KernelSHAP vs TreeSHAP

Kernel SHAPTree SHAP都用于近似Shapley值。Tree SHAP要快得多。缺点是它只能用于基于树的算法,如随机森林和xgboost。另一方面,Kernel SHAP是模型不可知的(model agnostic),这意味着它可以与任何机器学习算法一起使用。我们将比较这两种近似方法。

接下来介绍实验,将展示Tree SHAP实际上有多快。此外,还将探讨树算法的参数如何影响时间复杂度。这些包括树的数量深度特征的数量。在使用Tree SHAP进行数据探索时,这些知识非常方便。最后,我们将讨论特性依赖等其他考虑因素如何影响方法。

Time per observation(每次观测时间)

对于第一个实验,我们想看看这些方法计算SHAP值需要多少时间。我们不会讨论用于获得结果的代码,但您可以在GitHub上找到它。总之,我们从模拟回归数据开始。它有10000个样本,10个特征和1个连续目标变量。使用这些数据,我们训练一个随机森林。具体来说,该模型有100棵树,最大深度为4。

现在可以使用这个模型来计算 SHAP 值。同时使用 KernelSHAP 和 TreeSHAP 方法,对于每种方法计算 10、100、1000、2000、5000 和 10000 个 SHAP 值。记录每个值计算所花费的时间,并且我重复此过程 3 次,然后将平均值作为最终时间。

可以在图 1 中看到结果。TreeSHAP 明显更快。对于 10,000 个 SHAP 值,该方法耗时 1.44 秒。相比之下,KernelSHAP 耗时 13 分 40.56 秒。这是 570 倍的时间。当然这些计算的速度将取决于设备,但差异不会太大。

上面的 TreeSHAP 线看起来很平。这是因为 KernelSHAP的值太大了。在下图 2 中,我们单独绘制 TreeSHAP 。可以看到它也随着观察次数的增加而线性增加。这告诉我们每个 SHAP 值都需要相似的时间来计算。我们将在下一节探讨原因。
在这里插入图片描述

时间复杂度

两种方法的时间复杂度如下。这也是树算法中计算特征的SHAP值时的复杂度。T 是个体树的数量。L 是每棵树中的最大叶子数。D 是每棵树的最大深度。M 是每棵树中的最大特征数。对于这些方法,这些参数将以不同的方式影响逼近时间。
在这里插入图片描述
TreeSHAP 的复杂性只受深度 (D) 的影响。而KernelSHAP 受特征数量 (M) 的影响。不同之处在于 KernelSHAP 复杂度是指数 w.r.t M 而 TreeSHAP 是二次 w.r.t D。因为树深度(D=4)比特征(M = 10)小的多,所以KernelSHAP 会慢很多。

这是每个 SHAP 值的时间复杂度,一般情况下每个值都需要相似的时间来计算,所以我们看到时间和观察次数之间存在线性关系。现在将探讨时间与其他参数 T、L、D 和 M 之间的关系。然后将讨论结果对模型验证和数据探索的意义。

树的数量(T)

对于这两种方法,复杂度都是树的数量(T)的线性w.r.t.。为了验证这个参数会以类似的方式影响逼近时间。我们通过增加树的数量来训练不同的模型,使用每个模型计算100个SHAP值。

可以在图3中看到结果。对于这两种方法,时间随树的数量线性增加。这就是我们在查看时间复杂度时所期望的结果。这告诉我们,通过限制树的数量,我们可以减少计算SHAP值的时间。
在这里插入图片描述

特征数量(M)

只有KernelSHAP受到特征数量(M)的影响,这次我们在不同数量的特征上训练模型。而其他参数(T、L、D)保持不变。在下图4中,可以看到随着m的增加,KernelSHAP的时间呈指数增长。相比之下,TreeSHAP的时间受影响较小。
在这里插入图片描述
TreeSHAP的时间在逐渐增加(虽然不明显),因为我们看到复杂度与m无关。这是计算单个特征的SHAP值时的复杂度。随着M的增加,我们需要为每次观测计算更多的SHAP值,所以这部分增加应该是合理的。

树的深度(D)

最后,我们改变树的深度。我们将森林中每棵树的深度都设置成最大深度。在下图5中,可以看到当我们增加深度时使用TreeSHAP的时间大大增加了。在某些情况下,TreeSHAP的计算成本甚至比KernelSHAP高。因为TreeSHAP复杂度是D的函数时,这点也是毫无疑问的。
在这里插入图片描述
为什么KernelSHAP时间也会增加?这是因为特征(M)和叶(L)的数量是根据树的深度而变化的。随着深度的增加,会有更多的分裂,所以我们会有更多的叶子。更多的分叉也意味着树可以使用更多的特征。可以在下图6中看到这一点。在这里,我们计算了森林中所有树木的特征和叶子的平均数量。

