zoukankan      html  css  js  c++  java
  • 解释机器学习模型的一些方法(一)——数据可视化

    本系列文章转载自关于如何解释机器学习的一些方法。本篇主要介绍了几种可视化数据及模型结果的方法。

    到现在你可能听说过种种奇闻轶事,比如机器学习算法通过利用大数据能够预测某位慈善家是否会捐款给基金会啦,预测一个在新生儿重症病房的婴儿是否会罹患败血症啦,或者预测一位消费者是否会点击一个广告啦,等等。甚至于,机器学习算法还能驾驶汽车,以及预测大选结果!… 呃,等等。它真的能吗?我相信它肯定可以,但是,这些高调的论断应该在数据工作者(无论这些数据是否是『大』数据)以及机器学习工作者心里留下些非常困难的问题:我能否理解我的数据?我能否理解机器学习算法给予我的模型和结果?以及,我是否信任这些结果?不幸的是,模型的高复杂度赐予了机器学习算法无与伦比的预测能力,然而也让算法结果难以理解,甚至还可能难以采信。

    尽管,我们可能能够强制自变量-因变量关系函数是满足单调性约束的(译者注:单调性的意思是,递增地改变自变量,只会导致因变量要么一直递增,要么一直递减),机器学习算法一直有倾向产生非线性、非单调、非多项式形式、甚至非连续的函数,来拟合数据集中自变量和因变量之间的关系。(这种关系也可以描述为,基于自变量的不同取值,因变量条件分布的变化)。这些函数可以根据新的数据点,对因变量进行预测——比如某位慈善家是否会捐款给基金会,一个在新生儿重症病房的婴儿是否会罹患败血症,一位消费者是否会点击一个广告,诸如此类。相反地,传统线性模型倾向于给出线性、单调、连续的函数用于估计这些关系。尽管它们不总是最准确的预测模型,线性模型的优雅、简单使得他们预测的结果易于解释。

    如果说,好的(数据)科学对能够理解、信任模型以及结果是一个一般性要求的话,那么在诸如银行、保险以及其他受监管的垂直行业中,模型的可解释性则是重要的法律规范。商业分析师、医生以及行业研究员必须理解以及信任他们自己的模型,以及模型给出的结果。基于这个原因,线性模型几十年来都是应用预测模型中最易于上手的工具,哪怕是放弃几个百分点的精度。今天,大量机构和个人开始在预测模型任务中拥抱机器学习算法,但是『不易解释』仍然给机器学习算法的广泛应用带来了一些阻碍。

    在这篇文章中,为了进行数据可视化和机器学习模型/结果解释,我在最常用的一些准确性度量、评估图表以外,提供了额外的几种方法。我诚挚建议用户根据自己的需要,对这些技巧进行一些混搭。只要有可能,在这篇文章中出现的每一个技巧里,『可解释性』都被解构为几个更基本的方面:模型复杂程度,特征尺度,理解,信任 —— 接下来我首先就来简单对这几点做个介绍。

    待解释的响应函数(译者注:因变量关于自变量的函数)的复杂程度

    线性单调函数:由线性回归算法创建的函数可能是最容易解释的一类模型了。这些模型被称为『线性的、单调的』,这意味着任何给定的自变量的变化(有时也可能是自变量的组合,或者自变量的函数的变化),因变量都会以常数速率向同一个方向变动,变动的强度可以根据已知的系数表达出来。单调性也使得关于预测的直觉性推理甚至是自动化推理成为可能。举例来说,如果一个贷款的借方拒绝了你的信用卡申请,他们能够告诉你,根据他们的『贷款违约概率模型』推断,你的信用分数、账户余额以及信用历史与你对信用卡账单的还款能力呈现单调相关。当这些解释条文被自动化生成的时候,它们往往被称作『原因代码』。当然,线性单调的响应函数也能够提供变量重要性指标的计算。线性单调函数在机器学习的可解释性中有几种应用,在更下面的第一部分和第二部分讨论中,我们讨论了利用线性、单调函数让机器学习变得更为可解释的很多种办法。

    非线性单调函数:尽管大部分机器学习学到的响应函数都是非线性的,其中的一部分可以被约束为:对于任意给定的自变量,都能呈现单调性关系。我们无法给出一个单一的系数来表征某个特定自变量的改变对响应函数带来的影响程度,不过非线性单调函数实际上能够做到『只朝着一个方向前进』(译者注:前进的速度有快有慢)。一般来说,非线性单调的响应函数允许同时生成『原因代码』以及自变量的『相对重要性指标』。非线性单调的响应函数在监管类的应用中,是具备高度可解释性的。

    (当然,机器学习能够凭借多元自适应回归样条方法,建立『线性非单调』的响应曲线。在此我们不强调这些函数的原因,是因为一方面,它们的预测精度低于非线性非单调的预测模型,另一方面,它们跟线性单调的模型比起来又缺乏解释性。)

    非线性非单调函数:大部分机器学习算法建立了非线性、非单调的响应函数。给定任意一个自变量,响应函数可能以任何速率、向任何方向发生变动,因此这类函数最难以解释。一般来说,唯一可以标准化的解释性指标就是变量的『相对重要性指标』。你可能需要组织一些本文将要展示的技术作为额外手段,来解释这些极端复杂的模型。

    可解释性的特征尺度

    全局可解释性:某些下文展示的技巧,无论是对机器学习算法,算法得到的预测结果,还是算法学习到的自变量-因变量关系而言,都能够提供全局的可解释性(比如条件概率模型)。全局可解释性可以根据训练出来的响应函数,帮助我们理解所有的条件分布,不过全局可解释性一般都是『近似』的或者是『基于平均值』的。

    局部可解释性:局部可解释性提高了对于小区域内条件分布的理解,比如输入值的聚类,聚类类别对应的预测值和分位点,以及聚类类别对应的输入值记录。因为小局部内的条件分布更有可能是线性的、单调的,或者数据分布形式较好,因此局部可解释性要比全局可解释性更准确。

    理解与信任

    机器学习算法以及他们在训练过程中得到的响应函数错综复杂,缺少透明度。想要使用这些模型的人,具有最基本的情感需求:理解它们,信任它们——因为我们要依赖它们帮忙做出重要决策。对于某些用户来说,在教科书、论文中的技术性描述,已经为完全理解这些机器学习模型提供了足够的洞见。对他们而言,交叉验证、错误率指标以及评估图表已经提供了足以采信一个模型的信息。不幸的是,对于很多应用实践者来说,这些常见的定义与评估,并不足以提供对机器学习模型与结论的全然理解和信任。在此,我们提到的技巧在标准化实践的基础上更进一步,以产生更大的理解和信任感。这些技巧要么提高了对算法原理,以及响应函数的洞察,要么对模型产生的结果给出了更详尽的信息。 对于机器学习算法,算法学习到的响应函数,以及模型预测值的稳定性/相关性,使用以下的技巧可以让用户通过观测它们、确认它们来增强使用它们的信心。

    这些技巧被组织成为三部分:第一部分涵盖了在训练和解释机器学习算法中,观察和理解数据的方法;第二部分介绍了在模型可解释性极端重要的场合下,整合线性模型和机器学习模型的技巧;第三部分描述了一些理解和验证那些极端复杂的预测模型的方法。

    第一部分:观察你的数据

    大部分真实的数据集都难以观察,因为它们有很多列变量,以及很多行数据。就像大多数的『视觉型』人类一样,在理解信息这方面我大量依赖我的『视觉』感觉。对于我来说,查看数据基本等价于了解数据。然而,我基本上只能理解视觉上的二维或者三维数据——最好是二维。此外,在人类看到不同页面、屏幕上的信息时,一种被称作『变化盲视』的效应往往会干扰人类做出正确的推理分析。因此,如果一份数据集有大于两三个变量,或者超过一页/一屏幕数据行时,如果没有更先进的技巧而是只漫无止境的翻页的话,我们确实难以知道数据中发生了什么。

    当然,我们有大量的方法对数据集进行可视化。接下来的强调的大部分技巧,是用于在二维空间中描述所有的数据,不仅仅是数据集中的一两列(也就是仅同时描述一两个变量)。这在机器学习中很重要,因为大部分机器学习算法自动提取变量之间的高阶交互作用(意味着超过两三种变量在一起形成的效果)。传统单变量和双变量图表依然很重要,你还是需要使用它们,但他们往往和传统线性模型的语境更相关;当众多变量之间存在任意高阶交互作用时,仅靠使用传统图表就想理解这类非线性模型,帮助就不大了。

    图1. 使用图形符号代表操作系统和网页浏览器类型。

    图形符号(Glyph)是一种用来表征数据的视觉符号。图形符号的颜色、材质以及排列形式,可以用来表达数据不同属性(译者注:即变量)的值。在图1中,彩色的圆圈被定义为表达不同种类的操作系统以及网络浏览器。使用特定方式对图形符号进行排列后,它们就可以表征数据集中的一行行数据了。

    图2. 将图形符号进行组织,表达数据集中的多行。

    关于如何使用图形符号表示一行行数据,图2在这里给出了一个例子。每4个符号形成的小组既可以表示特定数据集中的某一行数据,也可以表示其中的很多行的汇总数据。图形中被突出的『Windows+IE浏览器』这种组合在数据集中十分常见(用蓝色,茶叶色,以及绿色表示),同理『OS X+Safari浏览器』这种组合也不少(上面是两个灰色点)。在数据集中,这两种组合分别构成了两大类数据。同时我们可以观察到,一般来说,操作系统版本有比浏览器版本更旧的倾向,以及,使用Windows的用户更倾向用新版的操作系统,使用Safari的用户更倾向于用新版的浏览器,而Linux用户以及网络爬虫机器人则倾向于使用旧版的操作系统和旧版的浏览器。代表机器人的红点在视觉上很有冲击力(除非您是红绿色盲)。为那些数据离群点(Outlier)选择鲜明的颜色和独特的排列,在图形符号表达法中,是标注重要数据或异常数据值的好办法。

    图3. 来自一家大型金融公司,用于表征贷款业务的相关图

    相关图是体现数据集中数据关系(相关性)的二维表达方法。尽管在图3中,过多的细节实际上是可有可无的,这张图还有一定改进空间,然而就相关图本身而言,这一方法仍然是观察、理解各变量相关性的有力工具。利用这种技巧,哪怕是上千个变量的数据集,也能画在一张二维图形上。

    在图3中,图的结点(node)表示某个贷款数据集中的变量,图中的连边(edge)的权重,也就是线条的粗细,是由两两之间皮尔逊相关系数的绝对值来定义的。为了简单起见,低于特定某个阈值的绝对值没有画出来。结点的大小,由结点向外连接的数目(即结点的度,degree)决定。结点的颜色是图的社群聚类算法给出的。结点所在的位置是通过力导向图生成的。相关图使我们能够观察到相关变量形成的大组,识别出孤立的非相关变量,发现或者确认重要的相关性信息以引入机器学习模型。以上这一切,二维图形足以搞定。

    在如图3所展示的数据集中,若要建立以其中某个变量为目标的有监督模型,我们希望使用变量选择的技巧,从浅绿、蓝色、紫色的大组里挑选一到两个变量出来;我们能够预计到,跟目标变量连线较粗的变量在模型中会较为重要,以及『CHANNEL_R』这种无连线的变量在模型中重要性较低。在图3中也体现出了一些常识性的重要关系,比如『FIRST_TIME_HOMEBUYER_FLAG_N』(是否为首次购房者)以及『ORIGINAL_INTEREST_RATE』(原始基准利率),这种关系应该在一个可靠的模型中有所体现。

    图4. 基于著名的784维的MNIST手写数据集制作的二维投影图。左图使用了主成分分析,右图使用了堆叠式消噪自编码机

    把来自数据集中原始高维空间的行向量映射到更容易观察的低维空间(理想情况是2到3维),此类方法可谓多种多样。流行的技巧包括:

    • 主成分分析(Principal Component Analysis,PCA)

    • 多维缩放(Multidimensional Scaling,MDS)

    • t分布随机近邻嵌入(t-distributed Stochastic Neighbor Embedding,t-SNE)

    • 自编码机神经网络(Autoencoder Networks)

    每一种方法都有它的优点和弱势,但他们有一个共同的主旨,就是把数据的行转化到有意义的低维空间上。这些数据集包括图像、文本,甚至商业数据,它们往往具有很多难以画在一张图上的变量。但这些通过找到把高维数据有效映射到低维表达的投影方法,让古老而可靠的散点图迎来了第二春。一个散点图所体现的高质量映射,应该反映出数据集中各方面的重要结构,比如数据点形成的聚类,层次结构,稀疏性,以及离群点等。

    在图4中,著名的MNIST数据集(数字的手写数据集)被两种算法从原始的784维映射到了2维上:一种是主成分分析,另一种是自编码机神经网络。糙快猛的主成分分析能够把标注为0和1的这两类数据区分的很好,这两种数字对应的手写图像被投影在两类较为密集的点簇中,但是其他数字对应的类普遍地发生了覆盖。在更精巧(然而计算上也更费时)的自编码机映射中,每个类自成一簇,同时长的像的数字在降维后的二维空间上也比较接近。这种自编码机投影抓住了预期中的聚簇结构以及聚簇之间的相对远近关系。有意思的是,这两张图都能识别出一些离群点。

    投影法在用于复查机器学习建模结果时,能提供一定程度上的额外『可信性』。比如说,如果在2维投影中能够观测到训练集/验证集里存在类别、层级信息和聚簇形态的信息,我们也许可以确认一个机器学习算法是否正确的把它们识别出来。其次,相似的点会投影到相近的位置,不相似的点会投影到较远的位置,这些都是可以加以确认的。我们考察一下用于做市场细分的分类或者聚类的模型:我们预计机器学习模型会把老年有钱客户和年轻且不那么富裕的客户放在不同的组里,并且它们在经过映射后,分别属于完全分离的两大组稠密的点簇。哪怕训练集、验证集中存在一些扰动,这种结果也应该是稳定的,而且对有扰动/无扰动两组样本分别进行映射,可以考察模型的稳定性,或者考察模型是否表现出潜在的随时间变化的模式。

    图5. 在著名的加州房产数据集上建立GBDT集成模型后得到的一维偏相关图

    当我们只关心一两个自变量取值发生变化,而其他自变量都处于平均水准对机器学习模型响应函数所造成的影响时,偏相关图可以为我们展现这种关系。在我们感兴趣的自变量存在较为复杂的交互作用时,用双自变量偏相关图进行可视化显得尤为有效。当存在单调性约束时,偏相关图可以用于确认响应函数对于自变量的单调性;在极端复杂的模型里,它也可以用于观察非线性性、非单调性、二阶交叉效应。如果它显示的二元变量关系与领域知识相符,或者它随时间迁移呈现出可预计的变化模式或者稳定性,或者它对输入数据的轻微扰动呈现不敏感,此时我们对模型的信心都会有所提高。

    偏相关图对于数据集的不同数据行而言,是全局性的;但对数据的不同列,也就是不同自变量而言,是局部性的。仅当我们需要考察1-2个自变量和因变量的关系时我们才能使用这种图。一种较新,不太为人所知的偏相关图的改进版本,称为『个体条件期望图』(Individual conditional expectation,ICE),它使用类似偏相关图的思想,能够给出对数据更局部性的解释。在多个自变量存在较强的相关关系时,ICE图显得尤其好用。

    图6. 一个来自残差分析应用的截图

    『残差』,是指数据集每一行中,因变量的测量值和预测值之差。一般来说,在拟合得不错的模型中,残差应该呈现出随机分布,因为一个好的模型,会描述数据集中除了随机误差以外的绝大部分重要现象。绘制『残差-预测值』这种评估手段,是一种用二维图形检查模型结果的好办法,饱经时间考验。如果在残差图中观测到了很强的相关性模式,这不啻为一种死亡讯息:要么你的数据有问题,要么你的模型有问题——要么两者都有问题!反之,如果模型产生了随机分布的残差,那这就是一种强烈的信号:你的模型拟合较好,可靠,可信;如果其他拟合指标的值也合理(比如,R^2,AUC等指标),那就更加如此了。

    在图6中,方框指出了残差中具有很强线性模式的部分。这里不仅有传统的『预测值-残差图』,也有特定自变量跟残差形成的二维散点图。把残差跟不同自变量画在一起,可以提供更细粒度的信息,以便于推理出到底什么原因导致了非随机模式的产生。残差图对识别离群点也有帮助,图6就指出了离群点。很多机器学习算法都使徒最小化误差平方和,这些高残差的点对大部分模型都会带来较强的影响,通过人工分析判断这些离群点的真实性可以较大的提高模型精度。

    现在我们已经展现了几种数据可视化的技巧,我们通过提几个简单问题,来回顾以下几个大概念:尺度,复杂性,对数据的理解,以及模型的可信性。我们也会对后面的章节中出现的技术提出相同的问题。

    数据可视化提供的可解释性,是局部性的还是全局性的?

    都有。大部分数据可视化技术,要么用于对整个数据集进行粗糙的观测,要么用于对局部数据提供细粒度检查。理想情况家,高级可视化工具箱能够让用户容易地缩放图形或者向下钻取数据。如若不然,用户还可以自己用不同尺度对数据集的多个局部进行可视化。

    数据可视化能够帮助我们理解什么复杂级别的响应函数?

    数据可视化可以帮我们解释各种复杂程度的函数。

    数据可视化如何帮我们提高对数据的理解?

    对大部分人而言,数据结构(聚簇,层级结构,稀疏性,离群点)以及数据关系(相关性)的可视化表达比单纯浏览一行行数据并观察变量的取值要容易理解。

    数据可视化如何提高模型的可信程度?

    对数据集中呈现的结构和相关性进行观察,会让它们易于理解。一个准确的机器学习模型给出的预测,应当能够反映出数据集中所体现的结构和相关性。要明确一个模型给出的预测是否可信,对这些结构和相关性进行理解是首当其冲的。

    在特定情况下,数据可视化能展现敏感性分析的结果,这种分析是另一种提高机器学习结果可信度的方法。一般来说,为了检查你的线上应用能否通过稳定性测试或者极端情况测试,会通过使用数据可视化技术,展现数据和模型随时间的变化,或者展现故意篡改数据后的结果。有时这一技术本身即被认为是一种敏感性分析。

  • 相关阅读:
    Passbook教程中生成pass时遇到的“Couldn't find a passTypeIdentifier in the pass”
    几个app maker的网站
    forever start Error: Cannot find module './daemon.v0.10.26'
    [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)
    在linux环境下配置node:node + npm + forever
    [技术翻译] 构建现代化的Objective-C (下)
    [技术翻译]构建现代化的 Objective-C (上)
    NSDate与 NSString 、long long类型的相互转化
    Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)
    基本网络请求
  • 原文地址:https://www.cnblogs.com/wmx24/p/9356930.html
Copyright © 2011-2022 走看看