解释机器学习模型的一些方法(三)——理解复杂的机器学习模型

在这一部分中我们所要展现的技术,可以为非线性、非单调的响应函数生成解释。我们可以把它们与前两部分提到的技巧结合起来,增加所有种类模型的可解释性。实践者很可能需要使用下列增强解释性技巧中的一种以上,为他们手中最复杂的模型生成令人满意的解释性描述。

代理模型

图14.  为了解释复杂神经网络而使用代理模型的示意图

代理模型是一种用于解释复杂模型的简单模型。最常见的建立方法是,对原始输入和复杂模型给出的预测值建立简单线性回归或者决策树模型。代理模型中所展示的系数、变量重要性、趋势以及交互作用,是复杂模型内部机制的一种体现。不过,几乎没有理论依据能够保证简单的代理模型能够以高精度表达出更复杂的模型。

代理模型适用于何种尺度的可解释性?

一般而言,代理模型是全局性的。一个简单模型的全局可解释特性会用于解释一个更复杂模型的全局特性。不过,我们也无法排除代理模型对复杂模型条件分布的局部拟合能力,例如先聚类,再用自变量拟合预测值、拟合预测值的分位点、判断样本点属于哪一类等等,能够体现局部解释性。因为条件分布的一小段倾向于是线性的、单调的,或者至少有较好的模式,局部代理模型的预测精度往往比全局代理模型的表现更好。模型无关的局部可解释性描述(我们会在下一小节介绍)是一种规范化的局部代理模型建模方法。当然,我们可以把全局代理模型和局部代理模型一起使用,来同时获得全局和局部的解释性。

代理模型能够帮助我们解释何种复杂程度的响应函数?

代理模型能够有助于解释任何复杂程度的机器学习模型,不过可能它们最有助于解释非线性、非单调的模型。

代理模型如何帮我们提高对数据的理解?

代理模型可以针对复杂模型的内部机制向我们提供一些洞见,因此能提高我们对数据的理解。

代理模型如何让模型更可信赖?

当代理模型的系数、变量重要性、趋势效应和交叉效应都符合人类的领域知识,被建模的数据模式符合合理预期时,模型的可信度会得以提升。当数据中存在轻微的或者人为的扰动时,或者数据来自于我们感兴趣领域的数据模拟,又或者数据随着时间改变时,如果结合敏感性分析进行检验发现,对于模型的解释是稳定的,并且贴合人类领域经验,符合合理预期,那么模型的可信度会得以提升。

模型无关的局部可解释性描述(Local Interpretable Model-agnostic Explanation, LIME)

图15. 对LIME流程的一个描述,其中使用了加权线性模型帮助我们解释一个复杂的神经网络是如何做出某个预测的

LIME是围绕单个样本建立局部代理模型的一种方法。它的主旨在于厘清对于特定的几个样本,分类器是如何工作的。LIME需要找到、模拟或者产生一组可解释的样本集。使用这组已经被详细研究过的样本,我们能够解释机器学习算法得到的分类器是如何对那些没有被仔细研究过的样本进行分类的。一个LIME的实现可以遵循如下流程:首先,使用模型对这组可解释的数据集进行打分;其次,当模型对另外的数据进行分类时,使用解释性数据集与另外的数据点的距离进行加权,以加权后的解释性数据集作为自变量做L1正则化线性回归。这个线性模型的参数可以用来解释,另外的数据是如何被分类/预测的。

LIME方法一开始是针对图像、文本分类任务提出的,当然它也适用于商业数据或者客户数据的分析,比如对预测客户群违约或者流失概率的百分位点进行解释,或者对已知的成熟细分市场中的代表性客户行为进行解释,等等。LIME有多种实现,我最常见的两个,一个是LIME的原作者的实现,一个是实现了很多机器学习解释工具的eli5包。

LIME提供的可解释性的尺度如何?

LIME是一种提供局部可解释性的技术。

LIME能帮助我们解释何种复杂程度的响应函数?

LIME有助于解释各种复杂程度的机器学习模型,不过它可能最适合解释非线性、非单调的模型。

LIME如何帮我们提高对模型的理解?

LIME提供了我们对重要变量的洞察力,厘清这些变量对特定重要样本点的影响以及呈现出的线性趋势。对极端复杂的响应函数更是如此。

LIME如何让模型更加可信?

