決策樹算法原理

轉載於:http://www.cnblogs.com/pinard/p/6050306.html (樓主總結的很好,就拿來主義了,不顧之後仍是多像樓主學習)html

   決策樹算法在機器學習中算是很經典的一個算法系列了。它既能夠做爲分類算法,也能夠做爲迴歸算法,同時也特別適合集成學習好比隨機森林。本文就對決策樹算法原理作一個總結,上篇對ID3, C4.5的算法思想作了總結,下篇重點對CART算法作一個詳細的介紹。決策樹根據一步步地屬性分類能夠將整個特徵空間進行劃分,從而區別出不一樣的分類樣本算法

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

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

    首先,咱們須要熟悉信息論中熵的概念。熵度量了事物的不肯定性,越不肯定的事物,它的熵就越大。具體的,隨機變量X的熵的表達式以下:機器學習

H(X)=i=1npilogpiH(X)=−∑i=1npilogpi

    其中n表明X的n種不一樣的離散取值。而pipi表明了X取值爲i的機率,log爲以2或者e爲底的對數。舉個例子,好比X有2個可能的取值,而這兩個取值各爲1/2時X的熵最大,此時X具備最大的不肯定性。值爲H(X)=(12log12+12log12)=log2H(X)=−(12log12+12log12)=log2。若是一個值機率大於1/2,另外一個值機率小於1/2,則不肯定性減小,對應的熵也會減小。好比一個機率1/3,一個機率2/3,則對應熵爲H(X)=(13log13+23log23)=log323log2<log2)H(X)=−(13log13+23log23)=log3−23log2<log2).函數

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

H(X,Y)=i=1np(xi,yi)logp(xi,yi)H(X,Y)=−∑i=1np(xi,yi)logp(xi,yi)

    有了聯合熵,又能夠獲得條件熵的表達式H(X|Y),條件熵相似於條件機率,它度量了咱們的X在知道Y之後剩下的不肯定性。表達式以下: 性能

H(X|Y)=i=1np(xi,yi)logp(xi|yi)=j=1np(yj)H(X|yj)H(X|Y)=−∑i=1np(xi,yi)logp(xi|yi)=∑j=1np(yj)H(X|yj) 

    好吧,繞了一大圈,終於能夠從新回到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)。測試

信息熵(Entropy)、信息增益(Information Gain)概念解釋

一、 信息熵:H(X) 描述X攜帶的信息量。 信息量越大(值變化越多),則越不肯定,越不容易被預測。優化

       對於拋硬幣問題,每次有2種狀況,信息熵爲1

       對於投骰子問題,每次有6中狀況,信息熵爲1.75

       下面爲公式:

                 

  其中log2(p)能夠理解爲p這個須要用幾個bit位表示。如p(x1)=1/2, p(x2)=1/4, p(x3)=1/8, p(x4)=1/8, 

      能夠用x1: 1, x2: 10, x3: 110, x4: 111表示,由於爲了讓平均的bit位最少,機率越大的bit爲設的越短。而-log2(p)正好對應bit位數。

      那麼H(X)能夠理解爲比特位的指望值。

 

  信息熵特色:(以機率和爲1爲前提哈)

  a) 不一樣類別的機率分佈越均勻,信息熵越大;

  b) 類別個數越多,信息熵越大;

  c) 信息熵越大,越不容易被預測;(變化個數多,變化之間區分小,則越不容易被預測)(對於肯定性問題,信息熵爲0;p=1; E=p*logp=0)

 

二、 信息增益IG(Y|X): 衡量一個屬性(x)區分樣本(y)的能力。 當新增一個屬性(x)時,信息熵H(Y)的變化大小即爲信息增益。 IG(Y|X)越大表示x越重要。

     條件熵:H(Y|X),當X條件下Y的信息熵     

           

     信息增益: IG(Y|X)=H(Y)-H(Y|X)

熵(entropy):在信息論和機率統計中,熵是表示隨機變量不肯定性的度量

條件熵(conditional entropy):表示在一直隨機變量X的條件下隨機變量Y的不肯定性度量。

信息增益(information gain)信息增益表示得知特徵X的信息而使得類Y的信息的不肯定性減小的程度。

信息增益比(information gain ratio):其信息增益g(D, A)與訓練數據集D關於特徵A的值的熵HA(D)之比

