可解释的机器学习库—SHAP

1.SHAP介绍

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

2.工作原理

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

其中,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,:])

上图的"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_第1张图片

3.5 Global Interper

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

3.6 summary_plot

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

可解释的机器学习库—SHAP_第2张图片

3.7 Feature Importance

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

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

可解释的机器学习库—SHAP_第3张图片

从上图可以看出,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_第4张图片

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_第5张图片

# 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_第6张图片

 

你可能感兴趣的:(特征筛选,学习,数据挖掘,机器学习)