当LIME发现的重要变量及其对重要观测点的影响贴合人类已有的领域知识,或者模型中体现的数据模式符合人类的预期时,我们对模型的信心会得到增强。结合下文将会提到的最大激发分析,当我们能明显地看到,相似的数据被相似的内部机制处理,全然不同的数据被不同的内部机制处理,在对多个不同的样本使用不同处理方式上,能够保持一贯性。同时,在数据存在轻微扰动时,数据是由我们感兴趣的场景模拟得出时,或者数据随时间改变时,LIME可以被视为是敏感性分析的一种,帮助我们检查模型是否依然能够保持稳定,是否依然贴合人类的领域知识,以及数据模式是否依然符合预期。

最大激发分析

图16. 不同输入数据激发神经网络中不同神经元的示意图

在最大激发分析中,可以找到或者模拟出这样的例子,它们总是会对特定的神经元、网络层、滤波器(filter)、决策树集成模型中的某棵树进行大量激发。像第二部分所提到的单调性约束一样,最大激发分析在实战中,是一种很常见的与模型相关的解释性分析技术。

对于特定的一组样本或者一类相似的样本,观察它们能够对响应函数的哪一部分进行最大程度的激发(对于神经元而言是激发强度最大,对于树模型而言是残差最低,二者都可以算最大激发),这种最大分析厘清了复杂模型的内部工作机制。同时,如果不同类型的样本持续激发模型中相同的部分,那么这种分析也可以发现交叉效应。

图16描绘了一种比较理想化的情况:一个好的客户和一个欺诈型客户分别以高强度激发了两组不同的神经元。红圈表示两类输入数据所激发的强度排名前三的神经元。对于这两类数据而言,最大激发的神经元不同,表示着对于不同类型的样本,神经网络的内部结构会以不同的方式对其进行处理。如果对很多不同子类型的好客户和欺诈型客户而言这种模式依然存在,那么这就是一种很强烈的信号,意味着模型内部结构是稳定的、可靠的。

最大激发分析适用于哪种尺度的可解释性?

最大激发分析在尺度上是局部性的,因为它刻画了一个复杂响应函数的不同部分是如何处理特定的一个或者一组观测样本的。

最大激发分析能够帮助我们解释何种复杂程度的响应函数?

最大激发分析能够解释任意复杂的响应函数,不过它可能最适合于解释非线性、非单调的模型。

最大激发分析如何让我们更好的理解数据和模型?

最大激发函数通过像我们展示复杂模型的内部结构,提高我们对数据、模型的理解。

最大激发分析如何让模型变的更加可信?

上文讨论过的LIME有助于解释在一个模型中对条件分布的局部进行建模并预测。最大激发分析可以强化我们对模型局部内在机制的信心。二者的组合可以为复杂的响应函数建立详细的局部解释,它们是很棒的搭配。使用最大激发分析,当我们能明显地看到,相似的数据被相似的内部机制处理,全然不同的数据被不同的内部机制处理,对多个不同的样本使用不同处理方式这一点保持一贯性,模型中发现的交互作用贴合人类已有的领域知识,或者符合人类的预期,甚至把最大激发分析当做一种敏感性分析来用,以上的种种都会让我们对模型的信心得以提高。同时,在数据存在轻微扰动时,数据是由我们感兴趣的场景模拟得出时,或者数据随时间改变时,最大激发分析可以帮我们检查模型对于样本的处理是否依然保持稳定。

敏感性分析

图17. 一个变量的分布随着时间而改变的示意图

敏感性分析考察的是这样一种特性:给数据加上人为的扰动,或者加上模拟出的变化时,模型的行为以及预测结果是否仍然保持稳定。在传统模型评估以外,对机器学习模型预测进行敏感性分析可能是最有力的机器学习模型验证技术。微小地改变变量的输入值,机器学习模型可能会给出全然不同的预测结论。在实战中,因为自变量之间、因变量与自变量之间都存在相关性,有不少线性模型的验证技巧是针对回归系数的数值稳定性的。 对从线性建模技术转向机器学习建模技术的人而言,少关注一些模型参数数值不稳定性的情况,多关心一些模型预测的不稳定性,这种做法可能还算是比较谨慎。

