如何解读决策树和随机森林的内部工作机制?


随机森林在过去几年里得到了蓬勃的发展。它是一种非线性的基于树的模型,往往可以得到准确的结果。但是,随机森林的工作过程大都处于黑箱状态,往往难以解读和完全理解。近日,Pivotal Engineering Journal 网站发表了一篇文章,对随机森林的基础进行了深度解读。该文从随机森林的构造模块决策树谈起,通过生动的图表对随机森林的工作过程进行了介绍,能够帮助读者对随机森林的工作方式有更加透彻的认识。本文内容基于 Ando Saabas 的一个 GitHub 项目。另外,你也能在 GitHub 上找到用于创建本文中各种图表的代码。


  • Ando Saabas 的项目:https://github.com/andosa/treeinterpreter

  • 创建图表的代码:https://github.com/gregtam/interpreting-decision-trees-and-random-forests


决策树的工作方式


决策树可以看成为一个 if-then 规则的集合,即由决策树的根节点到叶节点的每一条路径构建一条规则,路径上内部节点的特征对应着规则的条件,而叶节点的类对应于规则的结论。因此决策树就可以看作由条件 if(内部节点)和满足条件下对应的规则 then(边)组成。


决策树的工作方式是以一种贪婪(greedy)的方式迭代式地将数据分成不同的子集。其中回归树(regression tree)的目的是最小化所有子集中的 MSE(均方误差)或 MAE(平均绝对误差);而分类树(classification tree)则是对数据进行分割,以使得所得到的子集的熵或基尼不纯度(Gini impurity)最小。


结果得到的分类器可以将特征空间分成不同的子集。对某个观察的预测将取决于该观察所属的子集。


图 1:一个决策树的迭代过程


决策树的贡献


