本篇文章转载于LIME:一种解释机器学习模型的方法

该文章介绍了一种模型对单个样本解释分类结果的方法,区别于对整体测试样本的评价指标准确率、召回率等,Lime为具体某个样本的分类结果做出解释,直观地表明该模型为何做出如此预测。

动机:我们为什么要理解预测结果?

机器学习如今是非常火的一个话题。随着计算机在围棋等游戏中击败人类专家,许多人不禁要问机器是否也能胜任司机的工作,甚至是取代医生?

现在很多前沿的机器学习模型还是一个黑盒,几乎无法去感知它的内部工作状态。这就给我们带来了可信度的问题:我该相信那个模型的某个预测结果是正确的吗?或者说我该相信那个模型的预测结果普遍都是合理的吗?围棋游戏的赌注还是小事,如果让计算机取代医生可算一件大事了,或者让计算机判断我是不是恐怖分子嫌疑人(《疑犯追踪》)。更通俗的来说,如果一家公司正准备替换上一套基于机器学习的系统,它就要确保机器学习模型的工作状态是良好的。

从直观上看,解释每次独立预测背后的基本原理能使我们更容易信任或是不信任预测结果,乃至分类器本身。即使我们无法理解模型在所有情况下的表现,却有可能理解(大多数情况都是如此)它在某些特定情况下的行为。

最后,说一下准确性。如果你有机器学习的经验,我敢说你正在想的是:“我当然知道模型在真实情况下能取得不错的效果,因为在交叉验证中已经得到了很高的准确率!当99%的情况下模型都能准确预测时,我为啥还要去理解它的预测结果呢?”任何一位在现实问题中(不是在静态的数据集上)使用过机器学习方法的人都能证明,交叉验证的准确率很具有误导性。有时候预测数据会不小心混入训练数据中。有时候你收集数据的方法会引入现实中不存在的相关性,而模型却能捕捉到。其它许多棘手的问题都会影响我们评判模型性能,即使是使用A/B测试。我不是不让你测试准确率,而是准确率不应该是你的唯一标准。

Lime:一些例子

你真的相信你的新闻数据集的分类器吗?

首先,我们给一个文本分类的例子。著名的新闻数据集( 20 newsgroups dataset)是一个标尺,在多篇文章中被用来比较不同的模型。我们选取两个难以区分的类别,选取标准是它们有着许多重合的词语:基督教(Christianity)和无神论(Atheism)。训练一个有着500棵树的随机森林,我们在测试集上得到92.4%的准确率,高的惊人了。如果准确率是唯一的衡量标准,我们肯定会相信这个算法。

下图是测试集中任意一个案例的解释,由lime包生成。

这是分类器预测结果正确但是原因错误的一个例子。仔细观察就会发现单词“Posting”(邮件抬头的一部分)在21.6%的训练数据中出现过,仅有两次是属于“基督教”类别。在测试集里也是一样,它在20%的样本中出现过,也仅有两次属于“基督教”类别。数据集的这种分布状态使得问题比现实状况简单得多,分类器是无法区分基督教和无神论两个类别的。这一点准确率或者原始数据上是很难观察到的,但是如果有预测的解释则很容易发现。一旦你明白了模型真正的工作原理,此类洞察能力就显得很平常了,模型的泛化能力也更强了。

进一步看看其解释能力如何:这是一个非常稀疏的线性模型(只有6维特征)。尽管底层的分类器是复杂的随机森林,在这个例子里它几乎就是个线性模型。基本可以确定,如果我们从例子中删除“Host”和“NNTP”两个单词,预测为“atheism”的概率值将会是0.57-0.14-0.12=0.31。

由深度神经网络解释预测结果

下图来自我们的论文,我们在一些任意的图像上解释Google的 Inception neural network。在本例中,我们解释图像中类别最确定的那部分。这里,图像中的是木吉他,分类器却预测为电吉他。解释部分阐述了为何两者被混淆了:它们的指板很相似。lime包目前暂时还无法实现图像分类器的解释,我们正在开发中。

参考阅读:深度神经网络的灰色区域:可解释性问题

Lime:我们是如何进行解释

Lime是Local Interpretable Model-Agnostic Explanations的缩写。名字的每一部分反映了我们进行解释的意图。Local指的是局部保真——也就是说我们希望解释能够真实地反映分类器在被预测样本上的行为。这个解释要求是可以理解的(interpretable)——即能够被人类读懂。Lime能够解释任何模型,而不需要进行模型适配,所以是与模型无关的(model-agnostic)。

现在我们来俯瞰一下lime的工作原理。若想了解更多细节,请查阅我们论文的预印版

首先来说一说可解释性。有些分类器使用的用户完全无法理解的表征方式(如词向量)。Lime用可以被理解的表征方式(比如用单词)来解释这些分类器,即使它不是分类器真正在使用的方式。另外,lime考虑了人类的局限性:解释内容不会过长。目前,我们的工具包支持稀疏线性模型的解释,我们正在开发支持其它表征方式。

为了做到与模型无关,lime不会深入模型内部。为了搞清楚哪一部分输入对预测结果产生贡献,我们将输入值在其周围做微小的扰动,观察模型的预测行为。然后我们根据这些扰动的数据点距离原始数据的距离分配权重,基于它们学习得到一个可解释的模型和预测结果。举个例子,如果我们要解释“我讨厌这部电影”这句话的预测结果,我们将打乱这个句子,对“我讨厌电影”、“我这部电影”、“我电影”、“我讨厌”等句子进行预测。即使起初的分类器使用了更多的词语,但是我们可以合理的预期例子中只有“讨厌”这个词相关。注意,如果分类器用到了一些不可解释的表达方式,比如词向量,此方法依旧可行:我们只需用词向量来打乱句子,不过最后的解释还是会落到诸如“讨厌”或“电影”的词。