如果我们能针对有趣的情况或者已知的极端情况做一些数据模拟,敏感性分析也可以基于这些数据对模型的行为以及预测结果做一些验证。在整篇文章中提及或者不曾提及的不少技巧,都可以用来进行敏感性分析。预测的分布、错误比率度量、图标、解释性技巧,这些方法都可以用来检查模型在处理重要场景中的数据时表现如何,表现如何随着时间变化,以及在数据包含人为损坏的时候模型是否还能保持稳定。

敏感性分析适用于什么尺度的可解释性?

敏感性分析可以是一种全局性的解释技术。当使用单个的像代理模型这种全局性解释技术时,使用敏感性分析可以保证,就算数据中存在轻微扰动或者有人为造成的数据缺失,代理模型中所存在的主要交叉效应依然稳定存在。

敏感性分析也可以是一种局部性的解释技术。例如,当使用LIME这种局部性解释技术时,它可以判断在宏观经济承压的条件下,为某个细分市场的客户进行授信时,模型中使用的重要变量是否依然重要。

敏感性分析能够帮我们解释何种复杂程度的响应函数?

敏感性分析可以解释任何复杂程度的响应函数。不过它可能最适合于解释非线性的,或者表征高阶变量交叉特征的响应函数。在这两种情况下,对自变量输入值的轻微改变都可能引起预测值的大幅变动。

敏感性分析如何帮助我们更好的理解模型?

敏感性分析通过向我们展现在重要的场景下,模型及其预测值倾向于如何表现,以及这种表现随时间会如何变化。因此敏感性分析可以加强我们对模型的理解。

敏感性分析如何提高模型的可信可信度?

如果在数据轻微改变或者故意受损时,模型的表现以及预测输出仍然能表现稳定,那么稳定性分析就可以提高我们对模型的信任。除此以外,如果数据场景受到外来影响,或者数据模式随时间发生变化时,模型仍然能够符合人类的领域知识或者预期的话,模型的可信度也会上升。

变量重要性的度量

对于非线性、非单调的响应函数,为了量化衡量模型中自变量和因变量的关系,往往只能度量变量重要性这一种方法可以选。变量重要性度量难以说明自变量大概是往哪个方向影响因变量的。这种方法只能说明,一个自变量跟其他自变量相比,对模型影响的相对强弱。

变量重要性的全局度量

图18. 在决策树集成模型中,对变量重要性的描绘

在基于树的模型中使用变量重要性度量是一种常见做法。如图18所示,一种拍脑袋的变量重要性规则是,同时考虑树模型中一个变量用于分叉的所在深度和出现的频率:自变量所在分叉位置越高(译者注:在越浅的层数出现),或者自变量在树中出现的频率越高,那么它就越重要。对于单棵决策树来说,每次这个自变量在某个节点成为最佳分叉使用的变量时,把对应的分支准则(Splitting Criterion)收益累加起来,就可以量化地判断这个变量究竟有多重要。对于梯度提升树的集成(译者注:Gradient boosted tree ensemble, 往往也称作GBDT)而言,可以先对单棵树计算变量重要性,然后再做聚合加总;我们还有一种额外的度量,如果把单个自变量排除掉之后导致了模型精度的降低,那么这个精度差异可以代表自变量在模型中有多重要(Shuffling,洗牌法可以视作考察排除一个/一部分变量的效应,因为其他变量并没有被洗掉)。对于神经网络而言,对我们感兴趣的特定自变量的重要性度量,一般来说是它所对应的模型参数绝对值的加总。全局性的变量重要性度量技术往往因模型而异,实践者们要特别注意,变量重要性的简单度量可能会偏向于那些取值范围较大,包含类别数目较多的那些变量。

去除某一自变量的分析法(Leave-One-Covariate-Out, LOCO)

图19. LOCO方法的示意图

最近某篇文章的预印版本给出一种局部性的、模型无关的、通过模型平均精度下降的方式来考察变量重要性的度量,称为『去除某一自变量的分析法』(Leave-One-Covariate-Out),简称LOCO。最开始LOCO是用于回归模型的,不过LOCO的大体思想是无关于模型的,而且可以有多重不同的实现。可以按照如下流程实现LOCO:对训练集或验证集中的每一行以及每一个变量(自变量)进行局部性的重要性评分。在此之外,每一个变量被设置为缺失值、零值、平均值或者其他值域中的值,来把它在预测时起到的效果消除掉。对预测精度有最大绝对影响的自变量就是对那一行预测时的最重要变量,同时,可以对每一行中所有变量对预测的影响大小进行排序。LOCO还能为每一个变量计算它们对整个数据集精度的平均影响,给出全局性的变量重要性度量,甚至还能给出这些全局变量重要性度量的置信区间。

