SHAP 是一种解释机器学习模型预测结果的方法,它基于博弈论中的 Shapley 值理论。
它通过计算每个特征对模型输出的贡献度,帮助我们理解模型的决策过程。
SHAP 适用于各种类型的机器学习模型,使得黑盒模型(如深度神经网络、随机森林等)的预测更加透明、可解释。
核心概念
- Shapley 值
源自博弈论的 Shapley 值,用于公平地分配合作博弈中各参与者的收益。
在机器学习中,SHAP 通过计算每个特征在不同组合中的边际贡献,求取其平均值,从而得到该特征的 Shapley 值。这种方法确保了模型解释的公平性和一致性。 - 可加性解释模型
SHAP 构建了一个可加性的解释模型,将模型的预测结果表示为各特征贡献的线性组合。
这种方法确保了特征贡献的总和等于模型的预测值,从而提供了一种一致且直观的解释方式。
SHAP的主要特点
1.一致性
如果模型的特征贡献增加,那么相应的SHAP值也会增加,确保解释的合理性。
2.局部解释
3.全局解释
通过对多个数据点的SHAP值进行汇总,提供模型整体行为的洞察。
SHAP的优势
- 模型无关性
SHAP 适用于多种机器学习模型,包括线性模型、树模型和深度学习模型等。 - 理论基础
SHAP基于Shapley值,具有坚实的理论支持,确保解释的公平性和一致性。 - 可视化能力
SHAP提供多种可视化工具,帮助直观地理解特征对模型预测的影响。
案例分享
下面,我们来训练一个 XGBoost 模型并计算 SHAP 值来解释每个特征如何影响预测。
首先,我们加载数据集(加利福尼亚住房数据集)并训练一个 XGBoost 模型
import shap
import xgboost as xgb
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载加利福尼亚住房数据集
california_housing = fetch_california_housing()
X, y = california_housing.data, california_housing.target
feature_names = california_housing.feature_names
X = pd.DataFrame(X, columns=feature_names)
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = xgb.XGBRegressor(random_state=42)
model.fit(X_train, y_train)
接下来,计算训练集上的 SHAP值,并使用 shap.summary_plot 展示了各特征对模型预测的总体影响。
explainer = shap.Explainer(model,X_train)
shap_values = explainer(X_train)
shap.summary_plot(shap_values, X_train, feature_names=feature_names)
下图按所有样本的 SHAP 值大小总和对特征进行排序,并使用 SHAP 值显示每个特征对模型输出的影响的分布。
我们还可以只取每个特征的 SHAP 值的平均绝对值来获得标准条形图。
shap.plots.bar(shap_values,show=False)
最后,我们使用 shap.force_plot 展示了单个样本的特征贡献,帮助我们理解模型对该样本的具体预测。
shap.initjs() # 初始化JS以便显示交互图
shap.force_plot(explainer.expected_value, shap_values.values[0, :], X_train.iloc[0])