赞
踩
假设第i个样本为xi,第i个样本的第j个特征为xij,模型对该样本的预测值为yi,整个模型的基线(通常是所有样本的目标变量的均值),为y_base,那么SHAP value服从以下等式:
其中,f(xij)为当前特征的SHAP值,即第i个样本中的当前特征对最终预测值yi的贡献值,当f(xij)>0,就说明该特征提升了预测值,有正向作用;反之,说明该特征使得预测值降低,有反作用。
传统的feature importance只告诉我们哪个特征重要,但是我们并不清楚该特征是怎样影响预测结果的。SHAP value的最大优势是SHAP能反映出每一个样本中的特征的影响力,而且还能表现出是正影响还是负影响。
pip即可安装,以boston房价数据集下训练一个xgboost为例
- import pandas as pd
- import shap
- import matplotlib.pyplot as plt
- import numpy as np
- import xgboost as xgb
- shap.initjs() # notebook环境下,加载用于可视化的JS代码
-
- # 我们先训练好一个XGBoost model
- X,y = shap.datasets.boston()
- model = xgb.train({"learning_rate": 0.01}, xgb.DMatrix(X, label=y), 100)
在SHAP中进行模型解释时,需要先创建一个explainer,SHAP支持很多类型的explainer,例如:deep,gradient,kernel,linear,tree,sampling,本文以tree为例,因为它支持常用的XGB,LGB,CatBoost等基于树的集成算法。
创建Explainer:
- explainer = shap.TreeExplainer(model)
- shap_values = explainer.shap_values(X) #传入特征矩阵X,以计算SHAP值
Local可解释性提供了预测的细节,侧重于解释单个预测是如何生成的。它可以帮助决策者信任模型,并且解释各个特征是如何影响模型的单次的决策的。
SHAP提供极其强大的数据可视化功能,来展示模型或预测的解释结果。
- # 可视化第一个prediction的解释 如果不想用JS,传入matplotlib=True
- shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
上图的"Explanation"展示了每个特征的贡献程度,图上有base value 以及最终的f(x)值,红色表示为正向作用,蓝色表示为负向作用,模型将预测结果从base推动到了f(x),推高的特征用红色表示,将预测推低的特征用蓝色表示。
基本值(base value)是我们传入数据及上模型预测值的均值,可以用以下代码进行验证:
- y_base = explainer.expected_value
- print(y_base)
14.230186
- pred = model.predict(xgb.DMatrix(X))
- print(pred.mean())
14.230186
要对多个样本进行解释,将上述形式旋转90度后并排放置,就可以看到整个数据及的explanations:
shap.force_plot(explainer.expected_value, shap_values, X)
Global可解释性:寻求理解模型的overall structure(总体结构)。这往往比解释单个预测困难的多,因为它涉及到对模型的一般工作原理作出说明,而不仅仅是一个预测。
summary_plot为每一个样本绘制其每个特征的SHAP值,可以提供直观的理解整体模式,并允许发现预测异常值。每一行代表一个特征,横坐标为SHAP值。一个点代表一个样本,颜色表示特征值(红色高,蓝色低)。下图输出的summary_plot图,可以看出,LSTAT特征较高的取值会降低预测的房价。
SHAP提供了特征重要性的计算方式,取每个特征的SHAP值的绝对值的平均值作为该特征的重要性,得到一个标准的条形图(multi-class则生成堆叠的条形图)
shap.summary_plot(shap_values, X, plot_type="bar")
从上图可以看出,LSTAT、RM、CRIM的特征重要性最高,必须保留,而CHAS、ZN、RAD三个特征的重要性最低,可以考虑删除。
Interaction values是将SHAP推广到更高阶交互的一种方法。树模型实现了快速、精确的两两交互计算,这将为每个预测返回一个矩阵,其中主要影响在对角线上,交互影响在对角线外。这些数值往往揭示了有趣的隐藏关系(交互作用)。
- shap_interaction_values = explainer.shap_interaction_values(X)
- shap.summary_plot(shap_interaction_values, X)
为了理解单个feature如何影响模型的输出,我们可以将该feature的SHAP值与数据集中的所有样本的feature值进行比较。由于SHAP值表示一个feature对模型输出中的变动量的贡献,下图表示随着特征RM变化的预测房价(output)的变化。单一RM(特征)值垂直方向上的色散表示与其他特征的相互作用,为了帮助揭示这些交互作用,“dependence_plot函数”自动选择另一个用于着色的feature。在这个案例中,RAD特征着色强调了RM(每栋房屋的平均房间数)对RAD值较高地区的房价影响较小。
- # create a SHAP dependence plot to show the effect of a single feature across the whole dataset
- shap.dependence_plot("RM", shap_values, X)
- # create a SHAP dependence plot to show the effect of a single feature across the whole dataset
- shap.dependence_plot("LSTAT", shap_values, X)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。