來源:https://zhuanlan.zhihu.com/p/76709712
0 簡介
CART剪枝算法從"完全生長"的決策樹的底端剪去一些子樹,使決策樹變小(模型變簡單),從而能夠對未知數據有更准確的預測。
分兩步:
1.從生產算法產生的整體的樹 的最底端開始不斷剪枝,直至剪到整個樹
的根結點為止,從而形成了一個子樹序列
;
2.通過交叉驗證法在獨立的驗證數據集上對子樹序列進行測試,從中選出最優子樹。
1.剪枝,形成一個子樹序列
剪枝剪枝,怎么來剪?
從前面第4節將的剪枝內容來看,我們需要整一個損失函數來控制剪枝。
這個損失函數為:
其中,T為任意子樹, 為對訓練數據的預測誤差(如基尼指數),
為子樹的葉結點個數,表示樹的復雜度的。
為參數,
為參數是
時的子樹T的整體損失。
參數 權衡訓練數據的擬合程度與模型的復雜度。
上述關於損失函數的定義,在前面的章節中已經介紹的非常多了,看過前面的這部分就不難理解。以后的章節中,如果遇到前面詳細介紹過的內容,除非必要,就都不啰嗦了。
對固定的一個 值,一定存在使損失函數
最小的子樹,將其表示為
。這個
取值越大,最優子樹就偏向於簡單地子樹(即葉結點少),
取值越小,最優子樹偏向於與訓練數據集更好地擬合。我們可以想象一個極端情況,當
時,最優子樹是根結點構成的單結點樹;當
時,最優子樹就是整體樹本身。(這個一定要結合上面的損失函數公式來理解)。
Breiman(CART提出者)等人證明:可以用遞歸的方法對樹進行剪枝。什么意思呢?就是將 從0開始逐漸增大,
,產生一系列的區間
;對每一個
取值,都能得到一個最優子樹,最終得到對應的最優子樹集
,序列中
是整樹,一直到
(根結點構成的單結點樹),是嵌套的。子樹序列對應着區間
。
整個剪枝過程的示意圖如上。接下來我們來看看具體數學過程是怎樣的。
從整體樹 開始剪枝。對於
的任意內部結點t(除葉結點外的所有結點,包括根結點),計算以t為單結點樹的損失函數:
如下圖
然后計算以t為根結點的子樹 的損失函數:
如下圖
接下來進行 的比較:
1) 當 ,有不等式
意思是,此時如果保留這個子樹,得到的總的損失函數是會比剪掉它更小的,所以我們選擇保留子樹不剪。
2) 當 增大時,在某一
值時有
此時,由公式可以推出: 。
在這時取相同的損失函數值。但由於t的結點少,因此t比
更可取,故應對子樹
進行剪枝。
3) 當 再增大時,1)中的不等式反向,即
此時就應該再取下一個內部結點,進行下一步剪枝判斷了。
對 中每一內部結點t,計算:
(即對應着不同的
取值)
這個g(t)表示剪枝后整體損失函數減少的程度。在 中減去g(t)值最小的子樹
,將得到的剩下的子樹作為
,同時將最小的g(t)設為
。
為區間
的最優子樹。
如此剪枝下去,直至得到根結點。在這一過程中,不斷地增加 的值,得到更小的子樹,產生新的區間。就得到了最優子樹序列,
,剪枝后對新的葉結點t以多數表決法決定其類。
2.在剪枝得到的子樹序列
中通過交叉驗證選取最優子樹 ![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1UXyU3QiU1Q2FscGhhJTdE.png)
利用獨立的驗證數據集,測試子樹序列 中各棵子樹的平方誤差或基尼指數。選擇平方誤差或基尼指數最小的決策樹作為最優的決策樹。在子樹序列中,每棵子樹
都對應於一個參數
。所以,當最優子樹
確定時,對應的
也確定了,即得到最優決策樹
。