机器学习--决策树

学习开始前的环境搭建:

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)
  
算法:
  • 树以代表训练样本的单个结点开始(步骤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文件:

转成相应的PDF文件:allElectronicInformationGainOri.pdf

 

 
posted @ 2017-07-31 11:42  banshaohuan  阅读(330)  评论(0编辑  收藏  举报