一、決策樹思維、決策樹算法
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)信息熵的計算:
- Pi:對於一個系統中,有 k 類的信息,每一類信息所占系統的比例,記為 P;
- k 類:比如數據集中樣本的總類數;
- 比例:每一類樣本數量占總數的多少;
- 公式中的 “-”:由於 Pi < 1,則 log(Pi) < 0,熵的值 H 應該大於 0;
- log(Pi):對數函數的底數可以取2,e或者10,取的底不同,獲得的信息熵的結果的單位不同,分別稱為:bits, nats 和 bans。
2)實例了解信息熵的計算
-
例一:
- k == 3:共 3 種樣本類別;
- P1 == P2 == P3 == 1/3
,此處選擇的底數是自然對數 e;
- 在這里的計算中,我們求信息熵的底可以用任意值,因為具體在划分的時候,不管底取多少,H這個函數的性質是不會變的。
-
例二:
- k == 3
- P1 == 1/10、P2 == 2/10、P3 == 7/10
-
例三:
3)3 個例子對比分析
- 現象:例一的信息熵 > 例二的信息熵 > 例三的熵
- 結論:
- 確定性:例三 > 例二 > 例一
- 例二中的數據的確定性比例一高更高,因為它有 70% 的數據是同一類型的;
- 信息熵物理上的最小值:Hmin = 0;
三、構建決策樹的思路和問題
1)決策樹算法的思想
- 解決分類問題時,決策樹算法的任務是構造決策樹模型,對未知的樣本進行分類;
- 決策樹算法利用了信息熵和決策樹思維:
- 信息熵越小的數據集,樣本的確定性越高,當數據集的信息熵為 0 時,該數據集中只有一種類型的樣本;
- 訓練數據集中有很多類型的樣本,通過對數據集信息熵的判斷,逐層划分數據集,最終將每一類樣本單獨划分出來;
- 划分數據集的方式有很多種,只有當按樣本類別划分數據集時(也就是兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小;反相推斷,當兩部分數據集的整體的信息熵最小時,則兩部分數據集中不會同時存在相同類型的樣本;
- 預測:根據模型參數划分結束后,對每個“葉子”節點的樣本數據進行投票,規定數量最多的樣本的類型為該“葉子”的預測類型;(也就是未知的樣本經過逐層決策后到達該“葉子”節點處,則認為該樣本的類型為其所處的“葉子”的預測類型)
2)概念
- 根節點:第一次進行划分的節點,擁有全部數據;
- 維度:一般指樣本特征;
- 划分點:選定的特征的一個值;(按某特征的值的大小排列數據集樣本,根據該特征的值划分數據集)
- 整體的信息熵:節點處的數據集划分為兩部分后的信息熵,等於兩部分數據集信息熵的和:H總 = H1 + H2;
- H1 = -log(P1) - log(P2) - ... - log(Pk):第一部分數據集中共有 k 種樣本類型;
3)思路
- 思路:先找到划分一個節點數據集的方法,用此方法,從根節點開始划分數據集,直到所有的數據集不需要再進行划分,此時的決策樹為最終的決策樹模型;
4)問題
- 節點處的數據集應該按哪個維度的哪個閾值進行划分?
- 怎么判斷該數據集不需要再進行划分?
5)解決思想
- 按不同的特征的不同值將數據集划分為兩部分,划分的方式有很多種,划分后的兩部分數據集的信息熵的總和最小時,對應的划分方式為最佳,此時的特征和該特征的值為最佳;
- 如果一個數據集的信息熵為 0,說明該數據集中只有一類樣本,則不再對該數據集進行划分;
- 任務:
- 尋找一種方式——為每一個節點處選取一個維度,維度上選取一個值,根據這個維度和取值對數據進行划分,划分以后使得整個系統的信息熵最低;
- 方法:
- 對所有的划分可能性進行搜索,比較每一種方式所得的系統整體的信息熵,最低的信息熵對應的划分方式就是該節點最終的結構;
- 按此思路和方式,確定決策樹的每一個節點,進而確定決策樹的最終結構;
- 在極端情況下:
- 如下圖,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()
- 當 x = 0.5 時,H 最大;
- 相對於 0.5,無論 x 值偏大或者偏小,H 值都降低,因為無論 x 值偏向哪一類,數據集中的樣本都更集中於一類樣本,數據集的確定性就會偏高。
四、老師答疑
- 問(一):決策樹模型中,每個節點處的數據集划分到最后,得到的“葉端”數據集中一定只包含一種類型的樣本嗎?
- 老師:是的!如果你不規定最高決策樹深度,節點划分最小樣本數等信息的話,最終沒一個葉子節點又有可能包含一類樣本信息,即信息熵為0:)但是,對於正常的數據,這樣做近乎一定過擬合。關於我說的這些參數,后續課程會有介紹:)
- 問(二):如果最終所有決策樹模型的“葉端”的數據集中只包含一種類型的樣本,所有的“葉端”數據集對應的樣本類型當中,有沒有相同的類型?
- 老師:可能!舉一個實際的例子(不一定科學),判斷一個腫瘤是良性還是惡性,有腫瘤的長度和寬度兩個指標,可能得到的決策樹是這樣的:有兩個葉子節點對應的樣本是良性的;你可以想象,在更復雜的場景下,樣本的特征更多,決策樹的層數更高,葉子節點更多,勢必有很多葉子節點最終的類別是一樣的;
腫瘤樣本 / \ 長度>10? 長度 <= 10 / \ (良性) 寬度 < 10 寬度 >= 10 (良性) (惡性)
- 問(三):我們對節點數據集划分時,是不是“只有當按樣本類別划分數據集時(也就是划分后的兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小?”
- 老師:是這樣的,但是對於很多數據,在初始化分的時候,會不存在這樣的划分(如果只基於一個特征和一個固定值進行划分的話)。通常划分后的兩部分數據集,依然都每個樣本的數據各有一些,所以還需要到下一層繼續划分。
- 問(四):在根據某一特征對樣本進行分類時,有沒有可能是:特質值在區間 [a, b] U [c, d] 上的樣本定義為一個類別?
- 老師:有可能,但根據我們的算法,還是會先選擇一個分割點,另一個分割點在后續的划分時出現,所以有了2)的情況。
-
結論:
- 決策樹模型中,每個節點處的數據集划分到最后,得到的“葉端”數據集中不一定只包含一種類型的樣本;
- 所有的“葉端”數據集對應的樣本類型當中,有些實際業務中存在相同的類型。
- 對節點數據集划分時,只有當按樣本類別划分數據集時(也就是划分后的兩部分數據集中不會同時存在相同類型的樣本),划分后的兩部分數據集的整體的信息熵最小。
- 在根據特征進行樣本分類時,有些類型的樣本之間存在關聯,如問(二)中,老師舉例的腫瘤案例:長度 <= 10 的全是良性腫瘤,長度 > 10 的有些是良性腫瘤有些是惡性腫瘤。