我在理解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
```
在我看来,从
LeftNode, RightNode
和MissingNode
指向不同行的角度来看,索引是基于0的。当通过使用数据样本并遵循其预测树进行测试时,当我认为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树使用的索引的正确方法是什么?
最佳答案
使用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 Prediction0 9 6.250000e+01 1 2 21 0.6634681 5981 0.005000061
表示根节点(由行号0表示)被第9个拆分变量拆分(此处拆分变量的编号从0开始,因此拆分变量是训练集x
中的第10列)。 SplitCodePred
的6.25
表示所有小于6.25
的点都进入了LeftNode 1
,所有大于6.25
的点都进入了RightNode 2
。在此列中所有具有缺失值的点都分配给MissingNode 21
。由于此拆分,ErrorReduction
为0.6634
,并且根节点中有5981(Weight
)。 Prediction
的0.005
表示在分割点之前分配给该节点所有值的值。在-1
,SplitVar
,LeftNode
和RightNode
中由MissingNode
表示的终端节点(或叶子)的情况下,Prediction
表示针对该叶子节点的所有点的预测值(经调整(倍))乘以shrinkage
要了解树的结构,重要的是要注意,树的拆分以深度优先的方式发生。因此,当根节点(节点ID为0)拆分为左节点和右节点时,将处理左侧,直到无法再进行拆分为止,然后再返回并标记右节点。在示例中的两棵树中,RightNode
的值为2。这是因为在两种情况下,LeftNode
都是叶子节点。
关于r - 了解R gbm包中的树结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31296541/