我正在尝试可视化我的 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

任何人都可以解释我有什么问题吗?万分感谢!

最佳答案

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

  • 我尝试安装官方的 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...>我添加;C:\Program Files (x86)\Graphviz2.38\binVariable value:字段结束。
  • 为了确认我现在可以在命令行(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())
    

    Python、PyDot 和决策树-LMLPHP

    或者,如果您不使用 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 文件。

    关于Python、PyDot 和决策树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31209016/

    10-15 12:49