機器學習:決策樹(基本思想、信息熵、構建決策樹的問題及思想)


一、決策樹思維、決策樹算法

 1)決策樹思維

  • 決策樹思維是一種邏輯思考方式,逐層的設定條件對事物進行刷選判斷,每一次刷選判斷都是一次決策,最終得到達到目的;整個思考過程,其邏輯結構類似分叉的樹狀,因此稱為決策樹思維;
  • 例一:公式招聘時的決策樹思維
  • 此過程形成了一個樹的結構,樹的葉子(錄用 / 考察)節點位置是做出的決定,也可以理解為是對輸出(也就是應聘者的信息)的分類:錄用、考察——這樣的邏輯思考的過程就叫決策樹。
  • 樹的最高深度:depth == 3,說明最多做出 3 次判斷就能得到結果;

 

 2)scikit-learn 中的決策樹算法

  • 例二:

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    iris = datasets.load_iris()
    X = iris.data[:, 2:]
    y = iris.target
    
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.scatter(X[y==2, 0], X[y==2, 1])
    plt.show()

  • def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
        
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
        
        from matplotlib.colors import ListedColormap
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        
        plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    # 使用 DecisionTreeClassifier 方法對數據分類
    from sklearn.tree import DecisionTreeClassifier # 創建決策樹的分類器 # 構造決策樹時,DecisionTreeClassifier() 方差需要傳入兩個參數: # 1)max_depth:決策樹最高深度; # 2)criterion='entropy':表示“熵”的意思;
    dt_clf = DecisionTreeClassifier(max_depth=2, criterion='entropy')
    dt_clf.fit(X, y)
    
    plot_decision_boundary(dt_clf, axis=[0.5, 7.5, 0, 3])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.scatter(X[y==2, 0], X[y==2, 1])
    plt.show()

 

 3)分析模型的決策邊界:得出模型的決策樹

 

 4)決策樹算法

  • 決策樹算法是借用了決策樹思維解決分類問題(或者回歸問題)的算法;
  • 決策樹算法的特點:
  1. 非參數學習算法;
  2. 可以解決分類問題;
  3. 天然可以解決多分類問題;
  4. 也可以解決回歸問題;(結果是一個數值)
  5. 具有非常好的可解釋性; 

 

 

二、信息熵

  • “信息熵”:隨機變量不確定度的度量,是信息論中的代表;
  • 特點熵越大,數據的不確定性越高;熵越小,數據的不確定性越低
  • 不確定性:一組數據的個數一定,元素的種類越少,該組數據的不確定性越高;

 

 1)信息熵的計算:

 

  1. Pi:對於一個系統中,有 k 類的信息,每一類信息所占系統的比例,記為 P;
  2. k 類:比如數據集中樣本的總類數;
  3. 比例:每一類樣本數量占總數的多少;
  4. 公式中的 “-”:由於 Pi < 1,則 log(Pi) < 0,熵的值 H 應該大於 0;
  5. log(Pi):對數函數的底數可以取2,e或者10,取的底不同,獲得的信息熵的結果的單位不同,分別稱為:bits, nats  bans

 

 2)實例了解信息熵的計算

  • 例一:

  1. k == 3:共 3 種樣本類別;
  2. P1 == P2 == P3 == 1/3
  3. ,此處選擇的底數是自然對數 e;
  • 在這里的計算中,我們求信息熵的底可以用任意值,因為具體在划分的時候,不管底取多少,H這個函數的性質是不會變的

 

  • 例二:

  1. k == 3
  2. P1 == 1/10、P2 == 2/10、P3 == 7/10

 

  • 例三:

 

 3)3 個例子對比分析

  • 現象:例一的信息熵  >  例二的信息熵  > 例三的熵
  • 結論
  1. 確定性:例三  >  例二  >  例一
  2. 例二中的數據的確定性比例一高更高,因為它有 70% 的數據是同一類型的;
  3. 信息熵物理上的最小值:Hmin = 0; 

 

 

 三、構建決策樹的思路和問題

 1)決策樹算法的思想

  • 解決分類問題時,決策樹算法的任務是構造決策樹模型,對未知的樣本進行分類;
  • 決策樹算法利用了信息熵和決策樹思維:
  1. 信息熵越小的數據集,樣本的確定性越高,當數據集的信息熵為 0 時,該數據集中只有一種類型的樣本;
  2. 訓練數據集中有很多類型的樣本,通過對數據集信息熵的判斷,逐層划分數據集,最終將每一類樣本單獨划分出來;
  3. 划分數據集的方式有很多種,只有當按樣本類別划分數據集時(也就是兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小;反相推斷,當兩部分數據集的整體的信息熵最小時,則兩部分數據集中不會同時存在相同類型的樣本;
  4. 預測:根據模型參數划分結束后,對每個“葉子”節點的樣本數據進行投票,規定數量最多的樣本的類型為該“葉子”的預測類型;(也就是未知的樣本經過逐層決策后到達該“葉子”節點處,則認為該樣本的類型為其所處的“葉子”的預測類型)

 

 2)概念

  1. 根節點:第一次進行划分的節點,擁有全部數據;
  2. 維度:一般指樣本特征;
  3. 划分點:選定的特征的一個值;(按某特征的值的大小排列數據集樣本,根據該特征的值划分數據集)
  4. 整體的信息熵:節點處的數據集划分為兩部分后的信息熵,等於兩部分數據集信息熵的和:H = H1 + H2
  5. H1 = -log(P1) - log(P2) - ... - log(Pk):第一部分數據集中共有 k 種樣本類型;

 

 3)思路

  • 思路:先找到划分一個節點數據集的方法,用此方法,從根節點開始划分數據集,直到所有的數據集不需要再進行划分,此時的決策樹為最終的決策樹模型;

 

 4)問題

  1. 節點處的數據集應該按哪個維度的哪個閾值進行划分?
  2. 怎么判斷該數據集不需要再進行划分?

 

 5)解決思想

  1. 按不同的特征的不同值將數據集划分為兩部分,划分的方式有很多種,划分后的兩部分數據集的信息熵的總和最小時,對應的划分方式為最佳,此時的特征和該特征的值為最佳;
  2. 如果一個數據集的信息熵為 0,說明該數據集中只有一類樣本,則不再對該數據集進行划分;

 

  • 任務
  • 尋找一種方式——為每一個節點處選取一個維度,維度上選取一個值,根據這個維度和取值對數據進行划分,划分以后使得整個系統的信息熵最低;

 

  • 方法
  1. 對所有的划分可能性進行搜索,比較每一種方式所得的系統整體的信息熵,最低的信息熵對應的划分方式就是該節點最終的結構;
  2. 按此思路和方式,確定決策樹的每一個節點,進而確定決策樹的最終結構;

 

  • 在極端情況下
  • 如下圖,A、B、C 3 個葉子節點處,每個葉子節點中的數據都只屬於 A、B、C 它們本身;此時整個系統的信息熵就達到了 0(每處葉子種只有一類樣本,信息熵為 0,因此整體系統的信息熵也是 0);

 

 6)計算二分類結果的整體的信息熵

  • 二分類的信息熵計算:
  • ,x 表示其中一類樣本的比例;

 

  • 繪制此函數的圖像:x 的取值范圍定義為:[0.01,0.99]
  • import numpy as np
    import matplotlib.pyplot as plt
    
    # np.log(p):此時的 p 不僅可以是一個數,還能是一個向量;
        # 當 p 傳入的是數組時,可以一次性計算出數組中所有元素的信息熵,再以數組的形式返回;
    def entropy(p):
        return -p * np.log(p) - (1-p) * np.log(1-p)
    
    x = np.linspace(0.01, 0.99, 200)
    plt.plot(x, entropy(x))
    plt.show()

  1. 當 x = 0.5 時,H 最大;
  2. 相對於 0.5,無論 x 值偏大或者偏小,H 值都降低,因為無論 x 值偏向哪一類,數據集中的樣本都更集中於一類樣本,數據集的確定性就會偏高。

 

 

