在決策樹算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用較為復雜的熵來度量,使用了相對較為復雜的多叉樹,只能處理分類不能處理回歸。對這些問題,CART(Classification And Regression Tree)做了改進,可以處理分類,也可以處理回歸。
1. CART分類樹算法的最優特征選擇方法
ID3中使用了信息增益選擇特征,增益大優先選擇。C4.5中,采用信息增益比選擇特征,減少因特征值多導致信息增益大的問題。CART分類樹算法使用基尼系數來代替信息增益比,基尼系數代表了模型的不純度,基尼系數越小,不純度越低,特征越好。這和信息增益(比)相反。
假設K個類別,第k個類別的概率為pk,概率分布的基尼系數表達式:
如果是二分類問題,第一個樣本輸出概率為p,概率分布的基尼系數表達式為:
對於樣本D,個數為|D|,假設K個類別,第k個類別的數量為|Ck|,則樣本D的基尼系數表達式:
對於樣本D,個數為|D|,根據特征A的某個值a,把D分成|D1|和|D2|,則在特征A的條件下,樣本D的基尼系數表達式為:
比較基尼系數和熵模型的表達式,二次運算比對數簡單很多。尤其是二分類問題,更加簡單。
和熵模型的度量方式比,基尼系數對應的誤差有多大呢?對於二類分類,基尼系數和熵之半的曲線如下:
基尼系數和熵之半的曲線非常接近,因此,基尼系數可以做為熵模型的一個近似替代。
CART分類樹算法每次僅對某個特征的值進行二分,而不是多分,這樣CART分類樹算法建立起來的是二叉樹,而不是多叉樹。
2. CART分類樹算法具體流程
CART分類樹建立算法流程,之所以加上建立,是因為CART分類樹算法有剪枝算法流程。
算法輸入訓練集D,基尼系數的閾值,樣本個數閾值。
輸出的是決策樹T。
算法從根節點開始,用訓練集遞歸建立CART分類樹。
(1)、對於當前節點的數據集為D,如果樣本個數小於閾值或沒有特征,則返回決策子樹,當前節點停止遞歸。
(2)、計算樣本集D的基尼系數,如果基尼系數小於閾值,則返回決策樹子樹,當前節點停止遞歸。
(3)、計算當前節點現有的各個特征的各個特征值對數據集D的基尼系數,對於離散值和連續值的處理方法和基尼系數的計算見第二節。缺失值的處理方法和C4.5算法里描述的相同。
(4)、在計算出來的各個特征的各個特征值對數據集D的基尼系數中,選擇基尼系數最小的特征A和對應的特征值a。根據這個最優特征和最優特征值,把數據集划分成兩部分D1和D2,同時建立當前節點的左右節點,做節點的數據集D為D1,右節點的數據集D為D2。
(5)、對左右的子節點遞歸的調用1-4步,生成決策樹。
對生成的決策樹做預測的時候,假如測試集里的樣本A落到了某個葉子節點,而節點里有多個訓練樣本。則對於A的類別預測采用的是這個葉子節點里概率最大的類別。
例:根據下表所給的訓練集,應用CART算法生成決策樹。
3. CART分類樹算法對連續特征和離散特征的處理
CART分類樹算法對連續值的處理,思想和C4.5相同,都是將連續的特征離散化。唯一區別在選擇划分點時,C4.5是信息增益比,CART是基尼系數。
具體思路:m個樣本的連續特征A有m個,從小到大排列a1,a2,......,am,則CART取相鄰兩樣本值的平均數做划分點,一共取m-1個,其中第i個划分點Ti表示為:Ti = (ai + ai+1)/2。分別計算以這m-1個點作為二元分類點時的基尼系數。選擇基尼系數最小的點為該連續特征的二元離散分類點。比如取到的基尼系數最小的點為at,則小於at的值為類別1,大於at的值為類別2,這樣就做到了連續特征的離散化。
注意的是,與ID3、C4.5處理離散屬性不同的是,如果當前節點為連續屬性,則該屬性在后面還可以參與子節點的產生選擇過程。
CART分類樹算法對離散值的處理,采用的思路:不停的二分離散特征。
在ID3、C4.5,特征A被選取建立決策樹節點,如果它有3個類別A1,A2,A3,我們會在決策樹上建立一個三叉點,這樣決策樹是多叉樹。
CART采用的是不停的二分。會考慮把特征A分成{A1}和{A2,A3}、{A2}和{A1,A3}、{A3}和{A1,A2}三種情況,找到基尼系數最小的組合,比如{A2}和{A1,A3},然后建立二叉樹節點,一個節點是A2對應的樣本,另一個節點是{A1,A3}對應的樣本。由於這次沒有把特征A的取值完全分開,后面還有機會對子節點繼續選擇特征A划分A1和A3。這和ID3、C4.5不同,在ID3或C4.5的一顆子樹中,離散特征只會參與一次節點的建立。
4. CART回歸樹建立算法
CART回歸樹和CART分類樹的建立類似,這里只說不同。
(1)、分類樹與回歸樹的區別在樣本的輸出,如果樣本輸出是離散值,這是分類樹;樣本輸出是連續值,這是回歸樹。分類樹的輸出是樣本的類別,回歸樹的輸出是一個實數。
(2)、連續值的處理方法不同。
(3)、決策樹建立后做預測的方式不同。
分類模型:采用基尼系數的大小度量特征各個划分點的優劣。
回歸模型:采用和方差度量,度量目標是對於划分特征A,對應划分點s兩邊的數據集D1和D2,求出使D1和D2各自集合的均方差最小,同時D1和D2的均方差之和最小。表達式為:
其中,c1為D1的樣本輸出均值,c2為D2的樣本輸出均值。
對於決策樹建立后做預測的方式,CART分類樹采用葉子節點里概率最大的類別作為當前節點的預測類別。回歸樹輸出不是類別,采用葉子節點的均值或者中位數來預測輸出結果。
5、CART樹算法的剪枝
CART樹的生成:基於訓練數據集,遞歸構建二叉決策樹。CART樹的剪枝:用驗證數據集對生成的樹進行剪枝並選擇最優子樹,損失函數最小作為剪枝的標准。
CART分類樹的剪枝策略在度量損失的時候用基尼系數;CART回歸樹的剪枝策略在度量損失的時候用均方差。
決策樹很容易對訓練集過擬合,導致泛化能力差,所以要對CART樹進行剪枝,即類似線性回歸的正則化。CART采用后剪枝法,即先生成決策樹,然后產生所有剪枝后的CART樹,然后使用交叉驗證檢驗剪枝的效果,選擇泛化能力最好的剪枝策略。
剪枝損失函數表達式:
α為正則化參數(和線性回歸的正則化一樣),C(Tt)為訓練數據的預測誤差,|Tt|是子樹T葉子節點數量。
當α = 0時,即沒有正則化,原始生成的CART樹即為最優子樹。當α = ∞時,正則化強度最大,此時由原始的生成CART樹的根節點組成的單節點樹為最優子樹。當然,這是兩種極端情況,一般來說,α越大,剪枝剪的越厲害,生成的最優子樹相比原生決策樹就越偏小。對於固定的α,一定存在使得損失函數Cα(Tt)最小的唯一子樹。
剪枝的思路:
對於位於節點t的任意一顆子樹Tt,如果沒有剪枝,損失函數是:
如果將其剪掉,僅保留根節點,損失函數是:
當α = 0或α很小,,當α增大到一定程度時
當α繼續增大時不等式反向,即滿足下式:
Tt和T有相同的損失函數,但T節點更少,因此可以對子樹Tt進行剪枝,也就是將它的子節點全部剪掉,變為一個葉子結點T。
交叉驗證策略:
如果我們把所有節點是否剪枝的值α都計算出來,然后針對不同α對應的剪枝后的最優子樹做交叉驗證。這樣可以選擇最好的α,有了這個α,用對應的最優子樹作為最終結果。
有了上面的思路,CART樹的剪枝算法:
輸入是CART樹建立算法得到的原始決策樹T。
輸出是最優決策樹Tα。
算法過程:
(1)、初始化αmin = ∞,最優子樹集合ω = {T}。
(2)、從葉子結點開始自下而上計算內部節點 t 的訓練誤差損失函數Cα(Tt)(回歸樹為均方差,分類樹為基尼系數),葉子節點數|Tt|,以及正則化閾值,更新αmin = α
(3)、得到所有節點的α值得集合M。
(4)、從M中選擇最大的值αk,自上而下的訪問子樹 t 的內部節點,如果時,進行剪枝。並決定葉子節點 t 的值。如果是分類樹,這是概率最高的類別,如果是回歸樹,這是所有樣本輸出的均值。這樣得到αk對應的最優子樹Tk
(5)、最優子樹集合ω = ωυTk,M = M - {αk}。
(6)、如果M不為空,則回到步驟4。否則就已經得到了所有的可選最優子樹集合ω。
(7)、采用交叉驗證在ω選擇最優子樹Tα。
6. CART算法小結
算法 | 支持模型 | 樹結構 | 特征選擇 | 連續值處理 | 缺失值處理 | 剪枝 |
ID3 | 分類 | 多叉樹 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分類 | 多叉樹 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 分類回歸 | 二叉樹 | 基尼系數 均方差 |
支持 | 支持 | 支持 |
ωCART算法缺點:
(1)、無論ID3,C4.5,CART都是選擇一個最優的特征做分類決策,但大多數,分類決策不是由某一個特征決定,而是一組特征。這樣得到的決策樹更加准確,這種決策樹叫多變量決策樹(multi-variate decision tree)。在選擇最優特征的時,多變量決策樹不是選擇某一個最優特征,而是選擇一個最優的特征線性組合做決策。代表算法OC1。
(2)、樣本一點點改動,樹結構劇烈改變。這個通過集成學習里面的隨機森林之類的方法解決。
7. 決策樹算法小結
這里不糾結ID3、C4.5、CART,這部分來自scikit-learn英文文檔。
優點:
- 簡單直觀,生成的決策樹很直觀。
- 基本不需要預處理,不需要提前歸一化和處理缺失值。
- 使用決策樹預測的代價是O(log2m)。m為樣本數。
- 既可以處理離散值也可以處理連續值。很多算法只是專注於離散值或者連續值。
- 可以處理多維度輸出的分類問題。
- 相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上可以很好解釋。
- 可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
- 對於異常點的容錯能力好,健壯性高。
缺點:
- 決策樹算法非常容易過擬合,導致泛化能力不強。可以通過設置節點最少樣本數量和限制決策樹深度來改進。
- 決策樹會因為樣本發生一點的改動,導致樹結構的劇烈改變。這個可以通過集成學習之類的方法解決。
- 尋找最優的決策樹是一個NP難題,我們一般是通過啟發式方法,容易陷入局部最優。可以通過集成學習的方法來改善。
- 有些比較復雜的關系,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關系可以換神經網絡分類方法來解決。
- 如果某些特征的樣本比例過大,生成決策樹容易偏向於這些特征。這個可以通過調節樣本權重來改善。