我很难理解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
```
Run Code Online (Sandbox Code Playgroud)
在这里我看来,索引是基于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
Run Code Online (Sandbox Code Playgroud)
查看gbm树使用的索引的正确方法是什么?
小智 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列x).SplitCodePred的6.25表示所有点不到6.25就到了LeftNode 1大于和所有点6.25去了RightNode 2.此列中具有缺失值的所有点都已分配给MissingNode 21.这ErrorReduction是0.6634由于这种分裂,Weight根节点中有5981().Predictionof 0.005表示在拆分点之前分配给此节点上所有值的值.在由表示终端节点(或叶)的情况下-1在SplitVar,LeftNode,RightNode,和MissingNode,在Prediction表示为属于该叶节点的所有点预测的值,调整(次)乘以shrinkage.
要理解树结构,重要的是要注意树的分裂以深度第一的方式发生.因此,当根节点(具有节点id 0)被分成其左节点和右节点时,处理左侧直到在返回并标记右节点之前不可能进一步分割.在您的示例中的两个树中,RightNode获取值2.这是因为在两种情况下,LeftNode结果都是叶节点.