石灰 vs TreeInterpreter:解释决策树。

26

石灰解释器源代码: https://github.com/marcotcr/lime

树解释器源代码: tree interpreter

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

我们应该信任谁?特别是在顶部功能确实对预测有影响的情况下。

树的代码

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)
< p > Lime的代码

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)

让我们首先看一下tree的输出结果。

enter image description here

所以它确实正确地说是一个virginica。然而,通过在

1) 花瓣宽度(cm)然后花瓣长度(cm)中分配重要性

现在让我们看看lime的输出结果

enter image description here

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

1) 在lime中,花瓣长度(cm)>花瓣宽度(cm),而不是在tree中显示的花瓣长度(cm)<花瓣宽度(cm)

2) 当萼片宽度和萼片长度被预测为零时,在lime中声称有确定的值,如上传的图像所示

这里发生了什么?

当特征是1000+时,问题变得更加复杂,每个数字都很重要。


1
您没有设置 random_state 以生成您的随机森林,因此两个示例之间的随机森林不同。因此,比较lime和tree interpreter的结果是无意义的。底层分类器不同。 - error
@Victor,我看到你编辑了问题,在两种情况下添加了random_state=50;你能确认在这个修改之后,你的图片中显示的确切数字仍然有效吗? - desertnaut
@desertnaut 请检查一下,我已经更新了图片。当我说“立刻”时,我的意思是更新图片。 - user9238790
1个回答

25

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

Lime: 从他们的github页面中摘取的简短解释:

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

在github页面上有更详细的信息。

treeinterpreter: 如何工作的解释可在http://blog.datadive.net/interpreting-random-forests/上找到(这是针对回归的;分类的示例,其工作方式非常相似,可以在这里找到)。

简而言之:假设我们有一个节点,它将特征F与某个值进行比较,并根据此拆分实例。假设到达该节点的所有实例中有50%属于类C。假设我们有一个新实例,它最终被分配到该节点的左子节点,现在80%的所有实例都属于类C。那么,计算特征F对这个决策的贡献是0.8 - 0.5 = 0.3(如果路径上还有更多使用特征F的节点,则会有额外的项)。 比较:需要注意的重要事情是Lime是一种模型无关的方法(不特定于决策树/随机森林),它基于局部线性逼近。而Treeinterpreter则以与决策树本身类似的方式运作,实际上查看算法实际上使用哪些特征进行比较。因此,它们实际上在做完全不同的事情。Lime说:“如果我们摆动一下特征,这会导致不同的预测,那么这个特征很重要”。Treeinterpreter则说:“如果我们将一个特征与阈值进行比较,并由此进行分裂导致我们的预测发生了巨大变化,那么这个特征很重要”。

哪一个是可信的?

这个问题很难明确回答。它们可能各自有用。直觉上,你可能会倾向于一开始就选择treeinterpreter,因为它是专门为决策树创建的。然而,请考虑以下例子:

  • 根节点:50%的实例属于类0,50%属于类1。如果F <= 50,则向左走,否则向右走。
  • 左孩子:48%的实例属于类0,52%属于类1。其下面有子树。
  • 右孩子:99%的实例属于类0,1%的实例属于类1。其下面有子树。

如果大多数实例向左移动,只有一些实例向右移动,则可能出现这种设置。现在假设我们有一个实例,F = 49,被分配到了左边,最终分配到了类1。Treeinterpreter不会关心F实际上几乎要在根节点的等式的另一侧结束,只会分配一个低贡献值0.48 - 0.50 = -0.02。Lime将注意到稍微改变F就会完全改变胜算。

这句话的正确性不是很清楚。你可以说F非常重要,因为如果它稍微有点不同,预测结果就会不同(那么Lime就赢了)。但你也可以认为F对我们的最终预测没有贡献,因为在检查其值后,我们几乎没有更接近决策,还需要调查许多其他特征。那么treeinterpreter就赢了。
为了更好地理解,实际上绘制学习到的决策树可能会有所帮助。然后您可以手动跟随其决策路径,并决定哪些功能您认为很重要和/或查看为什么Lime和treeinterpreter都会说出他们所说的话。

我在想是否除了上述提到的方法之外,还有其他的方法 :) 谢谢。 - user9238790
@Victor,除了上述两种方法,我真的不太清楚其他的方法,这不是我的主要专业领域。 - Dennis Soemers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接