机器学习--决策树
学习开始前的环境搭建:
1、安装Anaconda4.2.0(因为想着以后可能会用到TensorFlow)
anaconda必须安装4.2版本,不能安装4.3 版本;满满的血泪史
因为我们需要安装自带的python必须是3.5,才可以调用TensorFlow
但是anaconda4.3自带是python3.6 ,无法调用TensorFlow
2、使用的是PyCharm 2017.2
3、安装 Graphviz: http://www.graphviz.org/
配置环境变量,即将安装路径到bin下的目录加到系统环境变量path中
转化dot文件至pdf可视化决策树,在cmd中执行:dot -Tpdf iris.dot(要转换的文件) -o outpu.pdf(转换成的文件)
理论学习:
什么是决策树/判定树(decision tree)?
判定树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。
信息熵(entropy)
![](https://images2017.cnblogs.com/blog/701977/201707/701977-20170731112953599-1240100333.png)
算法:
- 树以代表训练样本的单个结点开始(步骤1)。
- 如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤2 和3)。
- 否则,算法使用称为信息增益的基于熵的度量作为启发信息,选择能够最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。在算法的该版本中,
- 所有的属性都是分类的,即离散值。连续属性必须离散化。
- 对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤8-10)。
- 算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属性出现在一个结点上,就不必该结点的任何后代上考虑它(步骤13)。
- 递归划分步骤仅当下列条件之一成立停止:
- (a) 给定结点的所有样本属于同一类(步骤2 和3)。
- (b) 没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,使用多数表决(步骤5)。
- 这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。替换地,可以存放结
- 点样本的类分布。
- (c) 分枝
- test_attribute = a i 没有样本(步骤11)。在这种情况下,以 samples 中的多数类
- 创建一个树叶(步骤12)
实例应用:
根据一个人的各种信息来判断是否会买电脑
数据集:
准备:将数据集信息转成CSV文件:
代码:
1 from sklearn.feature_extraction import DictVectorizer 2 import csv 3 from sklearn import preprocessing 4 from sklearn import tree 5 from sklearn.externals.six import StringIO 6 7 allElectronicsData = open(r"D:\Documents\PycharmProjects\DataSet\AllElectronics.csv", "r") # 打开相应CSV文件 8 reader = csv.reader(allElectronicsData) 9 headers = next(reader) 10 11 print(headers) # 输出CSV文件的头信息,检测是否正确读取 12 13 featureList = [] # 用来装特征值age、income、student、credit_rating的信息 14 labelList = [] # 用来装Class_buys_computer的值 15 for row in reader: 16 labelList.append(row[len(row) - 1]) # 取每行的最后一个值即Class_buys_computer放入labelList中 17 18 # 将前四列的值,以age等为key的形式存入到字典中 19 rowDict = {} 20 for i in range(1, len(row) - 1): 21 rowDict[headers[i]] = row[i] 22 23 featureList.append(rowDict) 24 25 print(featureList) 26 27 vec = DictVectorizer() # python自带的方法,将字典值转换成0 1格式 28 dummyX = vec.fit_transform(featureList).toarray() 29 30 print("dummyX:" + str(dummyX)) 31 print(vec.get_feature_names()) 32 33 print("leabelList: " + str(labelList)) 34 35 lb = preprocessing.LabelBinarizer() 36 dummyY = lb.fit_transform(labelList) 37 print("dummyY: " + str(dummyY)) 38 39 # using decision tree for classification 40 clf = tree.DecisionTreeClassifier(criterion='entropy') # 度量标准,用ID3算法,所以指明criterion='entropy'信息熵 41 clf = clf.fit(dummyX, dummyY) # 建模,填参数,构建决策树 42 print("clf: " + str(clf)) 43 44 # 存储了决策树的所有信息的文件 45 with open("allElectronicInformationGainOri.dot", 'w') as f: 46 f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) 47 48 # 取数据集转换后的第一行进行查看 49 oneRowX = dummyX[0, :] 50 print("oneRowX: " + str(oneRowX)) 51 52 # 新建一行作为预测时的用例 53 newRowX = oneRowX 54 55 # 更改第一行的部分数据来生成测试用例 56 newRowX[0] = 1 57 newRowX[2] = 0 58 print("newRowX: " + str(newRowX)) 59 60 # 进行预测与打印预测结果 61 predictedY = clf.predict(newRowX) 62 print("predictedY: " + str(predictedY))
allElectronicInformationGainOri.dot文件:
![](https://images2017.cnblogs.com/blog/701977/201707/701977-20170731113953302-1225729452.png)
转成相应的PDF文件:allElectronicInformationGainOri.pdf