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

      最后更新:2020-03-25 12:42:56 手机定位技术交流文章

      作者:特伦斯·帕尔,格罗佛王子

      翻译:王雨桐

      校对:占豪

      这篇文章大约有9500字长。建议阅读

      10分钟以上。本文分析了决策树可视化的关键因素,并对现有的可视化工具进行了比较。通过大量实例介绍了决策树可视化工具的设计和实现过程。

      目录

      决策树概述决策树可视化效果显示的关键因素与现有可视化的比较我们的决策树可视化的可视化特征-目标空间的细节部分使用可视化树来解释单个观察水平决策树的简单结构;回归树可视化的例子-波士顿房价作为分类树可视化的例子-红酒作为实践经验的例子-科学工具包决策树阴影树工具箱SVG生成矢量图经验总结未来工作

      在适用于结构化数据的机器学习模型中,梯度提升和随机森林可以称为星级模型,而决策树是二者的基石决策树的可视化有助于理解这些模型的工作原理。然而,目前的可视化软件工具非常基础,对初学者不友好。例如,我们不能使用现有的库来显示每个节点如何划分变量。此外,当一个新的样本被放入决策树进行预测时,我们只能生成一个可以显示的结果图片,很难用现有的工具将整个过程可视化。

      因此,我们创建了一个通用包来可视化scikit-learn上的决策树模型和解释模型我们将在即将出版的机器学习书籍《机器学习的机制》(JeremyHoward)中广泛使用这个软件包。下面是一个简单的决策树可视化示例:

      ,带有书籍链接:

      https://mlbook.explained.ai/

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

      决策树概述

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

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

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

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

      决策树可视化的关键因素

      决策树可视化应该突出以下重要元素,这将在下面详细描述256个以上决策节点的特征与目标值分布(此处称为特征-目标空间)我们想知道观察值是否可以基于特征和分割点进行分类。决策节点的特征和特征分割点我们需要知道由每个决策节点选择的要研究的特征变量和用于分类观察的标准。叶节点纯度,这将影响我们的预测信心更高的纯度也意味着那些在回归问题中具有较低方差的叶节点和那些在分类问题中具有最多目标的叶节点都意味着更可靠的预测结果。叶节点预测值基于训练集的目标值,叶节点的具体预测结果决策节点中的样本数我们需要知道决策节点上大多数样本的属性。叶节点中的样本数我们的目标是使决策树具有更少的叶节点,更大的数量和更高的纯度。如果样本节点下的样本数量太少,可能是由于过度拟合造成的新样本如何从根节点开始划分到特定的叶节点这有助于解释为什么会相应地预测新样本。例如,在预测公寓租赁价格的回归树中,预测价格更高,因为决策节点检查卧室数量,并且新样本中的卧室数量大于3。

      效果显示

      在进一步研究现有的可视化工具之前,我想介绍一下我们已经生成的效果图。本节重点介绍一些可视化案例,即我们使用一些数据集构建的scikit回归和分类决策树。您还可以使用完整的库和代码来复制所有案例。带代码链接的

      :

      https://github.com/parrt/dtreeviz/blob/master/testing/gen _ samples . py

      11此外,还可以找到R甚至SAS和IBM的可视化工具。在这一节中,我们收集了各种现有决策树的可视化效果,并将其与我们使用dtreeviz库制作的决策树进行了比较。在下一节中,我们将更详细地讨论可视化。

      允许我们在默认设置下使用scitkit可视化工具在每个人都熟悉的Iris数据集上绘制一个可视化决策树。

      SCICKIT树很好地显示了树的结构,但是我们仍然发现一些问题首先,颜色的应用不够直观,例如,为什么有些节点是彩色的,而其他节点不是:如果颜色代表分类器的预测类别,那么我们可能认为只有树叶是彩色的,因为只有树叶有预测事实证明,没有颜色的节点预测能力很弱。除了

      之外,基尼系数(确定性得分)占据了图中的空间,不利于解释。反映每个节点中每个目标类别的样本数量很有用,但是直方图可以提供更多信息。此外,最好使用目标类别的彩色图例最后,使用真和假作为边缘标签不够清楚,而且<看起来更清楚最显著的区别是我们的决策节点使用堆叠直方图来显示特征分布,并且每个目标类别将以不同的颜色显示。同样,我们叶子的大小与叶子中样本的数量成正比。

      复习回归案例下图显示了在波士顿数据集上使用scikit的可视化效果。我们将其与dtreeviz版本进行比较。

      同样,在scikit tree中,我们不能直观地理解颜色的使用,但是经过进一步的研究,我们发现较暗的颜色图像代表较高的预测目标值如前所述,在我们的解决方案中,可以在决策节点下显示要素的空间分布。例如,在这种情况下,使用特征-目标值的散点图,并且目标值的分布总是显示在叶节点的带状图中,其中具有更密集点的叶节点意味着在叶节点下有更多样本。

      同样,让我们在下面的R语言下检查一下可视化决策树的软件包。这个软件包的结果类似于scikit,但是边缘标签的效果更好:

      SAS和IBM也提供(都不支持Python语言)决策树可视化。我们发现SAS的决策节点包括与样本目标值相关的条形图和节点的其他详细信息:

      。在这种情况下,有一个好主意,即子树中的样本大小由边宽来反映然而,由于缺少横轴,这些条形图的解释并不令人满意。测试类别变量的决策节点(如上)每个类别只有一个条,因此它们只能表示简单的类别计数,而不能表示特征分布对于数字特征(如下),SAS决策节点显示目标值或特征值的直方图(我们无法将它们与图像区分开来)SAS节点的条形图/直方图似乎只解释了目标值,而没有告诉我们关于特征分割的信息

      下方的SAS树似乎突出了新样本的预测过程,但我们无法从其他工具和库中找到任何其他样本,而且这些函数似乎并不常见。

      查看IBM软件它在海量数据集中显示了很好的可视化效果,甚至结合IBM的沃森分析以条形图的形式显示了决策节点类别的个数:

      。让我们看看在IBM早期的SPSS产品中决策树的可视化效果:

      。可以看出,在SPSS中,这些决策节点提供了与样本目标类别计数相同的SAS条形图。上面提到的所有可视化

      都提供了很好的结果,但是最能启发我们的案例是“机器学习可视化导论”它以动画的形式向我们展示了一个决策树可视化案例,如下所示:

      带链接:

      R2D3。美国/视觉-机器学习入门-第1部分/(译者注:非常经典的可视化。建议查看原始网站动态地图)

      除了动画元素外,可视化还具有前面提到的三个独特特征:

      决策节点显示了特征空间如何划分决策节点的划分点。叶节点的大小与叶中样本的数量成正比(即,三角形的指示器)。199虽然这个案例是基于硬编码技术的可视化动态地图,是为教学目的开发的,但它为我们指明了正确的方向

      我们的决策树可视化

      除了机器学习可视化导论中的动画,我们找不到另一个案例可以更好地解释如何在决策节点(特征目标空间)分割特征值这正是决策树模型训练过程中操作的关键点,也是初学者应该注意的点,因此我们借鉴这一方案,通过检查分类树和回归树的决策节点开始可视化工作。

      视觉特征-目标空间

      相同。我们从训练数据中得知,决策节点选择特征xi并在xi值范围(特征空间)中对其进行分割,将具有相似目标值的样本分成两个子树之一准确地说,在训练过程中需要检查特征和目标值之间的关系因此,除非我们的可视化工作在决策节点上显示特征-目标空间,否则读者很难直观地理解根据可视化图像获得预测结果的整个过程和原因。为了突出真实决策节点如何划分特征空间,我们给出了单个特征的回归树和分类树本案例使用波士顿房价数据中的单一特征(年龄)来训练回归决策树为了便于讨论,下图添加了节点ID:

      和用于生成渲染的代码:

      https://github.com/parrt/dtreeviz/blob/master/testing/paper示例。py

      水平虚线表示决策节点中左子树和右子树的目标平均值。垂直虚线表示要素空间中的分割点底部的黑色三角形突出显示分割点,并标记精确的分割值。叶节点用虚线表示目标预测(此处使用平均值)

      如图所示,为了便于决策节点的比较,AGE特征轴都控制在相同的取值范围内,没有方法进行取值集中的区域。因此,靠近决策部分的样本的年龄值被限制在一个狭窄的区域例如,

      进一步将节点0中的特征空间划分为节点1和8的特征空间;节点1的特征空间被进一步分成节点2和5中所示的特征空间当然,我们可以看到这种决策树模型的预测效果不是很好,因为为了显示方便,我们只训练了一个单一变量的模型,但是这个简单的例子向我们展示了如何可视化决策树划分特征空间的过程。

      虽然分类决策树和回归决策树的实现基本相同,但是它们的解释方法却有很大的不同,所以两种情况的视觉效果是不同的。对于回归模型,最好使用要素和目标的散点图来显示要素-目标空间然而,对于分类模型,目标是离散的类别而不是连续的数字,所以我们选择使用直方图来可视化特征目标空间下图是根据用户知识数据训练的分类树。类似地,我们仅使用单一特征(PEG)进行训练,并且还标记节点id:

      。在这种情况下,直方图显示聚乙二醇特征的空间分布,而颜色显示特征和目标类别之间的关系例如,在节点0中,我们可以看到目标类别非常低的样本聚集在PEG特征空间的左端,而目标类别高的样本聚集在右端与回归树一样,左子树的特征空间与父节点上直方图分割点左侧的特征空间相同。右子树也是如此。

      例如,可以通过组合节点9和12的直方图来获得节点8的直方图。我们将聚乙二醇决策节点的水平轴限制在相同的范围内,因此下面直方图中的范围更窄,这也意味着分类更纯。

      为了更清楚地显示不同类型的特征空间,我们使用堆叠直方图值得注意的是,y轴上堆栈直方图的高度是所有类别中样本的总数多个类别的计数相互叠加

      当类别超过四个或五个时,堆叠直方图的可读性非常低,因此我们建议在这种情况下将直方图类型参数设置为非堆叠直方图。在基数较高的目标类别下,重叠分布更难可视化且存在问题,因此我们设置了10个目标类别的限制由10种数字数据集(使用非堆栈直方图)组成的相对较浅的决策树示例如下:

      细节

      在前面的讨论中,我们省略了一些最明显的视觉细节,这里我们将分析一些关键元素

      在分类树的可视化中,我们使用节点大小来表示每个节点包含的样本数量随着节点中样本数量的减少和叶节点直径的减小,直方图将按比例减小。

      对于给定的特征,特征空间(横轴)总是具有相同的宽度和相同的范围,这更有利于比较不同节点的特征目标空间。直方图的所有条都具有相同的宽度(以像素为单位)为了避免混淆,我们只在水平轴和垂直轴上标记了最小值和最大值。

      虽然饼图一般不适合在决策树的可视化过程中呈现,但我们仍然选择用它来体现叶节点的分类。我们可以通过观察地图上是否有明显的主色来判断分类结果的纯度。饼图最大的缺点是它不能反映元素之间的具体关系。我们只能根据主色来确定该节点的预测结果。

      对于回归树,为了方便比较节点,我们将所有决策节点的目标(垂直)轴限制在相同的高度和范围内。对于给定要素,回归要素空间(水平轴)的宽度和范围始终相同。将所有散点图的透明度设置为较低的级别,以便较高的目标值密度对应于较暗的颜色。

      回归叶节点在垂直方向上显示相同范围的目标空间与盒图相比,我们选择了带图,因为带图可以更好地表示分布,并且隐含地表示点的样本数。(我们还用单词标记了叶节点的样本数。))对于叶节点的预测值,我们选择了带状图的质心(均值)分布,同时用虚线突出显示。

      此外,还有许多其他细节可以提高可视化图表的效果:

      包含分类类别的图例所有的颜色都是从一个对色盲相对友好的调色板中选择的,并且每个2到10个目标类别都与一个调色板绑定在一起。我们在文本中用灰色代替黑色,这更有利于人眼。图中的线条是细线。我们在带状图和饼图中突出显示了它的轮廓。新样本预测的可视化效果

      通过理解决策节点特征空间的划分过程,我们可以直观地看到决策树是如何获得具体的预测结果的现在让我们看看如何可视化预测新样本的过程。这里的关键是将从根节点到叶节点的决策可视化

      个节点内的决策非常简单:如果测试向量x中的特征xi小于分割点,则将其分类为左子树,否则将其分类为右子树为了突出决策过程,我们必须注重比较操作。对于沿叶预测变量节点路径的决策节点,我们在水平特征空间的xi位置显示一个橙色三角形

      如果橙色三角形在黑色三角形的左侧,则沿着左侧路径,否则沿着右侧路径预测过程中涉及的决策节点被虚线框包围,带有粗橙色边缘以下是两个测试向量的示例树:

      具有特征名称和值的测试向量X出现在叶预测变量节点下方(或水平决策树的右端)测试向量突出显示一个或多个决策节点中使用的特征当特征数量达到阈值20(左右方向为10)时,测试向量将不显示未使用的特征,以避免不必要的测试向量

      水平决策树

      与垂直决策树相比,一些用户更喜欢水平图像,有时从左到右可以更好地反映树的性质。在预测过程中,样本特征向量也可以从左向右延伸。以下是一些示例:

      简化结构

      为了从更宏观的角度评估决策树,我们可以看到分类过程的概述这意味着比较树的形状和大小等等,但更重要的是查看叶节点。我们想知道每个叶节点中有多少样本,分类有多纯,以及大多数样本落在哪里。

      当可视化文件太大时,很难获得概览,所以我们提供了一个“非花哨”的选项。该选项可以生成较小的可视化文件,同时保留关键叶信息下面的例子分别是非花式模式的回归树和分类树:

      经验教训

      那些有兴趣从设计角度观察这些树的人可能会发现阅读我们尝试过和拒绝过的东西很有趣。当设计分类树时,我们期望核密度估计给出比块状直方图更精确的图像。我们已经完成了以下案例:

      。问题是在只有一个或两个样本的决策节点中,所获得的分布是非常误导的:

      。我们还尝试使用气泡图而不是直方图作为分类器决策节点:

      这些视觉图看起来很酷,但相比之下,直方图更容易阅读。

      关于回归树,我们考虑用方框图显示预测值的分布,也考虑用简单的条形图显示样本号:

      。与目前使用的条形图相比,每片叶子的双图表并不令人满意。方框图不能像条形图一样显示目标值的分布。在带状图之前,我们仅使用样本索引值作为水平轴来表示目标值:

      。这是一种误导,因为横轴通常是要素空间我们把它压缩成带状图。

      代码示例

      本节提供波士顿回归数据集和红酒分类数据集的可视化示例您还可以查看样本可视化的完整库以及生成样本的代码。

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

      下面是一个代码示例。用于加载波士顿数据和训练回归树,最大深度为3:

      波士顿=加载_波士顿()x _ train =波士顿。数据火车=波士顿。target testx = x _ train

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

      这是一个代码案例。用于加载风数据和训练分类树,最大深度为3:

      clf = tree,决策树分类器(max _ depth = 3)wind = load _ wind()clf . fit(wind . data,wind.target)

      分类模型可视化与回归模型相同。然而,目标类名是必需的:

      viz = dtreeviz (clf,wind.data,wind.target,target _ name =' wind ',feature _ names = wind . feature _ names,Class _ names = list (wine。target _ names))即视图()

      在Jupyter笔记本中,从dtreeviz()返回的对象具有_repr_svg_()函数,Jupyter使用该函数自动显示对象请参考示例笔记本

      带链接:

      截至2018年9月,jupyter笔记本

      中的小问题。Jupyter笔记本无法正常显示该库生成的SVG,字体将变得混乱:

      好消息是github和JupyterLab可以正确显示图像

      使用巨峰笔记本中的图像(即topng()),视觉效果差;如果直接调用viz.view(),将弹出一个窗口,适当地显示结果。

      实践经验

      我们在这个项目中遇到了许多问题,例如编程错误、参数设置、错误解决和各种库的错误/限制,以及如何更好地集成现有工具。唯一有趣的部分是对视觉设计的无数尝试。我希望这个可视化对机器学习社区有很大的帮助,这也是我们坚持完成项目的动力。结合stackoverflow、文档和繁琐的图形编程,我们在大约两个月内完成了这个项目。

      最后,我们使用matplotlib生成决策和叶节点的图像,并使用传统的graphviz将它们组合成一棵树我们还在graphviz树的描述中广泛使用了用于布局和字体规范的HTML标签。但是我们遇到的最大问题是将所有组件组合成高质量的矢量图形。

      我们首先创建了一个影子树,其中包括由scikit创建的决策树。我们开始吧

      Scikit决策树

      scikit-learn分类树和回归决策树的影子树是为了提高效率而建立的,树的扩展或节点信息的提取不是重点。我们已经创建了dtreeviz.shadow.ShadowDecTree和dtreeviz . shadow . ShadowDecTree node类,以便于使用所有树信息(传统的二叉树)以下方法用于通过scikit分类树或回归树模型创建阴影树:

      shadow _ tree = shadow dectree(树模型、x _ train、y _ train、要素名称、类名)

      阴影树/节点类有许多方法,这些方法也可用于需要遍历scikit决策树的其他库中例如,预测()不仅可以使用树来预测新样本,还可以返回被访问节点的路径与任何特定节点相关联的样本可以通过node_samples()获得

      工具箱

      如果您能掌握所有技能,Graphviz和dot语言有助于设计合理的树布局,例如如何在子树重叠时隐藏图像的重叠边缘。如果两个叶节点leaf4和leaf5显示在同一层,我们可以使用graphviz,如下所示:

      LSTAT3->;为了从graphviz文件生成图像,我们使用graphvizpython软件包,该软件包最终使用一个程序例程(run())来执行点二进制可执行文件有时,我们在点命令中使用稍微不同的参数,所以我们可以更灵活和直接地调用RUN(),如下所示:

      CMD =

      王雨桐。加州大学统计学院正在攻读硕士学位,主修本科统计学。目前,我们专注于提高编码技能。在从理论到应用的转变中,对数据的敬畏和不断的进化

      -End-

      关注清华-青岛数据科学研究院官方微信公众平台“THU数据学校”和姐妹号“THU数据学校”获得更多讲座收益和优质内容

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/2793.html

          热门文章

          文章分类