決策樹在長成的過程中極易容易出現過拟合的情況,導緻泛化能力低。主要有兩種手段可以用于防止過拟合。
提前停止
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
- 因為剪去後的樹的損失更小。是以決定剪枝。
- 接着對于所有的切分節點做上述相同的動作。
算法