Python、PyDot 和决策树
Posted
技术标签:
【中文标题】Python、PyDot 和决策树【英文标题】:Python, PyDot and DecisionTree 【发布时间】:2015-09-21 10:13:09 【问题描述】:我正在尝试可视化我的决策树,但出现错误 代码是:
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
谁能解释一下是什么问题?非常感谢!
【问题讨论】:
您是否向我们展示了所有代码?我没有看到回溯指出的 if 语句。除此之外,显然startswith() 方法需要一个字符串作为输入“string”或一个字符串元组(“st”、“st2”、“st3”)。您将错误的数据类型传递给了startswith() 方法调用。要么您没有正确使用 codecs.BOM_UTF8,要么您必须将其转换为字符串 --> str(codecs.BOM_UTF8) 【参考方案1】:如果使用 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 并且工作起来很有魅力
你也可以dot_data = tree.export_graphviz(clf, out_file=None)
【参考方案2】:
我遇到了同样的问题,只是花了几个小时试图解决这个问题。我不能保证我在这里分享的内容对其他人有用,但可能值得一试。
-
我尝试安装官方的
pydot
软件包,但我有 Python 3,但它们根本不起作用。在我浏览的众多网站之一的线程中找到一条注释后,我最终安装了this forked repository of pydot。
我去了graphviz.org 并在我的Windows 7 机器上安装了他们的软件。如果您没有 Windows,请查看您系统的下载部分。
安装成功后,在环境变量(Control Panel\All Control Panel Items\System\Advanced system settings
>点击Environment Variables
按钮>在System variables
下找到变量path
>点击Edit...
>我在@987654332的末尾添加了;C:\Program Files (x86)\Graphviz2.38\bin
@字段。
为了确认我现在可以在命令行(Windows 命令处理器)中使用dot
命令,我输入了dot -V
,它返回了dot - graphviz version 2.38.0 (20140413.2041)
。
在下面的代码中,请记住我正在从剪贴板中读取dataframe
。你可能正在从文件中读取它或你有什么。
在 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 文件。
【讨论】:
【参考方案3】:有问题的行是检查流/文件是否编码为 UTF-8
代替:
if data.startswith(codecs.BOM_UTF8):
使用:
if codecs.BOM_UTF8 in data:
你可能会取得更大的成功...
【讨论】:
应该注意这两行并不完全等同,如果数据需要以它开头,那么第二行可能不起作用。 他正在寻找字符串方法中的 unicode。不太可能工作。尽管它们可能不等价,但 BOM 通常位于文件的开头,并且不会在其他任何地方使用(除非您真的弄乱了文件)请参阅 en.wikipedia.org/wiki/Byte_order_mark 我想问题出在我的数据文件中,有人知道它应该是什么样子吗?我有一个 csv 文件,其中第一个字符串包含每列中的属性名称,进一步的字符串包含数字数据。所以我的 X 和 Y 是文件中的数字数据,我让他们在打开文件时制作“skiprows=1” @Polly 没有看到文件,我们都在猜测。如果您想要更有建设性的答案,您需要提供更多详细信息。我上面的回答可能会在特定背景下处理您的原始问题。以上是关于Python、PyDot 和决策树的主要内容,如果未能解决你的问题,请参考以下文章
在 Anaconda 环境中安装 pydot 和 graphviz 包