变量重要性度量适用于哪种尺度的可解释性?

一般来说变量重要性度量方法提供的解释性是全局的;不过LOCO方法可以为数据集中的每一行或者新来的数据提供局部的变量重要性度量。

变量重要性度量能够帮我们解释何种复杂程度的响应函数?

变量重要性度量对于非线性、非单调的响应函数而言是最有效的;不过它们可以广泛应用于各种机器学习习得的响应函数上。

变量重要性度量如何帮我们更好的理解模型?

变量重要性度量让我们对模型中最具影响力的变量及其影响力顺序有所了解,因而提高了我们对模型的理解。

变量重要性度量如何让模型更加可信?

如果变量重要性度量的结果能够贴合人类领域知识、符合人类预期,在数据存在轻微扰动或人为干扰的情况下仍然保持稳定,在数据随时间变化或者经由模拟得到时变动幅度可以接受的话,那么它就能够让模型更加值得采信。

决策树模型解释器

图20. 单棵决策树中,对于某一样本点的预测,以高亮的决策路径显示

几种『平均树』的解释方法已经提出了几年了,不过名为『决策树模型解释器』的简单开源工具最近几个月才开始流行起来。决策树模型解释器把决策树、随机森林给出的预测进行分解,表示成为全局平均值(bias)和各个自变量带来的贡献之和。决策树模型解释器是专门为决策树设计的算法。图20显示了如何将决策树中的决策路径分解成为全局平均值以及各个自变量的贡献。图中给出了某个特定的样本的决策路径(决策树模型不仅可以输出模型中的平均值和自变量的贡献值,也能输出对于某个样本而言的平均值以及自变量的贡献值)eli5包中也有一个决策树解释器的实现。

决策树解释器适用于哪种尺度的模型可解释性?

当决策树解释器给出在整棵决策树或者整个随机森林中各个自变量的平均贡献时,它的解释性就是全局的。当它用于解释某些特定的预测时,它的解释性就是局部的。

决策树解释器能够解释何种复杂程度的响应函数?

决策树解释器往往是用于解释由决策树、随机森林模型构建的非线性、非单调响应函数的。

决策树解释器如何提高我们对于模型的理解?

对于决策树以及随机森林模型中的自变量,决策树解释器通过展示它们平均的贡献,并对它们进行排序,来增进我们对模型的理解。

决策树解释器如何让模型变得更加可信?

如果决策树解释器所展现的结果能够贴合人类领域知识、符合人类预期,在数据存在轻微扰动或人为干扰的情况下仍然保持稳定,在数据随时间变化或者经由模拟得到时变动幅度可以接受的话,那么它就能够让模型更加值得采信。

结语

在最近几个月里,当我的朋友和同事们听说我要写这篇文章后,他们用邮件、短信、推特、Slack提醒我这方面新工作的速度简直是有增无减。现在,我很可能一天要看两个新的算法库、算法或者论文,我几乎不可能跟上这样一种节奏,把这些东西一股脑塞进这篇综述性的文章中。实际上,这篇文档总要有个尽头,必须要在某个地方戛然而止。所以我们就在这里停下吧!我相信,为了让理解机器学习的可解释性更上一层楼,这篇文章提供了有效的总结,把这些解释性技巧从四个标准上进行分类:它们的尺度(局部性的,或者全局性的),它们所能解释响应函数的复杂程度,它们的应用领域(跟特定模型相关,或者跟特定模型无关),以及它们如何能够更易于理解、更容易受信任。同时,我相信,这篇文章涵盖了主流类型的技巧,尤其是那些领域应用型的或者是商业应用型的技巧。如果我有更充裕的时间能够无止尽的向本文添砖加瓦的话,我想要马上给读者展现的是两个课题:一个课题是RuleFit(译者注:基于规则的集成模型工具,RuleFit3是R语言中的一个包),另一个课题则是让深度学习更具可解释性的诸多工作,比如论文『学习深度k近邻表达』即是其中之一。针对这两个课题我自己当然是要深入钻研下去的。

如此多的新进展纷至沓来,对于在这个课题(即机器学习可解释性)上做研究的人而言,这是个令人激动的时代。我希望你们能够在这篇文章中发现有用的信息。因为这个领域可以把机器学习和人工智能以更有效、更透明的方式传达给用户和客户,我希望那些跟我处于统一领域的工作者们能够像我一样,受到这些具有光明未来的革命性技术的鼓舞。

