11

我正在尝试可视化我的决策树,但收到错误代码是:

X = [i[1:] for i in dataset]#attribute
y = [i[0] for i in dataset]
clf = tree.DecisionTreeClassifier()

dot_data = StringIO()
tree.export_graphviz(clf.fit(train_X, train_y), out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("tree.pdf")

错误是

Traceback (most recent call last):
if data.startswith(codecs.BOM_UTF8):
TypeError: startswith first arg must be str or a tuple of str, not bytes

谁能解释我有什么问题?十分感谢!

4

3 回答 3

11

如果使用 Python 3,只需使用pydotplus而不是pydot。它还将通过 pip 进行软安装过程。

import pydotplus

<your code>

dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")
于 2016-04-06T16:29:09.020 回答
5

我有同样的问题,只是花了几个小时试图解决这个问题。我不能保证我在这里分享的内容对其他人有用,但可能值得一试。

  1. 我尝试安装官方pydot软件包,但我有 Python 3,但它们根本不起作用。在从我浏览的众多网站之一的线程中找到一条注释后,我最终安装了这个分叉的 pydot 存储库
  2. 我去了graphviz.org并在我的 Windows 7 机器上安装了他们的软件。如果您没有 Windows,请查看您的系统的下载部分。
  3. 成功安装后,在环境变量(Control Panel\All Control Panel Items\System\Advanced system settings>单击Environment Variables按钮>下System variables我找到了变量path>单击Edit...>我添加;C:\Program Files (x86)\Graphviz2.38\bin到该Variable value:字段的末尾。
  4. 为了确认我现在可以dot在命令行(Windows 命令处理器)中使用命令,我输入dot -V了 which returned dot - graphviz version 2.38.0 (20140413.2041).

在下面的代码中,请记住我正在dataframe从剪贴板中读取 a。您可能正在从文件中读取它或你有什么。

IPython 笔记本中:

import pandas as pd
import numpy as np
from sklearn import tree
import pydot
from IPython.display import Image
from sklearn.externals.six import StringIO

df = pd.read_clipboard()
X = df[df.columns[:-1]]
y = df[df.columns[-1]]

dtr = tree.DecisionTreeRegressor(max_depth=3)
dtr.fit(X, y)

dot_data = StringIO()  
tree.export_graphviz(dtr, out_file=dot_data, feature_names=X.columns)  
graph = pydot.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png()) 

决策树可视化

或者,如果您不使用 IPython,只要您安装了 graphviz(上面的第 2 步),就可以从命令行生成自己的图像。使用我上面相同的示例代码,您在拟合模型后使用此行:

tree.export_graphviz(dtr.tree_, out_file='treepic.dot', feature_names=X.columns)

然后打开treepic.dot文件所在的命令提示符并输入以下命令行:

dot -T png treepic.dot -o treepic.png

应该使用您的决策树创建一个 .png 文件。

于 2015-12-11T08:51:52.983 回答
0

有问题的行是检查流/文件是否编码为 UTF-8

代替:

if data.startswith(codecs.BOM_UTF8):

采用:

if codecs.BOM_UTF8 in data:

你可能会获得更多的成功...

于 2015-07-03T14:48:51.870 回答