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

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

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

相关文章

基于图像识别的垃圾分类

基于机器学习的垃圾分类 摘要:2019年垃圾分类由上海开始实施,继而向全国推行,主要将垃圾种类进行划分,其分类包括可回收、厨余、有害和其他。本文以垃圾分类为核心展开系列探究,使用机器学习对垃圾进行分类&#xff0…

java中IO知识点概念

这里写自定义目录标题 内存中的数据以电子信号的形式表示,而磁盘中的数据是以磁场的方向表示。1.流的分类2.File类3.流的API 关键4.理解缓冲的作用-一次性多拿些读写文件的时候为什么要有缓冲流 -意义是什么缓冲流的使用 5.路径问题6.文件的创建7.内存和磁盘存储本质…

QT中的 容器(container)-大全

一、介绍 Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并…

i已学赋能智慧教育时代的幼儿教育

伴随“教育数字化战略行动”的深入开展,智慧教育正式成为国家战略。智慧教育延伸至家校社教育的每个阶段。当前,为适应智慧教育发展趋势,我国制定了《中国教育现代化2035》《教育部关于加强“三个课堂”应用的指导意见》《教育信息化2.0行动计划》等文件。幼儿作为智慧教育、智…

Blazor Select 实现点击一次选项触发一次后台事件

Blazor的官方案例中&#xff0c;Select组件只有两个事件 1、OnSelectedItemChanged 每次选项的时候改变触发&#xff0c;如果你点击同一个选项是不会触发后台的方法的 2、OnBeforeSelectedItemChange 我们可以用这个事件实现每次点击同一个选项都可以触发后台事件 需要注意下最…

OCR文字识别工具 Cisdem OCRWizard激活最新 for Mac

为了提高内容识别的准确性&#xff0c;Cisdem OCRWizard提供供您选择两种模式&#xff1a;文件或名片。此外&#xff0c;它会自动分析的内容&#xff0c;标志着不同颜色的页面上几个区域根据给定部分的性质&#xff1a;文本&#xff08;绿色标记&#xff09;&#xff0c;图像&a…

Stable Diffusion绘画系列【3】:二次元动漫画风

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

单片机BootLoader是咋回事?

BootLoader的定义&#xff1a; CPU进入APP之前运行的一小段程序代码就叫做BootLoader。它是由程序员编写的&#xff0c;作用是更新应用程序。这也就说明了只有BootLoader的单片机才可以升级。有的产品有升级的需要就需要BootLoader了。 单片机的启动过程可以这么叙述&#xff…

ArrayList源码全面解析

一、概述 ArrayList 是 java 集合框架中比较常用的数据结构,继承自 AbstractList&#xff0c;实现了 List 接口。底层采用数组来实现。ArrayList 实现了java.io.Serializable接口&#xff0c;这意味着ArrayList支持序列化&#xff0c;能通过序列化去传输。 1.1、底层数据结构…

fiddler设置手机端抓包看这篇文章就足够了,轻松解决!

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff0c;点…

10年资深码农,聊聊程序员的35岁危机

程序员的一天&#xff0c;日常都在做什么&#xff1f; 很多外行以及初入 IT 行业的从业者&#xff0c;往往只看到了高薪、加班、敲代码的标签&#xff0c;那程序员的日常究竟是什么样的&#xff1f; 当代程序员的一天&#xff1a;聊天、开会、写代码 哪种技术最热门与能拿到高…

Shell编程基础 – for循环

Shell编程基础 – for循环 Shell Scripting Essentials - for Loop 大多数编程语言都有循环的概念和语句。如果想重复一个任务数十次&#xff0c;无论是输入数十次&#xff0c;还是输出数十次&#xff0c;对用户来说都不现实。 因此&#xff0c;我们考虑如何用好Bash Shell编…

(Spring学习06)Spring之循环依赖底层源码解析

什么是循环依赖&#xff1f; 很简单&#xff0c;就是A对象依赖了B对象&#xff0c;B对象依赖了A对象。 比如&#xff1a; // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }那么循环依赖是个问题吗&#xff1f; 如果不考虑Spring&#xff0c;循环依赖并不…

浅谈STL中的分配器

分配器是STL中的六大部件之一&#xff0c;是各大容器能正常运作的关键&#xff0c;但是对于用户而言确是透明的&#xff0c;它似乎更像是一个幕后英雄&#xff0c;永远也不会走到舞台上来&#xff0c;观众几乎看不到它的身影&#xff0c;但是它又如此的重要。作为用户&#xff…

计算机缺少vcruntime140_1.dll的5个解决方法,轻松解决dll缺失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少vcruntime140_1.dll”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;这个错误通常会导致某些应用程序无法正常运行。那么&#xff0c;如何解决缺少vcruntime140_1.dll的问…

Vue框架学习笔记——事件处理:v-on指令+methods

文章目录 前文提要事件处理的解析过程&#xff0c;v-on:事件名样例代码如下&#xff1a;效果展示图片&#xff1a;v-on:事件名"响应函数"v-on简写形式响应函数添加响应函数传参占位符"$event"注意事项 前文提要 本人仅做个人学习记录&#xff0c;如有错误…

深度学习框架配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn&#xff0c;将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…

Linux以nohup方式运行jar包

1、在需要运行的jar包同级目录下建立启动脚本文件&#xff1a; 文件内容&#xff1a; #! /bin/bash #注意&#xff1a;必须有&让其后台执行&#xff0c;否则没有pid生成 jar包路径为绝对路径 nohup java -jar /usr/local/testDemo/jdkDemo-0.0.1-SNAPSHOT.jar >/us…

MX6ULL学习笔记 (一)交叉工具链的安装

前言&#xff1a; ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译 器&#xff0c;Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编译的是 ARM 架构的代码&#xff0c;因为我们编译的代码是需要烧写到ARM板子…

nacos集群开箱搭建-linux版本搭建

原创/朱季谦 nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;简单而言&#xff0c;它可以实现类似zookeeper做注册中心的功能&#xff0c;也就是可以在springcloud领域替代Eureka、consul等角色&#xff0c;同时&#xff0c;还可以充当spri…