全面 :手把手教你决策树可视化(附链接&代码)

您所在的位置:网站首页 决策树分类模型 全面 :手把手教你决策树可视化(附链接&代码)

全面 :手把手教你决策树可视化(附链接&代码)

2024-07-10 08:06| 来源: 网络整理| 查看: 265

作者: Terence Parr, Prince Grover 翻译:王雨桐 校对:詹好

本文长度约为9500字,建议阅读10+分钟

本文分析了决策树可视化中的关键因素,比较了现有的可视化工具。并通过大量的示例介绍了一个决策树可视化工具的设计和实现过程。

目录

决策树概述

决策树可视化的关键因素

效果展示

与现有可视化的比较

我们的决策树可视化

可视化特征-目标空间

细节部分

用可视化树来解释单次观测

横向决策树

简化结构

前车之鉴

代码示例

回归树可视化----以波士顿房价为例

分类树可视化---以红酒为例

实践经验

Scikit决策树的影子树

工具箱

SVG生成的矢量图

经验总结

未来工作

在适用于结构化数据的机器学习模型中,梯度提升和随机森林可以称得上是明星级模型,而决策树则是这两者的基石。决策树的可视化工作对于了解这些模型的工作原理有极大的帮助。然而目前的可视化软件工具很基础,对新手并不友好。例如,我们无法利用现有的库展示每个节点是如何划分变量的。此外,当把一个新样本放到决策树中进行预测时,我们只能生成一张可供展示的结果图片,而很难运用现有工具将整个过程可视化。

 

因此我们创建了一个通用包来在scikit-learn上可视化决策树模型以及解释模型。并且我们将在马上出版的机器学习书籍《The Mechanics of Machine Learning》(由JeremyHoward编写)中大量使用该包。以下是一个简单的决策树可视化示例:

附书链接:

https://mlbook.explained.ai/

 

本文演示了这项工作的成果,详细介绍了我们为此所做的尝试,并概述了该工具的在使用过程中的基本框架和技术细节。该可视化软件是dtreeviz的一部分,它是一个新兴的Python机器学习库。本文不会过多阐述决策树的基本原理,但为了方便您熟悉相关的术语使用,我们会对此做一个简短的概述。

决策树概述

决策树是一种基于二叉树(最多有左右两个子树)的机器学习模型。决策树遍历训练数据并将信息浓缩为二叉树的内部节点和叶节点,从而学习训练集中的观测值之间的关系,这些观测值表示为特征向量x和目标值y。(注:向量为粗体,标量为斜体。)

 

决策树中的每个叶子都表示特定的预测结果。回归树中输出的预测是一个(连续的)值,例如价格;而分类树中输出的预测是(离散的)目标类别(在scikit中表示为整数),例如是否患有癌症。决策树将观测分为具有相似目标值的组,每个叶子代表其中一个分组。对于回归而言,叶节点中观测的相似性意味着目标值之间的差异很小;而对于分类而言,则意味着大多数或所有观测属于同一类别。

 

任何一个从树根到叶节点的路径都要经过一系列(内部)决策节点。在训练过程中选出特定的分割点后,每个决策节点将x中的单个要素的值(xi)与分割点值进行比较。例如,在预测房租的模型中,决策节点会比较特征,如卧室数量和浴室数量等。(请参阅第3章,新样本预测的可视化效果。)即使在具有目标值离散的分类模型中,决策节点仍会比较数值特征值,这是因为在scitkit中,假定决策树模型的所有特征都是数值类型,因此分类变量必须要经过独热编码、合并、标签编码等处理。

 

为了得到决策节点,模型将遍历训练集的子集(或根节点的完整训练集)。在训练过程中,根据相似性最大化的原则,决策树将根据选择节点的特征和该特征空间内的分割点,将观察结果放入左右两个桶中(子集)。(该选择过程通常要对特征和特征值进行详尽的比较)左子集中样本的xi特征值均小于分割点,而右子集中样本的xi均大于分割点。通过为左分支和右分支创建决策节点,递归地进行树的构造。当达到某个停止标准(例如,节点中包含的观测数少于5)时,决策树终止生长。

 

决策树可视化的关键因素

