SHAP(SHapley Additive exPlanations)基于XGBoost模型的可解释机器学习

模型可解释性

这是一个关于错误解释机器学习模型的危险以及正确解释它的价值的故事。如果您发现诸如梯度提升机或随机森林之类的集成树模型的鲁棒准确性很有吸引力,但也需要解释它们,那么我希望您发现这些信息有用且有帮助。

试想一下,我们的任务是预测个人Ô为n行的财务状况。我们的模型越准确,银行赚的钱就越多,但由于此预测用于贷款申请,因此法律上也要求我们解释为什么做出预测。在对多种模型类型进行试验后,我们发现 XGBoost 中实现的梯度提升树提供了最佳准确度。不幸的是,解释 XGBoost 做出预测的原因似乎很难,所以我们只能选择退回到线性模型,或者弄清楚如何解释我们的 XGBoost 模型。没有数据科学家愿意放弃准确性……所以我们决定尝试后者,并解释复杂的 XGBoost 模型(它恰好有 1,247 个深度为 6 的树)。

图片

经典的全局特征重要性度量

第一个明显的选择是使用 Python XGBoost 接口中的 plot_importance() 方法。它提供了一个非常吸引人的简单条形图,表示我们数据集中每个特征的重要性:(重现本文的代码在Jupyter notebook 中)

图片

为一个训练模型运行 xgboost.plot_importance(model) 的结果,用于预测人们是否会报告来自经典“成人”人口普查数据集的超过 5 万美元的收入(使用逻辑损失)。

如果我们查看 XGBoost 返回的特征重要性,我们会发现年龄在其他特征中占主导地位,显然是最重要的收入预测指标。我们可以停在这里,向我们的经理报告直观令人满意的答案,即年龄是最重要的特征,其次是每周工作时间教育水平。但是作为优秀的数据科学家……我们查看了文档,发现在 XGBoost 中测量特征重要性有三个选项:

  1. 重量。使用特征在所有树中拆分数据的次数。

  2. 覆盖。使用特征在所有树中拆分数据的次数,权重由经过这些拆分的训练数据点的数量决定。

  3. 获得。 使用特征进行拆分时获得的平均训练损失减少量。

这些是我们可以在任何基于树的建模包中找到的典型重要性度量。权重是默认选项,因此我们决定尝试其他两种方法,看看它们是否有所不同:

图片

运行 xgboost.plot_importance 的结果同时具有 important_type=”cover” 和 important_type=”gain”。

令我们沮丧的是,我们看到 XGBoost 提供的三个选项中的每一个的特征重要性排序都非常不同!对于cover方法,似乎资本收益特征最能预测收入,而对于收益方法,关系状态特征主导所有其他特征。这应该让我们在不知道哪种方法最好的情况下,依赖这些度量来报告特征重要性会非常不舒服。

是什么让衡量特征重要性的好坏?

如何将一种特征归因方法与另一种进行比较并不明显。我们可以衡量每种方法在数据清理、偏差检测等任务上的最终用户性能。但这些任务只是对特征归因方法质量的间接衡量。在这里,我们将改为定义我们认为任何好的特征归因方法都应该遵循的两个属性:

  1. 一致性。每当我们更改模型以使其更多地依赖于某个特征时,该特征的归因重要性不应降低。

  2. 准确性。所有特征重要性的总和应该等于模型的总重要性。(例如,如果重要性是由 R² 值衡量的,那么每个特征的属性应与完整模型的 R² 相加)

如果一致性不成立,那么我们不能比较任意两个模型之间的归因功能重要性有关,因为那么 具有较高分配的归属并不意味着模型实际上更多地依赖于该功能

如果准确性无法保持,那么我们不知道每个特征的属性如何结合起来代表整个模型的输出。我们不能在方法完成后对属性进行标准化,因为这可能会破坏方法的一致性。

当前的归因方法是否一致且准确?

回到我们作为银行数据科学家的工作……我们意识到一致性和准确性对我们很重要。事实上,如果一个方法不一致,我们不能保证具有最高属性的特征实际上是最重要的。因此,我们决定使用两个与我们在银行的任务无关的非常简单的树模型来检查每种方法的一致性:

图片

两个特征的简单树模型。咳嗽在模型 B 中显然比模型 A 更重要。

模型的输出是基于人的症状的风险评分。模型 A 只是一个简单的“与”函数,用于发烧咳嗽的二元特征。模型 B 具有相同的功能,但只要咳嗽是肯定的,就 +10 。为了检查一致性,我们必须定义“重要性”。在这里,我们将通过两种方式定义重要性:1)作为我们删除一组特征时模型预期准确率的变化。2)作为我们删除一组特征时模型预期输出的变化。

