黑盒模型事后归因解析:LIME方法

2020 年 4 月 26 日

黑盒模型事后归因解析:LIME方法

机器学习模型可解释性方面的研究,在近两年的科研会议上成为一个相当热门的话题。随着机器学习应用越来越广泛,大家不再仅仅满足于模型的效果,而是希望对模型效果背后的原因有更好的理解。构建能让用户理解的模型正变得越来越重要,在医疗、金融和司法等高风险应用中,这一点尤其明显。可解释机器学习是索信达金融 AI 实验室的重点研究方向之一,我们希望通过一系列文章介绍不同解释模型的方法,并分享可解释机器学习理论结合实际业务的应用和思考。

1. LIME 背景

现今的数据挖掘领域中,机器学习模型被广泛使用。传统的机器学习模型更关注预测效果,追求更高预测精准度和更快的训练速度。然而,机器学习模型的“黑盒”属性导致了其内部工作原理难以被理解,输入与输出之间往往存在极其复杂的函数关系。当模型应用到银行业等金融领域时,透明度和可解释性是机器学习模型是否值得信任的重要考核标准。我们需要告诉业务人员如何营销,告诉风控人员如何识别风险点,而不仅仅告诉他们预测的结果。一个预测表现接近完美、却属于黑盒的人工智能模型,会容易产生误导的决策,还可能招致系统性风险,导致漏洞被攻击,因而变得不安全可靠。例如在银行消费者贷款领域,美国联邦政府颁布的平等信贷机会法(ECOA)明确要求各家银行在拒绝每个消费者申请信用卡时,必须明确说明拒绝的理据。因此,应用复杂的机器学习模型时,我们需要构造一个“解释器”,对模型的预测结果进行事后归因解析,而 LIME 便是一个很好的事后解释方法。

2. LIME 介绍

LIME 全称 Local Interpretable Model-Agnostic Explanations,由 Marco Ribeiro, Sameer Singh 和 Carlos Guestrin 三个人在 2016 年《“Why Should I Trust You?” Explaining the Predictions of Any Classififier》这一文中提出来的,是一种事后解释方法,即在建立模型之后所做的解释,其名称也很好的反应了它的特点:

Local: 基于想要解释的预测值及其附近的样本,构建局部的线性模型或其他代理模型;

Interpretable: LIME 做出的解释易被人类理解。利用局部可解释的模型对黑盒模型的预测结果进行解释,构造局部样本特征和预测结果之间的关系;

Model-Agnostic: LIME 解释的算法与模型无关,无论是用 Random Forest、SVM 还是 XGBoost 等各种复杂的模型,得到的预测结果都能使用 LIME 方法来解释;

Explanations: LIME 是一种事后解释方法。

LIME 可处理不同类型的输入数据,如表格数据 (Tabular Data)、图像数据(Image Data)或文本数据 (Text Data)。对于表格数据,如用银行客户行为数据预测理财产品销售,训练完复杂模型后可以用 LIME 得到哪些特征影响理财产品销售;图像数据,如识别图片中的动物是否为猫,训练完复杂模型后可以用 LIME 得到图片中的动物被识别为猫是因为哪一个或几个像素块;文本数据,如识别短信是否为垃圾短信,训练完复杂模型后可以用 LIME 得到一条信息被判断为垃圾短信是因为哪一个或几个关键词。

3. LIME 原理

LIME 的算法需要输入想要解释的预测样本和已经训练好的复杂模型,基于表格数据,算法步骤如下:

(1)预测样本附近随机采样:对于连续型 (continuous) 特征,LIME 在预测样本点附近用一个标准正态分布 N(0,1) 来产生指定个数(代码中设置的 num_samples)的样本;而对于类别型 (categorical) 特征,则根据训练集的分布进行采样,当新生成样本的类别型特征与预测样本相同时,该类别型特征取值为 1,否则取值为 0;假设,想要解释的预测点为 x=(x1,x2,,xp)x=(x1,x2,,xp) , 有 p 个特征, 其中第 i 个特征为连续型特征,取值为 xiσi 为 该特征在训练集中的标准差;生成的 N 个样本为 zk=(z1,z2,,zp),k=1,2,,N, 通过标准正态分布 N(0,1) 对应生成一个随机数 aki(对应第 k 个新生成样本的第 i 个特征),则新生成的第 k 个样本的第 i 个特征的取值为 akiσi+xi

(2)对新生成的样本打标签:将新生成的样本放入已经训练好的复杂模型中训练,得到对应的预测结果;设训练好的复杂模型为 f,则新生成的的样本预测结果为 f(z1),f(z2),,f(zN)

(3)计算新生成的样本与想要解释的预测点的距离并得到权重:新生成的样本距离想要解释的预测点越近,我们认为这些样本能够更好的解释预测点,因此需要赋予更高的权重。我们用指数核函数(exponential kernal)去定义新生成样本的权重,设为 Πx(z)=exp(D(x,z)2σ2), 此处 D(x,z) 为某个新生成的样本到 x 的距离函数, σ 则为超参数。从公式中可以看到,距离越近, Πx 的值越大。

