【问题标题】:Lime vs TreeInterpreter for interpreting decision tree [closed]用于解释决策树的 Lime vs TreeInterpreter [关闭]
【发布时间】:2018-08-01 05:47:20
【问题描述】:

石灰来源:https://github.com/marcotcr/lime

treeinterpreter 来源:tree interpreter

我试图了解DecisionTree 如何使用 Lime 和 treeinterpreter 进行预测。虽然两者都声称他们能够在他们的描述中解释决策树。似乎两者都以不同的方式解释相同的DecisionTree。即特征贡献order。这怎么可能?如果两者都在看同一件事,并试图描述同一事件,但按不同顺序分配重要性。

我们应该信任谁?尤其是最重要的特征在预测中很重要的地方。

树的代码

import sklearn
import sklearn.datasets
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
from __future__ import print_function
np.random.seed(1)
from treeinterpreter import treeinterpreter as ti
from sklearn.tree import DecisionTreeClassifier

iris = sklearn.datasets.load_iris()

dt = DecisionTreeClassifier(random_state=42)                
dt.fit(iris.data, iris.target)

n = 100


instances =iris.data[n].reshape(1,-1)

prediction, biases, contributions = ti.predict(dt, instances)


for i in range(len(instances)):
    print ("prediction:",prediction)
    print ("-"*20) 
    print ("Feature contributions:")
    print ("-"*20) 

    for c, feature in sorted(zip(contributions[i], 
                                 iris.feature_names), 
                             key=lambda x: ~abs(x[0].any())):

        print (feature, c)

石灰的代码

import sklearn
import sklearn.datasets
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
from __future__ import print_function
np.random.seed(1)
from sklearn.tree import DecisionTreeClassifier

iris = sklearn.datasets.load_iris()

dt = DecisionTreeClassifier(random_state=42)                
dt.fit(iris.data, iris.target)

explainer = lime.lime_tabular.LimeTabularExplainer(iris.data, feature_names=iris.feature_names, 
                                                   class_names=iris.target_names, 
                                                   discretize_continuous=False)

n = 100


exp = explainer.explain_instance(iris.data[n], dt.predict_proba, num_features=4, top_labels=2)

exp.show_in_notebook(show_table=True,  predict_proba= True , show_predicted_value = True , show_all=False)

让我们先看看的输出。

所以 a 它确实正确地说它是 virginica。但是,通过在

中分配重要性

1) 花瓣宽度 (cm) 然后花瓣长度 (cm)

现在让我们看看 lime

的输出

是的,它确实说算法预测了virginica,但是看看它是如何进行分类的,我们清楚地看到以下内容

1)花瓣长度(cm)>花瓣宽度(cm)以石灰代替花瓣长度(cm)

2)其中萼片宽度和萼片长度预测为零,石灰声称具有一定的价值,如上传的图片所示

这里发生了什么?

当特征达到 1000+ 时,问题就越来越大,每个数字都对做出决定很重要。

【问题讨论】:

  • 您没有设置random_state 来生成随机森林,因此两个示例之间的随机森林不同。因此,比较石灰和树解释器的结果是没有实际意义的。底层分类器不一样。
  • @Victor 我看到你编辑了问题,在这两种情况下都添加了random_state=50;您能否确认您的图片中显示的确切数字在此修改后仍然有效??
  • @desertnaut 现在请检查,我更新了图像。当我说“立即”时,我的意思是更新图像。

标签: python machine-learning scikit-learn


【解决方案1】:

为什么这两种方法可能产生不同的结果?

Lime:对其工作原理的简短说明,摘自他们的github page

直观地说,解释是模型行为的局部线性近似。虽然该模型在全局范围内可能非常复杂,但在特定实例附近更容易对其进行近似。在将模型视为黑匣子的同时,我们扰乱了我们想要解释的实例,并在它周围学习了一个稀疏线性模型,作为解释。下图说明了这个过程的直觉。模型的决策函数由蓝色/粉色背景表示,并且明显是非线性的。明亮的红色十字是正在解释的实例(我们称之为 X)。我们在 X 周围对实例进行采样,并根据它们与 X 的接近程度对它们进行加权(这里的权重由大小表示)。然后,我们学习了一个线性模型(虚线),它在 X 附近很好地逼近模型,但不一定是全局的。

在 github 页面上的各个链接中有更详细的信息。

treeinterpreterhttp://blog.datadive.net/interpreting-random-forests/ 上提供了有关其工作原理的说明(这是用于回归;可以在 here 找到一个非常相似的分类示例)。

简而言之:假设我们有一个节点将特征F 与某个值进行比较,并根据该值拆分实例。假设到达该节点的所有实例中有 50% 属于类 C。假设我们有一个新实例,它最终被分配给该节点的左子节点,现在所有实例的 80% 属于类C。然后,特征 F 对这个决定的贡献被计算为 0.8 - 0.5 = 0.3(如果沿着通往叶子的路径有更多节点也使用特征 F,则加上附加项)。

比较:需要注意的重要一点是,Lime 是一种独立于模型的方法(并非特定于决策树/RFs),它基于局部线性逼近。另一方面,Treeinterpreter 具体以与决策树本身类似的方式运行,并真正查看算法在比较中实际使用了哪些特征。所以他们实际上在做完全不同的事情。 Lime 说“一个特征很重要,如果我们稍微调整一下它就会产生不同的预测”。 Treeinterpreter 说“如果将某个特征与我们的一个节点中的阈值进行比较,它就会很重要,这会导致我们进行拆分,从而彻底改变了我们的预测”。


信任哪一个?

这很难明确回答。它们可能都以自己的方式有用。直觉上,你可能第一眼就倾向于 treeinterpreter,因为它是专门为决策树创建的。但是,请考虑以下示例:

  • 根节点:50% 的实例为 0 类,50% 为 1 类。如果 F <= 50,则向左,否则向右。
  • Left Child:48% 的实例为 0 类,52% 为 1 类。子树在此之下。
  • 右孩子:99% 的实例为 0 类,1% 的实例为 1 类。此子树下的子树。

如果大多数实例向左移动,只有一些向右移动,则这种设置是可能的。现在假设我们有一个带有F = 49 的实例,它被分配到左侧并最终分配到类1。Treeinterpreter 不会关心F 真的很接近在根节点中等式的另一边结束,并且只分配0.48 - 0.50 = -0.02 的低贡献。 Lime 会注意到,稍微改变F 就会完全改变几率。

哪一个是对的?这还不是很清楚。你可以说F 真的很重要,因为如果它只有一点点不同,预测就会不同(然后石灰获胜)。你也可以争辩说F 对我们的最终预测没有贡献,因为在检查了它的价值之后我们几乎没有接近于一个决定,并且之后仍然需要研究许多其他特性。然后 treeinterpreter 获胜。

为了在此处获得更好的想法,实际绘制学习到的决策树本身也可能会有所帮助。然后,您可以手动遵循它的决策路径,并决定您认为哪些功能很重要和/或看看您是否可以理解为什么 Lime 和 treeinterpreter 会说他们所说的。

【讨论】:

  • 我想知道除了上面提到的还有其他两种方法吗:) 谢谢
  • @Victor 除了以上两种方法之外,我真的不知道其他方法不,这不是我的主要专业领域。
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 2014-06-15
  • 2019-11-19
  • 2016-08-21
  • 1970-01-01
  • 2020-08-11
  • 2011-05-14
  • 2014-06-26
相关资源
最近更新 更多