以鲍鱼数据集(https://archive.ics.uci.edu/ml/datasets/abalone)为例。我们将根据壳的重量、长度、直径等变量来预测鲍鱼壳上环的数量。为了演示,我们构建了一个很浅的决策树。我们可以通过将树的最大层数限制为 3 而得到这个树。


图 2:预测不同环数的决策树路径


要预测鲍鱼的环的数量,决策树将沿着树向下移动直到到达一个叶节点。每一步都会将当前的子集分成两个。对于一次特定的分割,我们根据平均环数的改变来定义对该分割做出了贡献的变量。


比如说,如果我们拿到一个壳重 0.02、长度为 0.220 的鲍鱼,那么它就将落在最左边的叶节点上,预测的环数是 4.4731。壳重对预测环数的贡献为:


(7.587 - 9.958) + (5.701 - 7.587) = -4.257


长度的贡献为:


(4.473 - 5.701) = -1.228


这些贡献都是负数,说明对于这个特定的鲍鱼,壳重和长度值会使预测的环数下降。


我们可以通过运行以下代码得到这些贡献。


from treeinterpreter import treeinterpreter as ti dt_reg_pred, dt_reg_bias, dt_reg_contrib = ti.predict(dt_reg, X_test)


其中变量 dt_reg 是 sklearn 分类器目标,X_test 是一个 Pandas DataFrame 或 numpy 数组,包含了我们希望从中得到预测和贡献的特征。其贡献变量 dt_reg_contrib 是一个二维 numpy 数组 (n_obs, n_features),其中 n_obs 是观察的数量,n_features 是特征的数量。


我们可以绘制一个给定鲍鱼的这些贡献的图表,看看哪些特征对预测得到的值的影响最大。我们可以从下面这幅图表看到这个特定的鲍鱼的重量和长度值对预测得到的环数所产生的负影响。


图 3:一个贡献图表示例(决策树)


我们可以使用小提琴图表(Violin plot)将这个特定鲍鱼的贡献与所有鲍鱼的情况进行比较。这样可以在这张图表上叠加一个核密度估计。在下图中,我们可以看到,与其它鲍鱼相比,这个特定鲍鱼的壳重异乎寻常地低。实际上,很多鲍鱼的壳重值的贡献都是正数。


图 4:使用 violin 图对一个观察样本绘制的贡献图(决策树),文末将附上 violin 图的基本概念与用法。


上面的图虽然有些信息,但仍然无法让我们完全理解一个特定变量对鲍鱼所拥有的环数的影响。于是,我们可以根据一个给定特征的值绘制其贡献。如果我们绘制壳重的值与其贡献的比较,我们可以知道壳重的增长会导致贡献的增长。


图 5:贡献与壳重(决策树)


另一方面,去壳后的重量与贡献的关系是非线性非单调的。更低的去壳后的重量没有任何贡献,更高的去壳后的重量有负贡献,而在两者之间,贡献是正的。


图 6:贡献与去壳后的重量(决策树)


扩展成随机森林


通过将许多决策树组成森林并为一个变量取所有树的平均贡献,这个确定特征的贡献的过程可以自然地扩展成随机森林。


图 7:使用 violin 图对一个观察绘制的贡献图(随机森林)


因为随机森林固有的随机性,一个给定壳重值的贡献会有所不同。但是如下图平滑的黑色趋势线所示,这种增长的趋势仍然存在。就像在决策树上一样,我们可以看到壳重增大时,贡献会更高。


图 8:贡献与壳重(随机森林)


同样,我们也可能会看到复杂的不单调的趋势。直径的贡献似乎在大约 0.45 处有一处下降,而在大约 0.3 和 0.6 处各有一处峰值。除此之外,直径和环数之间的关系基本上是增长的。


图 9:贡献与直径(随机森林)


分类


我们已经看到回归树的特征分布源自环的平均值以及其在后续分割中的变化方式。我们可以通过检查每个子集中某个特定类别的观察的比例,从而将其扩展成二项分类或多项分类。一个特征的贡献就是该特征所导致的总的比例变化。


通过案例解释更容易理解。假设现在我们的目标是预测性别,即鲍鱼是雌性、雄性还是幼体。


图 10:多项分类的决策树路径


每个节点都有 3 个值——该子集中雌性、雄性和幼体各自的比例。一个脏器重量为 0.1 且壳重 0.1 的鲍鱼属于最左边的叶节点(概率为 0.082、0.171 和 0.747)。适用于回归树的贡献逻辑在这里也同样适用。


如果这个特定鲍鱼是幼体,那么脏器重量的贡献为:


(0.59 - 0.315) = 0.275


壳重的贡献为:


(0.747 - 0.59) = 0.157


我们可以为每个类别绘制一张贡献图。下面我们给出了针对幼体类别的贡献图。


图 11:使用 violin 图对一个幼体观察绘制的贡献图(多类决策树)


和之前一样,我们也可以为每一类绘制贡献与特征的图表。壳重对鲍鱼是雌性的贡献会随壳重的增长而增长,而对鲍鱼是幼体的贡献则会随壳重的增长而降低。对于雄性来说,壳重的贡献首先会增长,在壳重超过了 0.5 之后贡献又会下降。


图 12:每个类别的贡献与壳重(随机森林)


结语


在这篇文章中,我们表明可以通过查看路径来获得对决策树和随机森林的更加深入的理解。这对随机森林尤其有用,因为随机森林是一种非常并行的而且通常性能很高的机器学习模型。为了满足 Pivotal 客户的业务需求,我们不仅需要提供有很高预测能力的模型,也要提供可解释的模型。也就是说,不管效果如何,我们都不想给他们一个黑箱。当与政府和金融领域的客户做生意时,这就是一个很重要的要求,因为我们的模型需要通过合规性检查。


附 violin 图基础


violin 图是绘制数字数据的方法,它和箱线图十分相似,但其另外展示了分布的概率密度。下面我们先了解箱线图:

上图这一组数据表明:


  • 最小值等于 5

  • 最大值等于 10

  • 平均值为 8

  • 下四分位数为 7,即第一四分位数(Q1),等于该样本中所有数值由小到大排列后第 25% 的值。

  • 中位数为 8.5,即第二四分位数(Q2),等于该样本中所有数值由小到大排列后第 50% 的值。

  • 上四分位数为 9,即第三四分位数(Q3),等于该样本中所有数值由小到大排列后第 75% 的值。

  • 四分位距为 2(即ΔQ=Q3-Q1)。


上述是箱线图的基本参数,箱线图只显示诸如平均值/中值和四分位数范围的汇总统计数据,violin 图显示了数据的完整分布。



violin 图概括了箱线图所表达的统计量:


  • 上图白点代表中位数

  • 灰色的矩形代表 Q3 和 Q1 之间的四分位距

  • 灰线代表 95% 的置信区间


两边的灰色曲线代表核密度估计,其展示了数据的分布形状。其中两边间距较宽的曲线段代表样本总体取给定值有较高的概率,较窄的曲线段表明取给定值有较小的概率。


原文地址:http://engineering.pivotal.io/post/interpreting-decision-trees-and-random-forests/

来源:机器之心


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!

作者:浮雷来源:juejin.im/post/6871969929365553165「背景」因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本。规范在整个后端执行也有…

有了它,从此成为自带BGM的主角~

有了它 自带BGM不是事儿 这还是一篇卖货的文章 welcome 炎热的夏天,一场雷阵雨也浇灭不了的躁动,何不来点音乐啤酒,点燃内心的蠢蠢欲动, 放肆的音乐节奏,张扬的夏日心情。 然而单独用手机音乐播放器听,单薄…

oracle导入视图报错,exp/imp 报错处理(EXP-00003 / IMP-00019 / IMP-00058)

MOS 文章参考OERR: EXP 3 "no storage definition found for segment(%lu, %lu)" (文档 ID 21599.1)EXP-00003 When Exporting From 9.2.0.5.0 Or Any Higher Release With A Pre-9.2.0.5.0 Export Client (文档 ID 274076.1)一、EXP 导出报错(数据库版本 11.2.0.4.0…

重磅大礼!100本《机器学习》by周志华,免费送!

我 相 信 这 么 优秀 的 你 已 经 置 顶 了 我 亲爱的小伙伴们~ 我可想死你们啦! 福利小编再次上线 继续给大家送温暖~ 100本! 《机器学习》 by 周志华 内容简介 机器学习是计算机科学与人工智能的重要分支领域. 本书作为该领域的入门教材&a…

动态箭头gif图标_别以为只有专业人士才能做出酷炫的#动态跑分图#

如果经常关注数据可视化的话,你可能会发现一种流行的动态图表形式——动态跑分图(bar chart race)。这种动态图表的精髓是,通过数据范围的变化(通常是以日期为主),以条形图展现各数据序列间的关…

什么是云原生?

> 一千个读者眼里有一千个哈姆雷特,本号近半年零零散散写了一些云原生、Devops的文章, 最近系统阅读微软Docs, 今天开始结合自己的实践专题意译[云原生]。近几年,云原生成为了软件行业的驱动力。这是一种构建大型复杂系统的新…

宇宙十大不为人知的事情

仰望星空,才知人类如何渺小可怜,还需要继续思考很多年才知道,科学的尽头是神学。宇宙有你想象的到的所有东西,还有你想象不道的更多东西,就比如以下的宇宙十大真相。 一、宇宙空洞 除了黑洞,宇宙中另一种结…

idea shell 中的函数 跳转_SpringBoot项目打包+shell脚本部署实践,太有用了

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作;profiles指定不同环境的配置maven-assembly-plugin打发布压缩包分享shenniu_publish.sh程序启动工具linux上使用shenniu_publish.…

阅读源码的真正价值

大家好,我是Z哥。最近有位小伙伴求职遇到一些挫折,来找到我聊,其中有问到一个涉及到「阅读源码的必要性」的问题:“有很多场面试,面试官都有问到某个框架的某个功能是怎么实现的,难道真的要去看源码吗&…

vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观

Steinberg日前宣布最新的VST SDK(软件开发工具包)即将面市。最新的VST 3.7引入了多项SDK接口增强功能,使VST3宿主和插件之间的集成达到了新的水平,还包括新的VST3项目生成器、改进的文档以及对MIDI 2.0的支持,还可以开…

GitHub 2017 年度报告,最受欢迎的编程语言是?

GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言、开源项目等。今年的数据更是让人眼前一亮,Python 这匹编程语言中的黑马,势不可挡! 编程语言之间的战争就是一场持…

python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

1. Python和Java、PHP、C、C#、C等其他语言的对比?2. 简述解释型和编译型编程语言?3. 代码中要修改不可变数据会出现什么问题? 抛出什么异4. print 调用 Python 中底层的什么方法?5. 简述你对 input()函数的理解?6. Python解释器种类以及特点&#xf…

GraphQL:来来来,Union

Union就是把不相干的一些数据实体,合并起来,一起供外部查询。不用像webapi,完成查询不同的数据,需要多次请求。一次请求,获取多样数据,减少请求次数,这也是GraphQL的优势之一。怎么弄&#xff0…

每个程序员都应该知道的基础数论

这篇文章讨论了数论中每个程序员都应该知道的几个重要概念。本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是想要做为数论的一篇参考。如果读者想要获取关于数论的更多细节,文中也提供了一些外部的参考文献&…

powerbi视觉对象_玩转Power BI的图片可视化

​制作可视化报告时,为了展示效果,有时候需要用图片来展示,在 Power BI 中,关于图片的自定义视觉对象主要有下面三个,利用他们可以很轻松的进行图片可视化。下面来看看这些视觉对象的效果。样本数据如下:为…

东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析

各位读者大家好,今天给大家介绍的是南京重点大学—东南大学。小编一直从事高等教育领域的写作,感兴趣的读者可以关注一下小编~1.学校基础东南大学,简称“东大”,是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&am…

Goodbye 2020,Welcome 2021 | 沉淀 2021

引言2021年,已开启二月的篇章,农历新年也张灯结彩而来,只不过要留守过年。在这辞旧迎新之际,踏入而立之年之时,正是算账的好时候,数一数今年的成长,讲一讲来年的期望,最重要的还是要…

程序员必须知道的十大基础实用算法及其讲解

本文盘点程序员必须知道的十大基础实用算法及其讲解。 算法一:快速排序算法 快速排序是由东尼霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上&#…

sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间

概述开发数据库应用或者调试代码时,经常需要获取系统的当前日期和时间,今天主要看一下 PostgreSQL 中提供的相关函数。一、当前日期CURRENT_DATECURRENT_DATE 函数用于获取数据库服务器的当前日期:postgres# SELECT CURRENT_DATE;调用该函数时…

我们只知大势将至,却不知未来已来

❈ 凯文•凯利 《必然》: 未来的一切事物的生命都将是无穷尽的升级,而且迭代的速度不断的在加速。包括看得见的事物,也包括看不见的审美观和价值观。无论你使用一项工具的时间有多长,不断的升级都会把你变成一个菜鸟,从…