决策树可视化应该突出以下重要元素,我们将在下文中具体阐述。

 

决策节点的特征vs目标值分布(在本文中称为特征-目标空间)。我们想知道能否基于特征和分割点将观测进行分类。

决策节点的特征和特征分割点。我们需要知道每个决策节点所选择的待考察的特征变量,以及将观测分类的标准。

叶节点纯度,这会影响我们的预测置信度。较高的纯度也就意味着那些在回归问题中较低方差的叶节点,以及分类问题中包含绝大多数目标的叶节点,它们都意味着更可靠的预测效果。

 叶节点预测值。基于训练集的目标值,该叶节点具体的预测结果。

决策节点中的样本数。我们需要了解决策节点上大部分样本的归属。

叶节点中的样本数。我们的目标是让决策树的叶节点更少,数目更大和纯度更高。如果样本的节点下的样本数太少,则可能由过拟合现象。

新样本如何从根节点开始被分到特定的叶节点。这有助于解释为什么新样本得到了相应的预测。例如,在预测公寓租金价格的回归树中,由于决策节点检查了卧室的数量,而新样本的卧室数量大于3,因此预测价格偏高。

效果展示

在深入研究现有的可视化工具之前,想先介绍一下我们生成的效果图。本节重点介绍一些可视化的案例,这些是我们利用一些数据集构造的scikit回归和分类决策树。你还可以利用完整的库和代码复现所有案例。

附代码链接:

https://github.com/parrt/dtreeviz/blob/master/testing/gen_samples.py

与现有可视化工具的比较

如果搜索“可视化决策树”,很快便能找到由scikit提供的基于Python语言的解决方案:sklearn.tree.export_graphviz。此外还可以找到R甚至SAS和IBM的可视化工具。在本节中,我们收集了现有的各种决策树可视化效果,并将它们与我们使用dtreeviz库制作的决策树进行了比较。在下一部分中,我们将对可视化进行更详细的讨论。

 

让我们使用默认设置下的scitkit可视化工具,在大家都很熟悉的的Iris数据集上绘制一个可视化的决策树。

scikit树很好地表现了树的结构,但我们仍然发现了一些问题。首先颜色的运用不够直观,比如在为什么有些节点是彩色的而有些不是这一问题上:如果颜色代表该分类器的预测类别,那么我们可能会认为只有叶子才是彩色的,因为只有叶子才有预测。事实证明,没有颜色的节点预测能力较弱。

除此之外,基尼系数(确定性得分)会占用图中的空间,并且不利于解释。在每个节点中体现各目标类别的样本数很有用,但直方图可以提供更多信息。此外,利用有颜色的目标类别图例会很好。最后,将true和false用作边缘标签并不够清晰,³和 leaf4 [penwidth=0.3 color="#444443" label=] LSTAT3-> leaf5 [penwidth=0.3 color="#444443" label=] { rank=same; leaf4-> leaf5 [style=invis] }

我们通常在graphviz节点上使用HTML标签,而不仅仅是文本标签,因为它们能更好地控制文本显示,并将表格数据显示为实际表格。例如,当显示沿着树的测试向量时,使用HTML表显示测试向量:

为了从graphviz文件生成图像,我们使用graphvizpython软件包,该软件包最终是用程序例程之一(run())执行dot二进制可执行文件。有时,我们在dot命令上使用了略有不同的参数,因此我们可以更像这样更灵活地直接调用run():

cmd= ["dot", "-Tpng", "-o", filename, dotfilename] stdout,stderr = run(cmd, capture_output=True, check=True, quiet=False)

我们还将使用run()函数来执行pdf2svg(PDF转SVG)工具,如下一节所述。

 

SVG生成的矢量图

我们使用matplotlib生成决策和叶子节点,随后生成graphviz /dot图像和HTMLgraphviz标签,最终通过img标签引用生成的图像,如下所示:

 

94806数字是进程ID,它有利于独立运行同一台计算机的多个dtreeviz实例。否则,多个进程可能会覆盖相同的临时文件。

 

