在 scikit-learn 中可视化决策树
Visualizing decision tree in scikit-learn
我正在尝试在 Python 中使用 scikit-learn 设计一个简单的决策树(我在 Windows 上使用 Anaconda 的 Ipython Notebook 和 Python 2.7.3 OS) 并将其可视化如下:
from pandas import read_csv, DataFrame
from sklearn import tree
from os import system
data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)
dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")
但是,我收到以下错误:
AttributeError: 'NoneType' object has no attribute 'close'
我参考以下博客post:Blogpost link
以下 Whosebug 问题似乎对我也不起作用:Question
有人可以帮助我了解如何在 scikit-learn 中可视化决策树吗?
sklearn.tree.export_graphviz
没有 return 任何东西,因此默认情况下 returns None
.
通过执行 dotfile = tree.export_graphviz(...)
,您将覆盖之前已分配给 dotfile
的打开文件对象,因此当您尝试关闭文件时会收到错误消息(因为它现在是 None
).
要修复它,请将您的代码更改为
...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
或者,您可以尝试使用 pydot 从点生成 png 文件:
...
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file
import pydot
dotfile = StringIO()
tree.export_graphviz(dtreg, out_file=dotfile)
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
...
如果你像我一样在安装 graphviz 时遇到问题,你可以通过
可视化树
- 使用
export_graphviz
导出它,如之前的答案所示
- 在文本编辑器中打开
.dot
文件
- 复制这段代码并粘贴@webgraphviz.com
您可以复制 export_graphviz 文件的内容并将其粘贴到 webgraphviz.com 站点。
您可以查看关于如何 visualize the decision tree in Python with graphviz 的文章了解更多信息。
这是为那些正在使用 jupyter 和 sklearn(18.2+) 的人准备的一套工具,你甚至不需要 matplotlib
。唯一的要求是 graphviz
pip install graphviz
比运行(根据问题代码 X 是一个 pandas DataFrame)
from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
这将以 SVG 格式显示。上面的代码生成了 Graphviz 的 Source object (source_code - 并不可怕)这将直接在 jupyter 中呈现。
您可能会用它做的一些事情
以jupter显示:
from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))
另存为 png:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)
获取png图片,保存并查看:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
png_bytes = graph.pipe(format='png')
with open('dtree_pipe.png','wb') as f:
f.write(png_bytes)
from IPython.display import Image
Image(png_bytes)
的链接
如果您 运行 遇到直接获取源 .dot 的问题,您也可以像这样使用 Source.from_file
:
from graphviz import Source
from sklearn import tree
tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
Source.from_file('tree.dot')
我复制并修改了你的部分代码如下:
from pandas import read_csv, DataFrame
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from os import system
data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)
确保你有 dtree 后,这意味着上面的代码运行良好,你添加下面的代码来可视化决策树:
记得先安装graphviz:pip install graphviz
import graphviz
from graphviz import Source
dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns)
graph = graphviz.Source(dot_data)
graph.render("name of file",view = True)
我尝试了我的数据,可视化效果很好,我立即看到了一个 pdf 文件。
以下也可以正常工作:
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')
你可以找到来源here
创建的简单方法here with pydotplus(必须安装graphviz):
from IPython.display import Image
from sklearn import tree
import pydotplus # installing pyparsing maybe needed
...
dot_data = tree.export_graphviz(best_model, out_file=None, feature_names = X.columns)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
Scikit learn 最近引入了 plot_tree
方法来使这变得非常简单(0.21 版(2019 年 5 月)中的新增功能)。文档 here。
这是您需要的最少代码:
from sklearn import tree
plt.figure(figsize=(40,20)) # customize according to the size of your tree
_ = tree.plot_tree(your_model_name, feature_names = X.columns)
plt.show()
plot_tree
支持一些参数来美化树。例如:
from sklearn import tree
plt.figure(figsize=(40,20))
_ = tree.plot_tree(your_model_name, feature_names = X.columns,
filled=True, fontsize=6, rounded = True)
plt.show()
如果要将图片保存到文件中,在plt.show()
前添加下面一行:
plt.savefig('filename.png')
如果您想查看文本格式的规则,这里有答案here。阅读起来更直观。
这是仅需 3 行代码即可获得漂亮图表的最少代码:
from sklearn import tree
import pydotplus
dot_data=tree.export_graphviz(dt,filled=True,rounded=True)
graph=pydotplus.graph_from_dot_data(dot_data)
graph.write_png('tree.png')
plt.imshow(plt.imread('tree.png'))
我刚刚添加了 plt.imgshow
以在 Jupyter Notebook 中查看图表。如果你只对保存png文件感兴趣,可以忽略它。
我安装了以下依赖项:
pip3 install graphviz
pip3 install pydotplus
对于 MacO,Graphviz 的 pip 版本不起作用。按照 Graphviz 的 official documentation,我用 brew 安装了它,一切正常。
brew install graphviz
我正在尝试在 Python 中使用 scikit-learn 设计一个简单的决策树(我在 Windows 上使用 Anaconda 的 Ipython Notebook 和 Python 2.7.3 OS) 并将其可视化如下:
from pandas import read_csv, DataFrame
from sklearn import tree
from os import system
data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)
dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")
但是,我收到以下错误:
AttributeError: 'NoneType' object has no attribute 'close'
我参考以下博客post:Blogpost link
以下 Whosebug 问题似乎对我也不起作用:Question
有人可以帮助我了解如何在 scikit-learn 中可视化决策树吗?
sklearn.tree.export_graphviz
没有 return 任何东西,因此默认情况下 returns None
.
通过执行 dotfile = tree.export_graphviz(...)
,您将覆盖之前已分配给 dotfile
的打开文件对象,因此当您尝试关闭文件时会收到错误消息(因为它现在是 None
).
要修复它,请将您的代码更改为
...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
或者,您可以尝试使用 pydot 从点生成 png 文件:
...
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file
import pydot
dotfile = StringIO()
tree.export_graphviz(dtreg, out_file=dotfile)
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
...
如果你像我一样在安装 graphviz 时遇到问题,你可以通过
可视化树- 使用
export_graphviz
导出它,如之前的答案所示 - 在文本编辑器中打开
.dot
文件 - 复制这段代码并粘贴@webgraphviz.com
您可以复制 export_graphviz 文件的内容并将其粘贴到 webgraphviz.com 站点。
您可以查看关于如何 visualize the decision tree in Python with graphviz 的文章了解更多信息。
这是为那些正在使用 jupyter 和 sklearn(18.2+) 的人准备的一套工具,你甚至不需要 matplotlib
。唯一的要求是 graphviz
pip install graphviz
比运行(根据问题代码 X 是一个 pandas DataFrame)
from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
这将以 SVG 格式显示。上面的代码生成了 Graphviz 的 Source object (source_code - 并不可怕)这将直接在 jupyter 中呈现。
您可能会用它做的一些事情
以jupter显示:
from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))
另存为 png:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)
获取png图片,保存并查看:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
png_bytes = graph.pipe(format='png')
with open('dtree_pipe.png','wb') as f:
f.write(png_bytes)
from IPython.display import Image
Image(png_bytes)
的链接
如果您 运行 遇到直接获取源 .dot 的问题,您也可以像这样使用 Source.from_file
:
from graphviz import Source
from sklearn import tree
tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
Source.from_file('tree.dot')
我复制并修改了你的部分代码如下:
from pandas import read_csv, DataFrame
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from os import system
data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)
确保你有 dtree 后,这意味着上面的代码运行良好,你添加下面的代码来可视化决策树:
记得先安装graphviz:pip install graphviz
import graphviz
from graphviz import Source
dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns)
graph = graphviz.Source(dot_data)
graph.render("name of file",view = True)
我尝试了我的数据,可视化效果很好,我立即看到了一个 pdf 文件。
以下也可以正常工作:
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')
你可以找到来源here
创建的简单方法here with pydotplus(必须安装graphviz):
from IPython.display import Image
from sklearn import tree
import pydotplus # installing pyparsing maybe needed
...
dot_data = tree.export_graphviz(best_model, out_file=None, feature_names = X.columns)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
Scikit learn 最近引入了 plot_tree
方法来使这变得非常简单(0.21 版(2019 年 5 月)中的新增功能)。文档 here。
这是您需要的最少代码:
from sklearn import tree
plt.figure(figsize=(40,20)) # customize according to the size of your tree
_ = tree.plot_tree(your_model_name, feature_names = X.columns)
plt.show()
plot_tree
支持一些参数来美化树。例如:
from sklearn import tree
plt.figure(figsize=(40,20))
_ = tree.plot_tree(your_model_name, feature_names = X.columns,
filled=True, fontsize=6, rounded = True)
plt.show()
如果要将图片保存到文件中,在plt.show()
前添加下面一行:
plt.savefig('filename.png')
如果您想查看文本格式的规则,这里有答案here。阅读起来更直观。
这是仅需 3 行代码即可获得漂亮图表的最少代码:
from sklearn import tree
import pydotplus
dot_data=tree.export_graphviz(dt,filled=True,rounded=True)
graph=pydotplus.graph_from_dot_data(dot_data)
graph.write_png('tree.png')
plt.imshow(plt.imread('tree.png'))
我刚刚添加了 plt.imgshow
以在 Jupyter Notebook 中查看图表。如果你只对保存png文件感兴趣,可以忽略它。
我安装了以下依赖项:
pip3 install graphviz
pip3 install pydotplus
对于 MacO,Graphviz 的 pip 版本不起作用。按照 Graphviz 的 official documentation,我用 brew 安装了它,一切正常。
brew install graphviz