这个过程的演示图如下。原始模型的决策函数用蓝/粉背景表示,显然是非线性的。亮红色的叉叉表示被解释的样本(称为X)。我们在X周围采样,按照它们到X的距离赋予权重(这里权重的意思是尺寸)。我们用原始模型预测这些扰动过的样本,然后学习一个线性模型(虚线)在X附近很好地近似模型。注意,这个解释只在X附近成立,对全局无效。

结论

我希望已经能让你明白了理解预测器单独的预测结果的重要性。有了解释,你能有更多的信息来决策是否信任预测结果,或是整个模型,以及提供思路来改进模型效果。

机器学习模型解释工具-Lime的更多相关文章

  1. 斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...

    [导读]斯坦福大学的人工智能课程"CS 221"至今仍然是人工智能学习课程的经典之一.为了方便广大不能亲临现场听讲的同学,课程官方推出了课程笔记CheatSheet,涵盖4大类模型 ...

  2. GMIS 2017 大会陈雨强演讲:机器学习模型,宽与深的大战

    https://blog.csdn.net/starzhou/article/details/72819374 2017-05-27 19:15:36     GMIS 2017    10 0 5 ...

  3. scikit-learn系列之如何存储和导入机器学习模型

    scikit-learn系列之如何存储和导入机器学习模型   如何存储和导入机器学习模型 找到一个准确的机器学习模型,你的项目并没有完成.本文中你将学习如何使用scikit-learn来存储和导入机器 ...

  4. 使用pmml实现跨平台部署机器学习模型

    一.概述   对于由Python训练的机器学习模型,通常有pickle和pmml两种部署方式,pickle方式用于在python环境中的部署,pmml方式用于跨平台(如Java环境)的部署,本文叙述的 ...

  5. 使用pmml跨平台部署机器学习模型Demo——房价预测

      基于房价数据,在python中训练得到一个线性回归的模型,在JavaWeb中加载模型完成房价预测的功能. 一. 训练.保存模型 工具:PyCharm-2017.Python-39.sklearn2 ...

  6. 能力素质模型咨询工具(Part 2)

    核心能力素质模型数据库 1. 工作态度 通用 (1)热爱本职工作,对工作充满信心 (2)在没有明确的规定或领导指示的情况下,能够积极主动地承担职责范围内的各项工作,并能够积极地配合其他同事/部门工作 ...

  7. 并行计算基础&编程模型与工具

    在当前计算机应用中,对快速并行计算的需求是广泛的,归纳起来,主要有三种类型的应用需求: 计算密集(Computer-Intensive)型应用,如大型科学project计算与数值模拟: 数据密集(Da ...

  8. 老李分享: 并行计算基础&编程模型与工具 2

    2.并行编程模型和工具 – MPI – MPI(Message Passing Interface)是一种消息传递编程模型,服务于进程通信.它不特指某一个对它的实现,而是一种标准和规范的代表,它是一种 ...

  9. 老李分享: 并行计算基础&编程模型与工具 1

    老李分享: 并行计算基础&编程模型与工具   在当前计算机应用中,对高速并行计算的需求是广泛的,归纳起来,主要有三种类型的应用需求: 计算密集(Computer-Intensive)型应用,如 ...

随机推荐

  1. int 问号的使用

    单问号---为泛型 Nullable<int> 的简写方式. 双问号---用于判断前一个操作数是否为null,如为null则"返回"后一个操作数,否则"返回& ...

  2. iOS用contenteditable滚动时,光标不会刷新定位的处理方法

    分析 iOS的 wkwebview 在滚动时会暂停许多动画,作为优化 解决思路 监听滚动事件,利用文档重绘即可刷新动画 ps:因为滚动有惯性,touchmove事件只能监听到手指松开的那一刻,所以只能 ...

  3. shell 脚本中的入参获取与判断

    1.获取shell脚本的入参个数: $# 2.获取shell脚本的第n个入参的字符个数/字符串长度(注意这里的n需要替换为具体的数字,如果这个数字超过实际的入参个数,结果为0): ${#n}

  4. R 语言中的多元线性回归

    示例 sessionInfo() # 查询版本及系统和库等信息 # 工作目录设置 getwd() path <- "E:/RSpace" setwd(path) rm(lis ...

  5. 【leetcode】960. Delete Columns to Make Sorted III

    题目如下: We are given an array A of N lowercase letter strings, all of the same length. Now, we may cho ...

  6. 关于python-selenium-chromedriver提示

    问题一:AttributeError: module 'selenium.webdriver' has no attribute 'Chromedriver' 配置selenium环境时,执行代码 f ...

  7. shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

    1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...

  8. HTML中的超链接(Hyperlink)

    超链接 ★超链接简单介绍 超链接可以说是网页中最常见的元素.超链接的英文名是hyperlink.每个网站都是由众多的网页组成,网页之间通常都是通过链接的方式相互关联的. 超链接能够让浏览者在各个独立的 ...

  9. Java多线程和并发(二),Thread中的start和run的区别

    目录 1.调用run方法 2.调用start方法 3.start和run的区别 二.Thread中的start和run的区别 1.调用run方法 public class ThreadTest { p ...

  10. LOJ #2718. 「NOI2018」归程 Dijkstra+可持久化并查集

    把 $Noi2018$ day1t1 想出来还是挺开心的,虽然是一道水题~ 预处理出来 1 号点到其它点的最短路,然后预处理边权从大到小排序后加入前 $i$ 个边的并查集. 这个并查集用可持久化线段树 ...