模型验证和数据探索的建议

通过改变深度,我们看到在某些情况下 TreeSHAP 的计算成本更高。但是这些情况不太可能发生。只有当我们的树深度为 20 时才会发生这种情况。使用这么深的树并不常见,因为我们通常会拥有比树深度 (D) 更多的特征 (M)。

在使用 SHAP 验证树模型时,TreeSHAP 通常是更好的选择。我们能够更快地计算 SHAP 值。尤其是当您需要比较多个模型时。对于模型验证,我们对参数 T、L、D 和 M 没有太多选择。这是因为我们只想验证性能最好的模型。

对于数据探索,树算法可用于发现重要的非线性关系和交互。我们的模型只需要足够好就可以捕捉数据中的潜在趋势。所以通过减少树的数量 (T) 和深度 (D) 来使用 TreeSHAP 加快这个过程。并且可以在不大幅提高执行时间的情况下探索许多模型特征(M)。

一些注意事项

在选择方法时,时间复杂度是一个重要因素。在做出选择之前,可能需要考虑其他一些差异。其中包括 KernelSHAP 与模型无关,这些方法受特征依赖的影响,并且只有 TreeSHAP 可用于计算交互效果。

模型不可知

一开始我们就提到了 TreeSHAP 的最大限制是它不是模型无关的。如果使用的是非基于树的算法,将无法使用它。例如神经网络也有自己的逼近方法。这是就需要用到 DeepSHAP。但是KernelSHAP 是唯一可以与所有算法一起使用的方法。

特征依赖

特征依赖可能会扭曲 KernelSHAP 所做的近似。该算法通过随机采样特征值来估计SHAP值。如果当特征相关时,在使用 SHAP 值时,可能会过分重视不太可能的观察结果。

而TreeSHAP 没有问题。但是由于特征依赖性,该算法存在另外问题。即对预测没有影响的特征可以获得非零的 SHAP 值。当该特征与另一个影响预测的特征相关时,就会发生这种情况。在这种情况下会得出错误的结论:即某个特征对预测有贡献。

分析交互

SHAP交互值是SHAP值的扩展。它们通过将特征的贡献分解为其主要和交互影响。对于给定的特征,交互效应是它与其他特征的所有联合贡献。在突出显示和可视化数据中的交互时,这些可能很有用。如果有需要这方面的内容,我们可以单独文章介绍。

如果要使用 SHAP 交互值,则必须使用 TreeSHAP。这是因为它是唯一实现交互值的近似方法。这与 SHAP 交互值的复杂性有关。估计这些 KernelSHAP需要 更长的时间。

总结

应该尽可能使用 TreeSHAP。它速度更快,并且能够分析交互。对于数据探索。如果正在使用其他类型的模型算法,那么将不得不坚持使用 KernelSHAP。,因为它仍然是比蒙特卡罗采样等其他方法更快的近似方法。
————————————————
本文完整代码:https://github.com/conorosully/medium-articles/blob/master/src/interpretable%20ml/SHAP/kernelSHAP_vs_treeSHAP.ipynb
原文连接:https://towardsdatascience.com/kernelshap-vs-treeshap-e00f3b3a27db
作者:Conor O’Sullivan
搬运链接:https://avoid.overfit.cn/post/74f491a38a874b5e8dd9d17d9da4bfbb

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

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

相关文章

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了,ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去,让EM13C 来实现对RACDG的监控,主要是DG的EM13C的监控,还没有看到,大部分都是直接…

2023极客大挑战-AGRT战队wp

目录 RE Shiftjmp 点击就送的逆向题 幸运数字 ​编辑 砍树 小黄鸭 flower-or-tea mySelf 是男人就来扎针 听说cpp很难? Easymath 寻找初音未来 Rainbow 浪漫至死不渝 ezandroid Pwn nc_pwntools password ret2text write1 ret2libc ezpwn wr…

力扣23. 合并 K 个升序链表(java,最小堆解法)

Problem: 23. 合并 K 个升序链表 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 思路 1.对于合并k个有序链表,我们较为容易想…

shiro整合redis

