7

我正在关注关于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'

----更新 2 -----

另外,请在下面查看我自己的答案,它解决了另一个问题

4

6 回答 6

7

问题是您将参数设置out_fileNone.

如果您查看文档,如果您将其设置为它,None它会直接返回string文件并且不会创建文件。当然 astring没有write方法。

因此,请执行以下操作:

dot_data = tree.export_graphviz(clf)
graph = pydotplus.graphviz.graph_from_dot_data(dot_data)
于 2016-10-10T12:02:41.177 回答
3

即使graph_from_dot_data()在为out_file.

而是尝试使用graph_from_dot_file方法:

graph = pydotplus.graphviz.graph_from_dot_file("iris.dot")
于 2016-10-22T12:15:18.613 回答
2

今天早上我遇到了同样的错误。我使用 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()

希望能帮助到你。

于 2017-07-13T15:14:02.157 回答
0

真正帮助我解决问题的是:-我从安装了 graphviz 的同一用户处执行了代码。所以从任何其他用户执行都会给你的错误

于 2018-02-06T13:33:35.557 回答
0

另一个问题是backend我的 Graphviz 的设置!在这里很好地解决了。您只需要查找该设置文件并更改后端,或者在mpl.use("TkAgg")注释中建议的代码中。在我只得到pydotplot无法找到我的Graphviz可执行文件的错误之后,因此我通过自制软件重新安装了 Graphviz:brew install graphviz它解决了这个问题,我现在可以制作绘图了!

于 2016-10-31T12:35:40.303 回答
0

我建议避免使用 graphviz 并使用以下替代方法

from sklearn.tree import plot_tree
plt.figure(figsize=(60,30))
plot_tree(clf, filled=True);
于 2021-03-19T16:29:01.793 回答