決策樹算法原理(上)


    決策樹算法在機器學習中算是很經典的一個算法系列了。它既可以作為分類算法,也可以作為回歸算法,同時也特別適合集成學習比如隨機森林。本文就對決策樹算法原理做一個總結,上篇對ID3, C4.5的算法思想做了總結,下篇重點對CART算法做一個詳細的介紹。選擇CART做重點介紹的原因是scikit-learn使用了優化版的CART算法作為其決策樹算法的實現。

1. 決策樹ID3算法的信息論基礎

    機器學習算法其實很古老,作為一個碼農經常會不停的敲if, else if, else,其實就已經在用到決策樹的思想了。只是你有沒有想過,有這么多條件,用哪個條件特征先做if,哪個條件特征后做if比較優呢?怎么准確的定量選擇這個標准就是決策樹機器學習算法的關鍵了。1970年代,一個叫昆蘭的大牛找到了用信息論中的熵來度量決策樹的決策選擇過程,方法一出,它的簡潔和高效就引起了轟動,昆蘭把這個算法叫做ID3。下面我們就看看ID3算法是怎么選擇特征的。

    首先,我們需要熟悉信息論中熵的概念。熵度量了事物的不確定性,越不確定的事物,它的熵就越大。具體的,隨機變量X的熵的表達式如下:

$$H(X) = -\sum\limits_{i=1}^{n}p_i logp_i$$

    其中n代表X的n種不同的離散取值。而$p_i$代表了X取值為i的概率,log為以2或者e為底的對數。舉個例子,比如X有2個可能的取值,而這兩個取值各為1/2時X的熵最大,此時X具有最大的不確定性。值為$H(X) = -(\frac{1}{2}log\frac{1}{2} + \frac{1}{2}log\frac{1}{2}) = log2$。如果一個值概率大於1/2,另一個值概率小於1/2,則不確定性減少,對應的熵也會減少。比如一個概率1/3,一個概率2/3,則對應熵為$H(X) = -(\frac{1}{3}log\frac{1}{3} + \frac{2}{3}log\frac{2}{3}) = log3 - \frac{2}{3}log2 < log2)$.

    熟悉了一個變量X的熵,很容易推廣到多個個變量的聯合熵,這里給出兩個變量X和Y的聯合熵表達式:

$$H(X,Y) = -\sum\limits_{x_i \in X}\sum\limits_{y_i \in Y}p(x_i,y_i)logp(x_i,y_i)$$

    有了聯合熵,又可以得到條件熵的表達式H(X|Y),條件熵類似於條件概率,它度量了我們的X在知道Y以后剩下的不確定性。表達式如下:

$$H(X|Y) = -\sum\limits_{x_i \in X}\sum\limits_{y_i \in Y}p(x_i,y_i)logp(x_i|y_i) = \sum\limits_{j=1}^{n}p(y_j)H(X|y_j) $$

    好吧,繞了一大圈,終於可以重新回到ID3算法了。我們剛才提到H(X)度量了X的不確定性,條件熵H(X|Y)度量了我們在知道Y以后X剩下的不確定性,那么H(X)-H(X|Y)呢?從上面的描述大家可以看出,它度量了X在知道Y以后不確定性減少程度,這個度量我們在信息論中稱為互信息,,記為I(X,Y)。在決策樹ID3算法中叫做信息增益。ID3算法就是用信息增益來判斷當前節點應該用什么特征來構建決策樹。信息增益大,則越適合用來分類。

    上面一堆概念,大家估計比較暈,用下面這個圖很容易明白他們的關系。左邊的橢圓代表H(X),右邊的橢圓代表H(Y),中間重合的部分就是我們的互信息或者信息增益I(X,Y), 左邊的橢圓去掉重合部分就是H(X|Y),右邊的橢圓去掉重合部分就是H(Y|X)。兩個橢圓的並就是H(X,Y)。

