问题 是否可以在scikit-learn中打印决策树?


有没有办法在scikit-learn中打印经过训练的决策树?我想为我的论文训练一个决策树,我想把树的图片放在论文中。那可能吗?


3762
2017-08-12 21:53


起源



答案:


有一种方法可以导出为graph_viz格式: http://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html

所以从在线文档:

>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>>
>>> clf = tree.DecisionTreeClassifier()
>>> iris = load_iris()
>>>
>>> clf = clf.fit(iris.data, iris.target)
>>> tree.export_graphviz(clf,
...     out_file='tree.dot')    

然后你可以使用graph viz加载它,或者如果你安装了pydot,那么你可以更直接地执行此操作: http://scikit-learn.org/stable/modules/tree.html

>>> from sklearn.externals.six import StringIO  
>>> import pydot 
>>> dot_data = StringIO() 
>>> tree.export_graphviz(clf, out_file=dot_data) 
>>> graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
>>> graph.write_pdf("iris.pdf") 

会生成一个svg,无法在这里显示,所以你必须按照链接: http://scikit-learn.org/stable/_images/iris.svg

更新

自从我第一次回答这个问题后,行为似乎发生了变化,现在又回来了 list 因此你得到这个错误:

AttributeError: 'list' object has no attribute 'write_pdf'

首先,当你看到它时,打印对象并检查对象是值得的,并且很可能你想要的是第一个对象:

graph[0].write_pdf("iris.pdf")

感谢@NickBraunagel的评论


12
2017-08-13 07:04



我收到这个错误。 AttributeError: 'list' object has no attribute 'write_pdf' 我该如何解决这个问题? - Ernest Soo
@EdChum,你可以检查一下 stackoverflow.com/questions/48880557/...
@ErnestSoo(和任何其他人遇到你的错误: pydot.graph_from_dot_data() 返回所需的 graph (该 pydot.Dot 对象)但它在一个 list:所以,访问列表的第一个对象来访问 pydot.Dot 目的: graph[0].write_pdf("iris.pdf") - NickBraunagel
@NickBraunagel因为看起来很多人都会收到这个错误我会将其添加为更新,看起来这是行为的一些变化,因为我在3年前回答了这个问题,谢谢 - EdChum
除了测试数据,你会怎样做同样的事情? - mkheifetz


答案:


有一种方法可以导出为graph_viz格式: http://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html

所以从在线文档:

>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>>
>>> clf = tree.DecisionTreeClassifier()
>>> iris = load_iris()
>>>
>>> clf = clf.fit(iris.data, iris.target)
>>> tree.export_graphviz(clf,
...     out_file='tree.dot')    

然后你可以使用graph viz加载它,或者如果你安装了pydot,那么你可以更直接地执行此操作: http://scikit-learn.org/stable/modules/tree.html

>>> from sklearn.externals.six import StringIO  
>>> import pydot 
>>> dot_data = StringIO() 
>>> tree.export_graphviz(clf, out_file=dot_data) 
>>> graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
>>> graph.write_pdf("iris.pdf") 

会生成一个svg,无法在这里显示,所以你必须按照链接: http://scikit-learn.org/stable/_images/iris.svg

更新

自从我第一次回答这个问题后,行为似乎发生了变化,现在又回来了 list 因此你得到这个错误:

AttributeError: 'list' object has no attribute 'write_pdf'

首先,当你看到它时,打印对象并检查对象是值得的,并且很可能你想要的是第一个对象:

graph[0].write_pdf("iris.pdf")

感谢@NickBraunagel的评论


12
2017-08-13 07:04



我收到这个错误。 AttributeError: 'list' object has no attribute 'write_pdf' 我该如何解决这个问题? - Ernest Soo
@EdChum,你可以检查一下 stackoverflow.com/questions/48880557/...
@ErnestSoo(和任何其他人遇到你的错误: pydot.graph_from_dot_data() 返回所需的 graph (该 pydot.Dot 对象)但它在一个 list:所以,访问列表的第一个对象来访问 pydot.Dot 目的: graph[0].write_pdf("iris.pdf") - NickBraunagel
@NickBraunagel因为看起来很多人都会收到这个错误我会将其添加为更新,看起来这是行为的一些变化,因为我在3年前回答了这个问题,谢谢 - EdChum
除了测试数据,你会怎样做同样的事情? - mkheifetz


虽然我迟到了游戏,但以下全面的说明对于想要显示决策树输出的其他人来说非常有用:

安装必要的模块:

  1. 安装 graphviz。我使用了conda的安装包 这里 (推荐结束 pip install graphviz 如 pip 安装没有 包括实际的GraphViz 可执行文件
  2. 安装 pydot 通过点子(pip install pydot
  3. 将包含.exe文件(例如dot.exe)的graphviz文件夹目录添加到环境变量PATH
  4. 运行EdChum以上(注意: graph 是一个 list 含有 pydot.Dot 目的):

from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.externals.six import StringIO  
import pydot 

clf = tree.DecisionTreeClassifier()
iris = load_iris()
clf = clf.fit(iris.data, iris.target)

dot_data = StringIO() 
tree.export_graphviz(clf, out_file=dot_data) 
graph = pydot.graph_from_dot_data(dot_data.getvalue()) 

graph[0].write_pdf("iris.pdf")  # must access graph's first element

现在,您将在环境的默认目录中找到“iris.pdf”


0
2018-03-11 22:22