了解R gbm包中的树结构

时间:2015-07-08 15:03:05

标签: r tree gbm

我很难理解R的gbm梯度增强机器包中树的结构。具体来说,查看pretty.gbm.tree 的输出SplitVar中的索引指向哪些要素

我在数据集上训练了一个GBM,这是我的一棵树的前四分之一 - 调用pretty.gbm.tree的结果:

   SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight   Prediction
0         9  6.250000e+01        1         2          21      0.6634681   5981  0.005000061
1        -1  1.895699e-12       -1        -1          -1      0.0000000   3013  0.018956988
2        31  4.462500e+02        3         4          20      1.0083722   2968 -0.009168477
3        -1  1.388483e-22       -1        -1          -1      0.0000000   1430  0.013884830
4        38  5.500000e+00        5        18          19      1.5748155   1538 -0.030602956
5        24  7.530000e+03        6        13          17      2.8329899    361 -0.078738904
6        41  2.750000e+01        7        11          12      2.2499063    334 -0.064752766
7        28 -3.155000e+02        8         9          10      1.5516610     57 -0.243675567
8        -1 -3.379312e-11       -1        -1          -1      0.0000000     45 -0.337931219
9        -1  1.922333e-10       -1        -1          -1      0.0000000     12  0.109783128
```

在我看来,索引是基于0的,从查看LeftNode, RightNode的方式和MissingNode指向不同的行。当通过使用数据样本并在树中按照预测进行测试时,我会在考虑SplitVar使用 1基于索引时得到正确的答案。

但是,我构建的众多树中有1棵在SplitVar列中有!这是这棵树:

SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight    Prediction
0         4  1.462500e+02        1         2          21      0.41887   5981  0.0021651262
1        -1  4.117688e-22       -1        -1          -1      0.00000    512  0.0411768781
2         4  1.472500e+02        3         4          20      1.05222   5469 -0.0014870985
3        -1 -2.062798e-11       -1        -1          -1      0.00000     23 -0.2062797579
4         0  4.750000e+00        5         6          19      0.65424   5446 -0.0006222011
5        -1  3.564879e-23       -1        -1          -1      0.00000   4897  0.0035648788
6        28 -3.195000e+02        7        11          18      1.39452    549 -0.0379703437

查看gbm树使用的索引的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

使用pretty.gbm.tree时打印的第一列是在脚本row.names中分配的pretty.gbm.tree.R。在脚本中,row.names被指定为row.names(temp) <- 0:(nrow(temp)-1),其中temp是以data.frame形式存储的树信息。解释row.names的正确方法是将其读作node_id,并为根节点分配0值。

在你的例子中:

Id SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 0 9 6.250000e+01 1 2 21 0.6634681 5981 0.005000061

表示根节点(由行号0表示)被第9个拆分变量拆分(拆分变量的编号从0开始,因此拆分变量是训练集中的第10列{ {1}})。 x的{​​{1}}表示所有小于SplitCodePred的点都转到6.25,所有大于6.25的点都转到LeftNode 1。此列中具有缺失值的所有点都已分配给6.25。由于此分割,RightNode 2MissingNode 21,根节点中有5981(ErrorReduction)。 0.6634的{​​{1}}表示在拆分点之前分配给此节点上所有值的值。对于WeightPrediction0.005-1中由SplitVar表示的终端节点(或叶子),LeftNode表示为属于该叶节点的所有点预测的值调整(次)乘以RightNode

要理解树结构,重要的是要注意树的分裂以深度优先的方式发生。因此,当根节点(具有节点id 0)被分成其左节点和右节点时,处理左侧直到在返回并标记右节点之前不可能进一步分割。在您的示例中的两个树中,MissingNode的值为2.这是因为在这两种情况下,Prediction都是叶节点。