您的位置:首页 > 编程语言 > Python开发

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

2017-03-09 20:44 711 查看
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一行式代码与之前学习的代码有所不同,得花时间再学习。自己修改的代码不知道对错,造成结果不同的原因未知。猜测可能是将数据集随机分类造成的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据挖掘