重要性的第一个定义衡量特征对模型的全局影响。而第二个定义衡量特征对单个预测的个性化影响。在我们的简单树模型中,咳嗽特征在模型 B 中显然更重要,无论是对于全局重要性还是对于发烧咳嗽都是肯定的个体预测的重要性。

上面的weightcovergain方法都是全局特征归因方法。但是当我们在银行中部署我们的模型时,我们还需要为每个客户提供个性化的解释。为了检查一致性,我们在简单的树模型上运行了五种不同的特征归因方法:

  1. 树形状。我们提出了一种新的个性化方法。

  2. 萨巴斯。一种个性化的启发式特征归因方法。

  3. 平均值(|树形状|)。基于个性化 Tree SHAP 归因的平均幅度的全局归因方法。

  4. 获得。与上面 XGBoost 中使用的方法相同,也等效于 scikit-learn 树模型中使用的 Gini 重要性度量。

  5. 拆分计数。代表 XGBoost 中密切相关的“权重”和“覆盖”方法,但使用“权重”方法计算。

  6. 排列。当在测试数据集中随机排列单个特征时,导致模型准确度下降。

图片

使用六种不同方法的模型 A 和模型 B 的特征属性。据我们所知,这些方法代表了文献中所有特定于树的特征归因方法。

之前除了特征排列以外的所有方法都是不一致的!这是因为它们在模型 B 中对咳嗽的重要性低于模型 A。不能相信不一致的方法可以正确地为最有影响的特征分配更多的重要性。精明的读者会注意到,当我们研究的经典特征归因方法在同一模型上相互矛盾时,这种不一致就已经在早些时候表现出来了。那么精度属性呢?事实证明,Tree SHAP、Sabaas 和 Gain 都如之前定义的那样准确,而特征排列和拆分计数则不然。

也许令人惊讶的是,像增益(基尼重要性)这样广泛使用的方法会导致如此明显的不一致结果。为了更好地理解为什么会发生这种情况,让我们检查一下模型 A 和模型 B 的增益是如何计算的。为了简单起见,我们假设我们的数据集的 25% 落在每个叶子上,并且每个模型的数据集都有完全匹配的标签模型的输出。

如果我们将均方误差 (MSE) 视为我们的损失函数,那么在对模型 A 进行任何拆分之前,我们从 1200 的 MSE 开始。这是来自 20 的常数平均预测的误差。在模型 A 中对发烧进行拆分后, MSE 下降到 800,因此增益方法将 400 的下降归因于发烧特征。然后在咳嗽特征上再次拆分导致 MSE 为 0,并且增益方法将这个 800 的下降归因于咳嗽特征。在模型 B 中,相同的过程导致分配给发烧特征的重要性为 800,分配给咳嗽特征的重要性为 625 :

图片

计算模型 A 和模型 B 的增益(又名基尼重要性)分数。

通常我们期望树根附近的特征比叶子附近分裂的特征更重要(因为树是贪婪地构造的)。然而,增益方法倾向于将更多的重要性归因于较低的分裂。这种偏见会导致不一致,当咳嗽变得更加重要时(因此从根本上分开),其归因重要性实际上下降了。个性化的 Saabas 方法(由treeinterpreter 使用package) 在我们下降树时计算预测的差异,因此它也遭受相同的偏向于树中较低的分裂。随着树变得更深,这种偏差只会增加。相比之下,Tree SHAP 方法在数学上等效于对特征的所有可能排序的预测差异进行平均,而不仅仅是由它们在树中的位置指定的排序。

只有 Tree SHAP 既一致又准确,这并非巧合。鉴于我们想要一种既一致又准确的方法,结果证明只有一种方法可以分配特征重要性。详细信息在我们最近的NIPS 论文中,但总结是博弈论关于利润公平分配的证明导致机器学习中特征归因方法的唯一性结果。这些独特的值被称为 Shapley 值,以 1950 年代导出它们的 Lloyd Shapley 的名字命名。我们在此使用的 SHAP 值来自与 Shapley 值相关的几种个性化模型解释方法的统一。Tree SHAP 是一种快速算法,可以在多项式时间内准确计算树的 SHAP 值,而不是经典的指数运行时(参见arXiv)。

自信地解释我们的模型

坚实的理论论证和快速实用的算法相结合,使 SHAP 值成为自信地解释树模型(例如 XGBoost 的梯度提升机)的强大工具。有了这种新方法,我们又回到了解释银行 XGBoost 模型的任务上:

图片

