Rav*_*avi 30 python visualization decision-tree scikit-learn
我正在尝试使用Python中的scikit-learn设计一个简单的决策树(我在Windows操作系统上使用Anaconda的Ipython Notebook和Python 2.7.3),并将其可视化如下:
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")
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
AttributeError: 'NoneType' object has no attribute 'close'
Run Code Online (Sandbox Code Playgroud)
我使用以下博客文章作为参考:Blogpost链接
以下stackoverflow问题对我来说似乎也不起作用:问题
有人可以帮助我如何在scikit-learn中可视化决策树吗?
Ffi*_*ydd 27
sklearn.tree.export_graphviz不返回任何内容,因此默认返回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()
...
Run Code Online (Sandbox Code Playgroud)
sin*_*ger 26
对于那些使用jupyter和sklearn(18.2+)的人来说,这是一个班轮你甚至不需要matplotlib.只有要求是graphviz
pip install graphviz
Run Code Online (Sandbox Code Playgroud)
比运行(根据问题X的代码是pandas DataFrame)
from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
Run Code Online (Sandbox Code Playgroud)
这将以SVG格式显示.上面的代码生成Graphviz的Source对象(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'))
Run Code Online (Sandbox Code Playgroud)
保存为png:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)
Run Code Online (Sandbox Code Playgroud)
获取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)
Run Code Online (Sandbox Code Playgroud)
如果您打算使用该lib,则可以使用示例链接和userguide
小智 20
如果像我一样,你在安装graphviz时遇到问题,你可以通过它来显示树
export_graphviz如前面的答案所示,将其导出.dot在文本编辑器中打开文件或者,您可以尝试使用pydot从dot生成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")
...
Run Code Online (Sandbox Code Playgroud)
以下也可以正常工作:
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')
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到来源
小智 8
Scikit learn 最近引入了plot_tree使这变得非常简单的方法(0.21 版(2019 年 5 月)中的新功能)。文档在这里。
这是您需要的最少代码:
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()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
如果要将图片保存到文件,请在前面添加以下行plt.show():
plt.savefig('filename.png')
Run Code Online (Sandbox Code Playgroud)
如果你想在文本格式查看的规则,有一个答案在这里。读起来更直观。
小智 5
我复制并更改您的代码的一部分,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
在确定你有 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)
Run Code Online (Sandbox Code Playgroud)
我尝试使用我的数据,可视化效果很好,我立即看到了一个 pdf 文件。
| 归档时间: |
|
| 查看次数: |
84211 次 |
| 最近记录: |