基尼指數(gini index):基尼指數Gini(D)表示集合D的不肯定性,基尼指數越大,樣本集合的不肯定性也就越大,這一點與熵類似。

2. 決策樹ID3算法的思路

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

    樣本D的熵爲: H(D)=(915log2915+615log2615)=0.971H(D)=−(915log2915+615log2615)=0.971

    樣本D在特徵下的條件熵爲: H(D|A)=515H(D1)+515H(D2)+515H(D3)H(D|A)=515H(D1)+515H(D2)+515H(D3)

                                                      =515(35log235+25log225)515(25log225+35log235)515(45log245+15log215)=0.888=−515(35log235+25log225)−515(25log225+35log235)−515(45log245+15log215)=0.888    

    對應的信息增益爲 I(D,A)=H(D)H(D|A)=0.083I(D,A)=H(D)−H(D|A)=0.083            

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

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

    算法的過程爲:

    1)初始化信息增益的閾值ϵϵ

    2)判斷樣本是否爲同一類輸出DiDi,若是是則返回單節點樹T。標記類別爲DiDi

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

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

    5) 若是AgAg的信息增益小於閾值ϵϵ,則返回單節點樹T,標記類別爲樣本中輸出類別D實例數最多的類別。

    6)不然,按特徵AgAg的不一樣取值AgiAgi將對應的樣本輸出D分紅不一樣的類別DiDi。每一個類別產生一個子節點。對應特徵值爲AgiAgi。返回增長了節點的數T。

    7)對於全部的子節點,令D=Di,A=A{Ag}D=Di,A=A−{Ag}遞歸調用2-6步,獲得子樹TiTi並返回。

 

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個,從小到大排列爲a1,a2,...,ama1,a2,...,am,則C4.5取相鄰兩樣本值的中位數,一共取得m-1個劃分點,其中第i個劃分點TiTi表示爲:Ti=ai+ai+12Ti=ai+ai+12。對於這m-1個點,分別計算以該點做爲二元分類點時的信息增益。選擇信息增益最大的點做爲該連續特徵的二元離散分類點。好比取到的增益最大的點爲atat,則小於atat的值爲類別1,大於atat的值爲類別2,這樣咱們就作到了連續特徵的離散化。要注意的是,與離散屬性不一樣的是,若是當前節點爲連續屬性,則該屬性後面還能夠參與子節點的產生選擇過程。

    對於第二個問題,信息增益做爲標準容易偏向於取值較多的特徵的問題。咱們引入一個信息增益比的變量IR(X,Y)IR(X,Y),它是信息增益和特徵熵的比值。表達式以下:

 

IR(D,A)=I(A,D)HA(D)IR(D,A)=I(A,D)HA(D)

 

    其中D爲樣本特徵輸出的集合,A爲樣本特徵,對於特徵熵HA(D)HA(D), 表達式以下:

 

HA(D)=i=1n|Di||D|log2|Di||D|HA(D)=−∑i=1n|Di||D|log2|Di||D|

 

    其中n爲特徵A的類別數, DiDi爲特徵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算法。

對於C4.5算法,咱們也提到了它的不足,好比模型是用較爲複雜的熵來度量,使用了相對較爲複雜的多叉樹,只能處理分類不能處理迴歸等。對於這些問題, CART算法大部分作了改進。CART算法也就是咱們下面的重點了。因爲CART算法能夠作迴歸,也能夠作分類,咱們分別加以介紹,先從CART分類樹算法開始,重點比較和C4.5算法的不一樣點。接着介紹CART迴歸樹算法,重點介紹和CART分類樹的不一樣點。而後咱們討論CART樹的建樹算法和剪枝算法,最後總結決策樹算法的優缺點。

1. CART分類樹算法的最優特徵選擇方法

    咱們知道,在ID3算法中咱們使用了信息增益來選擇特徵,信息增益大的優先選擇。在C4.5算法中,採用了信息增益比來選擇特徵,以減小信息增益容易選擇特徵值多的特徵的問題。可是不管是ID3仍是C4.5,都是基於信息論的熵模型的,這裏面會涉及大量的對數運算。能不能簡化模型同時也不至於徹底丟失熵模型的優勢呢?有!CART分類樹算法使用基尼係數來代替信息增益比,基尼係數表明了模型的不純度,基尼係數越小,則不純度越低,特徵越好。這和信息增益(比)是相反的

    具體的,在分類問題中,假設有K個類別,第k個類別的機率爲pkpk, 則基尼係數的表達式爲:

Gini(p)=k=1Kpk(1pk)=1k=1Kp2kGini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2

    若是是二類分類問題,計算就更加簡單了,若是屬於第一個樣本輸出的機率是p,則基尼係數的表達式爲:

Gini(p)=2p(1p)Gini(p)=2p(1−p)

    對於個給定的樣本D,假設有K個類別, 第k個類別的數量爲CkCk,則樣本D的基尼係數表達式爲:

Gini(D)=1k=1K(|Ck||D|)2Gini(D)=1−∑k=1K(|Ck||D|)2

    特別的,對於樣本D,若是根據特徵A的某個值a,把D分紅D1和D2兩部分,則在特徵A的條件下,D的基尼係數表達式爲:

Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)

    你們能夠比較下基尼係數表達式和熵模型的表達式,二次運算是否是比對數簡單不少?尤爲是二類分類的計算,更加簡單。可是簡單歸簡單,和熵模型的度量方式比,基尼係數對應的偏差有多大呢?對於二類分類,基尼係數和熵之半的曲線以下:

    從上圖能夠看出,基尼係數和熵之半的曲線很是接近,僅僅在45度角附近偏差稍大。所以,基尼係數能夠作爲熵模型的一個近似替代。而CART分類樹算法就是使用的基尼係數來選擇決策樹的特徵。同時,爲了進一步簡化,CART分類樹算法每次僅僅對某個特徵的值進行二分,而不是多分,這樣CART分類樹算法創建起來的是二叉樹,而不是多叉樹。這樣一能夠進一步簡化基尼係數的計算,二能夠創建一個更加優雅的二叉樹模型。

2. CART分類樹算法對於連續特徵和離散特徵處理的改進

    對於CART分類樹連續值的處理問題,其思想和C4.5是相同的,都是將連續的特徵離散化。惟一的區別在於在選擇劃分點時的度量方式不一樣,C4.5使用的是信息增益,則CART分類樹使用的是基尼係數

    具體的思路以下,好比m個樣本的連續特徵A有m個,從小到大排列爲a1,a2,...,ama1,a2,...,am,則CART算法取相鄰兩樣本值的中位數,一共取得m-1個劃分點,其中第i個劃分點TiTi表示爲:Ti=ai+ai+12Ti=ai+ai+12。對於這m-1個點,分別計算以該點做爲二元分類點時的基尼係數。選擇基尼係數最小的點做爲該連續特徵的二元離散分類點。好比取到的基尼係數最小的點爲atat,則小於atat的值爲類別1,大於atat的值爲類別2,這樣咱們就作到了連續特徵的離散化。要注意的是,與離散屬性不一樣的是,若是當前節點爲連續屬性,則該屬性後面還能夠參與子節點的產生選擇過程。

    對於CART分類樹離散值的處理問題,採用的思路是不停的二分離散特徵。

    回憶下ID3或者C4.5,若是某個特徵A被選取創建決策樹節點,若是它有A1,A2,A3三種類別,咱們會在決策樹上一下創建一個三叉的節點。這樣致使決策樹是多叉樹。可是CART分類樹使用的方法不一樣,他採用的是不停的二分,仍是這個例子,CART分類樹會考慮把A分紅{A1}{A2,A3}{A1}和{A2,A3}, {A2}{A1,A3}{A2}和{A1,A3}, {A3}{A1,A2}{A3}和{A1,A2}三種狀況,找到基尼係數最小的組合,好比{A2}{A1,A3}{A2}和{A1,A3},而後創建二叉樹節點,一個節點是A2對應的樣本,另外一個節點是{A1,A3}對應的節點。從描述能夠看出,若是離散特徵A有n個取值,則可能的組合有n(n-1)/2種。同時,因爲此次沒有把特徵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的均方差之和最小所對應的特徵和特徵值劃分點。表達式爲:

