Lime vs TreeInterpreter 用于解释决策树[关闭]

2024-03-19

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

树解释器来源:树解释器 https://pypi.python.org/pypi/treeinterpreter

我试图理解如何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)

我们首先看一下输出tree.

so a它确实正确地说这是一个弗吉尼亚州。然而,通过分配重要性

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

现在让我们看看输出lime

是的,它确实说算法预测弗吉尼亚州然而,看看它是如何进行分类的,我们清楚地看到以下内容

1)石灰中的花瓣长度(cm)>花瓣宽度(cm)而不是树中所示的花瓣长度(cm)

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

这里发生了什么事?

当特征超过 1000 个时,问题就会变得更加严重,其中每个数字对于做出决定都很重要。


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

Lime:对其工作原理的简短解释,取自他们的github页面 https://github.com/marcotcr/lime:

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

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

树解释器:有关其工作原理的解释可在http://blog.datadive.net/interpreting-random-forests/ http://blog.datadive.net/interpreting-random-forests/(这是用于回归的;可以找到工作原理非常相似的分类示例here http://engineering.pivotal.io/post/interpreting-decision-trees-and-random-forests/).

简而言之:假设我们有一个比较特征的节点F到某个值并根据该值分割实例。假设到达该节点的所有实例中有 50% 属于类C。假设我们有一个新实例,它最终被分配给该节点的左子节点,现在所有实例的 80% 属于类C。那么特征的贡献F该决策的计算公式为0.8 - 0.5 = 0.3(如果沿着叶子的路径有更多节点也使用特征,则加上附加术语F).

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


值得信赖哪一个?

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

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

如果大多数实例向左移动,只有一些实例向右移动,则可以进行这种设置。现在假设我们有一个实例F = 49被分配到左边并最终被分配到类 1。Treeinterpreter 不会关心这一点F非常接近于在根节点中结束于方程的另一边,并且仅分配了较低的贡献0.48 - 0.50 = -0.02。 Lime 会注意到变化F只要一点点就会完全改变赔率。

哪一个是正确的?这还不太清楚。你可以那样说F这真的很重要,因为如果只有一点点不同,预测就会有所不同(那么莱姆获胜)。你也可以争辩说F对我们的最终预测没有贡献,因为在检查其价值后我们几乎没有更接近决定,并且之后仍然必须研究许多其他特征。然后树解释器获胜。

为了在这里获得更好的想法,实际绘制学习的决策树本身可能会有所帮助。然后,您可以手动沿着其决策路径进行操作,并确定您认为重要的功能和/或看看您是否可以理解为什么 Lime 和 treeinterpreter 都这么说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lime vs TreeInterpreter 用于解释决策树[关闭] 的相关文章