应用于收入预测模型的全局均值(|Tree SHAP|)方法。x 轴本质上是当特征从模型中“隐藏”时模型输出的平均幅度变化(对于该模型,输出具有对数几率单位)。有关详细信息,请参阅论文,但“隐藏”意味着将变量整合到模型之外。由于隐藏特征的影响会根据还隐藏的其他特征而变化,因此使用 Shapley 值来确保一致性和准确性。

我们可以看到,关系特征实际上是最重要的,其次是年龄特征。由于 SHAP 值保证了一致性,因此我们无需担心在使用增益或拆分计数方法之前发现的各种矛盾。但是,由于我们现在对每个人都有个性化的解释,因此我们可以做的不仅仅是制作条形图。我们可以绘制数据集中每个客户的特征重要性。在十八Python包让一切变得简单。我们首先调用 shap.TreeExplainer(model).shap_values(X) 来解释每个预测,然后调用 shap.summary_plot(shap_values, X) 来绘制这些解释:

图片

每个客户的每一行都有一个点。点的 x 位置是该特征对模型对客户的预测的影响,点的颜色代表该特征对客户的价值。不适合行的点堆积起来以显示密度(在此示例中有 32,561 个客户)。由于 XGBoost 模型具有逻辑损失,因此 x 轴具有对数赔率单位(Tree SHAP 解释了模型边际输出的变化)。

这些特征按均值(|Tree SHAP|)排序,因此我们再次将关系特征视为年收入超过 5 万美元的最强预测因子。通过绘制特征对每个样本的影响,我们还可以看到重要的异常值效应。例如,虽然资本收益在全球范围内并不是最重要的特征,但对于部分客户而言,这是迄今为止最重要的特征。按特征值着色的模式向我们展示了诸如年轻如何降低您赚取超过 5 万美元的机会,而高等教育增加您赚取超过 5 万美元的机会。

我们可以停在这里向我们的老板展示这个情节,但让我们更深入地研究其中的一些功能。我们可以通过绘制年龄 SHAP 值(对数几率的变化)与年龄特征值来为年龄特征做到这一点:

图片

y 轴是年龄特征对年收入超过 5 万美元的对数几率的改变程度。x 轴是客户的年龄。每个点代表数据集中的一个客户。

在这里,我们看到了 XGBoost 模型捕捉到的年龄对收入潜力的明显影响。请注意,与传统的部分依赖图(显示更改特征值时的平均模型输出)不同,这些 SHAP 依赖图显示交互效应。尽管数据集中的许多人都 20 岁,但他们的年龄对他们的预测的影响程度有所不同,如 20 岁点的垂直离散所示。这意味着其他特征正在影响年龄的重要性。为了了解哪些特征可能是这种效应的一部分,我们根据受教育年限对点进行着色,并看到高水平的教育在 20 多岁时降低了年龄的影响,但在 30 多岁时提高了它:

图片

y 轴是年龄特征对年收入超过 5 万美元的对数几率的改变程度。x 轴是客户的年龄。Education-Num 是客户完成的教育年数。

如果我们为每周工作的小时数制作另一个依赖图,我们会看到工作更多的好处在大约 50 小时/周时稳定下来,如果您已婚,额外工作不太可能表明高收入:

图片

每周工作小时数与工作小时数对收入潜力的影响。

解释你自己的模型

这个简单的演练旨在反映您在设计和部署自己的模型时可能经历的过程。在十八包很容易通过PIP安装,我们希望它可以帮助你有信心开拓您的模型。它包含的不仅仅是本文所涉及的内容,包括 SHAP 交互值、模型不可知的 SHAP 值估计和其他可视化。笔记本可以在各种有趣的数据集上说明所有这些功能。例如,您可以在解释 XGBoost 死亡率模型的笔记本中根据您的健康检查查看您死亡的主要原因。对于 Python 以外的语言,Tree SHAP 也已直接合并到核心 XGBoost 和 LightGBM 包中。

版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/781624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【项目管理】常见的敏捷实践:Scrum框架

【项目管理】常见的敏捷实践:Scrum框架 精益、敏捷与Scrum框架Scrum框架实践Sprint(冲刺)Scrum角色Scrum工件Scrum会议 精益、敏捷与Scrum框架 敏捷与精益思想、看板、Scrum等概念的关系如下图所示: Lean 精益 Kanban 看板 Ag…

永磁同步电机控制算法--扇区细分的直接转矩控制(十八扇区)

优化转矩磁链调节器和开关表可降低转矩脉动,改善直接转矩控制性能。有研究仔细分析了传统永磁同步电机六扇区 DTC 方案中空间电压矢量对磁链与转矩轨迹的作用过程发现,随着定子磁链在扇区内位置的变化,电压矢量对磁链与转矩的作用是不均衡的&…

