歡迎來到決策樹的世界!
在本節中,我們將學習如何實際「種植」一棵決策樹,或許更重要的是,如何對其進行「修剪」,使其能夠在處理新數據時發揮完美的效能。想像決策樹就像一株真正的植物:如果你任由它隨意生長而不加維護,它會長成一團混亂、難以打理的雜草。但如果你仔細修剪,它就會變成一個強大且好用的預測工具。
決策樹深受精算師喜愛,因為它們很容易向利益相關者(如你的上司或客戶)解釋,而且它們反映了人類決策的思維方式。讓我們開始吧!
快速回顧:請記住,決策樹會根據輸入變數的數值,將數據拆分為不同的組別(稱為節點 (nodes))。最底層的最終分組稱為葉節點 (leaves) 或終端節點 (terminal nodes)。
第一步:建立決策樹(遞迴二元拆分)
當我們開始構建決策樹時,我們會使用一種稱為遞迴二元拆分 (Recursive Binary Splitting) 的過程。別讓這個名稱嚇到你,拆解開來看其實很簡單:
1. 遞迴 (Recursive):我們針對產生的每一個分支重複同樣的拆分過程。
2. 二元 (Binary):每次拆分只會產生「兩個」分支(例如:「是」或「否」)。
3. 拆分 (Splitting):我們正在將數據劃分為更小的群組。
「貪婪」策略 (Greedy Approach):
建立決策樹是一個貪婪演算法。這意味著在每一步中,電腦都會尋找當下能使模型表現提升的「最佳拆分」。它不會預測現在選擇一個稍微「差一點」的拆分是否會導致未來出現更好的拆分,它只專注於當下!
我們如何決定哪個拆分是「最佳」的?
這取決於我們要預測的目標:
對於迴歸樹(預測數值):
我們希望最小化殘差平方和 (Residual Sum of Squares, RSS)。我們希望每個最終葉節點中的數據點,都能盡可能接近該葉節點的平均值。公式如下:
\( RSS = \sum_{j=1}^{J} \sum_{i \in R_j} (y_i - \hat{y}_{R_j})^2 \)
解釋:我們想要最小化所有最終區域 (\( R_j \)) 的總平方誤差。
對於分類樹(預測類別):
我們希望產生的分組盡可能「純」。如果一個葉節點包含 100% 的「類別 A」和 0% 的「類別 B」,那麼它就是完全純的。我們通常使用吉尼係數 (Gini Index) 或熵 (Entropy) 來衡量。數值越低,代表該組越「純」。
你知道嗎?吉尼係數通常被稱為衡量節點不純度 (node impurity) 的指標。如果吉尼係數為 0,則代表該節點完全純淨(組內所有數據皆屬於同一個類別)。
總結要點:我們由上而下建立決策樹,一次只進行一個拆分,並選擇在當下能最大程度減少誤差 (RSS) 或不純度 (Gini/Entropy) 的拆分方式。
第二步:長得太大的風險
如果我們不斷地拆分數據,直到數據集中的每一個人都有自己專屬的葉節點,我們在訓練集 (training data) 上的錯誤率將會是 0%。但這有一個大問題:過度擬合 (Overfitting)。
過度擬合是指決策樹學習到了你特定數據集中的「雜訊」或隨機特徵,而非真正的模式。一個過度擬合的決策樹就像是一個只會死背考古題答案的學生,卻沒理解背後的數學原理——當真正的考試題目數字變動時,他們就會失敗!
偏差與變異權衡 (Bias-Variance Tradeoff):
- 一棵巨大且複雜的樹具有高變異 (High Variance)(如果你稍微改變數據,結果就會產生巨大變化)。
- 一棵只有一個拆分、過於簡單的樹具有高偏差 (High Bias)(它過於簡單,無法捕捉到真正的模式)。
第三步:修剪決策樹(成本複雜度修剪)
為了修正過度擬合,我們會先長出一棵很大的樹,然後將其「修剪」成較小的子樹 (subtree)。但我們不能隨機選擇子樹,因為可能性太多了!因此,我們使用成本複雜度修剪 (Cost-Complexity Pruning)(也稱為最弱連結修剪 (Weakest Link Pruning))。
我們使用一個特殊的評分指標來決定該切除哪些分支。該評分公式為:
\( \sum_{m=1}^{|T|} \sum_{i \in R_m} (y_i - \hat{y}_{R_m})^2 + \alpha|T| \)
讓我們用「精算語言」拆解這個公式:
1. 第一部分 \( \sum \sum (y_i - \hat{y}_{R_m})^2 \) 就是 RSS(樹對數據的擬合程度)。
2. 第二部分 \( \alpha|T| \) 是懲罰項 (Penalty)。
- \( |T| \) 是終端節點(葉節點)的數量。葉節點越多,複雜度越高。
- \( \alpha \) (alpha) 是調整參數 (tuning parameter)。這是我們選擇的一個數值,用來控制我們對「過於複雜的樹」懲罰的力度。
\(\alpha\) 如何運作:
- 如果 \( \alpha = 0 \):沒有懲罰!我們得到的是原本那棵巨大的樹。
- 如果 \( \alpha \) 非常大:懲罰極高!最終我們會得到一棵非常小的樹(甚至可能只有一個節點)。
- 當我們將 \( \alpha \) 從零開始增加時,分支會以特定且可預測的順序被逐一修剪掉。
記憶小撇步:將 \( \alpha \) 想成是對葉節點徵收的「稅」。如果稅收很低,樹可以負擔得起很多葉子;如果稅收很高,為了保持「獲利」,樹必須縮減規模。
總結要點:修剪能幫助我們在過於簡單與過於複雜之間找到平衡。我們透過調整參數 \( \alpha \) 來控制這種平衡。
第四步:選擇最佳的 Alpha (\(\alpha\))
我們如何知道該使用哪個 \(\alpha\) 值呢?答案是使用 K-折交叉驗證 (K-Fold Cross-Validation)!
1. 將你的數據分成 \( K \) 個部分(折)。
2. 對於每個 \( \alpha \) 值,在其中幾個折上建立樹,並在剩餘的折上進行測試。
3. 選擇那個在測試集上能產生最低平均誤差的 \( \alpha \)。
避免常見錯誤:不要選擇那個讓樹在你的訓練數據上表現最好的 \( \alpha \)。一定要使用驗證數據或交叉驗證來選擇 \( \alpha \)。否則,你又會掉進過度擬合的陷阱!
步驟流程總整理
別擔心,這看起來有很多步驟。以下是建立一棵優秀決策樹的標準「食譜」:
1. 使用遞迴二元拆分在訓練數據上長出一棵大樹。(直到節點變得非常小才停止)。
2. 應用成本複雜度修剪,根據 \( \alpha \) 的函數找到一系列最佳子樹。
3. 使用K-折交叉驗證選擇最佳的 \( \alpha \)。
4. 選定對應於你所選 \( \alpha \) 的子樹,這就是你的最終模型。
最終快速回顧表
- 生長策略:由上而下、貪婪、遞迴二元拆分。
- 迴歸目標:最小化 RSS。
- 分類目標:最小化吉尼係數或熵。
- 問題:大樹會過度擬合(高變異)。
- 解決方案:使用懲罰項 \( \alpha|T| \) 進行修剪。
- 調校:使用交叉驗證選擇最佳 \( \alpha \)。
你一定沒問題的!決策樹的核心就是盡可能進行最佳拆分,然後在之後進行清理,確保模型在處理新數據時依然「聰明」。