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