iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
AI & Data

30 天入門常見的機器學習演算法系列 第 14

(Day 14) 決策樹 (Decision Tree)

  • 分享至 

  • xImage
  •  

Decision Tree 是一種基於條件分支的監督式學習模型,可用於分類與回歸任務。它透過一連串的「是/否」判斷,將資料不斷切分成更純淨的子集,最終形成一個由節點 (Nodes) 與邊 (Edges) 組成的樹狀結構。直覺上,你可以將它想成一連串的決策問句: 「乘客的性別是女性嗎?」 → 是 → 「年齡是否小於 12 歲?」 → 是 → 存活機率高。其最大特色是 可解釋性高,每個決策規則都能清楚對應到特徵與閾值,便於與非技術背景的利害關係人溝通。

模型介紹

模型邏輯與核心概念

決策樹 (Decision Tree) 是一種監督式學習演算法,可用於分類與回歸任務。模型的結構類似一棵樹,由節點 (Node) 與分支 (Branch) 組成

  • 內部節點 (Internal Node): 表示一個特徵的條件判斷
  • 葉節點 (Leaf Node): 對應模型的預測結果 (類別或數值)

建構過程是「貪婪式遞迴分割 (Greedy Recursive Splitting)」,根據資訊增益 (Information Gain) 最大或吉尼不純度 (Gini Impurity) 最小的原則進行

模型建構說明

決策樹使用「貪婪演算法」建構模型,並無使用梯度下降類優化器,主要特徵:

  • 每次分裂僅考慮當前最佳特徵 (不做全局最優)
  • 使用遞迴方式構建整棵樹
  • 終止條件包括:
    • 節點樣本數過小
    • 不再能提升資訊增益
    • 最大深度限制
  • 節點的特徵選擇: 每次分裂節點時,會從候選特徵中選出最佳分割特徵,其依據如下:
    • DecisionTreeClassifier
      • Information Gain
      • Gini Impurity
    • DecisionTreeRegressor
      • MSE 減少量
      • MAE 減少量

模型優缺點

優點 缺點
模型結構直觀,可視覺化 易過擬合,尤其是深樹
對特徵縮放不敏感 (不需標準化) 對資料擾動敏感 (小變化可能改變樹結構)
可處理數值與類別型特徵 單棵樹表現有限 (通常需配合集成方法如 Random Forest, XGBoost)
支援特徵重要性評估 分裂偏向多取值的特徵 (需調整)

模型實作

程式實例

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree

# 讀取資料
data = pd.read_csv('titanic.csv')

# 特徵與標籤
features = ["Pclass", "Sex", "Age", "Fare"]
data = data.dropna(subset=["Age"])  # 簡單處理缺失值
X = pd.get_dummies(data[features])  # One-Hot Encoding
y = data["Survived"]

# 訓練 / 測試切分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立模型
clf = DecisionTreeClassifier(
    criterion='gini', 
    max_depth=4, 
    random_state=42
)
clf.fit(X_train, y_train)

# 評估
print("Accuracy: ", clf.score(X_test, y_test))

# 視覺化
plt.figure(figsize=(15,8))
plot_tree(clf, feature_names=X.columns, class_names=['Not Survived', 'Survived'], filled=True)
plt.show()

執行結果

Test Accuracy:  0.8268
              precision    recall  f1-score   support

           0     0.8319    0.9000    0.8646       110
           1     0.8167    0.7101    0.7597        69

    accuracy                         0.8268       179
   macro avg     0.8243    0.8051    0.8122       179
weighted avg     0.8260    0.8268    0.8242       179


Top Feature Importances: 
         feature  importance
 adult_male_True    0.588332
     class_Third    0.185393
            fare    0.156906
             age    0.045641
    class_Second    0.014194
           parch    0.009535
      embarked_S    0.000000
     alone_False    0.000000
adult_male_False    0.000000
       who_woman    0.000000
         who_man    0.000000
       who_child    0.000000
      embarked_C    0.000000
      embarked_Q    0.000000
     class_First    0.000000

結果評估

  • 模型整體準確率尚可,但對「正類 (存活)」的 召回率僅 0.71,代表仍有 約 29% 的存活樣本被判成未存活;若你的業務目標重視「找出潛在存活 (或正類)」的能力,現況偏保守。
  • 對正類的錯失 (FN) 明顯多於將負類誤判為正類 (FP)。在成本敏感情境(例如「漏抓到的正類」代價更高)下,這是不理想的權衡。

下一步建議

我會先驗證的 6 件事:

  • 閾值與召回的權衡
    • 目前採預設 0.5 閾值 (葉節點多數決),導致正類召回僅 0.71。
    • 行動: 改以機率輸出 (predict_proba),嘗試 下降決策閾值 或以 ROC/PR 曲線 找到業務最適點;同時回報 PR-AUC 與 ROC-AUC (正類不均衡時 PR-AUC更具辨識力)。
  • 成本敏感學習 (class_weight)
    • 目標: 提升正類召回、降低 FN。
    • 行動: 設定 class_weight={0: 1, 1: α} (α>1) 或使用 balanced,再比較 Recall/FPR 變化與實際成本。
  • 後剪枝 (Cost-Complexity Pruning, ccp_alpha)
    • 目的: 降低方差、提升泛化穩定性。
    • 行動: 以交叉驗證掃描 ccp_alpha,觀察 AUC/F1 的變化,並記錄每次樹深與節點數以利報告「複雜度—效能曲線」。
  • 特徵脫敏與冗餘檢驗
    • 行動 A: 移除 adult_male、who、alone 等「與 sex/age 高度重疊的衍生欄位」,只保留原始訊息,觀察規則是否更穩健。
    • 行動 B: 完全移除敏感變數 (sex 及其 proxy),評估效能下降幅度與可接受性。
  • 穩定性與方差評估
    • 行動: 使用 Stratified K-Fold (k=5 或 10) 做交叉驗證,回報平均與標準差,檢驗在不同隨機切分下的波動。決策樹屬高變化模型,單次切分的 0.8268 不足以定論。
  • 與基線/集成法比較
    • 行動: 與 Logistic Regression (可加 L2)、Random Forest、Gradient Boosting / XGBoost 比較,特別關注 召回、PR-AUC 與穩定性。單棵樹常作為可解釋基線,若要實戰表現,集成通常更穩。

結語

Decision Tree 的最大優勢在於 可解釋性與直觀性,適合需要明確規則與透明決策邏輯的情境。然而,單棵決策樹在泛化能力上有限,常與集成方法 (Random Forest、Gradient Boosting) 結合以提升表現。在實務中,若你需要快速建立一個能與商業部門對話的模型,Decision Tree 是一個高性價比的選擇。


上一篇
(Day 13) 迴歸任務驗證指標
下一篇
(Day 15) 隨機森林 (Random Forest)
系列文
30 天入門常見的機器學習演算法30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言