決策樹演算法原理(上)

劉建平Pinard發表於2016-11-10

    決策樹演算法在機器學習中算是很經典的一個演算法系列了。它既可以作為分類演算法,也可以作為迴歸演算法,同時也特別適合整合學習比如隨機森林。本文就對決策樹演算法原理做一個總結,上篇對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_{i=1}^{n}p(x_i,y_i)logp(x_i,y_i)$$

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

$$H(X|Y) = -\sum\limits_{i=1}^{n}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) 

   

相關文章