決策樹算法原理(上)

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

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)\).post

    熟悉了一個變量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之後剩下的不肯定性。表達式以下:url

\[ 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)  \]spa

    好吧,繞了一大圈,終於能夠從新回到ID3算法了。咱們剛纔提到H(X)度量了X的不肯定性,條件熵H(X|Y)度量了咱們在知道Y之後X剩下的不肯定性,那麼H(X)-H(X|Y)呢?從上面的描述你們能夠看出,它度量了X在知道Y之後不肯定性減小程度,這個度量咱們在信息論中稱爲互信息,,記爲I(X,Y)。在決策樹ID3算法中叫作信息增益。ID3算法就是用信息增益來判斷當前節點應該用什麼特徵來構建決策樹。信息增益大,則越適合用來分類。3d

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

2、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、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算法的主要改進思路,上篇就到這裏。下篇請看決策樹算法原理(下)

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索