提问者:小点点

为什么在导出的决策树中只标记父节点的边


我有一个经过训练的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决策树实际上也缺少布尔标签。就我对决策树的理解而言,这遗漏了有关决策树的重要信息。再说一次,我在这里遗漏了什么惯例吗?例如,左边缘是否总是隐式为真?我怎样才能从点文件中分辨出来,因为它是垂直组织的?


共1个答案

匿名用户

在偶然发现了一个Scikit学习网站上的例子后,我意识到我不必解析导出的点文件就能得到一个Python树结构来表示我构建的决策树。显然,我可以使用tree_属性的决策树分类器实例,这是一个公开的属性,根据官方的API参考(一直在底部),它有一个关于如何使用这个tree_对象在这里。

然而,这是相当令人困惑的——至少对我来说——显然这个树对象是作为DecisionTreeClassifierAPI的一部分公开的,并且它有一个关于如何以特定方式使用它的文档化示例,但是没有关于它的底层类sklearn的正式发布文档。树_树树。您只需查看源代码。

关于点文件,我现在非常确定它的唯一目的只是渲染决策树。在查看export_graphviz的源代码后,我再次确认了这一结论,我注意到它确实是硬编码的,只传递连接到父级的边缘标签export_graphviz正在使用DecisionTreeClassifiertree属性。从这个属性的使用方式,我认为您可以安全地推断,它总是先写出“真”边,然后再写出任何节点的“假”边。IMHO这保证特征请求允许标记给定特定参数标志的所有边。