四、老師答疑

  • 問(一):決策樹模型中,每個節點處的數據集划分到最后,得到的“葉端”數據集中一定只包含一種類型的樣本嗎?
  • 老師:是的!如果你不規定最高決策樹深度,節點划分最小樣本數等信息的話,最終沒一個葉子節點又有可能包含一類樣本信息,即信息熵為0:)但是,對於正常的數據,這樣做近乎一定過擬合。關於我說的這些參數,后續課程會有介紹:)

 

  • 問(二):如果最終所有決策樹模型的“葉端”的數據集中只包含一種類型的樣本,所有的“葉端”數據集對應的樣本類型當中,有沒有相同的類型?
  • 老師:可能!舉一個實際的例子(不一定科學),判斷一個腫瘤是良性還是惡性,有腫瘤的長度和寬度兩個指標,可能得到的決策樹是這樣的:有兩個葉子節點對應的樣本是良性的;你可以想象,在更復雜的場景下,樣本的特征更多,決策樹的層數更高,葉子節點更多,勢必有很多葉子節點最終的類別是一樣的;
                  腫瘤樣本
                /          \
          長度>10?        長度 <= 10
         /       \         (良性)
    寬度 < 10   寬度 >= 10   
     (良性)       (惡性)

 

  • 問(三):我們對節點數據集划分時,是不是“只有當按樣本類別划分數據集時(也就是划分后的兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小?”
  • 老師:是這樣的,但是對於很多數據,在初始化分的時候,會不存在這樣的划分(如果只基於一個特征和一個固定值進行划分的話)。通常划分后的兩部分數據集,依然都每個樣本的數據各有一些,所以還需要到下一層繼續划分。

 

  • 問(四):在根據某一特征對樣本進行分類時,有沒有可能是:特質值在區間 [a, b] U [c, d] 上的樣本定義為一個類別?
  • 老師:有可能,但根據我們的算法,還是會先選擇一個分割點,另一個分割點在后續的划分時出現,所以有了2)的情況。

 

 

  • 結論:

  1. 決策樹模型中,每個節點處的數據集划分到最后,得到的“葉端”數據集中不一定只包含一種類型的樣本;
  2. 所有的“葉端”數據集對應的樣本類型當中,有些實際業務中存在相同的類型。
  3. 對節點數據集划分時,只有當按樣本類別划分數據集時(也就是划分后的兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小。
  4. 在根據特征進行樣本分類時,有些類型的樣本之間存在關聯,如問(二)中,老師舉例的腫瘤案例:長度 <= 10 的全是良性腫瘤,長度 > 10 的有些是良性腫瘤有些是惡性腫瘤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM