決策樹(初識)

決策樹:算法

    • 決策樹方法在分類,預測,規則等領域有這普遍的應用,20世紀70年代後期和80年代初期,機器學習研究者提出了ID3算法後,決策樹在機器學習,數據挖掘領域取得極大的發展,後來又有了c4.5,成爲新的監督學習算法.1984年,幾位科學家提出了CART分類算法,ID3和CART算法同時被提出,但都是採用相似的方法訓練樣本中學習決策樹
    • 決策樹是一種樹狀結構,它的每個葉節點對應着一個分類,非葉子節點對應着在某個屬性上的劃分,根據樣本在該屬性上的不一樣取值將其劃分紅若干個子集.對於非純的葉子節點,多數類的標號給出到達這個節點的樣本所屬的類,構造決策樹的核心問題是在每一步如何選擇適當的屬性對樣本作拆分.對於一個分類問題,從已知類標記的訓練樣本中學習並構造出決策樹是一個自上而下,分而治之的過程.
    • 決策樹算法
      算法 描述
      C4.5算法 C4.5決策樹生成算法至關於ID3算法的重要改進是使用信息增益率來選擇節點屬性.C4.5算法可疑克服ID3算法存在的不足:ID3算法只適用於離散的描述屬性,而C4.5算法即可以處理離散的描述性,也能夠處理連續的描述屬性
      CART算法 CART決策樹是一種十分有效的非參數分類和迴歸方法,經過構建樹,修剪樹,評估樹來構建一個二叉樹.當終結點是連續變量時,該樹爲迴歸樹,當終結點是分類變量,該樹爲分類樹
      ID3算法 其核心的是在決策樹的各級節點上,使用信息增益方法做爲屬性的選擇標準,來幫助肯定生成每一個節點是所應採用的合適屬性

 

  • ID3算法簡介及基本原理app

    • ID3算法基於信息熵來選擇最佳測試屬性.它選擇當前樣本集中具備最大信息增益值的屬性做爲測試屬性;樣本集的劃分則依據測試屬性的取值進行,測試屬性有多少不一樣取值舊將樣本集劃分爲多少子樣本集,同時決策樹上相應於該樣本集的節點長出新的葉子節點.ID3算法根據信息論理論,採用劃分後樣本集的不肯定性做爲衡量劃分好壞的標準,用信息增益值度量不肯定性;信息增益值越大,不肯定性越小.所以,ID3算法在每一個非葉節點選擇信息增益最大的屬性做爲測試屬性,這樣可疑獲得當前狀況下最純的拆分,從而獲得較小的決策樹
    • 設S是s個數據樣本的集合.假定類別屬性具備m個不一樣的值:Ci(i=1,2,...,m),設si是類Ci中的樣本數.對於一個給定的樣本,它老是信息熵爲
    • 其中,Pi是任意樣本屬於Ci的機率,通常能夠用si/s估計
    • 設一個屬性A具備k個不一樣的值{a1,a2,a3...a4},利用屬性A將集合S劃分爲個子集{S1,S2,...Sk},其中Sj包含了集合S中屬性A取aj值的樣本.若選擇屬性A爲測試屬性,則這些子集就是從集合S的節點生長出來的新的葉節點.設Sij是子集Sj中類別爲Ci的樣本數,則根據屬性A劃分樣本的信息熵值爲 
        • E(A) = ∑kj=1(s1j+ s2j + ... + smj)/I(sj,s2j,...smj)
        • 其中,I(s1j, s2j,...smj) = -∑mi=1Pijlog2(Pij), Pij = sij/(s1j + s2j + ...smj)是子集Sj只能給類別爲Ci的樣本的機率
        • 最後,用屬性A劃分樣本集S後所獲得的信息增益(Gain)爲
          • Gain(A) = I(s1, s2, ..., sm) - E(A)
        • 顯然E(A)越小,Gain(A)的值越大,說明選擇測試屬性A對於分類提供的信息越大,選擇A以後對分類的分類提供的信息越大,選擇A以後對分類的不肯定成都越小.屬性A的K個不一樣的值對應樣本集S的k個子集或分支,經過遞歸調用上述的過程(不包括已經選擇的屬性),生成其餘屬性做爲節點和分支來生成整個決策樹.ID3決策樹算法做爲一個典型的決策樹學習算法,其核心是在決策樹的各級節點上都用信息增益做爲判斷標準進行屬性的選擇,使得在每一個非葉節點上進行測試時,都能得到最大的類別分別增益,使分類後的數據集的熵最小,這樣的處理方法,使得樹的平均深度較小,從而有效提升了分類效益..
      • ID3算法的具體流程:
        1. 對當前樣本集合,計算全部屬性的信息增益;
        2. 選擇信息增益最大的屬性做爲測試屬性,把測試數屬性取值相同的樣本劃分爲同一個子集樣本集
        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,壞,是,是,低

     

      • 採用ID3算法構建決策樹模型的具體步驟以下:
        1. 根據上邊的信息熵公式,計算總的信息熵,其中數據中國總的記錄數爲34,而銷售數量爲"高"的數據有18,"低"的有16.
          1. I(18,16) = -18/34log218/34 - 16/34log216/34 = 0.997503
        2. 根據總的總的信息熵公式和劃分樣本的信息熵公式,來計算每一個測試屬性的信息熵,對於天氣屬性,其屬性值有"好"和"壞"兩種,其中天氣爲"好"的條件下,銷售數量爲高的記錄爲11,銷售數量爲低的記錄爲6天剋表示爲(11,6),天氣爲"壞"的條件下,銷售數量爲"高"的記錄爲7天,銷售數量爲"低"的記錄爲10可表示爲(7,10),則天氣屬性的信息熵計算過程以下.
          1. I(11,6) = -11/17log211/17 - 6/17log26/17 = 0.936667
          2. I(7,10) = -7/17log27/17 - 10/17log210/17 = 0.977418
          3. E(天氣) = 17/34I(11,6) + 17/24(7,10) = 0.957034
        3. 對因而否週末屬性,其屬性值有"是"和"否"兩種,其中是否週末屬性爲"是"的條件下,起銷售數量爲"高"的記錄爲11,銷售數量爲低的記錄爲3,可表示爲(11,3),是否週末屬性爲"否"的條件下,銷售數量爲"高"的記錄爲7,而銷售數量爲"低"的記錄爲13可表示爲(7,13),則節假日屬性的信息熵計算過程以下:
          1. I(11,3) = -11/14log211/14 - 3/14log23/14 = 0.749595
          2. I(7,13) = -7/20log27/20 - 13/20log213/20 = 0.934068
          3. E(是否週末) = -14/34I(11,3) + 20/34I(7,13) = 0.858109
        4. 對因而否有促銷屬性,其屬性值有"是"和"否"兩種.其中,是否有促銷屬性爲"是"的條件下,銷售數量爲"高"的記錄爲15,銷量爲"低"的記錄視爲7,可表示爲(15,7);其中是否有促銷屬性爲"否"的條件下.銷售數量爲"高"的記錄爲3,銷售數量爲"低"的金雞路爲9,可表示爲(3,9).則是否有促銷屬性的信息熵計算過程以下:
          1. I(15,7) = -15/22log215/22 - 7/22log27/22 = 0.902393
          2. I(3,9) = -3/12log23/12 - 9/12log29/12 = 0.811278
          3. E(是否有促銷) = -22/34I(15,7) + 12/34I(3,9) = 0.870235
        5. 根據公式,計算天氣,是否週末和是否有促銷屬性的信息增益值
          1. Gain(天氣) = I(18, 16) - E(天氣) = 0.997503 - 0.957043 = 0.04046
          2. Gain(是否週末) = I(18, 16) - E(是否週末) = 0.997503 - 0.858109 = 0.139394
          3. Gain(是否有促銷) = I(18, 16) = E(是否促銷) = 0.997503 - 0.870235
        6. 由上邊的計算結果能夠知道,是否週末屬性的信息增益值最大,它的兩個屬性值"是"和"否"做爲該根結點的兩個分支,而後按照1-5的步驟進行節點的劃分,針對每個分支節點繼續進行信息增益的計算,如此反覆循環,直到沒有新的結點分支,最終構成一顆決策樹
      • 因爲ID3決策樹算法採用了信息增益做爲選擇測試屬性的標準,會偏向於選擇取值較多的,即所謂高度分支屬性,而這類屬性並不必定是最優的屬性.同時ID3決策樹算法只能處理離散屬性,對於連續性的屬性,在分類前須要對其進行離散化,爲了解決傾向於選擇高度分支屬性的問題,人們採用信息增益率做爲選擇測試屬性的標準,這樣便獲得C4.5決策樹算法.此外,經常使用的決策樹算法還有CART算法,SLIQ算法,SPRINT算法和PUBLIC算法等.
    • # -*- coding:utf-8 -*-
      
      import sys
      
      reload(sys)
      sys.setdefaultencoding("utf-8")
      
      """
      利用ID3決策樹算法預測銷量高低
      """
      
      # 參數初始化
      import pandas as pd
      data = pd.read_csv("./practice_data.csv", header=None, sep=",",
                         names=["number", "tianqi", "weekend", "pt", "count"])
      
      print data["tianqi"]
      # 數據是類別標籤,要將她轉換成數據
      # 用1來表示"好", "是", "高"這三個屬性,用-1來表示"壞","否","低"
      data[data["tianqi"] == u""] = 1
      data[data["tianqi"] == u""] = -1
      print data["tianqi"]
      data[data["weekend"] == u""] = 1
      data[data["weekend"] == u""] = -1
      print data["weekend"]
      data[data["pt"] == u""] = 1
      data[data["pt"] == u""] = -1
      data[data["count"] == u""] = 1
      data[data["count"] == u""] = -1
      print data
      
      
      # print data
      x = data.iloc[:,:3].as_matrix().astype(int)
      y = data.iloc[:,3].as_matrix().astype(int)
      
      from sklearn.tree import DecisionTreeClassifier as DTC
      dtc = DTC(criterion="entropy")  # 創建決策樹模型, 基於信息熵
      dtc.fit(x, y)  # 訓練模型
      
      # 導入相關函數,可視化決策樹
      # 導出的結果是一個dot文件, 須要安裝Graphviz才能將它轉化爲pdf或png等格式
      from sklearn.tree import export_graphviz
      from sklearn.externals.six import StringIO
      with open("tree.dot", "w") as f:
          f = export_graphviz(dtc, feature_names=x.columns, out_file=f)
相關文章
相關標籤/搜索