Python数据挖掘入门与实践-OneR分类算法

Python数据挖掘入门与实践-OneR分类算法

OneR算法

OneR算法是根据已有的数据中,具有相同特征值的个体最可能属于哪个类别进行分类。
在本例中,只需选区Iris是个特征中分类效果最好的一个作为分类依据。

使用OneR算法对植物进行分类

离散化

数据集的特征为连续值,把连续值转变为类别行,这个过程叫作离散化。

1、准备数据集

每条数据集中给出了四个特征:sepal length,sepal width,petal length,petal width,可以从sklearn-learn使用该数据集

from sklearn.datasets import load_iris
import numpy as np
dataset = load_iris()
print(dataset.DESCR)
X = dataset.data
y = dataset.target

2、数据处理

使用离散化算法确定数据,通过确定一个阈值,将低于该阈值的特征值置为0,高于阈值的置为1,设每个特征的阈值为所有特征的均值,计算方法如下:

attribute_means = X.mean()

进行类型转换

X_d = np.array(X >= attribute_means, dtype='int')

3、实现OneR算法

通过OneR算法,我们将计算按照每个特征进行分类的错误率,然后选区错误率最低的特征作为分类准则,
首先创建函数,参数分别是数据集,类别数组,选好的特征索引值,特征值

from collections import defaultdict
from operator import itemgetter
def train_feature_value(X, y_true, feature_index, value):
    class_counts = defaultdict(int)
    for sample, y in zip(X, y_true):
        if sample[feature_index] == value:
            class_counts[y] += 1
    sorted_class_counts = sorted(class_counts.items(),key=itemgetter(1), reverse=True)
    most_frequent_class = sorted_class_counts[0][0]
    incorrect_predictions = [class_count for class_value,class_count in class_counts.items() if class_value != most_frequent_class]
    error = sum(incorrect_predictions)
    return most_frequent_class, error

对于任意一项特征,遍历其中每一个特征值使用上述函数计算错误率。

def train_on_feature(X, y_true, feature_index):
    values = set(X[:,feature_index])
    #字典predictors作为预测器,字典的键位特征值,值为类别
    #errors表示每个特征值的错误率
    predictors = {}
    errors = []
    #调用函数记录每个特征值可能的类别,计算错误率并保存到predictor中
    for current_value in values:
        most_frequent_class, error = train_feature_value(X,y_true, feature_index, current_value)
        predictors[current_value] = most_frequent_class
        errors.append(error)
    total_error = sum(errors)
    return predictors, total_error

4、测试算法

切割数据集

from sklearn.cross_validation import train_test_split
Xd_train, Xd_test, y_train, y_test = train_test_split(X_d, y, random_state=14)

接下来计算所有特征值的目标类别(预测器)

all_predictors = {}
errors = {}
for feature_index in range(Xd_train.shape[1]):
    predictors, total_error = train_on_feature(Xd_train,y_train,feature_index)
    all_predictors[feature_index] = predictors
    errors[feature_index] = total_error

找出错误率最低的特征,作为分类准则

best_feature, best_error = sorted(errors.items(), key=itemgetter(1))[0]

对预测器进行排序,找出最佳特征并创建model模型,创建函数通过遍历数据集中每条数据完成预测

model = {'feature': best_feature,'predictor': all_predictors[best_feature]}

def predict(X_test, model):
    feature = model['feature']
    predictor = model['predictor']
    y_predicted = [predictor[int(sample[feature])] for sample in X_test]
    return y_predicted

比较结果和实际类别进行预测,得出正确率

y_predicted = predict(Xd_test, model)
accuracy = np.mean(y_predicted == y_test) * 100
print("The test accuracy is {:.1f}%".format(accuracy))

运行结果

写在最后

OneR算法的思路很简单,但是整个编程过程对于新手来说比较复杂,还是需要加强算法和数据结构方面的练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值