CART剪枝算法詳解

CART剪枝算法

CART剪枝算法從“完全生長“的決策樹的底端剪去一些子樹,使決策樹變小(模型變簡單),從而能夠對未知數據有更準確的預測。CART剪枝算法由兩步組成:首先從生成算法產生的決策樹T0底端開始不斷剪枝,直到T0的根節點,形成一個子樹序列{T0,T1 ,…, Tn};然後通過交叉驗證法在獨立的驗證數據集上對子樹序列進行測試,從中選擇最優子樹。

1. 剪枝,得到子樹序列

子樹的損失函數:
           公式
T爲任意子樹,C(T)爲對訓練數據的預測誤差,可以是基尼指數,|T|爲子樹T的葉子節點個數,α>= 0爲參數,Cα(T)爲參數是α時的子樹T的整體損失,|T|衡量樹的複雜度,α權衡訓練數據的擬合程度與樹的複雜度。
爲了使得損失函數減小,有兩種辦法:
1> 降低第一部分的不確定次數,但我們知道這是不可能的了,因爲降低不確定次數的辦法是再找尋一個特徵,或者找尋特徵的最優切分點。這在生成決策時就已經決定了,無法改變。
2> 進行剪枝操作,這是可以的。剪枝最明顯地變化就是葉結點個數變少。假設是一個三叉樹,那麼一次剪枝它的葉結點數減少2個。變化量爲2α,有了這變化量,我們就可以用來求解最優決策子樹了。

在α參數給定時,假設只有一個子結點發生剪枝,那麼該子結點上的葉結點都將全部歸併到該結點,由此我們計算此結點的不確定次數。倘若不確定次數增大的量超過2α,那麼剪枝失敗,算法將嘗試其他子結點。因爲新得的子樹損失函數反而增大。這從側面又反映了什麼樣的事實?該子結點的分類規則是大大降低不確定次數的,並不存在噪聲,所以沒必要進行剪枝。所以在剪枝過程中,找尋的就是那些噪聲點,卻被過度規則那些子結點,把這些合併了,萬事大吉,自然而然決策樹的準確率將上升。

那麼問題來了,α是未知的,從函數和以上的分析中我們可以看出α的值對剪枝結果有很大的影響,我們如何找到這個合適的α來使擬合程度與複雜度之間達到最好的平衡呢,最好的辦法就是,我們將α從0取到正無窮,對於每一個固定的α,我們都可以找到使得Cα(T)最小的最優子樹T(α) 。當α 很小的時候,T0是最優子樹,當α很大的時候,單獨一個根節點Tn是最優的子樹。(Breiman等人證明:可以用遞歸的方法對樹進行剪枝,將a從小增大,a0<a1<…<an<+無窮,產生一系列的區間[ai,ai+1),i =0,1,…,n;剪枝得到的子樹序列對應着區間[ai,ai+1),i =0,1,…,n的最優子樹序列{T0, T1, … , Tn},序列中的子樹是嵌套的。)
我們通過無限個α去求有最優的子樹序列式很困難的,是一個NP完全問題,那怎麼辦呢?

這裏有一個前提,對固定的α,一定存在使損失函數Cα(T)最小的子樹,將其表示爲Tα。Tα在損失函數最小的意義下是最優的,這樣的最優的子樹是唯一的。其實所要表達的意思就是Tα和α是一一對應的。
我們通過無限個α去求有最優的子樹序列式很困難的,但是根據剪枝的核心思想我們知道,無論多麼複雜的決策樹,生成的最優子樹序列都是有限的,這裏記作{T0,T1 ,…, Tn},那麼我們只需要尋找每一個最優子樹對應的α不就可以了嘛。

如上分析,我們現在的思路就是要得出最優子樹序列,這子樹序列又如何生成呢?(怎麼感覺說着說着又說回來了呢,我們的最終結果不就是要得到這些最優子樹序列嗎?爲什麼還要記錄相應的α值呢?這個本人也不勝理解)我們先說說求子樹序列的事情。

我們先假設我們找到了當前的最優子樹,且必然發生剪枝(一定要注意這句話,這是我們接下來所有推導的前提)。具體地,從整體樹T0開始剪枝,我們每次剪枝剪的都是某個內部節點的子節點,也就是將某個內部節點的所有子節點回退到這個內部節點裏,並將這個內部節點作爲葉子節點。因此在計算整體的損失函數時,這個內部節點以外的值都沒變,只有這個內部節點的局部損失函數改變了,因此我們本需要計算全局的損失函數,但現在只需要計算內部節點剪枝前和剪枝後的損失函數。

對任意內部節點t,
剪枝前的狀態:有|Tt| 個葉子節點,預測誤差是C(Tt)
剪枝後的狀態:只有本身一個葉子節點,預測誤差是C(t)
剪枝前以t結點爲根結點的子樹的損失函數是:
公式
剪枝以後以t爲單結點樹的損失函數是:
公式
當alpha=0及alpha充分小,有不等式
公式
當alpha增大時,在某一alpha有
公式
當alpha再增大時,以上不等式(1)反向。在(1)式的情況下,
在這裏插入圖片描述
我們之前假設在得到最優子樹時必然發生了剪枝,那麼什麼時候必然發生剪枝?當我們取得損失函數中的α>=α1時,必然對Tt進行剪枝,因爲此時剪枝後損失函數的值要比剪枝前小。