2. 決策樹ID3算法的思路

    上面提到ID3算法就是用信息增益大小來判斷當前節點應該用什么特征來構建決策樹,用計算出的信息增益最大的特征來建立決策樹的當前節點。這里我們舉一個信息增益計算的具體的例子。比如我們有15個樣本D,輸出為0或者1。其中有9個輸出為1, 6個輸出為0。 樣本中有個特征A,取值為A1,A2和A3。在取值為A1的樣本的輸出中,有3個輸出為1, 2個輸出為0,取值為A2的樣本輸出中,2個輸出為1,3個輸出為0, 在取值為A3的樣本中,4個輸出為1,1個輸出為0.

    樣本D的熵為: $H(D) = -(\frac{9}{15}log_2\frac{9}{15} + \frac{6}{15}log_2\frac{6}{15}) = 0.971$

    樣本D在特征下的條件熵為: $H(D|A) = \frac{5}{15}H(D1) + \frac{5}{15}H(D2) + \frac{5}{15}H(D3)$

                                                      $ = -\frac{5}{15}(\frac{3}{5}log_2\frac{3}{5} + \frac{2}{5}log_2\frac{2}{5}) - \frac{5}{15}(\frac{2}{5}log_2\frac{2}{5} + \frac{3}{5}log_2\frac{3}{5}) -\frac{5}{15}(\frac{4}{5}log_2\frac{4}{5} + \frac{1}{5}log_2\frac{1}{5}) = 0.888 $    

    對應的信息增益為 $I(D,A) = H(D) - H(D|A) = 0.083 $            

    下面我們看看具體算法過程大概是怎么樣的。

    輸入的是m個樣本,樣本輸出集合為D,每個樣本有n個離散特征,特征集合即為A,輸出為決策樹T。

    算法的過程為:

    1)初始化信息增益的閾值$\epsilon$

    2)判斷樣本是否為同一類輸出$D_i$,如果是則返回單節點樹T。標記類別為$D_i$

    3) 判斷特征是否為空,如果是則返回單節點樹T,標記類別為樣本中輸出類別D實例數最多的類別。

    4)計算A中的各個特征(一共n個)對輸出D的信息增益,選擇信息增益最大的特征$A_g$

    5) 如果$A_g$的信息增益小於閾值$\epsilon$,則返回單節點樹T,標記類別為樣本中輸出類別D實例數最多的類別。

    6)否則,按特征$A_g$的不同取值$A_{gi}$將對應的樣本輸出D分成不同的類別$D_i$。每個類別產生一個子節點。對應特征值為$A_{gi}$。返回增加了節點的數T。

    7)對於所有的子節點,令$D=D_i,  A= A-\{A_g\}$遞歸調用2-6步,得到子樹$T_i$並返回。

 

3. 決策樹ID3算法的不足

    ID3算法雖然提出了新思路,但是還是有很多值得改進的地方。  

    a)ID3沒有考慮連續特征,比如長度,密度都是連續值,無法在ID3運用。這大大限制了ID3的用途。

    b)ID3采用信息增益大的特征優先建立決策樹的節點。很快就被人發現,在相同條件下,取值比較多的特征比取值少的特征信息增益大。比如一個變量有2個值,各為1/2,另一個變量為3個值,各為1/3,其實他們都是完全不確定的變量,但是取3個值的比取2個值的信息增益大。如果校正這個問題呢?

    c) ID3算法對於缺失值的情況沒有做考慮

    d) 沒有考慮過擬合的問題

    ID3 算法的作者昆蘭基於上述不足,對ID3算法做了改進,這就是C4.5算法,也許你會問,為什么不叫ID4,ID5之類的名字呢?那是因為決策樹太火爆,他的ID3一出來,別人二次創新,很快 就占了ID4, ID5,所以他另辟蹊徑,取名C4.0算法,后來的進化版為C4.5算法。下面我們就來聊下C4.5算法

