1.导入iris植物数据集,包含150个sample。X是一个4元组,包含特征:sepal length、 sepal width、 petal length、 petal width。Y是每个sample的分类情况,分类有三种情况(0,1,2)表示。
from sklearn.datasets import load_iris
dataset=load_iris()
X=dataset.data
Y=dataset.target
2.将连续的数据离散化。以平均值做阈值。
attribute_mean= X.mean(axis=0)
X_d=np.array(X>=attribute_mean,dtype=’int’)
from collections import defaultdict
from operator import itemgetter
3.实现OneR算法。
X是特征集,y_ture是分类信息,feature_index表示用第几个特征来分类,value表示特征值。(zip()函数:将两个元组一一对应)
train_feature_value函数统计了y类中第feature_index个特征值为value的sample个数
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
4.values是将X的集合中第feature_index列的值选出来,该例子只可能是0和1.
def train_on_feature(X,y_true,feature_index):
values=set(X[:,feature_index])
predictors={}
errors=[]
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
5.导入包,来分割训练集合和测试集合。
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={}
(.shape[1]表示求Xd_train元组的第1行的长度,求出结果是4)
for feature_index in range(Xd_train.shape[1]):
#print(Xd_train)
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]
print(all_predictors,errors)
将训练集的结果写成一个model字典,用在下面的测试集上。
model={‘feature’:best_feature,’predictor’:all_predictors[best_feature][0]}
def predict(Xd_test,model):
variable = model[‘feature’](和书中不一样,书里写的是variable = model[‘variable’]。但是自己理解上这参数应该是feature)
predictor = model[‘predictor’]
#for sample in Xd_test:
print(Xd_test,y_test)
y_predicted = np.array([int(predictor!=sample[variable]) for sample in Xd_test])
(书上是y_predicted = np.array([predictor[int(sample[variable])] for sample in X_test]),但是代码报错。predictor是一个整数,求索引会报错。 这里我按自己理解的算法改写了代码。)
#print(sample)
# y_predicted =0
return y_predicted
y_predicted = predict(Xd_test, model)
accuracy = np.mean(y_predicted == y_test) * 100
print(y_predicted)
print(“The test accuracy is {:.1f}%”.format(accuracy))
最后求出来的结果是The test accuracy is 76.3%。和书中给的68%有所差别。
总结:python一行式代码与之前学习的代码有所不同,得花时间再学习。自己修改的代码不知道对错,造成结果不同的原因未知。猜测可能是将数据集随机分类造成的。