iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
自我挑戰組

用數據守護雙眼:生活型態對視力影響的探索性資料分析系列 第 25 篇

揭開黑盒子!SHAP 賽局理論特徵解釋與模型全局歸因分析

  • 分享至 

  • xImage
  •  

利用在 Day 23 表現最為優異的 LightGBM 冠軍模型,導入源自合作賽局理論的 SHAP(SHapley Additive exPlanations) 框架。擺脫傳統特徵重要度僅能給出相對排序的局限,計算各特徵對「高度疲勞風險(High Risk)」預測機率的真實邊際貢獻值(Shapley Value),繪製全局摘要蜂群圖(Summary Beeswarm Plot)與特徵交互作用相依圖(Dependence Plot),達成醫療級的可解釋性 AI(XAI)標準。

一、實作前情境:為什麼有了特徵重要度,還需要SHAP?
在 Day 20、22 與 23 中,我們分別探討了隨機森林的 MDI、XGBoost 的 Gain 與 LightGBM 的 Split 分裂次數:

1.傳統特徵重要度的致命盲區:

  • 只能告訴我們「特徵很重要」,但無法說明「特徵數值變大時,風險是變高還是變低」。
  • 無法拆解正負向效應:例如每日螢幕時數很長,到底推升了多少機率?充足睡眠又抵消了多少風險?
    2.SHAP(Shapley Additive exPlanations)的核心優勢:
  • 可加性歸因(Additive Attribution):基礎機率加上所有特徵的 Shapley 值之和,精準等於模型的最終預測機率:
    https://ithelp.ithome.com.tw/upload/images/20261009/20178794GoSfzc0i5f.png
  • 符號方向性與大小並存:正值(phi > 0)代表推升預測風險,負值(phi < 0)代表具備保護效應。
  • 個體與全局兼備:既能縱觀整個群體的普遍規律,又能針對單一特定受試者做精確病例拆解。

今天我們聚焦於臨床與健康管理最關心的目標——「高度疲勞風險(High Risk,類別 2)」的預測歸因機制。

二、撰寫SHAP歸因分析與視覺化腳本
在 Colab 中新增儲存格,使用 shap 套件建立 TreeExplainer,產出全局蜂群圖與 CESI 指數特徵相依圖:

# ==========================================
# Day 25:LightGBM 模型之 SHAP 可解釋性分析
# ==========================================

import warnings
warnings.filterwarnings('ignore')

import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm
import pandas as pd
import numpy as np

import shap

# 1. 引用中文字型
font_path = 'NotoSansTC-Regular.otf'
my_font = fm.FontProperties(fname=font_path)

# 2. 建立適用於樹模型的 SHAP TreeExplainer
# 使用在 Day 23 訓練完成的 lgb_clf
explainer = shap.TreeExplainer(lgb_clf)

# 3. 計算測試集 (X_test) 的 SHAP 數值
# 對於多分類模型,shap_values 形狀為 (樣本數, 特徵數, 類別數)
shap_values = explainer(X_test)

# 提取針對「高度疲勞風險 (Class 2: High)」的 SHAP 值
shap_values_high = shap_values[:, :, 2]

# 4. 繪製 SHAP 全局摘要蜂群圖 (Summary Beeswarm Plot)
plt.figure(figsize=(12, 7))
plt.title('特徵對預測「高度疲勞風險 (High)」的 SHAP 邊際貢獻分佈', fontproperties=my_font, fontsize=14, fontweight='bold', pad=15)

# 繪製蜂群圖 (每個點代表測試集的一位受試者)
shap.plots.beeswarm(shap_values_high, max_display=11, show=False)

# 調整坐標軸字型
plt.xlabel('SHAP 值 (推升預測為高度風險的邊際貢獻)', fontproperties=my_font, fontsize=12)
plt.ylabel('輸入特徵項目', fontproperties=my_font, fontsize=12)
plt.tight_layout()
plt.show()

# 5. 繪製核心特徵相依圖 (Dependence Plot):CESI_Score vs. Sleep_Hours
# 觀察合成指數在不同睡眠時數下的邊際效應演變
fig, ax = plt.subplots(figsize=(10, 6))
shap.plots.scatter(
    shap_values_high[:, 'CESI_Score'], 
    color=shap_values_high[:, 'Sleep_Hours'], 
    ax=ax, 
    show=False
)
ax.set_title('CESI 綜合疲勞指數與睡眠時數對高度風險的非線性交互 SHAP 相依圖', fontproperties=my_font, fontsize=13, fontweight='bold')
ax.set_xlabel('CESI 綜合疲勞指數 (標準化後)', fontproperties=my_font, fontsize=12)
ax.set_ylabel('CESI_Score 之 SHAP 貢獻值', fontproperties=my_font, fontsize=12)
plt.tight_layout()
plt.show()

