使用 SHAP 使機器學習模型變的可解釋!!!
大家好,我是小寒
SHAP 是一種用于解釋機器學習模型預測結果的方法,它基于博弈論中的 Shapley值。旨在為每個特征分配一個“貢獻值”,表明該特征對模型預測結果的影響有多大。
SHAP 為復雜的黑箱模型(如深度學習模型、集成方法等)提供了一種統一且理論上有保障的解釋框架,幫助我們理解模型的決策過程,提高模型的透明度和可信度。
SHAP 的基本概念
SHAP 借鑒了博弈論中 Shapley 值的思想,將模型視為一個合作游戲,特征被視為游戲中的“玩家”,而模型輸出(模型預測)是“收益”。
Shap 值的計算過程
SHAP 值的計算依賴于計算所有特征組合的邊際貢獻。其計算過程如下。
- 采樣特征子集
選取包含或不包含特定特征的不同組合,計算其對模型輸出的影響。 - 計算邊際貢獻
比較加入和移除某特征后模型輸出值的差異。 - 平均邊際貢獻
對所有可能組合計算的貢獻值取平均,得到特征的 Shap 值。
由于特征組合的數量呈指數級增長,SHAP 使用近似方法(如蒙特卡洛采樣、特定模型優化)來減少計算成本。
SHAP 的特點
- 一致性
如果某個特征對預測的影響增加,其 SHAP 值也應增加。 - 公平性
所有特征的貢獻之和等于模型的預測值減去基準值(如平均預測值)。 - 模型無關性
可以應用于任何機器學習模型(如 XGBoost、隨機森林、深度神經網絡等)。 - 局部與全局解釋能力
- 局部解釋:解釋單個預測值的貢獻。
- 全局解釋:衡量整個數據集上特征的重要性。
SHAP 的應用
SHAP 廣泛應用于解釋機器學習模型,以下是常見的應用場景。
- 特征重要性分析:了解哪些特征對模型預測結果影響最大。
- 個體預測解釋:解釋特定樣本的預測結果,提供個性化解釋。
- 模型調優:通過 SHAP 分析特征貢獻來優化模型。
- 異常檢測:識別在決策過程中導致異常預測的關鍵特征。
SHAP 的實現方式
SHAP 提供了多種計算方法,適用于不同的模型類型和規模。
- Kernel SHAP(通用)
適用于任意黑盒模型,使用加權線性回歸來逼近 SHAP 值,但計算成本較高。 - Tree SHAP(決策樹專用)
針對決策樹模型(如 XGBoost、LightGBM、Random Forest)進行了優化,計算效率更高。 - Deep SHAP(深度學習)
結合深度學習的梯度信息來估計 SHAP 值。
案例分享
以下是將 SHAP 與復雜的 XGBoost 模型一起使用的示例代碼。
首先訓練一個 xgboost 模型。
import shap
import xgboost as xgb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 1. 加載加利福尼亞房價數據集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target
# 2. 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 訓練 XGBoost 模型
model = xgb.XGBRegressor(objective="reg:squarederror", n_estimators=100, max_depth=4, random_state=42)
model.fit(X_train, y_train)
接下來,計算 SHAP 值,并展示所有特征對預測的整體影響。
explainer = shap.Explainer(model, X_train)
shap_values = explainer(X_test)
shap.summary_plot(shap_values, X_test)
圖片
接下來,使用 force_plot 圖,直觀展示單個樣本的預測分解。
shap.force_plot(explainer.expected_value, shap_values[10].values, X_test.iloc[10], matplotlib=True)
圖片
使用 Dependence Plot(依賴圖) 顯示特征 AveRooms 如何影響預測,同時考慮與其他特征的交互效應。
shap.dependence_plot("AveRooms", shap_values.values, X_test)
圖片
使用 Decision Plot(決策圖) 展示特征在決策路徑中的累積影響。
shap.decision_plot(explainer.expected_value, shap_values.values[:10], X_test.iloc[:10])
圖片