《python数据挖掘入门与实践》笔记1

    xiaoxiao2021-03-25  161

    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一行式代码与之前学习的代码有所不同,得花时间再学习。自己修改的代码不知道对错,造成结果不同的原因未知。猜测可能是将数据集随机分类造成的。

    转载请注明原文地址: https://ju.6miu.com/read-15609.html

    最新回复(0)