专栏首页数据STUDIO用 SHAP 可视化解释机器学习模型实用指南(下)

用 SHAP 可视化解释机器学习模型实用指南(下)

大家好,我是云朵君!

导读: SHAP是Python开发的一个"模型解释"包,是一种博弈论方法来解释任何机器学习模型的输出。本文重点介绍11种shap可视化图形来解释任何机器学习模型的使用方法。上篇用 SHAP 可视化解释机器学习模型实用指南(上)已经介绍了特征重要性和特征效果可视化,而本篇将继续介绍shap用于模型预测的可解释性。

👆点击关注|设为星标|干货速递👆


SHAP(Shapley Additive exPlanations) 使用来自博弈论及其相关扩展的经典 Shapley value将最佳信用分配与局部解释联系起来,是一种基于游戏理论上最优的 Shapley value来解释个体预测的方法。

从博弈论的角度,把数据集中的每一个特征变量当成一个玩家,用该数据集去训练模型得到预测的结果,可以看成众多玩家合作完成一个项目的收益。Shapley value通过考虑各个玩家做出的贡献,来公平的分配合作的收益。

下面先回顾下如何创建解释器Explaineer,并计算SHAP。

数据集

标准的 UCI 成人收入数据集。

import shap
X,y = shap.datasets.adult()
X_display, y_display = shap.datasets.adult(display=True)

创建Explainer并计算SHAP值

在SHAP中进行模型解释需要先创建一个explainer,SHAP支持很多类型的explainer(例如deep, gradient, kernel, linear, tree, sampling),本文使用支持常用的XGB、LGB、CatBoost等树集成算法的tree为例。

  • deep:用于计算深度学习模型,基于DeepLIFT算法
  • gradient:用于深度学习模型,综合了SHAP、集成梯度、和SmoothGrad等思想,形成单一期望值方程
  • kernel:模型无关,适用于任何模型
  • linear:适用于特征独立不相关的线性模型
  • tree:适用于树模型和基于树模型的集成算法
  • sampling :基于特征独立性假设,当你想使用的后台数据集很大时,kenel的一个很好的替代方案
explainer = shap.TreeExplainer(model)  

然后计算shap_values值,计算非常简单,直接利用上面得到的解释器解释训练样本X,这里有两种形式:

输出numpy.array数组

shap_values = explainer.shap_values(X) 

输出shap.Explanation对象

shap_values2 = explainer(X) 

模型预测的可解释性

Force plot

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

单个预测的解释可视化

SHAP force plot 提供了单一模型预测的可解释性,可用于误差分析,找到对特定实例预测的解释。

# 如果不想用JS,传入matplotlib=True
shap.force_plot(explainer.expected_value, 
                shap_values[0,:], 
                X_display.iloc[0,:])

尝试分析此图。

  • 模型输出值:-5.89
  • 基值:模型输出与训练数据的平均值(explainer.expected_value)
  • 绘图箭头下方数字是此实例的特征值。如Age=39,Education-Num=13
  • 将预测推高的特征用红色表示,将预测推低的特征用蓝色表示
  • 箭头越长,特征对输出的影响越大。通过 x 轴上刻度值可以看到影响的减少或增加量。

多个预测的解释可视化

如果对多个样本进行解释,将上述形式旋转90度然后水平并排放置,得到力图的变体,我们可以看到整个数据集的 explanations

通过上图中上方和左方选项卡,可以任意选择单个变量的多个样本对模型输出结果的影响。如下Age前80个样本,对模型输出结果f(x)的影响。

Interaction Values

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

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

Decision plot

SHAP 决策图显示复杂模型如何得出其预测(即模型如何做出决策)。决策图是 SHAP value 的文字表示,使其易于解读。

决策图显示的信息与力图基本相同,都可以有效地解释上述模型的预测。而且很容易识别出主要影响的大小和方向。

决策图比力图更清晰和直观,尤其是要分析的特征比较多的时候。在力图中,当预测变量的数量较多时,信息可能看起来非常紧凑。

explainer = shap.TreeExplainer(model)
expected_value = explainer.expected_value
# 限制20个样本
features = X.iloc[range(20)]
# 展示第一条样本
shap_values = explainer.shap_values(features)[1]

shap.decision_plot(expected_value, shap_values, 
                   features_display)

决策图中间灰色垂直直线标记了模型的基础值,彩色线是预测,表示每个特征是否将输出值移动到高于或低于平均预测的值。特征值在预测线旁边以供参考。从图的底部开始,预测线显示 SHAP value 如何从基础值累积到图顶部的模型最终分数。

shap_values = explainer.shap_values(features)
y_pred = (shap_values.sum(1) + expected_value) > 0
misclassified = y_pred != y[select]
shap.decision_plot(expected_value, shap_values, 
                   features_display, 
                   link='logit', 
                   highlight=misclassified)

决策图支持将对link='logit'数几率转换为概率。 使用虚线样式highlight=misclassified突出显示一个错误分类的观察结果。

通过单独绘制来检查错误分类的观察结果。绘制单个观测值时,会显示其相应的特征值。