4. 決策樹C4.5算法的改進

    上一節我們講到ID3算法有四個主要的不足,一是不能處理連續特征,第二個就是用信息增益作為標准容易偏向於取值較多的特征,最后兩個是缺失值處理的問和過擬合問題。昆蘭在C4.5算法中改進了上述4個問題。

    對於第一個問題,不能處理連續特征, C4.5的思路是將連續的特征離散化。比如m個樣本的連續特征A有m個,從小到大排列為${a_1,a_2,...,a_m}$,則C4.5取相鄰兩樣本值的平均數,一共取得m-1個划分點,其中第i個划分點$T_i表示$為:$T_i = \frac{a_i+a_{i+1}}{2}$。對於這m-1個點,分別計算以該點作為二元分類點時的信息增益。選擇信息增益最大的點作為該連續特征的二元離散分類點。比如取到的增益最大的點為$a_t$,則小於$a_t$的值為類別1,大於$a_t$的值為類別2,這樣我們就做到了連續特征的離散化。要注意的是,與離散屬性不同的是,如果當前節點為連續屬性,則該屬性后面還可以參與子節點的產生選擇過程。

    對於第二個問題,信息增益作為標准容易偏向於取值較多的特征的問題。我們引入一個信息增益比的變量$I_R(X,Y)$,它是信息增益和特征熵的比值。表達式如下:

$$I_R(D,A) = \frac{I(A,D)}{H_A(D)}$$

    其中D為樣本特征輸出的集合,A為樣本特征,對於特征熵$H_A(D)$, 表達式如下:

$$H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}$$

    其中n為特征A的類別數, $D_i$為特征A的第i個取值對應的樣本個數。$|D|$為樣本個數。

    特征數越多的特征對應的特征熵越大,它作為分母,可以校正信息增益容易偏向於取值較多的特征的問題。

    對於第三個缺失值處理的問題,主要需要解決的是兩個問題,一是在樣本某些特征缺失的情況下選擇划分的屬性,二是選定了划分屬性,對於在該屬性上缺失特征的樣本的處理。

    對於第一個子問題,對於某一個有缺失特征值的特征A。C4.5的思路是將數據分成兩部分,對每個樣本設置一個權重(初始可以都為1),然后划分數據,一部分是有特征值A的數據D1,另一部分是沒有特征A的數據D2. 然后對於沒有缺失特征A的數據集D1來和對應的A特征的各個特征值一起計算加權重后的信息增益比,最后乘上一個系數,這個系數是無特征A缺失的樣本加權后所占加權總樣本的比例。

    對於第二個子問題,可以將缺失特征的樣本同時划分入所有的子節點,不過將該樣本的權重按各個子節點樣本的數量比例來分配。比如缺失特征A的樣本a之前權重為1,特征A有3個特征值A1,A2,A3。 3個特征值對應的無缺失A特征的樣本個數為2,3,4.則a同時划分入A1,A2,A3。對應權重調節為2/9,3/9, 4/9。

 

    對於第4個問題,C4.5引入了正則化系數進行初步的剪枝。具體方法這里不討論。下篇講CART的時候會詳細討論剪枝的思路。

    除了上面的4點,C4.5和ID的思路區別不大。

    

5. 決策樹C4.5算法的不足與思考

    C4.5雖然改進或者改善了ID3算法的幾個主要的問題,仍然有優化的空間。

    1)由於決策樹算法非常容易過擬合,因此對於生成的決策樹必須要進行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有優化的空間。思路主要是兩種,一種是預剪枝,即在生成決策樹的時候就決定是否剪枝。另一個是后剪枝,即先生成決策樹,再通過交叉驗證來剪枝。后面在下篇講CART樹的時候我們會專門講決策樹的減枝思路,主要采用的是后剪枝加上交叉驗證選擇最合適的決策樹。

    2)C4.5生成的是多叉樹,即一個父節點可以有多個節點。很多時候,在計算機中二叉樹模型會比多叉樹運算效率高。如果采用二叉樹,可以提高效率。

    3)C4.5只能用於分類,如果能將決策樹用於回歸的話可以擴大它的使用范圍。

    4)C4.5由於使用了熵模型,里面有大量的耗時的對數運算,如果是連續值還有大量的排序運算。如果能夠加以模型簡化可以減少運算強度但又不犧牲太多准確性的話,那就更好了。

 

    這4個問題在CART樹里面部分加以了改進。所以目前如果不考慮集成學習話,在普通的決策樹算法里,CART算法算是比較優的算法了。scikit-learn的決策樹使用的也是CART算法。在下篇里我們會重點聊下CART算法的主要改進思路,上篇就到這里。下篇請看決策樹算法原理(下)

 

(歡迎轉載,轉載請注明出處。歡迎溝通交流: liujianping-ok@163.com) 

   


免責聲明!

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



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