如何阅读graphviz决策树?
Posted
技术标签:
【中文标题】如何阅读graphviz决策树?【英文标题】:How to read a graphviz decision tree? 【发布时间】:2018-07-05 03:44:54 【问题描述】:我有一个使用 ScikitLearn 的 export_graphviz 函数获得的决策树 graphviz 文件。为了简单起见,我将深度限制为 3,所以我得到了这个输出:
digraph Tree
node [shape=box] ;
0 [label="userAcceleration-magnitude-mean <= 0.973\ngini = 0.875\nsamples = 3878\nvalue = [471, 467, 485, 484, 486, 486, 513, 486]\nclass = Walking"] ;
1 [label="userAcceleration-x-IQR <= 0.073\ngini = 0.834\nsamples = 2881\nvalue = [471, 443, 476, 484, 9, 486, 512, 0]\nclass = Walking"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="rotationRate-z-IQR <= 0.396\ngini = 0.606\nsamples = 1020\nvalue = [466, 80, 43, 2, 0, 429, 0, 0]\nclass = Push-ups"] ;
1 -> 2 ;
3 [label="gini = 0.355\nsamples = 515\nvalue = [5, 74, 28, 2, 0, 406, 0, 0]\nclass = Resting"] ;
2 -> 3 ;
4 [label="gini = 0.164\nsamples = 505\nvalue = [461, 6, 15, 0, 0, 23, 0, 0]\nclass = Push-ups"] ;
2 -> 4 ;
5 [label="rotationRate-magnitude-median <= 0.844\ngini = 0.764\nsamples = 1861\nvalue = [5, 363, 433, 482, 9, 57, 512, 0]\nclass = Walking"] ;
1 -> 5 ;
6 [label="gini = 0.596\nsamples = 974\nvalue = [2, 73, 388, 476, 0, 23, 12, 0]\nclass = Lunges"] ;
5 -> 6 ;
7 [label="gini = 0.571\nsamples = 887\nvalue = [3, 290, 45, 6, 9, 34, 500, 0]\nclass = Walking"] ;
5 -> 7 ;
8 [label="userAcceleration-y-max <= 2.702\ngini = 0.533\nsamples = 997\nvalue = [0, 24, 9, 0, 477, 0, 1, 486]\nclass = Running"] ;
0 -> 8 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
9 [label="rotationRate-z-IQR <= 2.4\ngini = 0.236\nsamples = 536\nvalue = [0, 22, 6, 0, 466, 0, 1, 41]\nclass = Jump Rope"] ;
8 -> 9 ;
10 [label="gini = 0.553\nsamples = 53\nvalue = [0, 11, 6, 0, 3, 0, 0, 33]\nclass = Running"] ;
9 -> 10 ;
11 [label="gini = 0.08\nsamples = 483\nvalue = [0, 11, 0, 0, 463, 0, 1, 8]\nclass = Jump Rope"] ;
9 -> 11 ;
12 [label="altitude-median <= 5.0\ngini = 0.068\nsamples = 461\nvalue = [0, 2, 3, 0, 11, 0, 0, 445]\nclass = Running"] ;
8 -> 12 ;
13 [label="gini = 0.0\nsamples = 445\nvalue = [0, 0, 0, 0, 0, 0, 0, 445]\nclass = Running"] ;
12 -> 13 ;
14 [label="gini = 0.477\nsamples = 16\nvalue = [0, 2, 3, 0, 11, 0, 0, 0]\nclass = Jump Rope"] ;
12 -> 14 ;
让我们专注于前 2 个节点:
0 [label="userAcceleration-magnitude-mean <= 0.973\ngini = 0.875\nsamples = 3878\nvalue = [471, 467, 485, 484, 486, 486, 513, 486]\nclass = Walking"] ;
1 [label="userAcceleration-x-IQR <= 0.073\ngini = 0.834\nsamples = 2881\nvalue = [471, 443, 476, 484, 9, 486, 512, 0]\nclass = Walking"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="rotationRate-z-IQR <= 0.396\ngini = 0.606\nsamples = 1020\nvalue = [466, 80, 43, 2, 0, 429, 0, 0]\nclass = Push-ups"] ;
1 -> 2 ;
这是我不明白的:
-
如果user-acceleration-magnitude-mean小于等于0.973,那么这个类就是“Walking”,否则我跳到节点1,对吧?还是相反?
如何读取以“gini = 0.596”开头的标签? gini 不是我的决策树的特征,这是什么意思?
nsamples 和 nvalue 等其他值呢?它们代表什么?
【问题讨论】:
【参考方案1】:1:如果 user-acceleration-magnitude-mean 小于或等于 0.973,则遵循 True。 (这会继续向下进入树中。)
2:我用谷歌搜索了一下,发现“基尼系数:一组值中表示的变异程度的统计量度,特别用于分析收入不平等”。我认为它已经脱离了经济背景,但我不确定是否是这种情况。
3:
这里面有一个底层结构。 samples
是申请该节点的样本数量。根有 3878 个样本,左孩子有 2881 个样本,右孩子有 997 个样本。由于 2881 + 997 = 3878 我相信对于 2881 个样本,user-acceleration-magnitude-mean <= 0.973
是真的。其他 997 个样本分别为 False。
这些值也有某种底层结构。 value
列表中每个值的总和等于该节点中samples
的数量。
【讨论】:
follow True 是什么意思? 好吧,如果对于一个样本user-acceleration-magnitude-mean <= 0.973
"== True",它属于左孩子。如果对于一个样本user-acceleration-magnitude-mean <= 0.973
"== False",它属于右孩子。
还不清楚。没有指示哪个是左/右孩子,节点0只有一个孩子。
好吧,我为整个代码输入制作了一个 .png,每个节点都有 2 个子节点,除了叶子。左右孩子就是我在 .png 上看到它们的方式。而左孩子总是代表“真”以上是关于如何阅读graphviz决策树?的主要内容,如果未能解决你的问题,请参考以下文章
scikit学习决策树导出graphviz - 决策树中的错误类名
Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像