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 和决策树的主要内容,如果未能解决你的问题,请参考以下文章

Pydot中决策树的字典对象

Python 决策树 GraphViz

在 Anaconda 环境中安装 pydot 和 graphviz 包

以 png 或 pdf 可视化 scikit-learn/sklearn 多输出决策树回归

Python数据挖掘决策树

决策树模型及案例(Python)