Python,PyDot和DecisionTree

时间:2015-07-03 14:20:35

标签: python decision-tree pydot

我试图想象我的DecisionTree,但得到了错误 代码是:

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

任何人都可以向我解释这个问题是什么吗?非常感谢你!

3 个答案:

答案 0 :(得分:9)

如果使用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 :(得分:5)

我遇到了同样的问题,只花了几个小时试图解决这个问题。我不能保证我在这里分享的内容会为其他人工作,但它可能值得一试。

  1. 我尝试安装官方pydot软件包,但我使用的是Python 3,但它们根本不起作用。在我浏览过的众多网站之一的帖子中找到一个笔记后,我最终安装了this forked repository of pydot
  2. 我去了graphviz.org并在我的Windows 7机器上安装了他们的软件。如果您没有Windows,请查看系统的“下载”部分。
  3. 成功安装后,在环境变量中{Control Panel\All Control Panel Items\System\Advanced system settings&gt;点击Environment Variables下的System variables按钮&gt;我发现变量path&gt;点击Edit... &gt;我在;C:\Program Files (x86)\Graphviz2.38\bin字段的末尾添加了Variable value:
  4. 要确认我现在可以在命令行(Windows命令处理器)中使用dot命令,我输入了返回dot -V的{​​{1}}。
  5. 在下面的代码中,请记住我正在从剪贴板中读取dot - graphviz version 2.38.0 (20140413.2041)。您可能正在从文件或whathaveyou中读取它。

    IPython Notebook

    dataframe

    Decision Tree Visualization

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

    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()) 
    

    然后打开tree.export_graphviz(dtr.tree_, out_file='treepic.dot', feature_names=X.columns) 文件所在的命令提示符并输入以下命令行:

    treepic.dot

    应使用决策树创建.png文件。

答案 2 :(得分:0)

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

而不是:

if data.startswith(codecs.BOM_UTF8):

使用:

if codecs.BOM_UTF8 in data:

你可能会取得更大的成功......