实用 | 分享一个决策树可视化工具

简介:

一、具体代码和步骤

可视化我们的决策树模型的第一步是把模型训练出来。下面这个例子是在鸢尾花数据上,采用随机森林的方法训练出来的包含多棵决策树的模型,我们对其中一棵决策树进行可视化


from sklearn.datasetsimport load_iris 
iris = load_iris()

# 导入随机森林模型 (此处也可换成决策树模型)
from sklearn.ensembleimport RandomForestClassifier
model =RandomForestClassifier(n_estimators=10)

# 训练
model.fit(iris.data,iris.target)

# 提取单棵决策树
tree =model.estimators_[5]

训练好我们的模型之后,我们就可以用sklearn自带的export_graphviz函数将决策树模型转换成Graphviz格式


from sklearn.treeimport export_graphviz

# 输出一个.dot格式的文件
export_graphviz(tree,out_file='tree.dot',
feature_names =iris.feature_names,
class_names =iris.target_names,
rounded = True, proportion =False,
precision = 2, filled = True)

参数含义:

precision 设置输出的纯度指标的数值精度

filled 指定是否为节点上色

max_depth 指定展示出来的树的深度,可以用来控制图像大小

需要下载Graphviz(一款图像可视化软件)来将 .dot文件转成 .png。下载地址见链接:https://graphviz.gitlab.io/download/

有两种方式使用Graphviz这个工具,一种是执行pip install graphviz,然后可以在pyhton调用,另一种是使用命令行,这里我们采用第二种,但是是在python里调用的外部命令行。


# 临时将Graphviz添加到环境变量中
import os
os.environ["PATH"]+= os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/

# 将tree.dot文件转化为tree.png
from subprocess importcall
call(['dot', '-Tpng','tree.dot', '-o', 'tree.png', '-Gdpi=600'])

# 在jupyter notebook中查看决策树图像
from IPython.displayimport Image
Image(filename ='tree.png')

e85d3545aac1e6b90f3f9b9303680795b4fc99da

上图就是我们将决策树可视化之后的结果,根据每个节点中的文字内容,我们就可以知道,这个节点包含的数据纯度大小(基尼指数或熵值)选用了哪个属性以及属性值对数据进行再划分,样本量多少,还可以根据节点颜色的深浅来推断类别,不同颜色代表不同类别,颜色深度越浅说明各个类别的混杂程度高,颜色越深说明纯度越高。上图中绿、紫、土黄三个颜色就表示了鸢尾花的三种类别。

通过这样的图,我们可以直观的展示随机森林中的每棵树,甚至推断每棵树形成背后的原因。

二、一个例子

这里我再举一个应用决策树可视化的例子。比如你想知道基于最小熵选择划分属性生成决策树这种方法不能产生一棵最小规模的决策树,即基于最大信息增益的原则去选择最优划分属性。这里我就用可视化决策树的方法来向大家说明这种方法是否可行。现在有下面这样一份数据:

19abbc7a9cba04ffc503fadfbb6c60c90d88b20f

其中a,b,c为三个属性,class为类别,分X,Y两种。在第一次对数据集进行划分时,根据

6a42ed662f79ac6ff3c03cfe35a47ca80693a306

计算属性的信息增益,得

Gain(D,c)=0.557,Gain(D,a)= Gain(D,b)= 0.2816

这里若基于熵最小方法首先应选择c作为划分属性,最后可得决策树可视化如下图。

0e36adf0e2ecbd7bf250e4bfc11c9b4a1fb4c12f

在这棵树中,a,b,c三个属性全部被用来进行划分,产生了三个分支节点。但如果我们采用属性a作为第一个划分属性,会得到一棵这样的决策树:

862428e5a8bd9e98054e153aa2e5f8e22b3171aa

由图可知,其实仅仅用到a,b两个属性即可将数据集完全划分为一颗叶子节点熵为0的完整决策树,这棵树只有两个分支节点,三个叶子结点,其规模显然小于上面的决策树。这个例子说明了基于最小熵的方法生成的决策树规模不一定就是最小的。它只能在局部范围内取得纯度最高的类别划分,是局部最优,从整个生成整棵决策树所有节点的过程来看,它并不能保证生成的节点数是最少的。

怎么样,上面这些例子中,决策树可视化是不是让一切看起来简单明了!

三、总结

现阶段机器学习模型仍然存在着黑盒问题,一张图片并不能彻底解决此问题。尽管如此,观察决策树图的过程还是向我们展示了这个模型并非一个不可解释的方法,而是一系列被提出的逻辑问题和答案,正如我们平时进行预测时所采用的步骤那样。所以,你可以直接复制上面的代码,尽情把这个工具用到你自己的数据集上,解决你的问题吧。


原文发布时间为:2018-09-3

本文作者:Revolver

本文来自云栖社区合作伙伴“磐创AI”,了解相关信息可以关注“磐创AI”。

相关文章
|
4月前
|
机器学习/深度学习 数据挖掘 Python
【数据挖掘】分类器模型性能评估讲解及iris数据集评估实战(超详细 附源码)
【数据挖掘】分类器模型性能评估讲解及iris数据集评估实战(超详细 附源码)
48 0
|
1天前
|
机器学习/深度学习 存储 数据可视化
数据分享|Python在Scikit-Learn可视化随机森林中的决策树分析房价数据
数据分享|Python在Scikit-Learn可视化随机森林中的决策树分析房价数据
27 12
|
2天前
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
27 2
|
7天前
|
机器学习/深度学习 监控 数据可视化
Scikit-learn与可视化:让机器学习结果更直观
【4月更文挑战第17天】本文探讨了如何使用Scikit-learn和可视化工具使机器学习结果更直观。Scikit-learn作为Python的开源机器学习库,结合Matplotlib、Seaborn等可视化库,便于数据探索、模型训练过程监控及结果展示。通过示例代码,展示了数据探索的pairplot、模型训练准确率曲线的绘制以及聚类结果的散点图,强调了可视化在提升模型理解度和应用普及性上的作用。随着可视化技术进步,机器学习将变得更直观易懂。
|
8天前
|
机器学习/深度学习 分布式计算 算法
R语言 RevoScaleR的大规模数据集决策树模型应用案例
R语言 RevoScaleR的大规模数据集决策树模型应用案例
17 0
|
8天前
|
算法 数据可视化
R语言ARIMA集成模型预测时间序列分析
R语言ARIMA集成模型预测时间序列分析
|
7天前
|
数据可视化 算法 数据挖掘
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集2
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
17 0
|
7天前
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集1
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
18 0
|
1月前
|
机器学习/深度学习 算法 Python
LightGBM高级教程:时间序列建模
LightGBM高级教程:时间序列建模【2月更文挑战第7天】
95 0
|
4月前
|
机器学习/深度学习 数据可视化 算法
Python利用线性回归、随机森林等对红酒数据进行分析与可视化实战(附源码和数据集 超详细)
Python利用线性回归、随机森林等对红酒数据进行分析与可视化实战(附源码和数据集 超详细)
35 0