shiro整合redis 前言:shiro默认的session是存储在jvm内存中的,这样会导致java服务内存占用更大以及一旦服务器宕机或者版本迭代需要重启服务时,缓存中的数据不能恢复,导致用户需要重新登录认证,体验很差。因此利用第三…

JSON详细教程

😊JSON详细教程 🚩JSON简介☃️JSON语法规则🔊JSON和JavaScript对象的区别 ☃️JSON数据类型字符串🔊数字🔊布尔值🔊数组🔊对象🔊Null ☃️JSON对象🔊访问JSON对象的值&a…

堆的应用(堆排序、Top-K问题)

文章目录 1 堆排序2 Top-K问题 1 堆排序 堆排序是一种基于二叉堆(通常使用数组实现)的排序算法。 它的基本思想是利用堆这种数据结构的性质,通过建立一个堆(大堆或小堆),使得堆的根节点是所有节点中的最大值…

在线 SQL 模拟器SQL Fiddle使用简介

在线 SQL 模拟器SQL Fiddle使用简介 有时候,我们想去验证 SQL语句,却缺少数据库环境,那该怎么办呢? 这时候在线 SQL 模拟器就有了用武之地。SQL 模拟器免安装,可以在网页直接运行 SQL 。 SQL Fiddle 支持 MySQL、Orac…

SystemVerilog 入门

文章目录 包定义SystemVerilog 数据类型结构体 SystemVerilog 过程块可嵌套模块接口 System Verilog 的优点 提高了硬件建模能力、编码效率和抽象能力;RTL 级、系统级行为描述; 增强了验证能力和为大规模复杂设计编写有效、无竞争测试程序的断言功能&am…

spring-framework-5.2.25.RELEASE源码环境搭建

环境准备 spring-framework-5.2.25.RELEASEIntelliJ IDEA 2022.3.1java version “11.0.20” 2023-07-18 LTSGradle 5.6.4java version “1.8.0_301” 下载spring-framework-5.2.25.RELEASE源码 git clone https://gitee.com/QQ952051088/spring.git cd spring gradlew buil…

[学习记录]Node event loop 总结流程图

文章目录 文章来源根据内容输出的流程图待处理遗留的问题参考 文章来源 详解JavaScript中的Event Loop(事件循环)机制 根据内容输出的流程图 待处理 这里从polling阶段开始 好像有些问题 遗留的问题 为什么“在I/O事件的回调中,setImmediate…

深度学习:全面了解深度学习-从理论到实践

深度学习:全面了解深度学习-从理论到实践 摘要:本文旨在为读者提供一份全面的深度学习指南,从基本概念到实际应用,从理论数学到实践技术,带领读者逐步深入了解这一领域。我们将一起探讨深度学习的历史、发展现状&#…

使用Tensorboard可视化 遇到无法访问此网站

问题: 使用Tensorboard可视化 遇到无法访问此网站 解决方法:后面加上服务器ip[参考] tensorboard --logdir目标目录 --hostxxx.xxx.xxx.xx

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想: 上面next cur->next应该放在cur->next pre前面执行,这里笔误 再来说递归的思想: 题目代码 这个代码里面我加了我自己写的测试数据,自己可以去找对应的部分&#xff0c…

【功能测试】软件系统测试报告

1.引言 1.1.目的 本测试报告为 xxx 系统测试报告,本报告目的在于总结测试阶段的测试及测试结果分析,描述系统是否达到需求的目的。 本报告预期参考人员包括测试人员、测试部门经理、开发人员、项目管理人员等。 1.2.参考文档 《xxxx系统需求规格说明…

Java线程安全问题

什么是线程安全问题 用程序模拟线程安全问题 主线程 package com.itheima.d3;public class ThreadTest {public static void main(String[] args) {//1、创建一个账户对象,代表两个人的共享账户Accout acc new Accout("ICBC-110",100000);//2、创建两个…

Django回顾【二】

目录 一、Web框架 二、WSGI协议 三、 Django框架 1、MVC与MTV模型 2、Django的下载与使用 补充 3、启动django项目 补充 5、 Django请求生命周期 四、路由控制 1、路由是什么? 2、如何使用 3、path详细使用 4、re_path详细使用 5、反向解析 6、路由…

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

从零带你底层实现unordered_map (2)

💯 博客内容:从零带你实现unordered_map 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家…

figma 基础使用 —— 常用方法

一、 导入组件 分成两种方式 (1)离线的包导入(iOS 常用组件.fig 直接拖拽到figma最近网页) (2)在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键:shift R 三、插…