那是不是剪掉當前的t結點就可以得到最優子樹了呢,當然不是,不同的結點會計算出不同的α1,我們就以此α1作爲損失函數的α值(解釋一下,當α=α1時,該節點剪枝前後的損失函數的值是一樣的,但是剪枝後結點少,也必然要剪枝,此時該結點處的損失函數值也是最小的),這時會算出不同的損失函數值來,當然是取損失函數值最小的結點來剪枝。這裏我們將結點t作爲變量,計算得到的α記爲α(t),則有如下公式:
在這裏插入圖片描述
但是在李航的《統計學習方法》中卻用以下公式來衡量應該剪枝的結點:
在這裏插入圖片描述
有一篇博文是這樣解釋的:整體損失函數 = 內部節點t的損失函數 + 其他節點的損失函數和 我們在計算2式的時候只是讓等號右邊的第一項達到了最小,可是局部結點的損失函數最小並不能代表整體的損失函數最小,所以並不能以2式來剪枝。但本人認爲這種說法經不起推敲,如果我們對2式瞭解透徹的話應該知道,在α確定的情況下,整體的損失函數的計算相當於是對局部結點損失函數的累加,在某個結點剪枝而其他結點不改變的情況下,2式等號右邊的第二項並沒有變化,因此這並不能說明問題。但我們可以這樣說,針對單個結點的剪枝我們可以用2式來衡量,可多個結點的剪枝用這種局部結點的計算公式是行不通的。

而α就不一樣了,在上面已經說過了,剪枝得到的子樹序列對應着區間[ai,ai+1),i =0,1,…,n的最優子樹序列{T0, T1, … , Tn},我們在不同的α(g(t))下剪枝可以得到一一對應的有限個最優子樹。在李航的《統計學習方法》中,將g(t)解釋爲剪枝後整體的損失函數減少額程度,如果不看之前的推導,只看公式3,我們是可以理解的,其實這跟信息增益的概念差不多,但加入了結點個數這個變量來權衡模型複雜度的影響。在T0中剪去g(t)最小的Tt,將得到的子樹作爲T1,同時將最小的g(t)設爲α1。T1爲區間[α1, α2)的最優子樹。
那爲什麼是最小的g(t)呢?(以下是別的博文上的解釋,說的很好,我就直接拿過來用了,自己就不再贅述了)
在這裏插入圖片描述
以圖中兩個點爲例,結點1和結點2,g(t)2大於g(t)1, 假設在所有結點中g(t)1最小,g(t)2最大,兩種選擇方法:當選擇最大值g(t)2,即結點2進行剪枝,但此時結點1的不修剪的誤差大於修剪之後的誤差,即如果不修剪的話,誤差變大,依次類推,對其它所有的結點的g(t)都是如此,從而造成整體的累計誤差更大。反之,如果選擇最小值g(t)1,即結點1進行剪枝,則其餘結點不剪的誤差要小於剪後的誤差,不修剪爲好,且整體的誤差最小。從而以最小g(t)剪枝獲得的子樹是該alpha值下的最優子樹!

通過以上的說明,我們現在應該可以理解,將α從小增大,產生一系列的區間,剪去 g(t)屬於[αi, αi+1)的對應的結點,就會得到該區間上的最優子樹,如此剪下去,直到得到根結點。在這一過程中,不斷增加α的值,產生新的區間。

2. 從剪枝得到的子樹序列中通過交叉驗證選取最優子樹Tα。

具體地,利用獨立的驗證數據集,測試子樹序列T0, T1, … , Tn中各棵子樹的平方誤差或基尼指數。平方誤差或基尼指數最小的決策樹被認爲是最優的決策樹。在子樹序列中,每棵子樹T0, T1, … , Tn都對應於一個參數α0, α1, … ,αn。所以,當最優子樹Tk確定時,對應的αk也確定了,即得到最優決策樹Tα。

最後附上CART剪枝算法:
輸入:CART算法生成的決策樹T0
輸出:最優決策樹Tα
(1)設k=0,T=T0
(2)設α=+∞
(3)自下而上地對各個內部結點t計算C(Tt),|Tt|以及
在這裏插入圖片描述
   α=min(α,α(t))
這裏,Tt表示t爲根結點的子樹,C(Tt)是對訓練數據的預測誤差,|Tt|是Tt的葉結點個數。
(4)對α(t)=α的內部結點t進行剪枝,並對葉結點t以多數表決法決定其類,得到樹T。
(5)設k=k+1,αk=α,Tk=T。
(6)如果Tk不是由根結點及兩個葉結點構成的樹,則回到步驟3;否則令Tk=Tn。
(7)採用交叉驗證法在子樹序列T0,T1,…,Tn中選取最優子樹Tα
最後,我還是不明白這一點,爲什麼我們還要記錄最終的α值,不是隻要得到最優子樹就可以了嗎?

參考文獻:

  1. Demon的黑與白 https://blog.csdn.net/u014688145/article/details/53326910
  2. MrTriste https://blog.csdn.net/wjc1182511338/article/details/76793164
  3. 李航. 統計學習方法[M]. 北京:清華大學出版社,2012
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章