在決策樹演算法原理(上)這篇裡,我們講到了決策樹裡ID3演算法,和ID3演算法的改進版C4.5演算法。對於C4.5演算法,我們也提到了它的不足,比如模型是用較為複雜的熵來度量,使用了相對較為複雜的多叉樹,只能處理分類不能處理迴歸等。對於這些問題, CART演算法大部分做了改進。CART演算法也就是我們下面的重點了。由於CART演算法可以做迴歸,也可以做分類,我們分別加以介紹,先從CART分類樹演算法開始,重點比較和C4.5演算法的不同點。接著介紹CART迴歸樹演算法,重點介紹和CART分類樹的不同點。然後我們討論CART樹的建樹演算法和剪枝演算法,最後總結決策樹演算法的優缺點。
1. CART分類樹演算法的最優特徵選擇方法
我們知道,在ID3演算法中我們使用了資訊增益來選擇特徵,資訊增益大的優先選擇。在C4.5演算法中,採用了資訊增益比來選擇特徵,以減少資訊增益容易選擇特徵值多的特徵的問題。但是無論是ID3還是C4.5,都是基於資訊理論的熵模型的,這裡面會涉及大量的對數運算。能不能簡化模型同時也不至於完全丟失熵模型的優點呢?有!CART分類樹演算法使用基尼係數來代替資訊增益比,基尼係數代表了模型的不純度,基尼係數越小,則不純度越低,特徵越好。這和資訊增益(比)是相反的。
具體的,在分類問題中,假設有K個類別,第k個類別的概率為$p_k$, 則基尼係數的表示式為:
$$Gini(p) = \sum\limits_{k=1}^{K}p_k(1-p_k) = 1- \sum\limits_{k=1}^{K}p_k^2$$
如果是二類分類問題,計算就更加簡單了,如果屬於第一個樣本輸出的概率是p,則基尼係數的表示式為:
$$Gini(p) = 2p(1-p)$$
對於個給定的樣本D,假設有K個類別, 第k個類別的數量為$C_k$,則樣本D的基尼係數表示式為:
$$Gini(D) = 1-\sum\limits_{k=1}^{K}(\frac{|C_k|}{|D|})^2 $$
特別的,對於樣本D,如果根據特徵A的某個值a,把D分成D1和D2兩部分,則在特徵A的條件下,D的基尼係數表示式為:
$$Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2) $$
大家可以比較下基尼係數表示式和熵模型的表示式,二次運算是不是比對數簡單很多?尤其是二類分類的計算,更加簡單。但是簡單歸簡單,和熵模型的度量方式比,基尼係數對應的誤差有多大呢?對於二類分類,基尼係數和熵之半的曲線如下:
從上圖可以看出,基尼係數和熵之半的曲線非常接近,僅僅在45度角附近誤差稍大。因此,基尼係數可以做為熵模型的一個近似替代。而CART分類樹演算法就是使用的基尼係數來選擇決策樹的特徵。同時,為了進一步簡化,CART分類樹演算法每次僅僅對某個特徵的值進行二分,而不是多分,這樣CART分類樹演算法建立起來的是二叉樹,而不是多叉樹。這樣一可以進一步簡化基尼係數的計算,二可以建立一個更加優雅的二叉樹模型。
2. CART分類樹演算法對於連續特徵和離散特徵處理的改進
對於CART分類樹連續值的處理問題,其思想和C4.5是相同的,都是將連續的特徵離散化。唯一的區別在於在選擇劃分點時的度量方式不同,C4.5使用的是資訊增益比,則CART分類樹使用的是基尼係數。
具體的思路如下,比如m個樣本的連續特徵A有m個,從小到大排列為${a_1,a_2,...,a_m}$,則CART演算法取相鄰兩樣本值的平均數,一共取得m-1個劃分點,其中第i個劃分點$T_i表示$為:$T_i = \frac{a_i+a_{i+1}}{2}$。對於這m-1個點,分別計算以該點作為二元分類點時的基尼係數。選擇基尼係數最小的點作為該連續特徵的二元離散分類點。比如取到的基尼係數最小的點為$a_t$,則小於$a_t$的值為類別1,大於$a_t$的值為類別2,這樣我們就做到了連續特徵的離散化。要注意的是,與ID3或者C4.5處理離散屬性不同的是,如果當前節點為連續屬性,則該屬性後面還可以參與子節點的產生選擇過程。
對於CART分類樹離散值的處理問題,採用的思路是不停的二分離散特徵。
回憶下ID3或者C4.5,如果某個特徵A被選取建立決策樹節點,如果它有A1,A2,A3三種類別,我們會在決策樹上一下建立一個三叉的節點。這樣導致決策樹是多叉樹。但是CART分類樹使用的方法不同,他採用的是不停的二分,還是這個例子,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的一棵子樹中,離散特徵只會參與一次節點的建立。
3. CART分類樹建立演算法的具體流程
上面介紹了CART演算法的一些和C4.5不同之處,下面我們看看CART分類樹建立演算法的具體流程,之所以加上了建立,是因為CART樹演算法還有獨立的剪枝演算法這一塊,這塊我們在第5節講。
演算法輸入是訓練集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的類別預測採用的是這個葉子節點裡概率最大的類別。
4. CART迴歸樹建立演算法
CART迴歸樹和CART分類樹的建立演算法大部分是類似的,所以這裡我們只討論CART迴歸樹和CART分類樹的建立演算法不同的地方。
首先,我們要明白,什麼是迴歸樹,什麼是分類樹。兩者的區別在於樣本輸出,如果樣本輸出是離散值,那麼這是一顆分類樹。如果果樣本輸出是連續值,那麼那麼這是一顆迴歸樹。
除了概念的不同,CART迴歸樹和CART分類樹的建立和預測的區別主要有下面兩點:
1)連續值的處理方法不同
2)決策樹建立後做預測的方式不同。
對於連續值的處理,我們知道CART分類樹採用的是用基尼係數的大小來度量特徵的各個劃分點的優劣情況。這比較適合分類模型,但是對於迴歸模型,我們使用了常見的和方差的度量方式,CART迴歸樹的度量目標是,對於任意劃分特徵A,對應的任意劃分點s兩邊劃分成的資料集D1和D2,求出使D1和D2各自集合的均方差最小,同時D1和D2的均方差之和最小所對應的特徵和特徵值劃分點。表示式為:
$$\underbrace{min}_{A,s}\Bigg[\underbrace{min}_{c_1}\sum\limits_{x_i \in D_1(A,s)}(y_i - c_1)^2 + \underbrace{min}_{c_2}\sum\limits_{x_i \in D_2(A,s)}(y_i - c_2)^2\Bigg]$$
其中,$c_1$為D1資料集的樣本輸出均值,$c_2$為D2資料集的樣本輸出均值。
對於決策樹建立後做預測的方式,上面講到了CART分類樹採用葉子節點裡概率最大的類別作為當前節點的預測類別。而回歸樹輸出不是類別,它採用的是用最終葉子的均值或者中位數來預測輸出結果。
除了上面提到了以外,CART迴歸樹和CART分類樹的建立演算法和預測沒有什麼區別。
5. CART樹演算法的剪枝
CART迴歸樹和CART分類樹的剪枝策略除了在度量損失的時候一個使用均方差,一個使用基尼係數,演算法基本完全一樣,這裡我們一起來講。
由於決策時演算法很容易對訓練集過擬合,而導致泛化能力差,為了解決這個問題,我們需要對CART樹進行剪枝,即類似於線性迴歸的正則化,來增加決策樹的泛化能力。但是,有很多的剪枝方法,我們應該這麼選擇呢?CART採用的辦法是後剪枝法,即先生成決策樹,然後產生所有可能的剪枝後的CART樹,然後使用交叉驗證來檢驗各種剪枝的效果,選擇泛化能力最好的剪枝策略。
也就是說,CART樹的剪枝演算法可以概括為兩步,第一步是從原始決策樹生成各種剪枝效果的決策樹,第二部是用交叉驗證來檢驗剪枝後的預測能力,選擇泛化預測能力最好的剪枝後的數作為最終的CART樹。
首先我們看看剪枝的損失函式度量,在剪枝的過程中,對於任意的一刻子樹T,其損失函式為:
$$C_{\alpha}(T_t) = C(T_t) + \alpha |T_t|$$
其中,$\alpha$為正則化引數,這和線性迴歸的正則化一樣。$C(T_t)$為訓練資料的預測誤差,分類樹是用基尼係數度量,迴歸樹是均方差度量。$|T_t|$是子樹T的葉子節點的數量。
當$\alpha = 0$時,即沒有正則化,原始的生成的CART樹即為最優子樹。當$\alpha = \infty$時,即正則化強度達到最大,此時由原始的生成的CART樹的根節點組成的單節點樹為最優子樹。當然,這是兩種極端情況。一般來說,$\alpha$越大,則剪枝剪的越厲害,生成的最優子樹相比原生決策樹就越偏小。對於固定的$\alpha$,一定存在使損失函式$C_{\alpha}(T)$最小的唯一子樹。
看過剪枝的損失函式度量後,我們再來看看剪枝的思路,對於位於節點t的任意一顆子樹$T_t$,如果沒有剪枝,它的損失是
$$C_{\alpha}(T_t) = C(T_t) + \alpha |T_t|$$
如果將其剪掉,僅僅保留根節點,則損失是
$$C_{\alpha}(T) = C(T) + \alpha$$
當$\alpha = 0$或者$\alpha $很小時,$C_{\alpha}(T_t) < C_{\alpha}(T)$ , 當$\alpha$增大到一定的程度時$$C_{\alpha}(T_t) = C_{\alpha}(T)$$。當$\alpha$繼續增大時不等式反向,也就是說,如果滿足下式:
$$\alpha = \frac{C(T)-C(T_t)}{|T_t|-1}$$
$T_t$和$T$有相同的損失函式,但是$T$節點更少,因此可以對子樹$T_t$進行剪枝,也就是將它的子節點全部剪掉,變為一個葉子節點$T$。
最後我們看看CART樹的交叉驗證策略。上面我們講到,可以計算出每個子樹是否剪枝的閾值$\alpha$,如果我們把所有的節點是否剪枝的值$\alpha$都計算出來,然後分別針對不同的$\alpha$所對應的剪枝後的最優子樹做交叉驗證。這樣就可以選擇一個最好的$\alpha$,有了這個$\alpha$,我們就可以用對應的最優子樹作為最終結果。
好了,有了上面的思路,我們現在來看看CART樹的剪枝演算法。
輸入是CART樹建立演算法得到的原始決策樹$T$。
輸出是最優決策子樹$T_\alpha$。
演算法過程如下:
1)初始化$\alpha_{min}= \infty$, 最優子樹集合$\omega=\{T\}$。
2)從葉子節點開始自下而上計算各內部節點t的訓練誤差損失函式$C_{\alpha}(T_t)$(迴歸樹為均方差,分類樹為基尼係數), 葉子節點數$|T_t|$,以及正則化閾值$\alpha= min\{\frac{C(T)-C(T_t)}{|T_t|-1}, \alpha_{min}\}$, 更新$\alpha_{min}= \alpha$
3) 得到所有節點的$\alpha$值的集合M。
4)從M中選擇最大的值$\alpha_k$,自上而下的訪問子樹t的內部節點,如果$\frac{C(T)-C(T_t)}{|T_t|-1} \leq \alpha_k$時,進行剪枝。並決定葉節點t的值。如果是分類樹,則是概率最高的類別,如果是迴歸樹,則是所有樣本輸出的均值。這樣得到$\alpha_k$對應的最優子樹$T_k$
5)最優子樹集合$\omega=\omega \cup T_k$, $M= M -\{\alpha_k\}$。
6) 如果M不為空,則回到步驟4。否則就已經得到了所有的可選最優子樹集合$\omega$.
7) 採用交叉驗證在$\omega$選擇最優子樹$T_\alpha$
6. CART演算法小結
上面我們對CART演算法做了一個詳細的介紹,CART演算法相比C4.5演算法的分類方法,採用了簡化的二叉樹模型,同時特徵選擇採用了近似的基尼係數來簡化計算。當然CART樹最大的好處是還可以做迴歸模型,這個C4.5沒有。下表給出了ID3,C4.5和CART的一個比較總結。希望可以幫助大家理解。
演算法 | 支援模型 | 樹結構 | 特徵選擇 | 連續值處理 | 缺失值處理 | 剪枝 |
ID3 | 分類 | 多叉樹 | 資訊增益 | 不支援 | 不支援 | 不支援 |
C4.5 | 分類 | 多叉樹 | 資訊增益比 | 支援 | 支援 | 支援 |
CART | 分類,迴歸 | 二叉樹 | 基尼係數,均方差 | 支援 | 支援 | 支援 |
看起來CART演算法高大上,那麼CART演算法還有沒有什麼缺點呢?有!主要的缺點我認為如下:
1)應該大家有注意到,無論是ID3, C4.5還是CART,在做特徵選擇的時候都是選擇最優的一個特徵來做分類決策,但是大多數,分類決策不應該是由某一個特徵決定的,而是應該由一組特徵決定的。這樣決策得到的決策樹更加準確。這個決策樹叫做多變數決策樹(multi-variate decision tree)。在選擇最優特徵的時候,多變數決策樹不是選擇某一個最優特徵,而是選擇最優的一個特徵線性組合來做決策。這個演算法的代表是OC1,這裡不多介紹。
2)如果樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過整合學習裡面的隨機森林之類的方法解決。
7. 決策樹演算法小結
終於到了最後的總結階段了,這裡我們不再糾結於ID3, C4.5和 CART,我們來看看決策樹演算法作為一個大類別的分類迴歸演算法的優缺點。這部分總結於scikit-learn的英文文件。
首先我們看看決策樹演算法的優點:
1)簡單直觀,生成的決策樹很直觀。
2)基本不需要預處理,不需要提前歸一化,處理缺失值。
3)使用決策樹預測的代價是$O(log_2m)$。 m為樣本數。
4)既可以處理離散值也可以處理連續值。很多演算法只是專注於離散值或者連續值。
5)可以處理多維度輸出的分類問題。
6)相比於神經網路之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
7)可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
8) 對於異常點的容錯能力好,健壯性高。
我們再看看決策樹演算法的缺點:
1)決策樹演算法非常容易過擬合,導致泛化能力不強。可以通過設定節點最少樣本數量和限制決策樹深度來改進。
2)決策樹會因為樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過整合學習之類的方法解決。
3)尋找最優的決策樹是一個NP難的問題,我們一般是通過啟發式方法,容易陷入區域性最優。可以通過整合學習之類的方法來改善。
4)有些比較複雜的關係,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關係可以換神經網路分類方法來解決。
5)如果某些特徵的樣本比例過大,生成決策樹容易偏向於這些特徵。這個可以通過調節樣本權重來改善。
以上就是決策樹的全部內容了,裡面有很多我個人思考的邏輯在,希望能對大家有所幫助,有錯誤的話請指正。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)