我有一个经过训练的DecisionTreeClassifier
实例,实际上我对底层决策树本身的谓词很感兴趣。所以我需要一个干净的方法来穿过这棵树。
因为获得可遍历表示的唯一官方方法是使用scikit的export_graphviz
函数导出到graphviz/dot文件。之后,我可以使用networkx和pydot的组合来解析和分析树的图形表示。
但是
digraph Tree {
node [shape=box] ;
0 [label="X[0] <= 15.0\ngini = 0.75\nsamples = 8\nvalue = [2, 2, 2, 2]"] ;
1 [label="X[1] <= 3.0\ngini = 0.5\nsamples = 4\nvalue = [2, 0, 2, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 2\nvalue = [0, 0, 2, 0]"] ;
1 -> 2 ;
3 [label="gini = 0.0\nsamples = 2\nvalue = [2, 0, 0, 0]"] ;
1 -> 3 ;
4 [label="X[1] <= 3.0\ngini = 0.5\nsamples = 4\nvalue = [0, 2, 0, 2]"] ;
0 -> 4 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
5 [label="gini = 0.0\nsamples = 2\nvalue = [0, 0, 0, 2]"] ;
4 -> 5 ;
6 [label="gini = 0.0\nsamples = 2\nvalue = [0, 2, 0, 0]"] ;
4 -> 6 ;
}
这看起来很好,但为什么只有连接到父节点的边正确地标记为布尔值?该图中的所有边是否都应附加适当的布尔标签/属性??
或者,如果有一些奇怪的图形化/点约定,帮助我区分随后的兄弟边缘,规则是什么?
我从scikit关于决策树分类器的文档中注意到,examplified rendered graphviz决策树实际上也缺少布尔标签。就我对决策树的理解而言,这遗漏了有关决策树的重要信息。再说一次,我在这里遗漏了什么惯例吗?例如,左边缘是否总是隐式为真?我怎样才能从点文件中分辨出来,因为它是垂直组织的?
在偶然发现了一个Scikit学习网站上的例子后,我意识到我不必解析导出的点文件就能得到一个Python树结构来表示我构建的决策树。显然,我可以使用tree_
属性的决策树分类器
实例,这是一个公开的属性,根据官方的API参考(一直在底部),它有一个关于如何使用这个tree_代码>对象在这里。
然而,这是相当令人困惑的——至少对我来说——显然这个树对象是作为DecisionTreeClassifier
API的一部分公开的,并且它有一个关于如何以特定方式使用它的文档化示例,但是没有关于它的底层类sklearn的正式发布文档。树_树树
。您只需查看源代码。
关于点文件,我现在非常确定它的唯一目的只是渲染决策树。在查看export_graphviz
的源代码后,我再次确认了这一结论,我注意到它确实是硬编码的,只传递连接到父级的边缘标签export_graphviz
正在使用DecisionTreeClassifier
的tree
属性。从这个属性的使用方式,我认为您可以安全地推断,它总是先写出“真”边,然后再写出任何节点的“假”边。IMHO这保证特征请求允许标记给定特定参数标志的所有边。