可解釋 AI (XAI) - LIME、SHAP 與 CFE 解析黑盒子

可解釋 AI (XAI) - LIME、SHAP 與 CFE 解析黑盒子

高準確率的模型往往伴隨著「黑盒子」的代價。本篇將介紹 XAI (可解釋 AI) 領域的三大神兵利器:LIME、SHAP 與 CFE,並親手用 SHAP 撬開鐵達尼號隨機森林模型的腦袋!


前言:準確率的代價 —— 黑盒子危機

還記得我們在 Day 04:鐵達尼號生存預測 的最後,為了突破邏輯回歸 81% 的天花板,我們請出了機器學習界的常勝軍:隨機森林 (Random Forest),並成功將準確率推升到 82.3%。

但這伴隨著一個巨大的代價:它變成了一個黑盒子 (Black Box)。 邏輯回歸有「權重 (Coefficients)」,我們可以直接看出「男性係數是負的,所以男性容易死亡」。但隨機森林是由上百棵決策樹混合投票出來的,人類根本無法直接看懂它內部到底經歷了什麼複雜的判斷。

在醫療、核貸、自動駕駛等高風險領域,「信任 (Trust)」比「準確率」更重要。如果 AI 無法解釋「為什麼」,醫生和法官是絕對不敢採用它的。 這就是 XAI (Explainable AI, 可解釋 AI) 誕生的原因。


XAI 三種解密工具:LIME、SHAP 與 CFE

在可解釋 AI 的領域中,有三種最主流的解密工具,它們各自用不同的哲學來撬開黑盒子:

1. LIME (局部可解釋性模型)

  • 核心哲學:「既然整個黑盒子太複雜,那我就只看你家門口這條街。」
  • 運作原理:LIME 會在你想要預測的那筆資料附近,隨機產生很多假資料,然後用一個「超級簡單的白盒子模型 (例如線性迴歸)」來局部模擬黑盒子的行為。
  • 優勢:運算速度快,且非常適合用在圖片辨識與自然語言處理 (NLP) 的局部解釋上。

2. SHAP (基於賽局理論的貢獻度)

  • 核心哲學:「大家合作賺的錢,必須公平分給每個人。」
  • 運作原理:思想來自經濟學的「賽局理論 (Game Theory)」。它會測試各種特徵組合的排列,精算出每個特徵對於最終預測結果的「真實邊際貢獻度」。
  • 優勢:數學基礎最為嚴謹!它不僅能解釋「單筆預測 (Local)」,還能客觀地統整出「整個模型 (Global)」的特徵重要性,是目前工業界最受歡迎的標準。

3. CFE (反事實解釋 Counterfactual Explanations)

  • 核心哲學:「與其告訴我為什麼死,不如告訴我怎麼做才能活?」
  • 運作原理:CFE 不解釋死板的權重原因,它提供的是行動方案。它會推算出一個距離你最近的成功案例。
  • 優勢:對終端使用者最友善!例如在銀行貸款被 AI 拒絕時,客戶不想聽到「因為你的年齡導致扣了 10 分」,客戶想聽到的是:「只要你的戶頭存款再增加 10 萬元,AI 就會核准你的貸款。」

實戰 XAI

我們隨機抽查了一位鐵達尼號乘客 (Passenger 0),以下是他的個人資料與 AI 預測結果:

  • 真實背景:28 歲,男性 (Sex=Male),買的是最便宜的 3 等艙 (Pclass=3)。
  • AI 預測生存率僅 18.3% (判定死亡)

為什麼只有 18.3%?讓我們輪流請出 SHAP、LIME 與 CFE 來進行說明!

1. SHAP:賽局理論

SHAP 追求的是絕對的公平與嚴謹,透過短短 3 行程式碼,我們就能進行解密:

import shap

# 1. 建立 SHAP 解密器
explainer = shap.Explainer(model, X_train)

# 2. 算出測試集的 SHAP 貢獻值
shap_values = explainer(X_test)

# 3. 畫出瀑布圖 (單一乘客解密)
shap.plots.waterfall(shap_values[0])

讓我們來看看 SHAP 產出的圖表!

宏觀視角:特徵重要性

SHAP Summary Plot

(SHAP 總體特徵重要性圖)

這張圖告訴我們,在整個隨機森林的眼中,哪些特徵最重要?

  • 第一名:Sex (性別):這根長條最長,代表「性別」是 AI 判斷鐵達尼號生死最核心的依據。
  • 第二名:Age (年齡)
  • 第三名:Pclass (艙等)
  • 有了這張圖,模型就再也不是黑盒子了,我們能清晰地向老闆報告 AI 的整體決策邏輯。

微觀視角:單一乘客的生死判決

SHAP Waterfall Plot

(該乘客的 SHAP 瀑布圖決策過程)

