CART算法(转)
來源:http://www.cnblogs.com/pinard/p/6053344.html
作者:劉建平Pinard
對(duì)于C4.5算法,我們也提到了它的不足,比如模型是用較為復(fù)雜的熵來度量,使用了相對(duì)較為復(fù)雜的多叉樹,只能處理分類不能處理回歸等。對(duì)于這些問題, CART算法大部分做了改進(jìn)。CART算法也就是我們下面的重點(diǎn)了。由于CART算法可以做回歸,也可以做分類,我們分別加以介紹,先從CART分類樹算法開始,重點(diǎn)比較和C4.5算法的不同點(diǎn)。接著介紹CART回歸樹算法,重點(diǎn)介紹和CART分類樹的不同點(diǎn)。然后我們討論CART樹的建樹算法和剪枝算法,最后總結(jié)決策樹算法的優(yōu)缺點(diǎn)。
1.CART(Classification And Regression Tree)分類回歸樹算法的最優(yōu)特征選擇方法
我們知道,在ID3算法中我們使用了信息增益來選擇特征,信息增益大的優(yōu)先選擇。在C4.5算法中,采用了信息增益比來選擇特征,以減少信息增益容易選擇特征值多的特征的問題。但是無論是ID3還是C4.5,都是基于信息論的熵模型的,這里面會(huì)涉及大量的對(duì)數(shù)運(yùn)算。能不能簡(jiǎn)化模型同時(shí)也不至于完全丟失熵模型的優(yōu)點(diǎn)呢?有!CART分類樹算法使用基尼系數(shù)來代替信息增益比,基尼系數(shù)代表了模型的不純度,基尼系數(shù)越小,則不純度越低,特征越好。這和信息增益(比)是相反的。
具體的,在分類問題中,假設(shè)有K個(gè)類別,第k個(gè)類別的概率為pkpk, 則基尼系數(shù)的表達(dá)式為:
Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kp2kGini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2
如果是二類分類問題,計(jì)算就更加簡(jiǎn)單了,如果屬于第一個(gè)樣本輸出的概率是p,則基尼系數(shù)的表達(dá)式為:
Gini(p)=2p(1−p)Gini(p)=2p(1−p)
對(duì)于個(gè)給定的樣本D,假設(shè)有K個(gè)類別, 第k個(gè)類別的數(shù)量為CkCk,則樣本D的基尼系數(shù)表達(dá)式為:
Gini(D)=1−∑k=1K(|Ck||D|)2Gini(D)=1−∑k=1K(|Ck||D|)2
特別的,對(duì)于樣本D,如果根據(jù)特征A的某個(gè)值a,把D分成D1和D2兩部分,則在特征A的條件下,D的基尼系數(shù)表達(dá)式為:
Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)
大家可以比較下基尼系數(shù)表達(dá)式和熵模型的表達(dá)式,二次運(yùn)算是不是比對(duì)數(shù)簡(jiǎn)單很多?尤其是二類分類的計(jì)算,更加簡(jiǎn)單。但是簡(jiǎn)單歸簡(jiǎn)單,和熵模型的度量方式比,基尼系數(shù)對(duì)應(yīng)的誤差有多大呢?對(duì)于二類分類,基尼系數(shù)和熵之半的曲線如下:
從上圖可以看出,基尼系數(shù)和熵之半的曲線非常接近,僅僅在45度角附近誤差稍大。因此,基尼系數(shù)可以做為熵模型的一個(gè)近似替代。而CART分類樹算法就是使用的基尼系數(shù)來選擇決策樹的特征。同時(shí),為了進(jìn)一步簡(jiǎn)化,CART分類樹算法每次僅僅對(duì)某個(gè)特征的值進(jìn)行二分,而不是多分,這樣CART分類樹算法建立起來的是二叉樹,而不是多叉樹。這樣一可以進(jìn)一步簡(jiǎn)化基尼系數(shù)的計(jì)算,二可以建立一個(gè)更加優(yōu)雅的二叉樹模型。
2.CART分類樹算法對(duì)于連續(xù)特征和離散特征處理的改進(jìn)
對(duì)于CART分類樹連續(xù)值的處理問題,其思想和C4.5是相同的,都是將連續(xù)的特征離散化。唯一的區(qū)別在于在選擇劃分點(diǎn)時(shí)的度量方式不同,C4.5使用的是信息增益,則CART分類樹使用的是基尼系數(shù)。
具體的思路如下,比如m個(gè)樣本的連續(xù)特征A有m個(gè),從小到大排列為a1,a2,...,ama1,a2,...,am,則CART算法取相鄰兩樣本值的中位數(shù),一共取得m-1個(gè)劃分點(diǎn),其中第i個(gè)劃分點(diǎn)Ti表示Ti表示為:Ti=ai+ai+12Ti=ai+ai+12。對(duì)于這m-1個(gè)點(diǎn),分別計(jì)算以該點(diǎn)作為二元分類點(diǎn)時(shí)的基尼系數(shù)。選擇基尼系數(shù)最小的點(diǎn)作為該連續(xù)特征的二元離散分類點(diǎn)。比如取到的基尼系數(shù)最小的點(diǎn)為atat,則小于atat的值為類別1,大于atat的值為類別2,這樣我們就做到了連續(xù)特征的離散化。要注意的是,與離散屬性不同的是,如果當(dāng)前節(jié)點(diǎn)為連續(xù)屬性,則該屬性后面還可以參與子節(jié)點(diǎn)的產(chǎn)生選擇過程。
對(duì)于CART分類樹離散值的處理問題,采用的思路是不停的二分離散特征。
回憶下ID3或者C4.5,如果某個(gè)特征A被選取建立決策樹節(jié)點(diǎn),如果它有A1,A2,A3三種類別,我們會(huì)在決策樹上一下建立一個(gè)三叉的節(jié)點(diǎn)。這樣導(dǎo)致決策樹是多叉樹。但是CART分類樹使用的方法不同,他采用的是不停的二分,還是這個(gè)例子,CART分類樹會(huì)考慮把A分成{A1}和{A2,A3}{A1}和{A2,A3},{A2}和{A1,A3}{A2}和{A1,A3},{A3}和{A1,A2}{A3}和{A1,A2}三種情況,找到基尼系數(shù)最小的組合,比如{A2}和{A1,A3}{A2}和{A1,A3},然后建立二叉樹節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)是A2對(duì)應(yīng)的樣本,另一個(gè)節(jié)點(diǎn)是{A1,A3}對(duì)應(yīng)的節(jié)點(diǎn)。同時(shí),由于這次沒有把特征A的取值完全分開,后面我們還有機(jī)會(huì)在子節(jié)點(diǎn)繼續(xù)選擇到特征A來劃分A1和A3。這和ID3或者C4.5不同,在ID3或者C4.5的一棵子樹中,離散特征只會(huì)參與一次節(jié)點(diǎn)的建立。
3. CART分類樹建立算法的具體流程
上面介紹了CART算法的一些和C4.5不同之處,下面我們看看CART分類樹建立算法的具體流程,之所以加上了建立,是因?yàn)镃ART樹算法還有獨(dú)立的剪枝算法這一塊,這塊我們?cè)诘?節(jié)講。
算法輸入是訓(xùn)練集D,基尼系數(shù)的閾值,樣本個(gè)數(shù)閾值。
輸出是決策樹T。
我們的算法從根節(jié)點(diǎn)開始,用訓(xùn)練集遞歸的建立CART樹。
1) 對(duì)于當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)集為D,如果樣本個(gè)數(shù)小于閾值或者沒有特征,則返回決策子樹,當(dāng)前節(jié)點(diǎn)停止遞歸。
2) 計(jì)算樣本集D的基尼系數(shù),如果基尼系數(shù)小于閾值,則返回決策樹子樹,當(dāng)前節(jié)點(diǎn)停止遞歸。
3) 計(jì)算當(dāng)前節(jié)點(diǎn)現(xiàn)有的各個(gè)特征的各個(gè)特征值對(duì)數(shù)據(jù)集D的基尼系數(shù),對(duì)于離散值和連續(xù)值的處理方法和基尼系數(shù)的計(jì)算見第二節(jié)。缺失值的處理方法和上篇的C4.5算法里描述的相同。
4) 在計(jì)算出來的各個(gè)特征的各個(gè)特征值對(duì)數(shù)據(jù)集D的基尼系數(shù)中,選擇基尼系數(shù)最小的特征A和對(duì)應(yīng)的特征值a。根據(jù)這個(gè)最優(yōu)特征和最優(yōu)特征值,把數(shù)據(jù)集劃分成兩部分D1和D2,同時(shí)建立當(dāng)前節(jié)點(diǎn)的左右節(jié)點(diǎn),做節(jié)點(diǎn)的數(shù)據(jù)集D為D1,右節(jié)點(diǎn)的數(shù)據(jù)集D為D2.
5) 對(duì)左右的子節(jié)點(diǎn)遞歸的調(diào)用1-4步,生成決策樹。
對(duì)于生成的決策樹做預(yù)測(cè)的時(shí)候,假如測(cè)試集里的樣本A落到了某個(gè)葉子節(jié)點(diǎn),而節(jié)點(diǎn)里有多個(gè)訓(xùn)練樣本。則對(duì)于A的類別預(yù)測(cè)采用的是這個(gè)葉子節(jié)點(diǎn)里概率最大的類別。
4. CART回歸樹建立算法
CART回歸樹和CART分類樹的建立算法大部分是類似的,所以這里我們只討論CART回歸樹和CART分類樹的建立算法不同的地方。
首先,我們要明白,什么是回歸樹,什么是分類樹。兩者的區(qū)別在于樣本輸出,如果樣本輸出是離散值,那么這是一顆分類樹。如果果樣本輸出是連續(xù)值,那么那么這是一顆回歸樹。
除了概念的不同,CART回歸樹和CART分類樹的建立和預(yù)測(cè)的區(qū)別主要有下面兩點(diǎn):
1)連續(xù)值的處理方法不同
2)決策樹建立后做預(yù)測(cè)的方式不同。
對(duì)于連續(xù)值的處理,我們知道CART分類樹采用的是用基尼系數(shù)的大小來度量特征的各個(gè)劃分點(diǎn)的優(yōu)劣情況。這比較適合分類模型,但是對(duì)于回歸模型,我們使用了常見的均方差的度量方式,CART回歸樹的度量目標(biāo)是,對(duì)于任意劃分特征A,對(duì)應(yīng)的任意劃分點(diǎn)s兩邊劃分成的數(shù)據(jù)集D1和D2,求出使D1和D2各自集合的均方差最小,同時(shí)D1和D2的均方差之和最小所對(duì)應(yīng)的特征和特征值劃分點(diǎn)。表達(dá)式為:
min??????A,s[min??????c1∑xi∈D1(A,s)(yi−c1)2+min??????c2∑xi∈D2(A,s)(yi−c2)2]min?A,s[min?c1∑xi∈D1(A,s)(yi−c1)2+min?c2∑xi∈D2(A,s)(yi−c2)2]
其中,c1c1為D1數(shù)據(jù)集的樣本輸出均值,c2c2為D2數(shù)據(jù)集的樣本輸出均值。
對(duì)于決策樹建立后做預(yù)測(cè)的方式,上面講到了CART分類樹采用葉子節(jié)點(diǎn)里概率最大的類別作為當(dāng)前節(jié)點(diǎn)的預(yù)測(cè)類別。而回歸樹輸出不是類別,它采用的是用最終葉子的均值或者中位數(shù)來預(yù)測(cè)輸出結(jié)果。
除了上面提到了以外,CART回歸樹和CART分類樹的建立算法和預(yù)測(cè)沒有什么區(qū)別。
5. CART樹算法的剪枝
CART回歸樹和CART分類樹的剪枝策略除了在度量損失的時(shí)候一個(gè)使用均方差,一個(gè)使用基尼系數(shù),算法基本完全一樣,這里我們一起來講。
由于決策時(shí)算法很容易對(duì)訓(xùn)練集過擬合,而導(dǎo)致泛化能力差,為了解決這個(gè)問題,我們需要對(duì)CART樹進(jìn)行剪枝,即類似于線性回歸的正則化,來增加決策樹的返回能力。但是,有很多的剪枝方法,我們應(yīng)該這么選擇呢?CART采用的辦法是后剪枝法,即先生成決策樹,然后產(chǎn)生所有可能的剪枝后的CART樹,然后使用交叉驗(yàn)證來檢驗(yàn)各種剪枝的效果,選擇泛化能力最好的剪枝策略。
也就是說,CART樹的剪枝算法可以概括為兩步,第一步是從原始決策樹生成各種剪枝效果的決策樹,第二部是用交叉驗(yàn)證來檢驗(yàn)剪枝后的預(yù)測(cè)能力,選擇泛化預(yù)測(cè)能力最好的剪枝后的數(shù)作為最終的CART樹。
首先我們看看剪枝的損失函數(shù)度量,在剪枝的過程中,對(duì)于任意的一刻子樹T,其損失函數(shù)為:
Cα(Tt)=C(Tt)+α|Tt|Cα(Tt)=C(Tt)+α|Tt|
其中,αα為正則化參數(shù),這和線性回歸的正則化一樣。C(Tt)C(Tt)為訓(xùn)練數(shù)據(jù)的預(yù)測(cè)誤差,分類樹是用基尼系數(shù)度量,回歸樹是均方差度量。|Tt||Tt|是子樹T的葉子節(jié)點(diǎn)的數(shù)量。
當(dāng)α=0α=0時(shí),即沒有正則化,原始的生成的CART樹即為最優(yōu)子樹。當(dāng)α=∞α=∞時(shí),即正則化強(qiáng)度達(dá)到最大,此時(shí)由原始的生成的CART樹的根節(jié)點(diǎn)組成的單節(jié)點(diǎn)樹為最優(yōu)子樹。當(dāng)然,這是兩種極端情況。一般來說,αα越大,則剪枝剪的越厲害,生成的最優(yōu)子樹相比原生決策樹就越偏小。對(duì)于固定的αα,一定存在使損失函數(shù)Cα(T)Cα(T)最小的唯一子樹。
看過剪枝的損失函數(shù)度量后,我們?cè)賮砜纯醇糁Φ乃悸罚瑢?duì)于位于節(jié)點(diǎn)t的任意一顆子樹TtTt,如果沒有剪枝,它的損失是
Cα(Tt)=C(Tt)+α|Tt|Cα(Tt)=C(Tt)+α|Tt|
如果將其剪掉,僅僅保留根節(jié)點(diǎn),則損失是
Cα(T)=C(T)+αCα(T)=C(T)+α
當(dāng)α=0α=0或者αα很小時(shí),Cα(Tt)<Cα(T)Cα(Tt)<Cα(T), 當(dāng)αα增大到一定的程度時(shí)
Cα(T)=C(T)+αCα(T)=C(T)+α
。當(dāng)αα繼續(xù)增大時(shí)不等式反向,也就是說,如果滿足下式:
α=C(T)−C(Tt)|Tt|−1α=C(T)−C(Tt)|Tt|−1
TtTt和TT有相同的損失函數(shù),但是TT節(jié)點(diǎn)更少,因此可以對(duì)子樹TtTt進(jìn)行剪枝,也就是將它的子節(jié)點(diǎn)全部剪掉,變?yōu)橐粋€(gè)葉子節(jié)點(diǎn)TT。
最后我們看看CART樹的交叉驗(yàn)證策略。上面我們講到,可以計(jì)算出每個(gè)子樹是否剪枝的閾值αα,如果我們把所有的節(jié)點(diǎn)是否剪枝的值αα都計(jì)算出來,然后分別針對(duì)不同的αα所對(duì)應(yīng)的剪枝后的最優(yōu)子樹做交叉驗(yàn)證。這樣就可以選擇一個(gè)最好的αα,有了這個(gè)αα,我們就可以用對(duì)應(yīng)的最優(yōu)子樹作為最終結(jié)果。
好了,有了上面的思路,我們現(xiàn)在來看看CART樹的剪枝算法。
輸入是CART樹建立算法得到的原始決策樹TT。
輸出是最優(yōu)決策子樹TαTα。
算法過程如下:
1)初始化αmin=∞αmin=∞, 最優(yōu)子樹集合ω={T}ω={T}。
2)從葉子節(jié)點(diǎn)開始自下而上計(jì)算各內(nèi)部節(jié)點(diǎn)t的訓(xùn)練誤差損失函數(shù)Cα(Tt)Cα(Tt)(回歸樹為均方差,分類樹為基尼系數(shù)), 葉子節(jié)點(diǎn)數(shù)|Tt||Tt|,以及正則化閾值α=min{C(T)−C(Tt)|Tt|−1,αmin}α=min{C(T)−C(Tt)|Tt|−1,αmin}, 更新αmin=ααmin=α
3) 得到所有節(jié)點(diǎn)的αα值的集合M。
4)從M中選擇最大的值αkαk,自上而下的訪問子樹t的內(nèi)部節(jié)點(diǎn),如果C(T)−C(Tt)|Tt|−1≤αkC(T)−C(Tt)|Tt|−1≤αk時(shí),進(jìn)行剪枝。并決定葉節(jié)點(diǎn)t的值。如果是分類樹,則是概率最高的類別,如果是回歸樹,則是所有樣本輸出的均值。這樣得到αkαk對(duì)應(yīng)的最優(yōu)子樹TkTk
5)最優(yōu)子樹集合ω=ω∪Tkω=ω∪Tk,M=M−{αk}M=M−{αk}。
6) 如果M不為空,則回到步驟4。否則就已經(jīng)得到了所有的可選最優(yōu)子樹集合ωω.
7) 采用交叉驗(yàn)證在ωω選擇最優(yōu)子樹TαTα
6. CART算法小結(jié)
上面我們對(duì)CART算法做了一個(gè)詳細(xì)的介紹,CART算法相比C4.5算法的分類方法,采用了簡(jiǎn)化的二叉樹模型,同時(shí)特征選擇采用了近似的基尼系數(shù)來簡(jiǎn)化計(jì)算。當(dāng)然CART樹最大的好處是還可以做回歸模型,這個(gè)C4.5沒有。下表給出了ID3,C4.5和CART的一個(gè)比較總結(jié)。希望可以幫助大家理解。
| 算法 | 支持模型 | 樹結(jié)構(gòu) | 特征選擇 | 連續(xù)值處理 | 缺失值處理 | 剪枝 |
| ID3 | 分類 | 多叉樹 | 信息增益 | 不支持 | 不支持 | 不支持 |
| C4.5 | 分類 | 多叉樹 | 信息增益比 | 支持 | 支持 | 支持 |
| CART | 分類,回歸 | 二叉樹 | 基尼系數(shù),均方差 | 支持 | 支持 | 支持 |
看起來CART算法高大上,那么CART算法還有沒有什么缺點(diǎn)呢?有!主要的缺點(diǎn)我認(rèn)為如下:
1)應(yīng)該大家有注意到,無論是ID3, C4.5還是CART,在做特征選擇的時(shí)候都是選擇最優(yōu)的一個(gè)特征來做分類決策,但是大多數(shù),分類決策不應(yīng)該是由某一個(gè)特征決定的,而是應(yīng)該由一組特征決定的。這樣絕息到的決策樹更加準(zhǔn)確。這個(gè)決策樹叫做多變量決策樹(multi-variate decision tree)。在選擇最優(yōu)特征的時(shí)候,多變量決策樹不是選擇某一個(gè)最優(yōu)特征,而是選擇最優(yōu)的一個(gè)特征線性組合來做決策。這個(gè)算法的代表是OC1,這里不多介紹。
2)如果樣本發(fā)生一點(diǎn)點(diǎn)的改動(dòng),就會(huì)導(dǎo)致樹結(jié)構(gòu)的劇烈改變。這個(gè)可以通過集成學(xué)習(xí)里面的隨機(jī)森林之類的方法解決。
7. 決策樹算法小結(jié)
終于到了最后的總結(jié)階段了,這里我們不再糾結(jié)于ID3, C4.5和 CART,我們來看看決策樹算法作為一個(gè)大類別的分類回歸算法的優(yōu)缺點(diǎn)。這部分總結(jié)于scikit-learn的英文文檔。
首先我們看看決策樹算法的優(yōu)點(diǎn):
1)簡(jiǎn)單直觀,生成的決策樹很直觀。
2)基本不需要預(yù)處理,不需要提前歸一化,處理缺失值。
3)使用決策樹預(yù)測(cè)的代價(jià)是O(log2m)O(log2m)。 m為樣本數(shù)。
4)既可以處理離散值也可以處理連續(xù)值。很多算法只是專注于離散值或者連續(xù)值。
5)可以處理多維度輸出的分類問題。
6)相比于神經(jīng)網(wǎng)絡(luò)之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
7)可以交叉驗(yàn)證的剪枝來選擇模型,從而提高泛化能力。
8) 對(duì)于異常點(diǎn)的容錯(cuò)能力好,健壯性高。
我們?cè)倏纯礇Q策樹算法的缺點(diǎn):
1)決策樹算法非常容易過擬合,導(dǎo)致泛化能力不強(qiáng)。可以通過設(shè)置節(jié)點(diǎn)最少樣本數(shù)量和限制決策樹深度來改進(jìn)。
2)決策樹會(huì)因?yàn)闃颖景l(fā)生一點(diǎn)點(diǎn)的改動(dòng),就會(huì)導(dǎo)致樹結(jié)構(gòu)的劇烈改變。這個(gè)可以通過集成學(xué)習(xí)之類的方法解決。
3)尋找最優(yōu)的決策樹是一個(gè)NP難的問題,我們一般是通過啟發(fā)式方法,容易陷入局部最優(yōu)。可以通過集成學(xué)習(xí)之類的方法來改善。
4)有些比較復(fù)雜的關(guān)系,決策樹很難學(xué)習(xí),比如異或。這個(gè)就沒有辦法了,一般這種關(guān)系可以換神經(jīng)網(wǎng)絡(luò)分類方法來解決。
5)如果某些特征的樣本比例過大,生成決策樹容易偏向于這些特征。這個(gè)可以通過調(diào)節(jié)樣本權(quán)重來改善。
總結(jié)
- 上一篇: ann搜索算法(Approximate
- 下一篇: Bundle文件的创建和使用(一)