1、环境搭建
Python在数据挖掘方面有很多的库,如果我们自己去挨个安装可能会耗费比较长的时间,所以这里介绍一个比较好用的工具Anaconda,可以直百度搜索下载安装,里面集成很多已经安装好的需要用到的库,它有2.7和3.6的版本,也有32和64的,我用的是2.7+32的版本,我的建议是32位的,兼容性比较好。
同时,我们还需要安装一个将决策树的dot文件装换为pdf视图的工具,便于后期的查看决策时的样子。我们下载安装Graphviz:http://www.graphviz.org/,然后配置好环境变量,使用命令dot -T pdf [dot文件] -o [输出文件] 就可以将dot文件转换为可视化的pdf文件。
2、Python使用决策树
在Python中,决策树算法是不需要我们来进行编写的,在scikit-learn包中已经包含了这个算法,我们只要负责调用就好。建议大家在学习机器学期之前去看一下numpy, SciPy和matplotlib这几个工具的使用,尤其是numpy是非常重要的科学计算工具。
下面我们看之前我们之前的买电脑的例子。
我在一个data.csv文件中有15个实例数据。当然,数据比较少,我们就做个简答的测试,构造一个决策树来预测某人是否买电脑。
首先我们导入一些我们可能用到的库
1 2 3 4 5 |
#coding:utf8 from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing, metrics from sklearn import tree |
读取data.csv中的数据
1 2 3 4 5 6 7 8 |
#读取数据集 #将数据存到reader alls = open(r"./data/data.csv") #将数据存到reader reader = csv.reader(alls) #第一行数据,也就是头 headers = reader.next() print (headers) |
到此我们已经拿到数据了,但是,这些数据我们是不能直接使用的,因为计算机是不认识字符的,它只认识数字,所以,我们要把字符串转换成数组,这里怎么装换呢?比如,我们把age分为了三类,youth、middle_aged和senior三类,比如第一条数据是youth,name就装换为1 0 0 。当然还有另外的转换方法。也可以使用1 2 3来分别表示三类数据,下面我们使用sklearn自带的工具装换,它就使用的第一种转换方式,youth = 1 0 0 ,ok,下面看代码
首先我们建立两个列表,来分别存储特征向量和标记。
1 2 3 4 5 6 7 8 9 10 |
featureList = [] #save feature Dict labelList = [] #save label for row in reader: #将每一行的label标记存到labelList labelList.append(row[len(row) - 1]) rowDict = {} for i in range(1, len(row)-1): rowDict[headers[i]] = row[i] #将每一行的特征向量存到featureList featureList.append(rowDict) |
转换数据集
1 2 3 4 5 6 7 8 9 10 11 |
#将数据集装换为0和1的格式 vec = DictVectorizer() #对特征向量进行转换 dummyX = vec.fit_transform(featureList).toarray() print (dummyX) print (vec.get_feature_names()) #对标记进行转换 lb = preprocessing.LabelBinarizer() dummyY = lb.fit_transform(labelList) print ("labelList:" + str(dummyX)) |
ok,到此为止我们的数据已经准好了,下面就可以开始训练数据,然后建立模型了。
建立决策树模型,方法非常简单,直接调用函数即可。
1 2 3 4 5 6 7 8 9 |
clf = tree.DecisionTreeClassifier(criterion='entropy') #entropy 使用信息熵 clf = clf.fit(dummyX, dummyY) #建模 print ("clf:\n" + str(clf)) #save clf to dot with open("./data/all.dot","w") as f: f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) #查看特征重要程度 print clf.feature_importances_ |
上面的的代码执行之后决策树模型就建立好了,并且已经保存在了all.dot文件上了。我们可以看一下建立之后的决策树,使用之前下载好的工具,使用命令dot -T pdf all.dot -o out.pdf 执行完之后会在目录下面生成out.pdf,我们打开看一下。
模型我们已经建立好了,我们怎么来进行预测呢,我们接着看下面。
1 2 3 4 5 6 7 8 9 |
#获取一个实例,进行部分的修改 oneRowX = dummyX[0] newRowX = oneRowX newRowX[0] = 1 newRowX[2] = 0 #开始预测 test_res = clf.predict(newRowX) #打印预测结果 print test_res |
下面我们看一下模型预测的正确率,因为数据比较少,我们就将全部的训练集放进去预测,然后将结果与正确结果对比,看正确率。
1 2 3 4 5 6 |
#进行正确率评测 predictedY = clf.predict(dummyX) print predictedY #参数:正确的结果,测试结果,显示正确率还是个数 score = metrics.accuracy_score(dummyY, predictedY, True) print (score) #打印测试成绩 |
到此为止,基本的决策树应用就算完成了,其实在建模那有一些参数是需要调整的,要根据正确率,不断地进行调整,如果特征值比较多的话还有可能牵扯到降维,就比较复杂了,这里就不写了。
下面贴一下完整的代码
3、完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#coding:utf8 from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing, metrics from sklearn import tree #读取数据集 alls = open(r"./data/data.csv") reader = csv.reader(alls) #将数据存到reader headers = reader.next() #第一行数据,也就是头 print (headers) featureList = [] #save feature Dict labelList = [] #save label for row in reader: #将每一行的label标记存到labelList labelList.append(row[len(row) - 1]) rowDict = {} for i in range(1, len(row)-1): rowDict[headers[i]] = row[i] #将每一行的特征向量存到featureList featureList.append(rowDict) #将数据集装换为0和1的格式 vec = DictVectorizer() #对特征向量进行转换 dummyX = vec.fit_transform(featureList).toarray() print (dummyX) print (vec.get_feature_names()) #对标记进行转换 lb = preprocessing.LabelBinarizer() dummyY = lb.fit_transform(labelList) print ("labelList:" + str(dummyX)) clf = tree.DecisionTreeClassifier(criterion='entropy') #entropy 使用信息熵 clf = clf.fit(dummyX, dummyY) #建模 print ("clf:\n" + str(clf)) #save clf to dot with open("./data/all.dot","w") as f: f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) #查看特征重要程度 print clf.feature_importances_ ''' #保存和加载模型 joblib.dump(clf, './data/ss.m') ss = joblib.load('./data/ss.m') print ss ''' #获取一个实例,进行部分的修改 oneRowX = dummyX[0] newRowX = oneRowX newRowX[0] = 1 newRowX[2] = 0 #开始预测 test_res = clf.predict(newRowX) #打印预测结果 print test_res #进行正确率评测 predictedY = clf.predict(dummyX) print predictedY #参数:正确的结果,测试结果,显示正确率还是个数 score = metrics.accuracy_score(dummyY, predictedY, True) print (score) #打印测试成绩 ######################花的测试集############################## print ("####################################################") from sklearn.datasets import load_iris iris = load_iris() print iris #分割数据0.1的测试数据,0.9的训练数据 from sklearn.cross_validation import train_test_split train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0) #随机种子 print test_target #建模 clf2 = tree.DecisionTreeClassifier(criterion='entropy') clf2.fit(train_data,train_target) #模型评测 y_pre = clf2.predict(test_data) print ("y_pre:" + str(y_pre)) print (metrics.accuracy_score(test_target, y_pre, True)) print clf2.feature_importances_ ''' with open("data/iris.dot", "w") as f: tree.export_graphviz(clf, out_file=f) ''' print clf2 print clf2.classes_ |
上面的代码从61行开始还做了另外的一个测试,使用了sklearn自带的一个数据集进行的预测,就不讲了,基本原理是一样的,大家自己看把。