shap.decision_plot(expected_value, 
                   shap_values[misclassified], 
                   features_display[misclassified],
                   link='logit', 
                   highlight=0)

错误分类观察的力图如下所示。在这种情况下,决策图和力图都可以有效地显示模型如何得出其决策。

shap.force_plot(expected_value, 
                shap_values[misclassified], 
                features_display[misclassified],
                link='logit', 
                matplotlib=True)

决策图的基本作用

  1. 大量特征效果清晰展示。
  2. 可视化多输出预测。
  3. 显示交互的累积效果。
  4. 探索一系列特征值的特征效果。
  5. 进行异常值检测。
  6. 确定典型的预测路径。
  7. 比较和对比几个模型的预测。

如需要具体了解每种作用的方法,建议去官网决策图查看每种作用所举的例子。

使用 SHAP 值进行异常值检测

这里只介绍一个异常检测的例子。

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=random_state)
d_train = lgb.Dataset(X_train, label=y_train)
d_test = lgb.Dataset(X_test, label=y_test)

params = {
    "max_bin": 512, "learning_rate": 0.05,
    "boosting_type": "gbdt", "objective": "binary",
    "metric": "binary_logloss", "verbose": -1,
     "min_data": 100, "random_state": 1
    "boost_from_average": True, "num_leaves": 10 }

model = lgb.train(params, d_train, 10000, valid_sets=[d_test], 
                  early_stopping_rounds=50, verbose_eval=1000)
explainer = shap.TreeExplainer(model)
expected_value = explainer.expected_value[1]

features = X_test.iloc[range(20)]
features_display = X_display.loc[features.index]
shap_values = explainer.shap_values(features)[1]
  
y_pred = model.predict(X_test) 
r = shap.decision_plot(expected_value, 
                       explainer.shap_values(T)[1], 
                       X_test[(y_pred >= 0.03) & (y_pred <= 0.1)], 
                       feature_order='hclust', 
                       return_objects=True)

将决策图叠加在一起有助于根据 SHAP value 定位异常值。在上图中,你可以看到一个不同数据集的示例,用于使用SHAP决策图进行异常值检测。

Heatmap plot

热图旨在使用监督聚类和热图显示数据集的总体子结构。监督聚类涉及的不是通过数据点的原始特征值而是通过它们的 shap values 对数据点进行聚类。默认使用 shap.utils.hclust_ordering 进行聚类。

绘图时,将 SHAP 值矩阵传递给热图绘图函数。得到的图中, x 轴上是实例、y 轴上是模型输入以及色标上是编码的 SHAP 值。默认情况下,样本使用 shap.order.hclust 排序,它基于层次聚类并根据解释相似性对样本进行排序。

这将因相同原因和具有相同模型输出的样本被分组在一起,如下图中对capital gain影响较大的人被分组在一起了。

shap.plots.heatmap(shap_values)

在热图矩阵上方是模型的输出,灰色虚线是基线(.base_value),图右侧的条形图是每个模型输入的全局重要性(默认用shap.order.abs.mean整体重要性来度量)

更改排序顺序和全局特征重要性值

通过给feature_values参数传递一组值来改变衡量特征整体重要性的方式(以及它们的排序顺序)。默认情况下feature_values=shap.Explanation.abs.mean(0),还可以在所有样本中按特征的最大绝对值进行排序。

shap.plots.heatmap(shap_values2, 
                   feature_values=shap_values.abs.max(0))

通过给instance_order参数传递一组值控制实例的顺序。默认情况下,设置instance_order=shap.Explanation.hclust(0)将具有相似解释的样本分组在一起。还可以按所有特征的 SHAP 值总和排序。

shap.plots.heatmap(shap_values2, 
                   instance_order=shap_values.sum(1))

Waterfall plot

瀑布图旨在显示单个预测的解释,因此将解释对象的单行作为输入。瀑布图从底部的模型输出的预期值开始,每一行显示每个特征的是正(红色)或负(蓝色)贡献,即如何将值从数据集上的模型预期输出值推动到模型预测的输出值。

shap.plots.waterfall(shap_values2[5])

这里值得注意拥有 2,174 美元的资本收益的人会比每年赚取超过 5 万美元的人的预测概率明显低很多。这里由于waterfall绘图仅显示了单个样本数据,因此我们无法看到资本收益变化的影响。可以使用scatter图来展示资本收益的低值是如何比根本没有资本收益更负面地预测收入。

shap.plots.scatter(shap_values2[:,"Capital Gain"])
参考文章

[1] https://shap.readthedocs.io/en/latest/index.html [2] https://www.bilibili.com/read/cv11622011

OK,今天的分享就到这里啦!

没看够?点赞在看走起来~后续更精彩~

