2015-01-07 78 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