決策樹如何防止過擬合
- 2019 年 10 月 3 日
- 筆記
決策樹在長成的過程中極易容易出現過擬合的情況,導致泛化能力低。主要有兩種手段可以用於防止過擬合。
提前停止
Early Stopping,在完全長成以前停止,以防止過擬合。主要有以下3種方式:
- 限制樹的高度,可以利用交叉驗證選擇
- 利用分類指標,如果下一次切分沒有降低誤差,則停止切分
- 限制樹的節點個數,比如某個節點小於100個樣本,停止對該節點切分
後剪枝
提前停止的不足
「提前停止」是一個不錯的策略,但是在實際的執行中會越到一些麻煩。比如「其中的第2點,如果下一次切分沒有降低誤差,則停止切分。」一看貌似很有道理,但是很容易舉出反例:
對一個XOR的數據集生成決策樹:

下面如果使用x[1]切分:

又或者用x[2]切分:

發現,無論選擇哪一個維度進行切分都不會使得訓練誤差降低了。所以根據Early Stopping,僅僅長成只有一個節點的stump。但是實際上:

繼續切下去,能學成一顆具有良好區分度的決策樹。所以「提前停止」的第2種情況既有利也有弊:

剪枝
我們通過一顆決策樹的葉子結點個數來定義這棵樹有多複雜。

但是樹太簡單也不好,訓練誤差太大,欠擬合。所以,訓練出一顆好的決策樹就是在樹的訓練誤差與複雜程度之間做權衡。

寫成數學公式,可以表示為:


剪枝演算法
舉例說明
有一顆已經長成的樹:

從底部開始考慮,第一個要檢查的切分點是Term:

假設懲罰性lambda是0.3:
- 對於未剪枝的T,計算它的訓練誤差為0.25,葉子結點總數為6.所以總的cost為0.43
- 對於剪去Term的Tsamller,計算它的訓練誤差為0.26,葉子結點總數為5.所以總的cost為0.41
- 因為剪去後的樹的損失更小。所以決定剪枝。
- 接著對於所有的切分節點做上述相同的動作。
演算法