Python, PyDot和DecisionTree

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

有人可以解释一下问题吗?非常感谢!


你展示了所有的代码吗?我没有看到traceback指出的if语句。除此之外,显然startswith()方法期望输入一个字符串"string"或者一个字符串元组("st", "st2", "st3")。你传递了错误的数据类型到startswith()方法调用中。你要么没有正确使用codecs.BOM_UTF8,要么你必须将它转换为字符串--> str(codecs.BOM_UTF8)。 - reticentroot
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")

这是最好的建议 - 谢谢 +1。我在Jupyter上使用了Image(graph.create_png()),而不是将其写入PDF文件,效果非常好。 - user-asterix
您也可以使用dot_data = tree.export_graphviz(clf, out_file=None) - mgcdanny

5

我曾经遇到过同样的问题,花了几个小时才解决。我不能保证以下内容适用于其他人,但可以一试。

  1. 我尝试安装官方的pydot软件包,但我使用的是Python 3,它们根本不起作用。在搜索了许多网站后,在一个帖子中找到了一条注释,最终我安装了这个pydot的分支存储库
  2. 我去graphviz.org并在我的Windows 7机器上安装了他们的软件。如果您没有Windows,请在其下载部分查找您的系统。
  3. 成功安装后,在环境变量(控制面板\所有控制面板项\系统\高级系统设置 > 点击环境变量按钮 > 在系统变量下找到变量path > 点击编辑... > 我在变量值:字段的末尾添加了;C:\Program Files (x86)\Graphviz2.38\bin
  4. 为了确认我现在可以在命令行(Windows命令处理器)中使用dot命令,我键入了dot -V,它返回了dot - graphviz version 2.38.0 (20140413.2041)

在下面的代码中,请记住我从剪贴板中读取一个dataframe。您可能正在从文件或其他方式中读取它。

IPython Notebook中:

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 格式创建你的决策树文件。

0

这行代码的作用是检查流/文件是否以UTF-8编码

而不是:

if data.startswith(codecs.BOM_UTF8):

使用:

if codecs.BOM_UTF8 in data:

你可能会更成功...


需要注意的是,这两行代码并不完全等价,如果数据需要以它开头,则第二行代码可能无法正常工作。 - Rick
他正在寻找一个字符串中的Unicode方法。不太可能奏效。虽然它们可能不等价,但BOM通常位于文件开头,除非您真的搞砸了文件,否则不会在其他任何地方使用。请参见https://en.wikipedia.org/wiki/Byte_order_mark。 - Sina Khelil
我猜问题出在我的数据文件上,有人知道应该长什么样吗?我有一个csv文件,其中第一个字符串包含每列属性的名称,后面的字符串包含数字数据。因此,我的X和Y是来自文件的数字数据,在打开文件时使用“skiprows = 1”获取它们。 - Polly
@Polly 如果没有看到文件,我们都只能猜测。如果您想要更有建设性的答案,您需要提供更多细节。我上面的回答可能会解决您最初的问题,但是在特定的上下文中。 - Sina Khelil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接