绘制决策树,graphvizm pydotplus

Posted

技术标签:

【中文标题】绘制决策树,graphvizm pydotplus【英文标题】:Plotting decision tree, graphvizm pydotplus 【发布时间】:2017-02-18 18:23:21 【问题描述】:

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

另外,下面我自己的答案解决了另一个问题

【问题讨论】:

【参考方案1】:

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

from sklearn.tree import plot_tree
plt.figure(figsize=(60,30))
plot_tree(clf, filled=True);

【讨论】:

【参考方案2】:

问题是您将参数out_file 设置为None

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

因此,请执行以下操作:

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

【讨论】:

好的,谢谢。你是对的,教程本身就是错误的!但我仍然遇到解析器错误。你能看看吗? Traceback(最近一次调用最后一次):文件“/Users/air/anaconda/lib/python2.7/site-packages/pydotplus/graphviz.py”,第 302 行,在 graph_from_dot_data 返回 parser.parse_dot_data(data) 文件“/Users /air/anaconda/lib/python2.7/site-packages/pydotplus/parser.py”,第 548 行,在 parse_dot_data 如果 data.startswith(codecs.BOM_UTF8): AttributeError: 'NoneType' object has no attribute 'startswith' 在你的导入中试试这个:from pydotplus import graphviz 然后做:'graph = graphviz.graph_from_dot_data(dot_data)' 它会抛出同样的错误:/ 当我查看 parser.py 时,我认为它与 UTF-8 解码有关。它询问是否 PY3 和...否则:if data.startswith(codecs.BOM_UTF8): data = data.decode('utf-8') graph_from_dot_data() 仍然对我不起作用。我不得不使用graph_from_dot_file() 而不是@Vadym Pasko 在下面建议【参考方案3】:

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

【讨论】:

【参考方案4】:

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

希望对你有帮助。

【讨论】:

【参考方案5】:

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

【讨论】:

哈哈,你能投票给你自己的答案吗?我不知道:D 哈哈,你不能投票,但我一定是不小心接受了它而不是你的:D 我会把它放回去。【参考方案6】:

即使在为out_file 指定了正确的路径之后,方法graph_from_dot_data() 也对我不起作用。

改为尝试使用graph_from_dot_file 方法:

graph = pydotplus.graphviz.graph_from_dot_file("iris.dot")

【讨论】:

我也尝试过,但也没有成功:/ 虽然这是一个好点!我对graphviz 有疑问

以上是关于绘制决策树,graphvizm pydotplus的主要内容,如果未能解决你的问题,请参考以下文章

决策树以及XGBoost如何画出 树分裂图?

决策树以及XGBoost如何画出 树分裂图?

如何从 gridsearchcv 绘制决策树?

Chapter3 绘制决策树

pydotplus使用

用python绘制决策树