zoukankan      html  css  js  c++  java
  • 决策树 Decision Tree

    决策树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。

    决策树的构建

    想要构建一个决策树,那么咱们首先就需要有一定的已知信息来作为决策树的构建依据。

    我们采用下图的数据来进行构建 决策树

    一个完整的数据应该包括数据特征对应的决策信息

    下表中的数据,代表对购买电脑的客户信息的记录,分为age/imcome/student...等信息

    在该数据源中,age 到 credit_rating 这4列称为特征,最后的class:buys_computer 代表最终的决策信息

    首先选择一个节点为开始(age),再根据该节点往下拓展,分为youth,middle_aged,seniors

    根据这三类去上图的数据源检索,可以得出 当middle_aged时,clas_lable全部为yes,所以该分支就结束了。

    重复上面的流程...知道最后的节点都是 决策结果信息

    信息熵

    流程和基本原理了解后,我们就要考虑一个问题:

    信息,如何度量?

    1948年,香农提出了 ”信息熵(entropy)“的概念
    一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少

          例子:猜世界杯冠军,假如一无所知,猜多少次?
          每个队夺冠的几率不是相等的
    

    信息熵用 比特(bit) 来衡量信息的多少

    信息熵公式为:


    大写X代表信息集合
    小写x代表集合中的某一
    p(x)代表概率

    假设 X={A,B,C}
    A概率为0.2,
    B概率为0.4,
    C概率为0.6

    那么计算结果为
    -0.2 * log 0.2 +
    -0.4 * log 0.4 +
    -0.6 * log 0.6 的和

    策树归纳算法 (ID3)

    ID3算法是根据信息获取量(Information Gain):
    Gain(A) = Info(D) - Infor_A(D)
    通过A来作为节点分类获取了多少信息


    类似,Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048

    代码实现

    数据源为第一个表格的数据

    # 决策树
    from sklearn.feature_extraction import DictVectorizer
    import csv
    from sklearn import tree
    from sklearn import preprocessing
    import pydotplus
    
    
    # Read csv file
    allElectronicsData = open('AllElectronics.csv','r')
    csvReader = csv.reader(allElectronicsData)
    # csvList = [ r for r in csvReader]
    # print(csvList)
    # 取头
    headers = next(csvReader)
    
    # print(headers)
    
    featureList =[] #特征
    labelList = []  #头
    
    
    # 字典化所有特征
    for row in csvReader:
        labelList.append(row[len(row) - 1])
        rowDic = {}
        for i in (range(1,len(row)-1)):
            rowDic[headers[i]] = row[i]
        # print(rowDic)
        featureList.append(rowDic)
    
    print(featureList)
    print(labelList)
    
    # 矢量化 特征
    vec = DictVectorizer()
    dummyX = vec.fit_transform(featureList).toarray()
    
    print("dummyX:")
    print(str(dummyX))
    print(vec.get_feature_names())
    
    # 矢量化 class label
    lb = preprocessing.LabelBinarizer()
    dummyY = lb.fit_transform(labelList)
    print("dummyY:")
    print(dummyY)
    
    
    # 构建决策树
    clf = tree.DecisionTreeClassifier(criterion="entropy")
    clf = clf.fit(dummyX,dummyY)
    print("clf: ")
    print(str(clf))
    
    # 查看决策树
    csvDot = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=None)
    graph = pydotplus.graph_from_dot_data(csvDot)
    graph.write_pdf('1.pdf')
    # Image(graph.create_png())
    
    
    # 使用决策树计算
    # 这里直接使用已经矢量化完事的数据来修改一下 进行预测,正常应该采用原始数据进行预处理后 进行预测
    new_Data = dummyX[0, :]
    print(dummyX[0, :])
    # print(new_Data)
    new_Data[0] = 0
    new_Data[2] = 1
    # print(new_Data)
    # 预测该数据
    predictedY = clf.predict([new_Data])
    print(predictedY)
    
    
    
    
    
    
    
  • 相关阅读:
    FPGrowth 实现
    数据库事务的4个特性ACID
    redis简介(keeper实时报表的基本部分)
    HADOOP中的CRC数据校验文件
    潜在语义分析
    AdaBoost 算法
    cocosBuilder生成cbbi文件,绑定到cocos2d-x
    C++继承模型
    Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)
    从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
  • 原文地址:https://www.cnblogs.com/zfcode/p/jue-ce-shu-Decision-Tree.html
Copyright © 2011-2022 走看看