KernelSHAP 和 TreeSHAP 都用于近似 Shapley 值。TreeSHAP 的速度很快,然而它只能用于基于树的算法,如随机森林和 xgboost。而 KernelSHAP 与模型无关。这意味着它能够与任何机器学习算法一起应用。咱们将比拟这两种近似办法。
本文中的试验,将展现 TreeSHAP 实际上有多快。另外还摸索树算法的参数如何影响工夫复杂度,这些包含树的数量、深度和特色的数量等。在应用 TreeSHAP 进行数据摸索时,这些常识十分有用。最初咱们还将探讨其余因素 (如个性依赖关系) 的一些影响。
本文假如你理解 SHAP,能够参考咱们以前公布的其余文章。
每样本的工夫
对于第一个试验,咱们看看这些办法计算 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://avoid.overfit.cn/post/74f491a38a874b5e8dd9d17d9da4bfbb
作者:Conor O’Sullivan