首页 文章

在scikit-learn中可视化决策树

提问于
浏览
27

我正在尝试使用Python中的scikit-learn设计一个简单的决策树(我在Windows操作系统上使用Anaconda的Ipython Notebook和Python 2.7.3),并将其可视化如下:

from pandas import read_csv, DataFrame
from sklearn import tree
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")

但是,我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'close'

我使用以下博客文章作为参考:Blogpost link

以下stackoverflow问题对我来说似乎也不起作用:Question

有人可以帮助我如何在scikit-learn中可视化决策树吗?

6 回答

  • 2

    sklearn.tree.export_graphviz不返回任何内容,因此默认返回 None .

    通过执行 dotfile = tree.export_graphviz(...) ,您将覆盖之前已分配给 dotfile 的打开文件对象,因此当您尝试关闭文件时会出现错误(因为它现在是 None ) .

    要修复它,请将代码更改为

    ...
    dotfile = open("D:/dtree2.dot", 'w')
    tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
    dotfile.close()
    ...
    
  • 20

    如果像我一样,你在安装graphviz时遇到问题,你可以通过它来显示树

    • export_graphviz 导出它,如前面的答案所示

    • 在文本编辑器中打开 .dot 文件

    • 复制一段代码并将其粘贴@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

  • 8

    对于那些使用 jupyter 和sklearn(18.2)的人来说,这是一个班轮你甚至不需要 matplotlib . 只有要求是graphviz

    pip install graphviz
    

    比运行(根据问题X的代码是pandas DataFrame)

    from graphviz import Source
    from sklearn import tree
    Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
    

    这将以SVG格式显示 . 上面的代码生成了Graphviz的Source对象(source_code - 不可怕),它将直接在jupyter中呈现 .

    你可能会做的一些事情

    在jupter中显示它:

    from IPython.display import SVG
    graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
    SVG(graph.pipe(format='svg'))
    

    保存为png:

    graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
    graph.format = 'png'
    graph.render('dtree_render',view=True)
    

    获取png图像,保存并查看:

    graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
    png_bytes = graph.pipe(format='png')
    with open('dtree_pipe.png','wb') as f:
        f.write(png_bytes)
    
    from IPython.display import Image
    Image(png_bytes)
    

    如果您打算使用该库,那么链接到examplesuserguide

  • 16

    或者,您可以尝试使用pydot从dot生成png文件:

    ...
    tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file
    
    import pydot
    dotfile = StringIO()
    tree.export_graphviz(dtreg, out_file=dotfile)
    pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
    ...
    
  • 0

    您可以复制export_graphviz文件的内容,并将其粘贴到webgraphviz.com站点中 .

    您可以查看有关如何visualize the decision tree in Python with graphviz的文章以获取更多信息 .

  • 17

    如果您遇到直接抓取源.dot的问题,您也可以像这样使用 Source.from_file

    from graphviz import Source
    from sklearn import tree
    tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
    Source.from_file('tree.dot')
    

相关问题