2015-01-07 80 views
14

我尝试使用Python中scikit学习(我用的蟒蛇的IPython的笔记本电脑与Windows操作系统的Python 2.7.3)设计一个简单的决策树和可视化,如下所示:可视化决策树scikit学习

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' 

我用下面的博客文章作为参考:Blogpost link

以下计算器q uestion似乎并不适用于我:Question

有人可以帮助我如何在scikit-learn中可视化决策树吗?

+0

是否创建文件'dtree2.dot'? –

+0

你可以调试'export_graphviz'行,因为这是返回'None'所以发生了一些错误 – EdChum

+0

是的。 dtree2.dot确实已创建。 – Ravi

回答

10

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() 
... 
+0

这确实消除了错误,但下面的命令不会产生图: 系统(“dot -Tpng D:/dtree2.dot -o D:/dtree2.png”)。但是,dtree2.dot文件被创建。 – Ravi

+0

我不知道使用graphviz抱歉。如果你提出一个新问题,最好是完全不同的问题。 – Ffisegydd

8

或者,你可以尝试使用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") 
... 
15

如果像我一样,你有安装问题graphviz,您可以通过

  1. 将其导出为export_graphviz,如前面的答案中所示
  2. 打开.dot文件在文本编辑器
  3. 复制一段代码,并将其粘贴@webgraphviz.com
+1

这非常方便谢谢! – joshi123

7

这里是一个使用jupyter和sklearn(18.2+)的班轮,您甚至不需要matplotlib。唯一的要求是graphviz

pip install graphviz 

比运行(根据所讨论X代码是熊猫数据帧)

from graphviz import Source 
from sklearn import tree 
Source(tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns)) 

这将在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')) 

保存为PNG:

​​

获取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) 

如果你打算使用这个库,这里是链接examplesuserguide