本文分享自微信公众号 - 数据STUDIO(jim_learning),作者:云朵君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MLK | 如何解决机器学习树集成模型的解释性问题

    前些天在同行交流群里,有个话题一直在群里热烈地讨论,那就是 如何解释机器学习模型 ,因为在风控领域,一个模型如果不能得到很好的解释一般都不会被通过的,在银行里会...

    Sam Gor
  • 近6万字的机器学习理论笔记分享,附PDF下载

    近期在对历史的机器学习文章进行了整理与归集,方便自己也方便他人学习知识,今天分享给大家的是一个近8万字的机器学习理论知识点文章汇集,主题为《machine le...

    Sam Gor
  • 干货 | 可解释的机器学习

    想象你是一个数据科学家,你想要在业余时间根据你朋友在facebook和twitter上发布的信息,来预估你朋友假期要去度假的地方。如果你预测对了,你朋友一定叹为...

    AI科技评论
  • 可解释的机器学习

    想象你是一个数据科学家,你想要在业余时间根据你朋友在facebook和twitter上发布的信息,来预估你朋友假期要去度假的地方。如果你预测对了,你朋友一定叹为...

    AI研习社
  • 10万+字的机器学习理论笔记&特征工程tips分享,附PDF下载

    随着我们在机器学习、数据建模、数据挖掘分析这条发展路上越走越远,其实越会感觉到机器学习理论知识和特征工程的重要性,这里有两本一位好友整理的学习资料,都是满满干货...

    Sam Gor
  • 风控ML[2] | 机器学习模型如何做业务解释?

    「风控ML」系列文章,主要是分享一下自己多年以来做金融风控的一些事一些情,当然也包括风控建模、机器学习、大数据风控等相关技术分享,欢迎同行交流与新同学的加入,共...

    Sam Gor
  • SHAP值:用博弈论的概念解释一个模型

    在越来越多的领域中机器学习模型已开始需要更高的标准, 例如模型预测中公司需要对模型产生的任何虚假预测负责。有了这种转变,可以说模型的可解释性已经比预测能力具有更...

    deephub
  • 黑盒模型实际上比逻辑回归更具可解释性

    如何让复杂的模型具备可解释性,SHAP值是一个很好的工具,但是SHAP值不是很好理解,如果能将SHAP值转化为对概率的影响,看起来就很舒服了。先前阿Sam也写过...

    Sam Gor
  • 利用lightgbm做learning to rank 排序,解析模型中特征重要度

    去年实习时,因为项目需要,接触了一下Learning to Rank(以下简称L2R),感觉很有意思,也有很大的应用价值。L2R将机器学习的技术很好的应用到...

    机器学习AI算法工程
  • Nat. Mach. Intell.|从局部解释到全局理解的树模型

    今天介绍美国华盛顿大学保罗·艾伦计算机科学与工程学院的Su-In Lee团队在nature mechine intelligence 2020的论文,该论文提出...

    DrugAI
  • 解读计算机视觉的深度学习模型

    人工智能(AI)不再仅限于研究论文和学术界。业内不同领域的企业和组织正在构建由AI支持的大规模应用程序。这里要考虑的问题是,“我们是否相信AI模型做出的决策?”...

    代码医生工作室
  • 机器学习模型可解释性的详尽介绍

    ? 模型可解释性方面的研究,在近两年的科研会议上成为关注热点,因为大家不仅仅满足于模型的效果,更对模型效果的原因产生更多的思考,这样的思考有助于模型和特征的优...

    腾讯技术工程官方号
  • 【技术分享】机器学习模型可解释性

    模型可解释性方面的研究,在近两年的科研会议上成为关注热点,因为大家不仅仅满足于模型的效果,更对模型效果的原因产生更多的思考,这样的思考有助于模型和特征的优化,更...

    腾讯云TI平台
  • 原创 | 一文读懂模型的可解释性(附代码&链接)

    目前人工智能应用已经渗透到我们生活的方方面面,成为我们生活中重要的一部分。我们相信,随着机器学习技术的不断进步,未来有望产生一个能够感知、学习、做出决策和采取独...

    数据派THU
  • 独家 | 用XGBoost入门可解释机器学习

    这是一个故事,关于错误地解释机器学习模型的危险以及正确解释所带来的价值。如果你发现梯度提升或随机森林之类的集成树模型具有很稳定的准确率,但还是需要对其进行解释,...

    数据派THU
  • 进行机器学习和数据科学常犯的错误

    首先,您应该可视化连续特征的分布,以了解如果有许多异常值,分布将是什么,以及它是否有意义。

    陆勤_数据人网
  • 人工智能和数据科学的七大 Python 库

    本文作者Favio Vázquez从2018年开始发布《数据科学和人工智能每周文摘:Python & R》系列文章,为数据科学家介绍最好的库、rep...

    加米谷大数据
  • 必备!人工智能和数据科学的七大 Python 库

    本文作者Favio Vázquez从2018年开始发布《数据科学和人工智能每周文摘:Python & R》系列文章,为数据科学家介绍最好的库、repos、pac...

    新智元
  • 快速的TreeSHAP:加速树的SHAP值计算

    SHAP(SHapley Additive exPlanation)值是解释机器学习模型的主要工具之一,具有强大的理论保证(一致性、局部准确性)和广泛的实现方式...

    用户8436237

扫码关注云+社区

领取腾讯云代金券