# 6. 計算平均絕對 SHAP 值總表 (全局邊際影響力排名)
mean_abs_shap = np.abs(shap_values_high.values).mean(axis=0)
shap_ranking_df = pd.DataFrame({
    '特徵項目': X_test.columns,
    '平均絕對 SHAP 貢獻值': mean_abs_shap.round(4)
}).sort_values(by='平均絕對 SHAP 貢獻值', ascending=False).reset_index(drop=True)

print("=== 預測高風險之 SHAP 特徵全局影響力排行榜 ===")
display(shap_ranking_df)

https://ithelp.ithome.com.tw/upload/images/20261010/201787942hiYhb4C1m.png
https://ithelp.ithome.com.tw/upload/images/20261010/201787943OTPUNFSvB.png
https://ithelp.ithome.com.tw/upload/images/20261010/20178794dzDG82JcAH.png

三、圖表解讀與客觀數據分析

  1. 全局摘要蜂群圖與影響力排行:正負因果完全透明化
    觀察蜂群圖的點位分佈(橫軸為 SHAP 邊際貢獻值,大於 0 代表推升判定為高風險,小於0代表降低高風險機率;點顏色紅色為高、藍色為低)與平均絕對 SHAP 貢獻表:
    a.自覺乾澀度躍居第一(平均絕對 SHAP 達 0.2438):
  • Eye_Dryness_Level 在排行榜上以 0.2438 的高分奪冠。
  • 觀察蜂群圖,右側(SHAP 介於+0.25 ~ +0.70的強推升區)高度聚集了藍色與亮粉色散點,顯示乾澀度是模型在多數深層葉節點判定個體是否邁入高風險門檻的重要催化劑。

b.特徵工程指標成功驗證:CESI_Score 穩坐第二(平均絕對 SHAP 達 0.1642):

  • 在合成特徵 CESI_Score 上,呈現出整齊的顏色分流:紅色點(高 CESI 指數)幾乎全數分佈在右側正值區(推升風險),藍色點(低 CESI 指數)則向左延伸至-0.45處(壓低風險)。這證實了 Day 15 所打造的綜合用眼疲勞指數具備單調遞增的預測方向性。

c.作息暴露的拉鋸:Sleep_Hours (0.1589) vs. Daily_Screen_Hours (0.1493):

  • 兩者分居第3與第4名。
  • Sleep_Hours 在右側正值區(推升風險)出現了大量的深藍色點(低睡眠時數),證實睡眠嚴重缺乏是將受試者推向高風險群的核心推手。
  • Daily_Screen_Hours 則在負值側左端出現密集的深紅色聚集(過度極端暴露時的非線性截斷效應)。

d.無效特徵的幾何收斂:底層邊界完全凍結:

  • 統計檢定不顯著的 Role_Student(0.0273)與 Blue_Light_Filter_Used_Yes(0.0123)穩居倒數前兩名。 * 在蜂群圖中,這兩項特徵的散點緊密壓縮在 x = 0.0 的中線垂直軸上,幾乎沒有任何向左右擴展的動態範圍。這說明無論受試者是學生還是上班族、是否開啟抗藍光濾鏡,模型給予的邊際預測機率增減量都趨近於 0!
  1. CESI 與睡眠時數交互相依圖:非線性臨界閾值曝光
    觀察相依圖中標準化後的 CESI_Score 與其 SHAP 貢獻值的散佈走勢(顏色代表 Sleep_Hours):
    a.清晰的正斜率非線性爬升:
  • 當CESI_Score< 0(標準化負值,即用眼負擔低於平均)時,SHAP 貢獻值全數落在-0.45 ~ 0.0 之間,發揮保護抑制效應。
  • 一旦CESI_Score > 0(高於平均水準),SHAP貢獻值迅速突破0軸並向上猛增至 +0.40 ~ +0.65。這揭示了一個明確的「亞健康臨界點」——一旦綜合用眼負擔突破平均值,模型判定其為高風險的邊際推力呈現指數級釋放。

b.睡眠時數(Sleep_Hours)的非線性調節:

  • 在CESI處於高值區(> 1.0)時,散佈點呈現深藍色與洋紅色交織,顯示即使暴露與自覺指數偏高,若睡眠時數產生微幅變動,依然會對最後的SHAP增益產生上下約0.2的擾動調節。

上一篇
五大演算法終極爭霸!全模型性能評測與多類別 ROC-AUC 曲線大對決
下一篇
個人化臨床級解構!SHAP 瀑布圖與個體病例診斷
系列文
用數據守護雙眼:生活型態對視力影響的探索性資料分析 共 26 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言