minA,s[minc1xiD1(A,s)(yic1)2+minc2xiD2(A,s)(yic2)2]min⏟A,s[min⏟c1∑xi∈D1(A,s)(yi−c1)2+min⏟c2∑xi∈D2(A,s)(yi−c2)2]

    其中,c1c1爲D1數據集的樣本輸出均值,c2c2爲D2數據集的樣本輸出均值。

    對於決策樹創建後作預測的方式,上面講到了CART分類樹採用葉子節點裏機率最大的類別做爲當前節點的預測類別。而回歸樹輸出不是類別,它採用的是用最終葉子的均值或者中位數來預測輸出結果。

    除了上面提到了之外,CART迴歸樹和CART分類樹的創建算法和預測沒有什麼區別。

5. CART樹算法的剪枝

    CART迴歸樹和CART分類樹的剪枝策略除了在度量損失的時候一個使用均方差,一個使用基尼係數,算法基本徹底同樣,這裏咱們一塊兒來說。

    因爲決策時算法很容易對訓練集過擬合,而致使泛化能力差,爲了解決這個問題,咱們須要對CART樹進行剪枝,即相似於線性迴歸的正則化,來增長決策樹的返回能力。可是,有不少的剪枝方法,咱們應該這麼選擇呢?

CART採用的辦法是後剪枝法,即先生成決策樹,而後產生全部可能的剪枝後的CART樹,而後使用交叉驗證來檢驗各類剪枝的效果,選擇泛化能力最好的剪枝策略

    也就是說,CART樹的剪枝算法能夠歸納爲兩步,第一步是從原始決策樹生成各類剪枝效果的決策樹,第二部是用交叉驗證來檢驗剪枝後的預測能力,選擇泛化預測能力最好的剪枝後的數做爲最終的CART樹。

    首先咱們看看剪枝的損失函數度量,在剪枝的過程當中,對於任意的一刻子樹T,其損失函數爲:

Cα(Tt)=C(Tt)+α|Tt|Cα(Tt)=C(Tt)+α|Tt|

    其中,αα爲正則化參數,這和線性迴歸的正則化同樣。C(Tt)C(Tt)爲訓練數據的預測偏差,分類樹是用基尼係數度量,迴歸樹是均方差度量。|Tt||Tt|是子樹T的葉子節點的數量。

    當α=0α=0時,即沒有正則化,原始的生成的CART樹即爲最優子樹。當α=α=∞時,即正則化強度達到最大,此時由原始的生成的CART樹的根節點組成的單節點樹爲最優子樹。固然,這是兩種極端狀況。通常來講,αα越大,則剪枝剪的越厲害,生成的最優子樹相比原生決策樹就越偏小。對於固定的αα,必定存在使損失函數Cα(T)Cα(T)最小的惟一子樹。

 

    看過剪枝的損失函數度量後,咱們再來看看剪枝的思路,對於位於節點t的任意一顆子樹TtTt,若是沒有剪枝,它的損失是

 

Cα(Tt)=C(Tt)+α|Tt|Cα(Tt)=C(Tt)+α|Tt|

 

    若是將其剪掉,僅僅保留根節點,則損失是

 

Cα(T)=C(T)+αCα(T)=C(T)+α

 

 

    當α=0α=0或者αα很小時,Cα(Tt)<Cα(T)Cα(Tt)<Cα(T) , 當αα增大到必定的程度時

Cα(T)=C(T)+αCα(T)=C(T)+α

。當αα繼續增大時不等式反向,也就是說,若是知足下式:

 

 