(4)筛选用来解释的特征,拟合线性模型:设想要用来解释的特征有 p 个,则用来解释的特征为 z=(z(1),z(2),,z(p)),此处 z(1)z1 不一定相等,只是用来表示从 p 个特征中选取 p 个作为解释;设用来解释的线性模型为 g(z)=ωg.z=ω0+ω1z(1)+ωpz(p) ,为了求出线性模型的系数,我们用一个加权平方损失构造损失函数:L(f,h,Πx)=Nk=1Πx(zk)(f(zk)g(zk))2, 找出使得损失最小的 ωg ,而 ωg.z 即为我们用来解释的特征的线性组合;而对于 p 个特征的选择,代码中提供 forward selection、highest weights、lasso_path 等方法。

4. Submodular Pick

虽然 LIME 可以实现对单个预测值的事后解释,提高了大家对黑箱模型的理解,但要看变量对模型预测值的整体影响,还需要进行全局解释。当我们用数据集做特征变量的全局解释时,需要挑选具有代表性且多元化的样本。一般的随机挑选方法(Random pick) 得到的效果一般般,而且也不太稳定。论文中提出次模挑选(Submodular Pick)来得到具有代表性的样本集。

4.1 什么是 submodular?

submodular(次模)实际上是对“边际效用递减”这个说法的形式化。对于一个集合函数 f:2VR, 如果有一个集合 V,满足 VS, 那么在 V 中增加一个元素所增加的收益要小于等于在 V 的子集中增加一个元素所增加的收益。更清晰地表示:对于函数 f 而言,若 ABS, 且 eSB,则 f(B{e})f(B)f(A{e})f(A)

在事后解释领域里, 我们想找到最具有代表性的样本集,就可以借鉴次模的思想,在集合 V 中不断加入增益最大的样本。但是如何寻找到这样的样本呢?在计算机领域里,次模函数有个性质,俗称 NP-hard,即对于一个次模函数 f, 如果给定一个限制条件,找出一个满足条件的集合 V,使得 f(V) 值最大。

贪心算法常用于解决上述的 NP-hard 问题。迭代地在解集合 V 中加入增益最大且满足条件的元素,即第 i 次迭代时解 Vi=Vi1{argmaxeΔ(e|Vi1)}, 其中增益为 Δ(e|Vi1)=f(Vi1{e})f(Vi1).

4.2 Submodular pick(SP) 的步骤

当使用 SP-LIME 时,首先得设定好 sample_size, 也就是次模挑选需要的样本数目。假定我们从数据集中挑选 n 个样本来做事后解释,每个样本是 d 维的,d 是用来做事后解释的特征变量个数。基于该样本集 X 在解释器中得到的解释,我们构建了 n×d 的解释矩阵 W

解释矩阵 W 中的每一个元素 Wij, 代表第 i 个样本的第 j 个可解释成分的局部重要性。鉴于使用的是线性模型当代理模型,解释器中对每一个样本 xi 都会计算出对应的线性解释 gi=ξ(xi)=α0+dj=1αjzij, zij 是经过标准化之后的 xij。在这里定义 Wij=|gij|=|αjzij|

为了度量解释空间中第 j 个特征的全局重要性,根据上文计算好的解释矩阵 W,定义了重要性函数 Ij=ni=1Wij, j{1,2d}。直观地,我们想要令选取的特征可以解释不同的样本,使重要性函数可以取更高的值。

在下图中,我们展示了一个例子。假定 W5×5 的二元矩阵,即 5 个样本,每个样本是 5 维的,每个元素要么取 0 要么取 1。重要性函数 I 给特征 f2 打的分 I2 比特征 f1 打的分 I1 要高, 所以特征 f2 用来解释更多的实例, 属于重要的可解释特征。

为了挑选可以覆盖最重要特征的样本,解释集一定不能冗余,即避免选取有相似解释性的实例。比如,第二个样本第三个样本的事后解释特征相同,所以我们只用二选一即可。

我们将非冗余的覆盖程度用下面的公式来计算。定义覆盖函数 c(x), 给定 WI, 计算至少出现在集合 V 中的一个样本的特征的重要性。

c(V,W,I)=dj=11iV:Wij>0Ij

挑选的问题由如下公式定义,找到集合 V, 满足 |V|n,可以使得 c(x) 达到最大。

Pick(W,I)=argmaxV,|V|nc(V,W,I)

集合函数 c 是次模函数, 上文提出贪心算法来解决挑选 n 个样本的问题。其可以迭代地增加对函数 c 有最高边际覆盖增益的样本 i,并以常数 11/e 的速度近似到最优。

算法展示了具体的挑选流程,我们称之为 submodular pick (次模挑选)。

5. 案例展示

