1. 決策樹(Decision Tree)-決策樹原理
2. 決策樹(Decision Tree)-ID3、C4.5、CART比較
1. 前言
決策樹是一種基本的分類和回歸方法。決策樹呈樹形結構,在分類問題中,表示基於特征對實例進行分類的過程。它可以認為是if-then規則的集合,也可以認為是定義在特征空間和類空間上的條件概率分布。學習時,利用訓練數據,根據損失函數最小化的原則建立決策樹模型。預測時,對新的數據,利用決策樹模型進行分類。決策樹學習通常包括三個步驟:特征選擇、決策樹的生成和決策樹的剪枝。決策樹算法的發展從ID3到C4.5再到CART,下面會分別介紹。
2. 特征選擇
特征選擇在於選取對訓練數據具有分類能力的特征。特征選擇的基本方法有三種,(ID3的信息增益、C4.5的信息增益比、CART的基尼系數)
2.1 信息增益
特征\(A\)對訓練數據集\(D\)的信息增益\(g(D,A)\),定義為集合\(D\)的經驗熵\(H(D)\)與特征\(A\)給定條件下D的經驗條件熵\(H(D|A)\)之差,即
2.2 信息增益比
ID3采用信息增益的方式很快就被人發現有問題,在相同條件下,取值比較多的特征比取值少的特征信息增益大,即信息增益作為標准容易偏向於取值較多的特征。比如一個變量有2個值,各為1/2,另一個變量為3個值,各為1/3,其實他們都是完全不確定的變量,但是取3個值的比取2個值的信息增益大。
所以在C4.5中,引入了信息增益比\(I_R(X,Y)\),它是信息增益和特征熵的比值。表達式如下:
其中\(D\)為樣本特征輸出的集合,\(A\)為樣本特征,對於特征熵\(H_A(D)\), 表達式如下:
其中\(n\)為特征\(A\)的類別數,\(D_i\)為特征\(A\)的第\(i\)個取值對應的樣本個數。\(D\)為樣本個數。
2.3 基尼系數
在ID3算法中我們使用了信息增益來選擇特征,信息增益大的優先選擇。在C4.5算法中,采用了信息增益比來選擇特征,以減少信息增益容易選擇特征值多的特征的問題。但是無論是ID3還是C4.5,都是基於信息論的熵模型的,這里面會涉及大量的對數運算,比較耗時。CART分類樹算法使用基尼系數來代替信息增益比,基尼系數代表了模型的不純度,基尼系數越小,則不純度越低,特征越好。這和信息增益(比)是相反的。
具體的,在分類問題中,假設有\(K\)個類別,第\(k\)個類別的概率為\(p_k\), 則基尼系數的表達式為:
3. 決策樹的生成
3.1 ID3算法
ID3算法的核心是再決策樹各個節點上應用信息增益選擇特征,遞歸的構建決策樹。
輸入:訓練集\(D\),特征集\(A\),閾值\(\varepsilon\)
輸出:決策樹\(T\)
- 初始化信息增益的閾值\(\varepsilon\)
- 判斷樣本是否為同一類輸出\(D_i\),如果是則返回單節點樹\(T\)。標記類別為\(D_i\)。
- 判斷特征是否為空,如果是則返回單節點樹\(T\),標記類別為樣本中輸出類別\(D\)實例數最多的類別。
- 計算\(A\)中的各個特征(一共n個)對輸出\(D\)的信息增益,選擇信息增益最大的特征\(A_g\)。
- 如果\(A_g\)的信息增益小於閾值\(\varepsilon\),則返回單節點樹\(T\),標記類別為樣本中輸出類別\(D\)實例數最多的類別。
- 否則,按特征\(A_g\)的不同取值\(A_{gi}\)將對應的樣本輸出D分成不同的類別\(D_i\)。每個類別產生一個子節點。對應特征值為\(A_{gi}\)。返回增加了節點的數\(T\)。
- 對於所有的子節點,令\(D=D_i,A=A-{A_g}\)遞歸調用2-6步,得到子樹\(T_i\)並返回。
3.2 C4.5算法
C4.5算法整體結構和ID3基本一樣,只有在特征選擇的時候換成了信息增益比。
3.3 CART算法
輸入是訓練集\(D\),基尼系數的閾值\(\varepsilon_1\),樣本個數閾值\(\varepsilon_2\)。
輸出是決策樹\(T\)。
我們的算法從根節點開始,用訓練集遞歸的建立CART樹。
- 對於當前節點的數據集為\(D\),如果樣本個數小於閾值\(\varepsilon_2\)或者沒有特征,則返回決策子樹,當前節點停止遞歸。
- 計算樣本集\(D\)的基尼系數,如果基尼系數小於閾值\(\varepsilon_1\),則返回決策樹子樹,當前節點停止遞歸。
- 計算當前節點現有的各個特征的各個特征值對數據集\(D\)的基尼系數。
- 在計算出來的各個特征的各個特征值對數據集\(D\)的基尼系數中,選擇基尼系數最小的特征\(A\)和對應的特征值\(a\)。根據這個最優特征和最優特征值,把數據集划分成兩部分\(D1\)和\(D2\),同時建立當前節點的左右節點,做節點的數據集\(D\)為\(D1\),右節點的數據集\(D\)為\(D2\)。
- 對左右的子節點遞歸的調用1-4步,生成決策樹。
4. 決策樹的剪枝
決策樹生成算法遞歸地產生決策樹,直到不能繼續下去為止。這樣產生的樹往往對訓練數據的分類很准確,但對未知的測試數據的分類卻沒那么准確,即出現過擬合現象。過擬合的原因在於學習時過多地考慮如何提高對訓練數據的正確分類,從而構建出過於復雜的決策樹。解決這個問題的辦法是考慮決策樹的復雜度,對已生成的決策樹進行簡化。
可以通過剪枝的方式降低決策樹的復雜度,剪枝類型分為預剪枝、后剪枝。
- 預剪枝:是在構建決策樹的過程中,提前終止決策樹的生長,從而避免過多的節點產生。預剪枝方法雖然簡單但實用性不強,因為很難精確的判斷何時終止樹的生長。
- 后剪枝:是在決策樹構建完成之后,對那些置信度不達標的節點子樹用葉子結點代替,該葉子結點的類標號用該節點子樹中頻率最高的類標記。后剪枝方法又分為兩種:
- 把訓練數據集分成樹的生長集和剪枝集(參考周志華老師的西瓜書上介紹的剪枝方法)。
- 使用同一數據集進行決策樹生長和剪枝。常見的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。 C4.5算法采用PEP(Pessimistic Error Pruning)剪枝法。PEP剪枝法由Quinlan提出,是一種自上而下的剪枝法,根據剪枝前后的錯誤率來判定是否進行子樹的修剪。CART采用的是CCP(Cost Complexity Pruning)的剪枝法策略。
本文介紹CART決策樹的后剪枝算法CCP(Cost Complexity Pruning)。
4.1 CART的CCP剪枝算法
總體思路:由完全樹\(T_0\)開始,剪枝部分結點得到\(T_1\),再次剪枝部分結點得到\(T_2\)...直到剩下樹根的樹\(T_k\);在驗證數據集上對這\(k\)個樹分別評價,選擇損失函數最小的樹\(T_a\)。
變量預定義:\(|T_{leaf}|\)表示樹\(T\)的葉結點個數,\(t\)表示樹\(T\)的葉結點,同時,\(N_t\)表示該葉結點含有的樣本點個數,其中屬於\(k\)類的樣本點有\(N_{tk}\)個,\(K\)表示類別的個數,\(H_t(T)\)為葉結點\(t\)上的經驗熵,\(\alpha≥0\)為參數。
一個節點的樣本數,是這個樣本所有類的數量的和,公式如下:
- 經驗熵:
經驗熵反映了一個葉結點中的分類結果的混亂程度。經驗熵越大,說明該葉結點所對應的分類結果越混亂,也就是說分類結果中包含了較多的類別,表明該分支的分類效果較差。
- 損失函數:
損失函數其實是求葉結點的經驗熵期望。用\(N_t\)給經驗熵加權的依據是葉子節點含有的樣本個數越多,其分類效果或混亂程度越占主導,相當於求了期望,可以更好的描述分支前后的關系。例如設一個結點\(r\)有\(n\)個樣本,其組成是第\(i\)類有\(n_i\)個樣本,在分了幾個孩子結點后各個葉結點的成分仍保持原比例,記新的子樹為\(R\),可以計算得出評價函數\(C(r)=C(R)\),即在隨機分組后不會有任何分類效果的改進。損失函數越小越好。熵的期望和熵一樣,越小越好。所以,損失函數越大,說明模型的分類效果越差。
- 損失函數的正則化:
修正項\(\alpha|T_{leaf}|\)是基於復雜度的考慮。如上面提到的情況,\(r\)與\(R\)其實是一樣的,沒有進行任何分類的處理,但是我們仍然覺得\(r\)更好,原因在於\(R\)的復雜度更高。加了此修正項后具有現實的意義:如果\(\alpha=0\)表示未剪枝的完全樹損失更小(熵更小的占主導地位),如果\(\alpha->\infty\)表示剪枝到只剩根結點更好(葉結點個數占主導地位)。修正項\(\alpha|T_{leaf}|\)可以避免過擬合。修正項\(\alpha|T_{leaf}|\)考慮到了復雜度,\(\alpha\)值設置得好可以避免出現完全樹和根結點這類的極端情況,因此可以避免過擬合。
- 損失函數簡化形式:
- 計算剪枝系數\(\alpha\):
假定當前對以\(t\)為根的子樹\(T_t\)剪枝,剪枝后只保留\(t\)本身而刪掉所有的子結點。
剪枝后的損失函數:\(C_\alpha(t)=C(t)+\alpha\)
剪枝前的損失函數:\(C_\alpha(T_t)=C(T_t)+\alpha|T_{leaf}|\)(\(C(T_t)\)應該是小於\(C(t)\))
令二者相等,求得:\(\alpha=\frac{C(t)-C(T)}{|T_{leaf}|-1}\),因為損失相同,那就取復雜度小的,所以就可以剪枝。\(\alpha\)稱為結點\(t\)的剪枝系數。
- 剪枝算法流程:
- 對於給定的決策樹\(T_0\)。
- 計算所有內部結點的剪枝系數。
- 查找最小剪枝系數的結點,剪枝得決策樹\(T_k\)。
- 重復以上步驟,直到決策樹\(T_k\)只有一個結點。
- 得到決策樹序列\(T_0,T_1,T_2...T_k\)。
- 使用驗證樣本集選擇最優子樹。
5. 總結
本文從:特征選擇、決策樹的生成和決策樹的剪枝三個方面介紹了決策樹的原理。並且也介紹了三種決策樹的算法ID3、C4.5、CART。下文將比較ID3、C4.5、CART的異同點。
最后對決策樹這個一類算法做總結:
首先我們看看決策樹算法的優點:
- 簡單直觀,生成的決策樹很直觀。
- 基本不需要預處理,不需要提前歸一化,處理缺失值。
- 使用決策樹預測的代價是O(log2m)。 m為樣本數。
- 既可以處理離散值也可以處理連續值。很多算法只是專注於離散值或者連續值。
- 可以處理多維度輸出的分類問題。
- 相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
- 可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
- 對於異常點的容錯能力好,健壯性高。
我們再看看決策樹算法的缺點:
- 決策樹算法非常容易過擬合,導致泛化能力不強。可以通過設置節點最少樣本數量和限制決策樹深度來改進。
- 決策樹會因為樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過集成學習之類的方法解決。
- 尋找最優的決策樹是一個NP難的問題,我們一般是通過啟發式方法,容易陷入局部最優。可以通過集成學習之類的方法來改善。
- 有些比較復雜的關系,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關系可以換神經網絡分類方法來解決。
- 如果某些特征的樣本比例過大,生成決策樹容易偏向於這些特征。這個可以通過調節樣本權重來改善。