聊天視窗

洞悉未來:資料科學決策師的實務指南 - 第 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)能將抽象數值轉化為易懂的圖形,便於溝通。 - **實務案例** 示範如何從解釋走向策略,並持續監測。 > **後續**:第七章將探討「模型部署與持續學習」,協助讀者將模型落地並維持其效能。