這張圖由下往上讀,解釋了 18.3% 是怎麼來的:

  1. 基礎生存率 (E[f(X)]E[f(X)] = 0.384):如果不看任何條件,全船平均生存率約為 38.4%。
  2. Age = 28 (加分):28 歲屬於年輕力壯,給生存率 +0.04 (紅條)
  3. Pclass = 3 (大扣分):這名乘客買的是 3 等艙,逃生資源最差,生存率 -0.08 (藍條)
  4. Sex = 0 (致命打擊):這名乘客是男性 (沒有優先上救生艇的權利),這是最致命的因素,生存率被狠狠 -0.17 (藍條)
  5. 最終預測:經過層層加減,最終結算生存率為 0.183 (18.3%)

2. LIME:局部抽查法 (以簡馭繁)

如果我們覺得 SHAP 的運算太慢太複雜,只想要快速知道「針對這個人,哪些條件影響最大?」,我們可以使用 LIME。

LIME 的底層邏輯非常聰明:既然隨機森林這個黑盒子太複雜,那我就只看 Passenger 0 家門口的這一小塊區域。 LIME 會故意把這位乘客的資料稍微「微調」一下(例如把年齡改成 29 歲、30 歲),隨機產生幾千筆「假鄰居資料」,並丟進黑盒子看看預測結果。接著,LIME 會用一個最簡單的「線性迴歸 (白盒子)」來學習這幾千筆鄰居資料的規律,從而推算出局部的權重!

import lime
import lime.lime_tabular

# 1. 建立 LIME 解密器
explainer = lime.lime_tabular.LimeTabularExplainer(
    training_data=X_train.values,
    feature_names=X_train.columns,
    mode='classification'
)

# 2. 對 Passenger 0 進行局部解密
exp = explainer.explain_instance(X_test.iloc[0], model.predict_proba)

# 3. 畫出 LIME 權重圖
exp.show_in_notebook(show_table=True)
LIME Plot

(LIME 局部解釋長條圖)

結果解析: 這張長條圖,就是 LIME 用「簡單線性迴歸」幫我們找出的局部權重。

  • 紅色長條 (扣分):向左延伸代表負面影響。因為他是「男性 (Sex = Male)」,這項特徵讓他被扣了 0.45 分;而「3 等艙 (Pclass = 3)」扣了 0.30 分。這兩點就是把他推向死亡的罪魁禍首。
  • 綠色長條 (加分):向右延伸代表正面影響。「28 歲 (Age = 28)」這個條件,微微為他加了 0.05 分。
  • 相較於 SHAP 嚴謹精算到底扣了幾 % 的生存率,LIME 更像是在告訴我們:「在這個人身上,哪幾個特徵的力量最大?」。它的優勢在於運算極快,能讓你一眼抓出主導決策的關鍵要素。

3. CFE:反事實行動顧問

如果你是這位乘客,你根本不想聽 LIME 或是 SHAP 解釋你為什麼會死,你只想知道「我該怎麼做才能活下來?」。這時候就要交給 DiCE (微軟開源的 CFE 套件):

import dice_ml

# 1. 定義資料與模型
d = dice_ml.Data(dataframe=train_data, continuous_features=['Age', 'Fare'], outcome_name='Survived')
m = dice_ml.Model(model=model, backend="sklearn")

# 2. 建立 CFE 解密器
exp = dice_ml.Dice(d, m)

# 3. 詢問 CFE:「請給我 2 個讓他生存率 > 50% 的改變方案」
dice_exp = exp.generate_counterfactuals(X_test.iloc[0:1], total_CFs=2, desired_class="opposite")
dice_exp.visualize_as_dataframe()
CFE Table

(CFE 反事實行動方案建議)

結果解析:CFE 直接給兩個方案:

  • Action 1:如果他願意花 $50 把艙等升級到「1 等艙 (Upgrade)」,他的生存率就會飆升到 62%!
  • Action 2:如果他變更性別為「女性 (Change)」,即使留在 3 等艙,生存率也能達到 55%!

CFE 的缺點 Action 2 (變更性別)中可以看出 CFE 的一大缺陷:演算法只負責算出數學上的最佳解,卻不懂現實世界的常理。性別或年齡在當下是不可能隨意改變的。因此在實務落地時,開發者必須嚴格設定「不可變動特徵 (Immutable Features)」,限制 CFE 只能針對「可變動特徵 (如存款、艙等)」提供建議,否則就會產出這種不切實際的方案。

總結比較表

比較維度SHAP (賽局貢獻度)LIME (局部抽查法)CFE (反事實解釋)
核心哲學公平分潤,數學嚴謹化繁為簡不問死因,只求生路
產出結果特徵加減分 (瀑布圖)局部權重 (長條圖)改變條件的行動方案 (表格)
運算速度較慢 (排列組合多)極快中等 (需尋找最佳解)

總結

XAI (可解釋 AI) 解決了深度學習與複雜機器學習模型長期以來的「信任危機」。 透過 XAI 的工具,我們不僅能擁有隨機森林 82% 的超高準確率,還能保有比邏輯回歸更完美的「白盒子解釋力」。這在金融業核貸、醫療診斷等場景中,是極度關鍵的技術!

下一關,我們將從傳統機器學習踏入當今最火熱的 GenAI (生成式 AI) 戰場。我們將在 Day 27 教你用 RAG (檢索增強生成) 打造企業專屬的超強大腦!