随机推荐

  • 将 JSON 字符串转换为 JAVA 中的通用对象(使用 GSON)

    我有一个返回 JSON 的 Api 响应采用某种格式 可以放入名为 ApiResult 的对象中 并包含Context
  • 如何计算贝塞尔曲线的面积?

    给定以下描述 SVG 三次贝塞尔曲线的路径 例如 M 300 140 C 300 40 500 40 500 140 并假设有一条直线连接端点300 140 to 500 140 封闭曲线下的面积 是否可以计算如此封闭的面积 谁能建议一个公
  • 如何创建自定义 haar 分类器?

    我正在努力创建一个自定义 haar 分类器 我在网上找到了一些教程 但他们没有指定他们使用的是哪个版本的 opencv 我需要的是一个非常简洁和简化的所需步骤示例 以及一个简单的图像数据集 我还需要知道 opencv 版本和操作系统平台 以
  • Rails 7 不会通过“generatescaffold”命令生成 SCSS 文件

    我在 Rails 7 中创建了一个新项目 每当我使用生成脚本时 rails generate scaffold or rails generate controller 除了 css scss 之外 所有生成的文件都会被创建 显然 我不是唯
  • svn 客户端超时并破坏 WC 状态

    当我提交较大的更改 数百兆字节 时 即使签入确实完成 客户端也会超时 当我右键单击 WC 并显示日志时 TSVN 显示即使实际签入 WC 修订版也不会更新 我尝试过使用TortoiseSVN 1 9 5 Build 27581 64 Bit
  • 静止搜索性能

    这是一个双重问题 我组装了一个简单的国际象棋引擎 它执行 Alpha Beta 搜索 最后执行静止搜索 静止搜索正在影响性能 问题是 这是可以接受的性能影响吗 如果不是 那么应该采取什么措施来解决这个问题 下图给出了性能影响 请注意 这些统
  • 出现“无法将 PersistentGenericSet 转换为 ISet”错误

    我收到此错误 无法转换类型的对象 NHibernate Collection Generic PersistentGenericSet1 IocWinFormTestEntities People to type System Collec
  • 如何禁用apache2中的mod_deflate?

    如何在 Apache2 中禁用 mod deflate 对于特定目录中的文件 OR 对于所有具有扩展名的文件 例如 py 您可以设置环境变量no gzip http httpd apache org docs 2 2 mod mod def
  • MAVEN_OPTS 与 mvn -D

    我认为两者都定义了相同的 JVM 属性 但两者之间显然存在差异 我找不到明确的解释 如果我在构建的 Jenkins Maven 中使用两者 则只有 D 设置的属性在 System getProperties 的 Java 应用程序中可见 尽
  • p:fileDownload bean方法被调用但文件下载不显示

    您好 我正在使用 JSF 和 Primefaces 进行文件上传和下载相同的文件操作 我结合使用来自不同论坛和博客的技术 BelusC 的博客和 Primefaces Showcase 该操作的主要思想是让用户上传文件并 为上传的文件生成一
  • 数据库连接应该是单例吗?

    Java 中创建单例的最佳方式是什么 数据库连接应该是单例 作为单例它自动是线程安全的 因为理论上数据库不能被许多用户同时访问 数据库连接通常不应是单例 两个原因 许多数据库驱动程序都不是线程安全的 使用单例意味着如果您有许多线程 它们将共
  • 从 phpmailer 获取原始 rfc822 消息

    我正在尝试使用 google api php client 和 gmail api 来允许我的用户验证他们的 gmail 帐户并通过我的网站发送电子邮件 我问了一个更通用的问题 https stackoverflow com questio
  • 时间:2019-03-17 标签:c#Linqselect不同的日期时间天

    我有以下方法 我计划返回一堆不同的日期时间对象 我所说的独特是指独特的日子 不包括时间 问题是 DateTime 对象具有不同的时间 因此即使它们是同一天 也会被评估为唯一 如何让查询忽略日期的时间部分并仅评估日期的唯一性 public L
  • 为什么我的类没有通过“def __init__”或“def __init__”初始化?为什么我会收到“不带参数”类型错误或属性错误?

    如果您的问题作为与此重复的问题而被关闭 那是因为您有一个代码示例 其中包含以下内容 class Example def int self parameter self attribute parameter or class Example
  • 从 DBMS_SCHEDULER 运行 exe

    我是 DBMS SCHEDULER 的新手 我面临一些问题 我想运行 exe所以我创建了一个工作 begin sys dbms scheduler create job job name gt FTREC EXE 1 job type gt
  • 类模板参数推导完美转发

    我想了解演绎指南如何与通用参考一起使用std forward 特别是创建完美的转发包装器 下面的代码提供了在两种情况下试验函子包装器的代码 一种具有隐式推导指南 一种具有显式推导指南 我已经放了很多 and std forward在评论中
  • 如何按列对多维数组进行排序?

    有没有办法使用 sort 方法或任何其他方法按列对列表进行排序 可以说我有清单 John 2 Jim 9 Jason 1 我想对其进行排序 使其看起来像这样 Jason 1 John 2 Jim 9 做到这一点的最佳方法是什么 Edit 现
  • 错误:生成未知

    我正在尝试按照教程进行操作https docs angularjs org tutorial https docs angularjs org tutorial并且运行命令时出错 npm run protractor 这是控制台日志 Mic
  • 从 Woocommerce 中的产品 ID 获取所有订单 ID

    如何按产品 ID 获取包含订单 ID 的数组 我的意思是接收所有展示特定产品的订单 我知道如何通过 MySQL 来做到这一点 但是有没有办法通过WP Query功能 Updates 2017 SQL 查询更改为 SELECT DISTINC
  • Lime vs TreeInterpreter 用于解释决策树[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 石灰来源 https github com marcotcr lime https github com marcotcr lime 树解