centos7|操作系统|低版本的OpenSSH升级到最新版本OpenSSH-9.8.p1

前言: 1、 OpenSSH是什么 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都…

实现antd designable平台的组件拖拽功能

平台:designable设计器 github:designable 目录 1 背景2 技术栈3 组件拖拽和放置3.1 类型定义3.2 拖拽3.3 放置 1 背景 由于业务需求,我们需要实现designable平台的一个简易版的组件拖拽功能。 #mermaid-svg-QrxSDGe9YyGG3LbQ {font-family:…

远心镜头简介

一、远心镜头 大家都有这种印象,一个物体在人眼看来,会有近大远小的现象。这是因为物体近的时候,在视网膜上投影大,小的时候,投影小。镜头也是一样,因为近大远小的原因,会产生误差。特别是在做尺…

测试图片上传功能,使用postman提供的url

是不是有时候想要测试图片上传功能,但是没有后台url进行测试,这时候就可以使用postman提供的url: https://postman-echo.com/post接下来,我将教你在postman中,用该url测试图片上传功能。 1.发送图片上传请求 第一步…

学习笔记——动态路由——OSPF聚合(汇总)

十一、OSPF聚合(汇总) 1、路由聚合(汇总) 路由汇总是一种重要的思想,在大型的项目中是必须考虑的一个重点事项。随着网络的规模越来越大,网络中的设备所需维护的路由表项也就会越来越多,路由表的规模也就会逐渐变大,而路由表是需…

Linux系统(Centos)下MySQL数据库中文乱码问题解决

问题描述:在进行数据库使用过程中,数据库里的数据中文都显示乱码。操作数据库的时候,会出现中文乱码问题。 解决方法如下: 第一步:打开虚拟机进入系统,启动MySQL。 第二步:连接登录MySQL输入…

0301STM32GPIO外设输出

STM32GPIO外设输出 STM32内部的GPIO外设GPIO简介基本结构GPIO位结构输入部分:输出部分: GPIO八种工作模式浮空/上拉/下拉输入模拟输入开漏/推挽输出复用开漏/推挽输出 手册寄存器描述GPIO功能描述外设的GPIO配置GPIO寄存器描述端口输入数据寄存器端口输出…

【驱动篇】龙芯LS2K0300之ADC驱动

实验目的 由于LS2K0300久久派开发板4.19内核还没有现成可用的ADC驱动,但是龙芯官方的5.10内核已经提供了ADC驱动,想要在4.19内核使用ADC就要参考5.10内核移植驱动,本次实验主要是关于ADC驱动的移植和使用 驱动移植 主要的驱动代码主要有3个…

【ROS2】初级:客户端-创建自定义 msg 和 srv 文件

目标:定义自定义接口文件( .msg 和 .srv )并将它们与 Python 和 C节点一起使用。 教程级别:初学者 时间:20 分钟 目录 背景 先决条件 任务 1. 创建一个新包2. 创建自定义定义3 CMakeLists.txt4 package.xml5. 构建 tut…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】 购物车需求描述购物车数据结构数据Model抽取实现流程(参照京东)代码实现参考 购物车需求描述 用户可以在登录状态下将商品添加到购物车【用户购物…

【LabVIEW学习篇 - 4】:程序结构——条件结构、事件结构、禁用结构

文章目录 条件结构案例一(布尔输入)案例二(整数输入)案例三(字符串输入) 事件结构案例一案例二 禁用结构 条件结构 条件结构的组成部分: 选择器标签(带方框的“?”)&…

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发(2)— 第一个简单驱动编写和测试 一、前言 教程参考:02_实战部分_PCIE设备测试 教程参考:03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示: #i…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

目标检测2--yolov1中相关基础知识(边框回归、交并比、nms)介绍

文章目录 前言回归介绍基本概念线性回归非线性回归边框回归 交并比介绍定义程序实现 NMS介绍定义与原理工作原理代码实现 前言 在上篇博客目标检测1–Pytorch目标检测之yolov1中介绍了yolov1的原理,里面提到几个知识点现在详细介绍一下。 回归介绍 在上篇博客中提…

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度,逆向转90度 一,STC单片机模块 二,步进电机 2.2 什么是步进电机? 步进电机可以理解为:是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于,普通电机可以持…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令,可以当作学习笔记收藏学习一下!!! 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展,水果在线销售已逐渐演变为一种极为便捷的购物方式,日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台,致力于为用户提供优质、…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…