Python可视化决策树【Matplotlib/Graphviz】
决策树是一种流行的有监督学习方法。决策树的优势在于其既可以用于回归,也可以用于分类,不需要特征缩放,而且具有比较好的可解释性,容易将决策树可视化。可视化的决策树不仅是理解你的模型的好办法,也是向其他人介绍你的模型的运作机制的有利工具。因此掌握决策树可视化的方法对于数据分析工作者来说非常重要。
机器学习相关教程:TensorFlow实战 | 机器学习基础 | 深入浅出Flask | Python基础
在这个教程里,我们将学习以下内容:
- 如何使用scikit-learn训练一个决策树模型
- 如何使用Matplotlib将决策树可视化
- 如何使用Graphviz将决策树可视化
- 如何将随机森林或决策树包中的单个决策树可视化
教程的代码可以从这里下载。现在让我们开始吧。
1、用scikit-learn训练决策树模型
为了可视化决策树,我们首先需要用scikit-learn训练出一个决策树模型。
首先导入必要的Python库:
import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import pandas as pd import numpy as np from sklearn import tree
然后载入iris数据集。scikit-learn内置了Iris数据集,因此我们不需要从其他网站下载了。下面的Python代码载入Iris数据集:
import pandas as pd from sklearn.datasets import load_irisdata = load_iris() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target
Iris数据集看起来是这样:
接下来我们将Iris数据集拆分为训练集和测试集:
X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)
分割后的Iris数据集看起来是这样:
最后,我们采用scikit-learn经典的4步模式训练决策树模型:
# Step 1: Import the model you want to use # This was already imported earlier in the notebook so commenting out #from sklearn.tree import DecisionTreeClassifier # Step 2: Make an instance of the Model clf = DecisionTreeClassifier(max_depth = 2, random_state = 0) # Step 3: Train the model on the data clf.fit(X_train, Y_train) # Step 4: Predict labels of unseen (test) data # Not doing this step in the tutorial # clf.predict(X_test)
2、使用Matplotlib将决策树可视化
从scikit-learn 版本21.0开始,可以使用scikit-learn的tree.plot_tree
方法来利用matplotlib将决策树可视化,而不再需要依赖于难以安装的dot库。下面的Python代码展示了如何使用scikit-learn将决策树可视化:
tree.plot_tree(clf);
决策树可视化结果如下:
还可以添加一些额外的Python代码以便让绘制出的决策树具有更好的
可解读性,例如添加特征和分类名称:
fn=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'] cn=['setosa', 'versicolor', 'virginica'] fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=300) tree.plot_tree(clf, feature_names = fn, class_names=cn, filled = True); fig.savefig('imagename.png')
增加了更多信息的决策树可视化结果如下:
3、使用Graphviz将决策树可视化
下图是使用Graphviz得到的决策树可视化结果:
Graphviz是一个开源的图(Graph)可视化软件,采用抽象的图和网络来表示结构化的信息。在数据科学领域,Graphviz的一个用途就是实现决策树可视化。我将graphviz方法放在matplotlib方法之后,是因为这个软件用起来有点复杂。
为了将决策树可视化,首先需要创建一个dot文件来描述决策树,这个倒不难。问题在于使用Graphviz将dot文件转换为图形文件,例如png、jpg等等可能会有点难度。
有一些办法来降低graphviz的使用门槛,例如通过Anaconda安装python-graphviz、利用mac的homebrew安装grahpviz、利用官方提供的windows安装文件、或者使用在线转换器将决策树的dot文件转换为图形:
首先我们将决策树模型导出为dot文件:
tree.export_graphviz(clf, out_file="tree.dot", feature_names = fn, class_names=cn, filled = True)
然后我们用conda安装graphviz:
conda install python-graphviz
现在就可以将决策树模型导出的dot文件转换为图形文件了:
dot -Tpng tree.dot -o tree.png
4、将决策树包或随机森林里的单个决策树可视化
决策树的一个缺点是通常其预测精度不够好。这部分原因在于其变化幅度比较大,对训练数据的不同拆分方式可能会生成截然不同的决策树模型。
上图可以表示决策树包或者随机森林模型之类的组合学习方法,通过将多个机器学习算法组合起来以期获得更好的预测性能。在这一部分,我们学习如何将这些组合模型中的单个决策树可视化。
首先还是使用scikit-learn来训练得到一个随机森林模型:
# Load the Breast Cancer (Diagnostic) Dataset data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target # Arrange Data into Features Matrix and Target Vector X = df.loc[:, df.columns != 'target'] y = df.loc[:, 'target'].values # Split the data into training and testing sets X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0) # Random Forests in `scikit-learn` (with N = 100) rf = RandomForestClassifier(n_estimators=100, random_state=0) rf.fit(X_train, Y_train)
现在我们可以将模型中的单个决策树可视化。首先还是使用matplotlib。下面的python代码将第1个决策树可视化:
fn=data.feature_names cn=data.target_names fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=800) tree.plot_tree(rf.estimators_[0], feature_names = fn, class_names=cn, filled = True); fig.savefig('rf_individualtree.png')
得到的这个决策树可视化结果如下:
你可以试着使用matplotlib的subplot来将你期望的多个决策树可视化。例如下面的Python代码将组合模型中的前5个决策树可视化:
# This may not the best way to view each estimator as it is smallfn=data.feature_names cn=data.target_names fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (10,2), dpi=3000)for index in range(0, 5): tree.plot_tree(rf.estimators_[index], feature_names = fn, class_names=cn, filled = True, ax = axes[index]); axes[index].set_title('Estimator: ' + str(index), fontsize = 11)fig.savefig('rf_5trees.png')
不过我个人不喜欢这么做,因为这看起来太费眼睛了:
5、教程小结
在这个教程里,我们学习了如何使用matplotlib和graphviz将scikit-learn训练得到的决策树可视化,也学习了如何将组合模型中的一个或多个决策树可视化,希望这有助于你的数据分析工作。
原文链接:决策树可视化 — 汇智网
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
10个主流Python区块链项目【收藏贴】
Python不是主流的区块链底层平台开发语言,但是在DApp开发、区块链仿真与数据分析、智能合约安全分析等领域,Python依然是不错的选择。本文介绍了10个最流行的Python区块链项并提供了相应的源代码下载地址。 区块链开发教程链接:以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple 1、web3.py - 以太坊的Python开发接口 web3.py是访问以太坊区块链及相关生态的Python接口,可以视为web3.js的Python版本的实现,它需要Python 3.6+运行环境。 Python源码下载:https://github.com/ethereum/web3.py 在线教程:web3.py以太坊DApp开发详解 2、mythril - 以太坊智能合约安全分析工具 Mythril是以太坊虚拟机字节码的安全分析工具,它支持EVM兼容区块链的智能合约的安全分析,例如以太坊、hedera、quorum、vechain、roostock、tron等。 Python源码下载:https://g...
- 下一篇
mycat自动重启解决办法
前言 mycat是一个非常著名的分库分表中间件,但是很多使用过这个中间件的人都会遇到一个共通的问题,那就是mycat的进程总是会重启,同时重启的时候应用的代码里面也会报出 Java.lang.NullPoint_er_Exception ,今天就来分析一下这个问题,以及解决办法! 原理 这个mycat的重启问题可能一部分人遇到了,一部分人没有遇到过,这是为什么呢? 实际上这段mycat的bug代码是出现在了跨库结果集合并后,释放堆外内存的代码上面 有一部分有经验的人知道分库分表中间件是不太适用于跨库查询的,这些有经验的人会让业务代码去一个一个库查出数据库后,让业务代码自己去做数据合并,排序的逻辑,如果是这样的话就完美避开了这个问题。 比如我用mycat的注解 /*#mycat: datanode=dn1*/select * from ljj_table /*#mycat: datanode=dn2*/select * from ljj_table 这样就强行指定了datanode的节点,就算我sql里面没有分库字段也可以去这个库里面查出数据。然后在业务里面把sel...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6