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