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.mzph.cn/diannao/42500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

julia系列17: tsp问题代码整理

1. 常用库和基础函数 这里是优化版的函数: using TSPLIB,LKH,Distances,PyPlot MaxNum 10000 tspreadTSPLIB(:att48) dist [round.(Int,euclidean(tsp.nodes[i,:],tsp.nodes[j,:])) for i in 1:tsp.dimension,j in 1:tsp.dimension]; pos(tsp::TSP,t::Vector{In…

Groovy中,多种循环方式

1.最常规的for循环 for (def i 0; i < 5; i) { //这个i需要声明println "遍历输出${i}" }2.while循环 def j 0 while (j < 5) {println "遍历输出 ${j}"j }3.for in 循环 def list [0, 1, 2, 3, 4] //这个l无需声明 for (l in list) { printl…

uniapp跨域问题解决

找到menifest文件&#xff0c;在文件的最后添加如下代码&#xff1a; // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

数据库的存储引擎,数据类型,约束条件,严格模式

【一】存储引擎 1.什么是存储引擎存储引擎可以理解为处理数据的不同方式 2.查看存储引擎show engines; 3.须知的引擎MyISAM5.5之前版本MySQL默认的存储引擎特点:存取数据的速度快 但是功能很少 安全性较低速度快因为自带索引InnoDB5.5之后版本MySQL默认的存储引擎特点:有诸多功…

工程施工合同无效但竣工交付,应当参照合同关于工程价款的约定计算折价补偿款

审判实践中&#xff0c;对于建设工程施工合同无效但工程竣工并交付使用的&#xff0c;应以何种标准计算折价补偿款的问题&#xff0c;认识不一致。【法官会议意见】&#xff1a;建设工程施工合同是承包人进行工程建设、交付工作成果即建设工程并由发包人支付价款的合同。建设工…

httpd目录显示乱码问题

vim /etc/httpd/conf/httpd.conf 在<Directory “/var/www/html”>下添加&#xff1a; IndexOptions CharsetUTF-8重启httpd: systemctl restart httpd.service还是不好看&#xff0c;调整下显示宽度&#xff0c;还是这个位置&#xff1a; <Directory “/var/www/ht…

区块链论文速读A会-ISSTA 2023(2/2)如何检测DeFi协议中的价格操纵漏洞

Conference&#xff1a;ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2023 第1~5篇区块链文章 请点击此…

09视图,触发器,事务,存储过程,函数,流程控制,索引,隔离机制,锁机制,三大范式

【一】视图 (1)视图须知概念 1.什么是视图&#xff1f; 视图就是通过查询得到一张虚拟表&#xff0c;然后保存下来&#xff0c;下次可以直接使用 2.为什么要用视图&#xff1f; 如果要频繁操作一张虚拟表(拼表组成)&#xff0c;就可以制作成视图&#xff0c;后续直接操作 注意…

IDEA 创建springboot项目杂记-更新中

一、工具使用杂记 1、使用maven 创建新springboot项目时&#xff0c;因为https://start.spring.io/ 连接不上项目无法创建。直接把脚手架地址换为国内的 http://start.aliyun.com

田忌赛马 贪心

本题是更难的那道,一场50 最低为o 第一行一个整数 &#x1d45b;n &#xff0c;表示他们各有几匹马&#xff08;两人拥有的马的数目相同&#xff09;。第二行 &#x1d45b;n 个整数&#xff0c;每个整数都代表田忌的某匹马的速度值&#xff08;0≤0≤ 速度值 ≤100≤1…

Python】从文本字符串中提取数字、电话号码、日期、网址的方法

关于从文本字符串中提取数字、电话号码、日期和网址的方法&#xff1a; 提取数字&#xff1a; 在 Python 中&#xff0c;使用正则表达式 \d 来匹配数字。 \d 表示匹配一个数字字符&#xff08;0-9&#xff09;。如果要匹配连续的数字&#xff0c;可以使用 \d 。 import re def …

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

Mac OS ssh 连接提示 Permission denied (publickey)

这错误有点奇葩&#xff0c;MacBook的IDE(vscode和pycharm)远程都连不上&#xff0c;terminal能连上&#xff0c;windows的pycharm能连上&#xff0c;见鬼了&#xff0c;所以肯定不是秘钥的问题了&#xff0c;查了好久竟然发现是权限的问题。。 chmod 400 ~/.ssh/id_rsa http…

华为机试HJ37统计每个月兔子的总数

华为机试HJ37统计每个月兔子的总数 题目&#xff1a; 想法&#xff1a; 上述题目实际是一个斐波那契数列&#xff0c;利用斐波那契数列对问题进行求解 input_number int(input())def fib(n):if n < 2:return 1else:n_1 1n_2 1count 2while count < n:n_1, n_2 n_…

【Android】【多屏】多屏异显异触调试技巧总结

这里写目录标题 如何获取多屏IDs获取多屏的size/density如何启动应用到指定DisplayId多屏截屏/录屏screencapscreenrecord发送按键到指定DisplayId 如何获取多屏IDs dumpsys display | grep mDisplayIdtrinket:/ # dumpsys display | grep mDisplayIdmDisplayId0mDisplayId2 t…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具&#xff0c;支持中英日三种语言&#xff0c;语音处理接近人类水平&#xff0c;使用Flash-Attn算法处理大规模数据&#xff0c;提供高效、准确、稳定的TTS体验。 Fish Audio

区块链技术的应用场景和优势。

区块链技术具有广泛的应用场景和优势。 区块链技术的应用场景&#xff1a; 1. 金融服务&#xff1a;区块链可用于支付、跨境汇款、借贷和结算等金融服务&#xff0c;提高交易效率、降低成本并增强安全性。 2. 物联网&#xff08;IoT&#xff09;&#xff1a;区块链可以用于物…

机器学习Day12:特征选择与稀疏学习

1.子集搜索与评价 相关特征&#xff1a;对当前学习任务有用的特征 无关特征&#xff1a;对当前学习任务没用的特征 特征选择&#xff1a;从给定的特征集合中选择出相关特征子集的过程 为什么要特征选择&#xff1f; 1.任务中经常碰到维数灾难 2.去除不相关的特征能降低学习的…

Git注释规范

主打一个有用 代码的提交规范参考如下&#xff1a; init:初始化项目feat:新功能&#xff08;feature&#xff09;fix:修补bugdocs:文档&#xff08;documentation&#xff09;style:格式&#xff08;不影响代码运行的变动&#xff09;refactor:重构&#xff08;即不是新增功能…

NodeJs获取文件扩展名

path.extname 是 Node.js 路径模块 (path) 中的一个方法&#xff0c;用于获取文件路径的扩展名。扩展名是指文件名中最后一个 .&#xff08;点&#xff09;之后的部分&#xff0c;包括这个 .。 const path require(path);const filename example.txt; const ext path.extna…