欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可解释的机器学习库—SHAP

程序员文章站 2024-03-21 11:40:16
...

1.SHAP介绍

  • SHAP(SHapley Additive exPlanations),是Python开发的一个“模型解释”包,它可以解释任何机器学习模型的输出。
  • 所有的特征都被视为“贡献者”。
  • 对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。
  • SHAP值从预测中把每一个特征的影响分解出来,可应用于如下场景中:
  1. 模型认为银行不应该给某人放贷,但是法律上需要银行给出每一笔拒绝放贷的原因。
  2. 医务人员想要确定对不同的病人而言,分别是哪些因素导致他们有患某种疾病的风险,这样就可以因人而异地采取针对性的卫生干预措施,直接处理这些风险因素。

2.工作原理

假设第i个样本为xi,第i个样本的第j个特征为xij,模型对该样本的预测值为yi,整个模型的基线(通常是所有样本的目标变量的均值),为y_base,那么SHAP value服从以下等式:

可解释的机器学习库—SHAP

其中,f(xij)为当前特征的SHAP值,即第i个样本中的当前特征对最终预测值yi的贡献值,当f(xij)>0,就说明该特征提升了预测值,有正向作用;反之,说明该特征使得预测值降低,有反作用。

传统的feature importance只告诉我们哪个特征重要,但是我们并不清楚该特征是怎样影响预测结果的。SHAP value的最大优势是SHAP能反映出每一个样本中的特征的影响力,而且还能表现出是正影响还是负影响。

3.使用方法

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)

3.1 Explainer

在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值

3.2 Local Interper

Local可解释性提供了预测的细节,侧重于解释单个预测是如何生成的。它可以帮助决策者信任模型,并且解释各个特征是如何影响模型的单次的决策的。

3.3 单个prediction的解释

SHAP提供极其强大的数据可视化功能,来展示模型或预测的解释结果。

# 可视化第一个prediction的解释   如果不想用JS,传入matplotlib=True
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

可解释的机器学习库—SHAP

上图的"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

3.4 多个预测的解释

要对多个样本进行解释,将上述形式旋转90度后并排放置,就可以看到整个数据及的explanations:

shap.force_plot(explainer.expected_value, shap_values, X)

可解释的机器学习库—SHAP

3.5 Global Interper

Global可解释性:寻求理解模型的overall structure(总体结构)。这往往比解释单个预测困难的多,因为它涉及到对模型的一般工作原理作出说明,而不仅仅是一个预测。

3.6 summary_plot

summary_plot为每一个样本绘制其每个特征的SHAP值,可以提供直观的理解整体模式,并允许发现预测异常值。每一行代表一个特征,横坐标为SHAP值。一个点代表一个样本,颜色表示特征值(红色高,蓝色低)。下图输出的summary_plot图,可以看出,LSTAT特征较高的取值会降低预测的房价。

可解释的机器学习库—SHAP

3.7 Feature Importance

SHAP提供了特征重要性的计算方式,取每个特征的SHAP值的绝对值的平均值作为该特征的重要性,得到一个标准的条形图(multi-class则生成堆叠的条形图)

shap.summary_plot(shap_values, X, plot_type="bar")

可解释的机器学习库—SHAP

从上图可以看出,LSTAT、RM、CRIM的特征重要性最高,必须保留,而CHAS、ZN、RAD三个特征的重要性最低,可以考虑删除。

3.8 Interaction Values

Interaction values是将SHAP推广到更高阶交互的一种方法。树模型实现了快速、精确的两两交互计算,这将为每个预测返回一个矩阵,其中主要影响在对角线上,交互影响在对角线外。这些数值往往揭示了有趣的隐藏关系(交互作用)。

shap_interaction_values = explainer.shap_interaction_values(X)
shap.summary_plot(shap_interaction_values, X)

可解释的机器学习库—SHAP

3.9 dependence_plot

为了理解单个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)

可解释的机器学习库—SHAP

# create a SHAP dependence plot to show the effect of a single feature across the whole dataset
shap.dependence_plot("LSTAT", shap_values, X)

可解释的机器学习库—SHAP