python算法演练_One Rule 算法(详解)
这样某一个特征只有0和1两种取值,数据集有三个类别。当取0的时候,假如类别A有20个这样的个体,类别B有60个这样的个体,类别C有20个这样的个体。所以,这个特征为0时,最有可能的是类别B,但是,还是有40个个体不在B类别中,所以,将这个特征为0分到类别B中的错误率是40%。然后,将所有的特征统计完,计算所有的特征错误率,再选择错误率最低的特征作为唯一的分类准则——这就是OneR。
现在用代码来实现算法。
#OneR算法实现 importnumpyasnp fromsklearn.datasetsimportload_iris #加载iris数据集 dataset=load_iris() #加载iris数据集中的data数组(数据集的特征) X=dataset.data #加载iris数据集中的target数组(数据集的类别) y_true=dataset.target #计算每一项特征的平均值 attribute_means=X.mean(axis=0) #与平均值比较,大于等于的为“1”,小于的为“0”.将连续性的特征值变为离散性的类别型。 x=np.array(X>=attribute_means,dtype="int") fromsklearn.model_selectionimporttrain_test_split x_train,x_test,y_train,y_test=train_test_split(x,y_true,random_state=14) fromoperatorimportitemgetter fromcollectionsimportdefaultdict #找到一个特征下的不同值的所属的类别。 deftrain_feature_class(x,y_true,feature_index,feature_values): num_class=defaultdict(int) forsample,yinzip(x,y_true): ifsample[feature_index]==feature_values: num_class[y]+=1 #进行排序,找出最多的类别。按从大到小排列 sorted_num_class=sorted(num_class.items(),key=itemgetter(1),reverse=True) most_frequent_class=sorted_num_class[0][0] error=sum(value_numforclass_num,value_numinsorted_num_classifclass_num!=most_frequent_class) returnmost_frequent_class,error #printtrain_feature_class(x_train,y_train,0,1) #接着定义一个以特征为自变量的函数,找出错误率最低的最佳的特征,以及该特征下的各特征值所属的类别。 deftrain_feature(x,y_true,feature_index): n_sample,n_feature=x.shape assert0<=feature_index总结:OneR算法,我在最开始的以为它是找到一个错误率最低的特征之后可以判断所有特征的分类,其实,现在明白它只能判断这个特征下的各特征值的分类,所以,明显它会有一些局限性。只是说它比较快捷也比较简单明了。但是,还是得是情况而判断是否使用它。
class precisionrecallf1-scoresupport
0 0.94 1.00 0.97 17
1 0.00 0.00 0.00 13
2 0.40 1.00 0.57 8avg/total0.51 0.66 0.55 38
注:
#在上面代码中。
forsampleinx_test:
printsample[0]
#得到的是x_test的第一列数据。而用下面的代码得到的是x_test的第一行数据。
printx_test[0]
#注意两者区别以上这篇python算法演练_OneRule算法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。