α=C(T)C(Tt)|Tt|1α=C(T)−C(Tt)|Tt|−1

 

    TtTt和TT有相同的損失函數,可是TT節點更少,所以能夠對子樹TtTt進行剪枝,也就是將它的子節點所有剪掉,變爲一個葉子節點TT。

 

    最後咱們看看CART樹的交叉驗證策略。上面咱們講到,能夠計算出每一個子樹是否剪枝的閾值αα,若是咱們把全部的節點是否剪枝的值αα都計算出來,而後分別針對不一樣的αα所對應的剪枝後的最優子樹作交叉驗證。這樣就能夠選擇一個最好的αα,有了這個αα,咱們就能夠用對應的最優子樹做爲最終結果。

 

    好了,有了上面的思路,咱們如今來看看CART樹的剪枝算法。

    輸入是CART樹創建算法獲得的原始決策樹TT。

    輸出是最優決策子樹TαTα。

    算法過程以下:

    1)初始化αmin=αmin=∞, 最優子樹集合ω={T}ω={T}。

    2)從葉子節點開始自下而上計算各內部節點t的訓練偏差損失函數Cα(Tt)Cα(Tt)(迴歸樹爲均方差,分類樹爲基尼係數), 葉子節點數|Tt||Tt|,以及正則化閾值α=min{C(T)C(Tt)|Tt|1,αmin}α=min{C(T)−C(Tt)|Tt|−1,αmin}, 更新αmin=ααmin=α

    3) 獲得全部節點的αα值的集合M。

    4)從M中選擇最大的值αkαk,自上而下的訪問子樹t的內部節點,若是C(T)C(Tt)|Tt|1αkC(T)−C(Tt)|Tt|−1≤αk時,進行剪枝。並決定葉節點t的值。若是是分類樹,則是機率最高的類別,若是是迴歸樹,則是全部樣本輸出的均值。這樣獲得αkαk對應的最優子樹TkTk

    5)最優子樹集合ω=ωTkω=ω∪Tk, M=M{αk}M=M−{αk}。

    6) 若是M不爲空,則回到步驟4。不然就已經獲得了全部的可選最優子樹集合ωω.

    7) 採用交叉驗證在ωω選擇最優子樹Tα

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(log2m)O(log2m)。 m爲樣本數。

    4)既能夠處理離散值也能夠處理連續值。不少算法只是專一於離散值或者連續值。

    5)能夠處理多維度輸出的分類問題。

    6)相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上能夠獲得很好的解釋

    7)能夠交叉驗證的剪枝來選擇模型,從而提升泛化能力。

    8) 對於異常點的容錯能力好,健壯性高。

    咱們再看看決策樹算法的缺點:

    1)決策樹算法很是容易過擬合,致使泛化能力不強。能夠經過設置節點最少樣本數量和限制決策樹深度來改進。

    2)決策樹會由於樣本發生一點點的改動,就會致使樹結構的劇烈改變。這個能夠經過集成學習之類的方法解決。

    3)尋找最優的決策樹是一個NP難的問題,咱們通常是經過啓發式方法,容易陷入局部最優。能夠經過集成學習之類的方法來改善。

    4)有些比較複雜的關係,決策樹很難學習,好比異或。這個就沒有辦法了,通常這種關係能夠換神經網絡分類方法來解決。

    5)若是某些特徵的樣本比例過大,生成決策樹容易偏向於這些特徵。這個能夠經過調節樣本權重來改善。 

    性能良好的決策樹的選擇標準是什麼?

    性能良好的決策樹的選擇標準是一個與訓練數據矛盾較小的決策樹,同時具備很好的泛化能力。言外之意就是說,好的決策樹不只對訓練樣本有着很好的分類效果,對於測試集也有着較低的偏差率。

    ID三、C4.5&CART

    其實不一樣的決策樹學習算法只是它們選擇特徵的依據不一樣,決策樹的生成過程都是同樣的(根據當前環境對特徵進行貪婪的選擇)。

    ID3算法的核心是在決策樹各個節點上應用信息增益準則選擇特徵,每一次都選擇使得信息增益最大的特徵進行分裂,遞歸地構建決策樹。

    ID3算法以信息增益做爲劃分訓練數據集的特徵,有一個致命的缺點。選擇取值比較多的特徵每每會具備較大的信息增益,因此ID3偏向於選擇取值較多的特徵。

    針對ID3算法的不足,C4.5算法根據信息增益比來選擇特徵,對這一問題進行了校訂。

    CART指的是分類迴歸樹,它既能夠用來分類,又能夠被用來進行迴歸。CART用做迴歸樹時用平方偏差最小化做爲選擇特徵的準則,用做分類樹時採用基尼指數最小化原則,進行特徵選擇,遞歸地生成二叉樹。

    決策樹的剪枝:咱們知道,決策樹在生成的過程當中採用了貪婪的方法來選擇特徵,從而達到對訓練數據進行更好地擬合(其實從極端角度來看,決策樹對訓練集的擬合能夠達到零偏差)。決策樹的剪枝是爲了簡化模型的複雜度,防止決策樹的過擬合問題。具體的決策樹剪枝策略能夠參見李航的《統計學習方法》。

參考:http://www.cnblogs.com/maybe2030/p/4734645.html

     http://blog.csdn.net/ichuzhen/article/details/53981715

相關文章
相關標籤/搜索