因为需要可缩放的矢量图形,我们先尝试着导入SVG图像,但无法通过graphviz插入这些文件(两者都不是pdf)。随后我们花了四个小时才发现生成和导入SVG是两件事,需要在OS X上使用--with-librsvg进行如下操作:

$brew install graphviz --with-librsvg --with-app --with-pango

最初,当我们想从matplotlib生成PNG文件时,我们将每英寸的点数(dpi)设置为450,这样它们在iMac这样高分辨率屏幕上能有不错的效果。不幸的是,这意味着我们必须使用标签的width和height参数和graphviz中的HTML表来设定整个树的大小。这会带来很多问题,因为我们必须了解matplotlib得到的宽高比。使用SVG文件后,我们不必再了解SVG 文件在HTML中的具体大小;在撰写此文档时,我们意识到没有必要了解SVG文件的具体尺寸。

 

然而graphviz的SVG结果仅引用了我们导入的节点文件,而没有将节点图像嵌入到整个树形图像中。这是一种很不方便的形式,因为当发送可视化树时,我们要发送文件的zip而不是单个文件。我们花了一些时间解析SVG  XML,并将所有引用的图像嵌入到单个大型meta-SVG文件中。有最终,得到了很好的效果。

 

然后我们注意到在生成SVG时,graphviz不能正确处理HTML标签中的文本。例如,分类树图例的文本会被切除并重叠。

 

为了获得独立SVG文件的工作,我们首先从graphviz生成PDF文件,然后使用pdf2svg将PDF转换为SVG(pdf2cairo也似乎起作用)。

 

我们注意到Jupyter notebook存在一个问题,它无法正确显示这些SVG文件(请参见上文)。Jupyterlab确实可以像github一样正确处理SVG。我们添加了一个topng()方法,这样Jupyter Notebook的用户就能使用Image(viz.topng())来获取嵌入式图像。还有一个跟好的方法,调用viz.view()将弹出一个窗口,也可以正确显示图像。

 

经验总结

有时解决编程问题与算法无关,而与编程语言的限制和功能有关,例如构建一个工具和库。决策树可视化软件也是这种类似的情况。编程并不难,我们是通过搭配适当的图形工具和库来得到最终的结果。

 

设计实际的可视化效果还需要进行无数次的实验和调整。生成高质量的矢量图还需要不断试错,对结果进行完善。

 

我们算不上可视化的狂热者,但是对于这个特定的问题,我们一直坚持了下来,才收获了理想的效果。在爱德华·塔夫特(Edward Tufte)的研讨会上,我了解到,只要不是随意的瞎搭配,我们就可以在人眼可以处理的限度下使用丰富的图表呈现大量的信息。

在这个项目中,我们使用了设计面板中的许多元素:颜色,线条粗细,线条样式,各种图,大小(区域,长度,图形高度,...),颜色透明度(alpha),文本样式(颜色,字体,粗体,斜体,大小),图形注释和视觉流程。所有视觉元素都发挥了相应的作用。例如,我们不能仅因为某一个颜色漂亮就使用它,而是要考虑到如何使用这个颜色来突出显示重要的维度(目标类别),因为人类能轻松且快速地发现颜色差异。节点大小的差异也应该很容易被人眼捕捉到,所以我们用节点的大小来表示叶子节点数据量的大小。

 

未来工作

本文档中描述的可视化内容是dtreeviz机器学习库的一部分,该库还处于起步阶段。我很快会将rfpimp库移至dtreeviz。到目前为止,我们只在OS X上测试过该工具。我们期待其他平台上的程序员提供更多执导,以便包括更丰富的安装步骤。

 

我们还在考虑几个细节的调整,例如使直方图和分类树底部对齐,会更利于比较节点。另外,某些三角形标签与轴标签重叠。最后,如果边缘宽度和子树中的样本量成比例就更好了(如SAS)。

原文标题:

How to visualize decision trees

原文链接:

https://explained.ai/decision-tree-viz/index.html

译者简介:王雨桐,UIUC统计学在读硕士,本科统计专业,目前专注于Coding技能的提升。理论到应用的转换中,敬畏数据,持续进化。

「完」

转自:数据派THU ;

版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。

更多相关知识请回复:“ 月光宝盒 ”;

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3