前言:
这本书其实有配套代码的来着,但是有点坑的是,里面的代码对应的版本是有点旧的,用的时候会警告或者已经报错。甚至有些代码书里提了但是却没有写进去,要自己去摸索。我是每一章都跟着代码示例,把每一个步骤都按我自己的理解注释了,然后把书里错的和缺的都自己补上了,方便我以后复习233.
还有数据集是最坑的,很多数据集都没给要我们自己去下载,然而过了这么久很多网站获取数据的方式都改了。要我们读者自己想办法……所以这本书除了数据挖掘,甚至还能锻炼爬虫技能(X)
闲来没事我就随便发第一章的最简单的了,以后有空慢慢把后面的章节都发了。
import numpy as np
from sklearn.datasets import load_iris
dataset = load_iris()
X = dataset.data
y = dataset.target
n_samples, n_features = X.shape
#导入数据,X是每一个植物的特征值,y是每一个植物对应的类型
attribute_means=X.mean(axis=0)
X_d=np.array(X>attribute_means,dtype="int")
#连续值离散化
from collections import defaultdict
from operator import itemgetter
#defaultdict用来创建带默认值(0)的字典,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 #就在其对应的类别中记数+1
#运行到这里已经把所有的数据都训练完,得到了原始了class_count的数据了,接下来要做的就是排序
sorted_class_counts=sorted(class_counts.items(),key=itemgetter(1),reverse=True)
most_frequent_class = sorted_class_counts[0][0] #排序后取出最多次数的字典的key(就是类别)
error = sum([class_count for class_value, class_count in class_counts.items()
if class_value != most_frequent_class]) #这个很长的表达式是列表生成器,就是对class_count这个字典先打散,然后如果不是对应的值,输出count并组成了列表,最后加起来
return most_frequent_class, error
#创建针对特征的训练器(在特征中实现上面的训练器,每一个特征一个训练器)
def train_on_feature(X,y_true,feature_index):
values=set(X[:,feature_index]) # X[:,feature_index]是以数组形式输出指定行列的表达方式。然后set是一个无序不重复的集合,从而筛选出总共有多少个value
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
#接下来对我们的数据集进行切分,分为训练集和测试集
from sklearn.model_selection import train_test_split
Xd_train,Xd_test,y_train,y_test = train_test_split(X_d,y,random_state=None)
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 = {'feature':best_feature,'predictor':all_predictors[best_feature]} #建立了预测模型,内含了该模型所选的特征,以及对应的预测器
#下面建立用于预测的函数,输入一个植物,给出这个植物最可能对应的类别。
def predict_a_plant(plant_d,model):
feature=model['feature']
predictor=['predictor']
prediction = predictor[int(plant_d[feature])]
return prediction
print(model)
#下面建立的预测的函数,输入对象为一个数据集,并给出对这个数据集预测的正确率
def predict(X_test,model):
feature=model['feature']
predictor=model['predictor']
y_predicted =np.array([predictor[int(sample[feature])] for sample in X_test]) #又一个列表生成器,输出一个array记录下数据集所有预测的类别
a=[predictor[int(sample[feature])] for sample in X_test]
accuracy=np.mean(y_predicted == y_test)*100 #array类型的数据与列表判断的时候可以直接变成bool类型的array,并且用mean方法就可以求平均值
print("the test accuracy is {:.1f}%".format(accuracy)) # :.1f可以保留一位小数
return y_predicted
y_predicted = predict(Xd_test, model)
print(y_predicted)
最后得到的正确率浮动很大,上到80下到50。毕竟是整本书最简单的算法了,用来作全书的入门233