我们以比特币的数据集为例,先使用 XGBoost 回归模型预测比特币价格,再用 LIME 做事后解释。用到数据集中的 15 个变量作为特征,响应变量为比特币价格。下图展示了部分的数据集结构。

用 XGBoost 对数据集做回归预测,发现该模型的 R2 高达 97%。模型效果很好但是内在是黑箱模型。

因此接下来对 XGBoost 用 LIME 做事后解释。先产生一个 LIME 的解释器。

接着在测试集中任意挑选一个样本,设置用 10 个特征来开始解释。代码会输出线性代理模型的截距,系数,标准化之后的样本数据,用 LIME 得到的预测值以及 XGB 预测该样本的比特币价格。


上图是在 Notebook 中展示的 LIME 解释。左边是用默认的 5000 个抽样得到的样本,通过拟合线性回归模型计算出来的预测值,最小是 355.03,最大是 15423.96,2295.3 则是 XGBoost 模型的预测值。中间的图是线性模型中 10 个特征变量对应的系数大小,positive 代表系数为正,negative 代表系数为负。右边是样本中对应 10 个特征的取值。

下面会输出对应的特征变量的局部解释图。

接下来尝试使用 submodular pick 来挑选 10 个代表性的样本做全局解释。

复制代码
from lime import submodular_pick
sp_obj = submodular_pick.SubmodularPick(explainer, train, reg.predict, sample_size=10, num_features=10, num_exps_desired=1)
[exp.as_pyplot_figure() for exp in sp_obj.sp_explanations]

从该全局解释图中可以看到,排名前三的特征变量 BlockSizeTot, TradeFee,TradeVol 对 XGBoost 预测结果有正向的影响,TransValue 则是对 XGBoost 产生了相对大的负向的影响。排名靠后的特征变量影响相对较小。

6. 结语

本文介绍了 LIME 作为一种复杂模型事后解释器,如何拟合局部代理模型,以及如何挑选全局样本,达到模型局部解释和整体解释的目的。更详细的介绍参考《“Why Should I Trust You?” Explaining the Predictions of Any Classififier》原文。为了演示 LIME 方法的效果,我们以一个比特币实际数据为例,对现下流行的 XGBoost 模型进行了 LIME 局部解释和全局解释。

7. 参考文档

[1] Túlio Ribeiro, M., Singh, S., Guestrin, C.: “Why Should I Trust You?”: explaining the predictions of any classifier. In: ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (2016)

[2] https://github.com/marcotcr/lime

原文链接:
https://mp.weixin.qq.com/s/qkWGKrAuDQqmNl-vxTekXg

2020 年 4 月 26 日 18:27 1540

评论

发布
暂无评论
发现更多内容

JVM详解之:运行时常量池

程序那些事

Java JVM class JIT GC

[架构师训练营] Week03 - 学习总结

谭方敏

架构师训练营week06 学习总结

GunShotPanda

第六期作业

AIK

Java8——Stream流

Java旅途

架构师训练营week06 作业

GunShotPanda

重读vue2.0风格指南,我整理了这些关键规则

前端有的玩

JavaScript Vue 代码规范

Idea中关于Js中的一些警告

阡陌r

架构学习第六周总结

乐天

布隆过滤器你值得拥有的开发利器

阿宝哥

缓存穿透 布隆过滤器

架构师第六周 命题作业

冯凯

Java HashMap 的那么多为什么

多选参数

Java java hashcode java; Java源码

第六周·学习总结

刘璐

单例模式

Leetao

Python 设计模式 单例模式

小白如何学习操作系统?

cxuan

操作系统

GitHub Actions和mp-ci助力微信小程序持续集成

neo

微信小程序 taro GitHub CI/CD

简单的了解一下K8S,并搭建自己的集群

detectiveHLH

Kubernetes 微服务

有了“质量墙”,程序员再也没有秃头的烦恼

华为云开发者社区

程序员 软件 代码审查 项目 代码

架构师训练营第六周总结

灵魂拷问:为什么short、byte会被提升为 int ? boolean到底多大?

烫烫烫个喵啊

Java Java Virtual Machine

你的成功为你带来好运,而你的运气与努力产生让人惊喜的变化。

叶小鍵

成功学 心理学 罗伯特·弗兰克 運氣

第六期总结

AIK

如何做一次完美的 ABTest?

vivo互联网技术

数据分析 AB testing实战

优傲机器人以人机协作助力中国“智能制造”落地

Geek_116789

中台,很多人理解的都不对

DeeperMan

数据中台 中台战略

架构师训练营第六周作业

架构师第六周 总结

冯凯

企业架构框架之Zachman框架

Winfield

企业架构

《架构师训练营》第六周总结

我从LongAdder中窥探到了高并发的秘籍,上面只写了两个字...

why技术

jdk 高并发 LongAdder

API接口管理平台YAPI的搭建

Man

DevOps APi设计 YAPI

黑盒模型事后归因解析:LIME方法-InfoQ