XAI 系列 03 · TreeSHAP Acceleration

2ⁿ O(TLD²)
TreeSHAP 的魔法。

KernelSHAP 計算 Shapley value 需要枚舉 2ⁿ 個特徵子集 — 30 個特徵就有 10 億種組合。TreeSHAP 利用樹結構,把這個指數級的計算壓縮成多項式時間,且結果完全精確。這頁帶你看懂這個 10⁶ 倍速差的祕密。

論文 · Lundberg et al. 2018 適用 · XGBoost / LightGBM / RandomForest 本質 · Path-dependent Recursion 輸出 · Exact Shapley Values
KernelSHAP
2ⁿ
特徵子集
O(2ⁿ · M)
10⁶×
TreeSHAP
TLD²
樹遍歷
O(T · L · D²)
§ 01 · 為什麼需要加速

KernelSHAP 的指數級詛咒

前面那篇 LIME vs SHAP 提到,SHAP 要算每個特徵的「平均邊際貢獻」 — 必須對所有可能的特徵子集都跑一次模型。問題是:n 個特徵會有 2ⁿ 個子集

互動:拖動特徵數量觀察組合爆炸

把每個特徵想成「在 / 不在」聯盟兩種狀態,n 個特徵就有 2ⁿ 種可能聯盟。對每個聯盟都要跑模型 → 計算量隨 n 指數成長。

n 特徵數 10
視覺化前 64 個子集(每格代表一個聯盟)
總子集數量
1,024
210 = subsets
假設每次模型推論 = 1ms
單筆樣本耗時:1.0 秒
10,000 筆資料:2.8 小時
尚可接受

現實的金融或醫療模型動輒 50~200 個特徵。KernelSHAP 即使用採樣近似,也無法兼顧速度與精確度。這就是 TreeSHAP 出現的契機。

§ 02 · 關鍵觀察

樹的預測,只走一條路

決策樹的預測是「分段常數」 — 從根節點走到葉節點的那條路徑,決定了預測值。路徑上用了哪些特徵?沒用到的特徵根本不會影響這次預測。這是 TreeSHAP 的第一塊基石。

互動:點任意輸入組合觀察預測路徑

申請人特徵

這棵小樹只用 3 個特徵 — 第 4 個怎麼變都不影響
預測機率
0.92
→ 葉節點 L4

關鍵體會:負債比這個特徵從來沒被這棵樹的任何節點使用。對單棵樹而言,它的 SHAP 值就是 0。模型的「特徵重要性」其實寫在樹的結構裡。

§ 03 · 核心技巧

不枚舉子集,
用 Cover 直接求邊際

Shapley value 要算「有這個特徵 vs 沒有這個特徵」的預測差。KernelSHAP 真的去跑所有子集;TreeSHAP 換一招 — 用訓練資料在每個節點的流量分佈(cover)來近似「特徵不存在」時的預測。

假設要算「信用分數」對這次預測的影響

比較兩種情境下,根節點的預期輸出

① 信用分數「揭露」

遵循樣本的真實值 → 走實線路徑
x[信用] = 750
路徑 → 走右子樹
右子樹 E[f] = 0.84
信用分數對預測的邊際貢獻 ≈
+0.16
= 0.84 (揭露) − 0.68 (隱藏)

這個「揭露 − 隱藏」差值就是該特徵在這個節點上對預測的邊際影響。TreeSHAP 把這個比較沿著樹遞迴展開,並用 Shapley 組合權重精確加總 — 完全不需要枚舉 2ⁿ 個子集。

§ 04 · 演算法逐步

TreeSHAP 怎麼走完整棵樹

下面把上面的概念變成具體的演算法步驟。同一棵樹,同一個樣本,按下「下一步」一步步看 TreeSHAP 怎麼累積每個特徵的 SHAP 值:

TreeSHAP 遞迴 — 訪問順序 準備開始
步驟 0 / 6
Step 0 · 初始化 樣本 x = (信用 750, 收入 80K, 年齡 35, 負債比 30%)。準備從根節點開始遞迴 — 所有特徵的 φ 累加器初始為 0。按「下一步」開始走樹。
四個特徵的 SHAP 累加器
驗證:Σ φᵢ + base ≈ f(x)
base value:  0.686
Σ SHAP:     0.000
預測 f(x):  0.686
§ 05 · 複雜度

實際差多少?用數字說話

把 KernelSHAP 與 TreeSHAP 套到三個常見規模的模型上,看實際 operation 數差距:

小型模型
10 特徵 · 50 樹 · 深度 4
KernelSHAP (2ⁿ·M) ~ 5.1×10⁵
TreeSHAP (TLD²) ~ 1.3×10⁴
≈ 39× 加速
中型模型
20 特徵 · 100 樹 · 深度 6
KernelSHAP (2ⁿ·M) ~ 1.1×10⁹
TreeSHAP (TLD²) ~ 2.3×10⁵
≈ 4,700× 加速
大型模型
50 特徵 · 500 樹 · 深度 8
KernelSHAP (2ⁿ·M) ~ 5.6×10¹⁷
TreeSHAP (TLD²) ~ 8.2×10⁶
≈ 6.8×10¹⁰ 加速
視覺化:特徵數 n 增加時,兩種方法的 operation 數(log 軸)

KernelSHAP 的曲線在 n=20 之後就「飛出畫面」 — 對特徵維度有指數敏感性。
TreeSHAP 對 n 幾乎無感,只在意樹的數量與深度。

§ 06 · 實務

怎麼用什麼時候用

TreeSHAP 的兩個變體

TreeSHAP 實際上有兩種估計「特徵不存在」的方式,差別在於用哪種分佈來邊際化:

變體 邊際化方式 適合場景 備註
Path-dependent 訓練資料在每個節點的 cover 來估計流量 速度優先、特徵之間有相關性 shap 套件預設、不需要背景資料集
Interventional 外部 background 資料真的去算 E[f | x_S] 需要嚴格因果語義、特徵獨立性假設成立時 需提供 background dataset、稍慢但更符合 SHAP 原始定義

最小程式碼骨架

# Python · shap 套件 · TreeSHAP 最常見用法 import shap import xgboost as xgb # 1. 訓練樹模型(XGBoost / LightGBM / sklearn 都行) model = xgb.XGBClassifier(n_estimators=100, max_depth=6).fit(X_train, y_train) # 2. 建立 TreeExplainer — 自動選用 TreeSHAP 演算法 explainer = shap.TreeExplainer( model, feature_perturbation="tree_path_dependent", # 預設模式 # 或者 feature_perturbation="interventional", data=X_background ) # 3. 計算 SHAP values(單筆或整批 — 同樣是 O(TLD²) 每筆) shap_values = explainer.shap_values(X_test) # 4. 視覺化 shap.summary_plot(shap_values, X_test) # 全局重要性 shap.force_plot(explainer.expected_value, explainer.shap_values(X_test[0]), X_test[0]) # 單筆解釋 shap.dependence_plot("income", shap_values, X_test) # 特徵依賴圖

選擇 TreeSHAP 的時機

  • 模型是 XGBoost、LightGBM、CatBoost、sklearn 的樹型模型 — 直接套用、無需設定
  • 需要對整個資料集計算 SHAP(百萬筆等級),KernelSHAP 完全不可行
  • 要做 SHAP dependence plotinteraction values — 都倚賴 exact SHAP
  • 需要在生產環境即時計算解釋 — TreeSHAP 通常 < 1ms 每筆

! 注意事項與替代

  • 模型是神經網路 → 用 DeepSHAP(同樣是 SHAP 的快速變體)
  • 模型是 SVM、KNN 或自定義 wrapper → 沒得選,退回 KernelSHAP + 採樣
  • 特徵之間高度相關時,path-dependent 會把貢獻算給「上游」特徵;要嚴謹歸因請用 interventional
  • TreeSHAP 算的是機率/log-odds 空間的貢獻 — 解讀分類模型結果時要注意尺度

📝 iPAS 考點提醒

TreeSHAP 是針對樹模型的高效 SHAP 演算法,iPAS 可解釋 AI 進階考點(中級科目三)。重點:一般 SHAP 計算量隨特徵數指數成長,TreeSHAP 利用樹結構把複雜度降到多項式時間,讓隨機森林、XGBoost 也能快速算出特徵貢獻。易混點:它是加速的精確解、非近似;適用對象是樹模型,神經網路要用其他方法。情境:大型樹模型的快速可解釋分析。

想練情境題與詳解 → AI 學習與考證地圖

❓ 常見問題

TreeSHAP 解決什麼問題?

一般 SHAP 要對特徵子集做大量組合運算、成本指數級;TreeSHAP 利用樹結構把樹模型的精確 Shapley 值計算降到多項式時間,實用得多。

為什麼能加速?

樹的路徑與分裂結構讓貢獻可沿樹有效率地累加,不必窮舉所有特徵組合,就能直接算出精確值。

適用哪些模型?

樹系模型:決策樹、隨機森林、GBDT、XGBoost、LightGBM 等;深度網路則用其他近似(如 DeepSHAP、KernelSHAP)。

精確和近似 SHAP 差在哪?

TreeSHAP 給精確 Shapley 值;KernelSHAP 等對任意模型用取樣近似(較慢、有誤差)。能用 TreeSHAP 就用,又快又準。

實務上用 SHAP 注意什麼?

高相關特徵的歸因要小心解讀;大資料時仍可能慢、可抽樣;解釋是相關非因果,需結合領域知識。

🧭 相關主題

← 返回 AI 學習與考證地圖