废话不多说,先贴代码

from sklearn.datasets import load_iris
iris = load_iris()
# Model (can also use single decision tree)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)
# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]
from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator, out_file='tree.dot',
feature_names = iris.feature_names,
class_names = iris.target_names,
rounded = True, proportion = False,
precision = 2, filled = True)
# Convert to png using system command (requires Graphviz)
from subprocess import call
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')

代码最终将决策树的结构输出为一张.png格式的图片,如下所示:


代码说明:

1. 训练一个模型并提取:我们可以只用单个决策树的模型,但是我通常会选择使用随机森林模型。(随机森林中的每一颗树都会略有不同。)

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)
# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]

2. 将树保存至 .dot文件:在这里我们使用到了Scikit-Learn中的export_graphviz函数。我们可以通过这个函数中的许多参数来调节图片的样式以及要显示的内容。

from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator_limited,
out_file='tree.dot',
feature_names = iris.feature_names,
class_names = iris.target_names,
rounded = True, proportion = False,
precision = 2, filled = True)

3. 将 .dot文件转换为 .png文件:使用这一功能,我们需要先安装支持 .dot运作的graphviz。完整的介绍请查看graphviz的介绍文档。(公众号文章不能置入超链接,请大家自行百度)# Convert to png

from subprocess import call

call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])

4. 可视化:使用Jupyter Notebook可以查看到最好的可视化效果。(你也可以使用matplotlib来显示图片)# Display in jupyter notebook

from IPython.display import Image

Image(filename = 'tree.png')

可视化随机森林的问题

在使用随机森林模型时,每一棵树的构造都是不同的。我使用这些图片来理解某一棵决策树的构造成因,而不是去理解具体的细节。当你有很多的特征时,将树的深度设置在一个相对较小的值是很有帮助的。否则的话,你将会构建出非常庞大的树,虽然这种树看起来很像回事,但是是完全无法解读的。(因为树的结构太过于复杂,分支过多,需要考虑的可能性也过多,同时也会造成过拟合的问题,当然这里作者主要关注的是可解读性的问题,译者注。)

结语

机器学习至今为止仍旧摆脱不了“黑匣子问题(black-box problem)”的困扰,可视化一棵树并没有办法解决这个黑匣子问题。然而,了解一棵树的结构可以让我们清楚这个模型并不是一个完全无法解释的模型。事实上,这个模型是一个有序列的逻辑的提问与回答——就像我们自己在做判断时一样。在你的模型中试试我在这篇文章中的代码吧。

想成为一名合格的数据科学家/AI工程师吗?关注“机器学习学社”获取每天一份的新鲜咨询,为你开拓属于你自己的AI之路