Scikit learn 为什么只有父节点';在导出的决策树中标记的s边
我有一个经过训练的Scikit learn 为什么只有父节点';在导出的决策树中标记的s边,scikit-learn,graphviz,decision-tree,dot,Scikit Learn,Graphviz,Decision Tree,Dot,我有一个经过训练的DecisionTreeClassifier实例,我实际上对底层决策树本身的谓词感兴趣。因此我需要一种干净的方法来遍历这棵树 因为获得可遍历表示的唯一官方方法是使用scikit的export_graphviz函数导出到graphviz/dot文件。之后,我可以使用networkx和pydot的组合来解析和分析树的图形表示 但是 我的特定点文件的内容如下: digraph Tree { node [shape=box] ; 0 [label="X[0] <= 15.0\
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 ;
}
有向图树{
节点[shape=box];
0[label=“X[0]在意外地在scikit学习网站上遇到一个示例后,我意识到我不必解析导出的点文件来获取Python树结构来表示我构建的决策树。显然,我可以使用DecisionTreeClassifier
实例的树
属性,它是一个公开的属性但是根据(一直在底部),它有一个关于如何使用这个树的文档化示例
然而,至少对我来说,这是相当令人困惑的,显然这个树对象是作为DecisionTreeClassifier
API的一部分公开的,它有一个关于如何以特定方式使用它的文档化示例,但是没有正式发布的底层类sklearn.tree.\u tree
的文档查看源代码
关于点文件,我现在非常确定它的唯一目的只是呈现决策树。在研究了我注意到它确实是硬编码的位置后,这一结论得到了重申,即它只传递连接到父级的边标签。export\u graphviz
正在使用tree
属性根据该属性的使用方式,我认为您可以安全地推断,它总是先写出“真”边,然后再写出任何节点的“假”边。我认为这是否保证功能请求允许在给定特定参数标志的情况下标记所有边。我可以建议您删除graphviz
和dot
标签?graphviz
只做它被告知的事情,并且只要源代码不包含边缘标签,它就不会显示任何东西,正如人们所期望的那样。但是为什么我要删除更多标签呢?标签包含我的树的实际相关元数据。如果有,我会nt更多标签,而不是更少:)添加或删除,关键是如果你的代码生成应用程序不适合你,你将不得不手动操作。graphviz
遵循它得到的说明,你的问题在以前的水平上。啊,好的。我现在明白你的意思了。但我只对dot文件感兴趣,因为我认为它是唯一的关闭点获取(n,尽管已序列化)的icial方法我的树的表示。我不在乎最终用graphviz渲染我的树。我现在知道有一种不同的python方法可以从DecisionTreeClassifier中获得结构。是的,如果我真的想,我现在可以自己将这些额外的布尔标签添加到点文件中。你有没有找到解决方案?所以我基本上是这样的lly遵循了上面例举的想法。也展示了我想做的事情的各种方式。但当我第一次偶然发现那篇文章时,我认为解决方案是黑客攻击的。但显然,这就是scikit暴露其树对象内部的方式。