zoukankan      html  css  js  c++  java
  • 机器学习--决策树

    学习开始前的环境搭建:

    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:DocumentsPycharmProjectsDataSetAllElectronics.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

     
  • 相关阅读:
    [.net 面向对象编程基础] (13) 重构
    [.net 面向对象编程基础] (12) 面向对象三大特性——多态
    [.net 面向对象编程基础] (11) 面向对象三大特性——继承
    [.net 面向对象编程基础] (10) 面向对象三大特性——封装
    [.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)
    [.net 面向对象编程基础] (8) 类和类的实例
    [.net 面向对象编程基础] (7) 基础中的基础——修饰符
    反向代理和正向代理区别
    Vue的路由及静态路由和动态路由的区别
    一次性讲明白vue插槽slot
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/7262329.html
Copyright © 2011-2022 走看看