返回目錄
A
洞悉未來:資料科學決策師的實務指南 - 第 6 章
第六章 模型解釋與可視化
發布於 2026-03-01 15:00
# 第六章 模型解釋與可視化
在上一章我們討論了如何選擇合適的模型,現在進一步把焦點放在「為什麼模型會做出這樣的決策」以及「如何把這些決策直覺化」上。對於非技術背景的決策者而言,了解模型內部的邏輯同樣重要,因為只有「被理解」的洞察才能轉化為可執行的策略。
## 6.1 為什麼要解釋模型?
| 目的 | 影響 | 例子 |
|------|------|------|
| 信任 | 企業能放心部署 | 信用卡審批機器判斷的可解釋性使風控團隊安心 |
| 合規 | 遵守法規需求 | 金融機構需要能證明模型決策不含歧視 |
| 行動 | 產生可執行建議 | 營銷策略師根據特徵重要性調整推廣渠道 |
> **實務提醒**:解釋模型不等於要把整個模型「拆開」;我們只需要找出關鍵驅動因子,並呈現在決策者熟悉的語境中。
## 6.2 解釋性指標:從宏觀到微觀
| 層級 | 說明 | 典型工具 |
|------|------|----------|
| **全局** | 整體模型可解釋性 | 係數向量、特徵重要性、Permutation Importance |
| **局部** | 單一預測原因 | LIME、SHAP、Partial Dependence Plot |
| **交互** | 特徵之間互動 | Interaction SHAP、Pairwise PDP |
### 6.2.1 係數向量(線性模型)
python
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import pandas as pd
# 讀取資料
X = pd.read_csv('data/features.csv')
y = pd.read_csv('data/target.csv')['label']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = LogisticRegression()
model.fit(X_scaled, y)
# 係數表格
coeff_df = pd.DataFrame({
'feature': X.columns,
'coef': model.coef_[0]
})
print(coeff_df.sort_values('coef', ascending=False))
> **提示**:在呈現給決策者時,請將係數乘以 1000 或使用 Odds Ratio,讓數字更直觀。
### 6.2.2 Permutation Importance(全局重要性)
python
from sklearn.inspection import permutation_importance
perm = permutation_importance(model, X_scaled, y, n_repeats=30, random_state=42)
importances = pd.DataFrame({
'feature': X.columns,
'importance': perm.importances_mean
}).sort_values('importance', ascending=False)
print(importances.head(10))
### 6.2.3 SHAP(局部與全局)
SHAP(SHapley Additive exPlanations)提供單一預測的貢獻分數,同時能匯總全局重要性。
python
import shap
explainer = shap.TreeExplainer(random_forest_model)
shap_values = explainer.shap_values(X)
# 全局圖
shap.summary_plot(shap_values[1], X) # 假設二分類,index 1 代表正類
# 單筆解釋
instance = X.iloc[0]
shap.force_plot(explainer.expected_value[1], shap_values[1][0], instance)
> **注意**:若模型是非樹狀結構,可使用 `shap.KernelExplainer`,但計算成本較高。
### 6.2.4 LIME(局部線性逼近)
LIME 以局部線性模型逼近複雜模型,並提供特徵權重。
python
from lime import lime_tabular
explainer = lime_tabular.LimeTabularExplainer(
training_data=np.array(X),
feature_names=X.columns,
class_names=['neg', 'pos'],
mode='classification'
)
exp = explainer.explain_instance(instance.values, random_forest_model.predict_proba)
exp.show_in_notebook(show_table=True)
> **小技巧**:在展示給非技術決策者時,只保留前五名特徵,並用簡短語句解釋其業務意義。
## 6.3 可視化技巧:從圖表到故事
### 6.3.1 係數雷達圖
python
import plotly.express as px
fig = px.line_polar(
name='Feature Coefficients',
theta=coeff_df['feature'],
r=coeff_df['coef'],
line_close=True
)
fig.update_layout(title='Model Coefficient Radar')
fig.show()
> **說明**:雷達圖能一眼看出哪些特徵正向或負向影響。
### 6.3.2 SHAP Beeswarm Plot
已在 6.2.3 中展示。若需更精簡:
python
shap.summary_plot(shap_values[1], X, plot_type='bar', max_display=10)
> **解讀**:bar 顯示全局重要性,左側為正向影響,右側為負向。
### 6.3.3 Partial Dependence Plot(PDP)
python
from sklearn.inspection import plot_partial_dependence
fig, ax = plt.subplots(figsize=(10, 5))
plot_partial_dependence(
model, X, features=['age', 'income'],
ax=ax, n_jobs=-1, grid_resolution=20
)
plt.show()
> **實務**:PDP 可顯示「年齡」對預測結果的趨勢,協助設定門檻。
## 6.4 案例:從預測到策略
### 6.4.1 背景
一家零售企業想提升會員購買率。經過模型訓練,我們使用 LightGBM 預測「是否在下個月購買」。模型輸出準確率 0.86,然而管理層想知道「為什麼」。
### 6.4.2 解析流程
1. **全局重要性**:使用 Permutation Importance 發現「上次購買距離」與「會員等級」為前兩大驅動因子。
2. **局部解釋**:挑選一位即將流失的會員,利用 SHAP 觀察特徵貢獻,發現「最近一次折扣使用率」低於 0.1,說明其對購買意願影響大。
3. **可視化**:製作 PDP 讓業務同仁看見「會員等級」與「購買機率」的關係,呈現折線圖。
4. **策略制定**:
- 針對高等級會員,設計 15% 折扣券;
- 對於離線距離大於 60 天的會員,推送個人化推薦。
5. **監測**:每月重新計算 SHAP,檢查策略是否仍有效。
> **結語**:可解釋性不是終點,而是一座橋梁,將資料科學的洞察轉化為具體商業行動。
## 6.5 小結
- **模型可解釋性** 能增強決策者的信任,並協助遵守合規要求。
- **解釋性指標** 從全局係數到局部 SHAP,提供多層次的洞察。
- **可視化工具**(Plotly、SHAP、PDP)能將抽象數值轉化為易懂的圖形,便於溝通。
- **實務案例** 示範如何從解釋走向策略,並持續監測。
> **後續**:第七章將探討「模型部署與持續學習」,協助讀者將模型落地並維持其效能。