原文地址:https://www.cnblogs.com/wmx24/p/9356939.html

时间: 2024-08-28 03:39:26

解释机器学习模型的一些方法(三)——理解复杂的机器学习模型的相关文章

解释机器学习模型的一些方法(二)——在受监管的行业使用机器学习

对于在受监管行业中工作的分析师和数据科学家来说,尽管机器学习可能会带来『能极大提高预测精度』这一好处,然而它可能不足以弥补内部文档需求以及外部监管责任所带来的成本.对于实践者而言,传统线性模型技术可能是预测模型中的唯一选择.然而,创新和竞争的驱动力并不因为你在一个受监管的模式下工作就会止息.在银行,保险以及类似受监管垂直领域里,数据科学家和分析师正面对着这样一个独一无二的难题:他们必须要找到使预测越来越精准的方案,但前提是,保证这些模型和建模过程仍然还是透明.可解释的. 在这一节中所展现的技巧,

垂直居中重要方法理解---重点是方法三

方法一 这个方法把一些 div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align property 属性. <div id="wrapper"> <div id="cell"> <div class="content"> Content goes here</div> </div> </div> #wrapper { display:table; }

理解 Word2Vec 之 Skip-Gram 模型

理解 Word2Vec 之 Skip-Gram 模型 天雨粟 模型师傅 / 果粉 https://zhuanlan.zhihu.com/p/27234078 508 人赞同了该文章 注明:我发现知乎有些公式在手机端不显示,但在PC端可以正常显示.后面的文章我会尽量用图片或者纯文本来表示公式,方便手机端阅读. 写在之前 专栏终于申请成功啦,不过现在正在申请改名中,可能要审核几天.后面我会不定期在专栏中更新机器学习和深度学习的一些内容,主要包括机器学习的比赛代码.深度学习的算法思想以及深度学习的实战

机器学习(05)——主要概念理解

机器学习的专业术语非常多,不需要一开始理解所有的专业术语,这些术语会随着对机器学习的深入,会慢慢理解,水到渠成. 不过在学习的过程中,有一些概念必须要了解,有助于后续的学习与理解,需要了解的核心概念有:监督学习.无监督学习.模型.策略.算法等. 监督学习 监督学习,指的是学习的数据与后续测试的数据,都有答案(标签). 比如说,我们自己的相片集,里面每个人我们都知道是谁并可以标识出来,给机器学习时,我们将每个单人照和对应的名字提交给机器学习模型,机器学习模型完成学习以后,我们继续提交新的相片(单人

django模型models.py文件内容理解

首先,要理解这句话:模型是你的数据的唯一的.权威的信息源.它包含你所存储数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表 基础:每个模型都是django.db.models.Model的一个python子类 模型的每个属性都表示为数据库中的一个字段 django提供一套自动生成的用于数据库访问的API,下一章总结 1.第一个例子 from django.db import models class Person(models.Model): first_name = models.C

Catalina.createDigester方法详细理解

这个方法主要设置(这个方法很重要,贵在理解,虽然还没学过设计模式..) 1.遇到<server>标签时创建StandardServer实例   设置StandardServer类内部的相关属性   并调用Catalina.setServer()方法设置server 2.遇到<Server>标签的子标签<Listener>==>对应匹配模式"Server/Listener"时  创建Listener实例,创建类名通过<Listener cl

深入理解JVM JVM内存模型

1.JVM内存模型        说起JVM内存模型,都是知道是Java方法区.Java栈.Native方法区.Java堆和程序计数器五部分,不过具体是做什么的,又有什么关系可能大家就不太清楚了,所以话不多说,直接上干货. 首先是JVM内存规范. 编译器和类加载在上篇博客已经讲了,不了解的可去看一下.现在主要就是运行时数据区了.具体请看下图 先给简单介绍一下什么是堆.桟.方法区以及格子 首先就是堆与栈分开设计是为什么呢? 栈存储了处理逻辑.堆存储了具体的数据,这样隔离设计更为清晰堆与栈分离,使得

【转】深入理解JVM—JVM内存模型

http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变

深入理解JVM—JVM内存模型

原文地址:http://www.lofter.com/app/QRCodedownload?act=qbbkdlxz_20150313_13 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因