web-dev-qa-db-ja.com

決定ツリーのプロット、graphvizm pydotplus

scikit ドキュメンテーションの意思決定ツリーのチュートリアルに従っています。私はpydotplus 2.0.2を持っていますが、writeメソッドがないことを示しています-以下のエラー。今しばらく苦労していますが、何かアイデアはありませんか?どうもありがとう!

from sklearn import tree
from sklearn.datasets import load_iris

iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

from IPython.display import Image

dot_data = tree.export_graphviz(clf, out_file=None)
import pydotplus

graph = pydotplus.graphviz.graph_from_dot_data(dot_data)

Image(graph.create_png())

そして私のエラーは

    /Users/air/anaconda/bin/python /Users/air/PycharmProjects/kiwi/hemr.py
Traceback (most recent call last):
  File "/Users/air/PycharmProjects/kiwi/hemr.py", line 10, in <module>
    dot_data = tree.export_graphviz(clf, out_file=None)
  File "/Users/air/anaconda/lib/python2.7/site-packages/sklearn/tree/export.py", line 375, in export_graphviz
    out_file.write('digraph Tree {\n')
AttributeError: 'NoneType' object has no attribute 'write'

Process finished with exit code 1

-----更新-----

out_fileで修正を使用すると、別のエラーがスローされます。

 Traceback (most recent call last):
  File "/Users/air/PycharmProjects/kiwi/hemr.py", line 13, in <module>
    graph = pydotplus.graphviz.graph_from_dot_data(dot_data)
  File "/Users/air/anaconda/lib/python2.7/site-packages/pydotplus/graphviz.py", line 302, in graph_from_dot_data
    return parser.parse_dot_data(data)
  File "/Users/air/anaconda/lib/python2.7/site-packages/pydotplus/parser.py", line 548, in parse_dot_data
    if data.startswith(codecs.BOM_UTF8):
AttributeError: 'NoneType' object has no attribute 'startswith'

----UPDATE 2-----

また、別の問題を解決する以下の私の独自の答え

7
Jan Sila

問題は、パラメータout_fileNoneに設定していることです。

documentation を見ると、Noneに設定すると、stringファイルが直接返され、ファイルは作成されません。そしてもちろん、stringにはwriteメソッドがありません。

したがって、次のようにします。

dot_data = tree.export_graphviz(clf)
graph = pydotplus.graphviz.graph_from_dot_data(dot_data)
7
MMF

メソッドgraph_from_dot_data()は、out_fileに適切なパスを指定した後でも機能しませんでした。

代わりにgraph_from_dot_fileメソッドを使用してみてください:

graph = pydotplus.graphviz.graph_from_dot_file("iris.dot")
2
Vadym Pasko

今朝も同じエラーに出会った。私はpython 3.xを使用していますが、これが問題を解決する方法です。

from sklearn import tree
from sklearn.datasets import load_iris
from IPython.display import Image
import io

iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

# Let's give dot_data some space so it will not feel nervous any more
dot_data = io.StringIO()
tree.export_graphviz(clf, out_file=dot_data)
import pydotplus

graph = pydotplus.graphviz.graph_from_dot_data(dot_data.getvalue())
# make sure you have graphviz installed and set in path
Image(graph.create_png())

python 2.xを使用する場合、 "import io"を次のように変更する必要があると思います。

import StringIO

そして、

dot_data = StringIO.StringIO()

それが役に立てば幸い。

1
zongyan

また、別の問題は、Graphvizのbackend設定でした。それはうまく解決されます here 。コメントで提案されているように、その設定ファイルを検索してバックエンドを変更するか、コードmpl.use("TkAgg")で変更するだけです。 pydotplotGraphviz実行可能ファイルを見つけられなかったというエラーが発生した後、自作のGraphvizを再インストールしました:brew install graphviz問題を解決し、私は今プロットを作ることができます!!

0
Jan Sila

問題の解決に本当に役立ったのは、次のとおりです。-graphvizがインストールされたのと同じユーザーからコードを実行しました。したがって、他のユーザーから実行するとエラーが発生します

0
K.S.