R gbm什么是基本树分类rpart或ctree,如何在gbm结果中重现树

时间:2017-10-11 05:29:32

标签: r tree gbm

gbmrpartctree的基本树分类器是什么?

假设我们想要使用以下数据进行2级分类:

D = iris[iris$Species!='setosa', ]
D$Species = as.factor(as.character(D$Species))
D$label = as.numeric(D$Species) - 1
D$Species = NULL
head(D)
   Sepal.Length Sepal.Width Petal.Length Petal.Width label
51          7.0         3.2          4.7         1.4     0
52          6.4         3.2          4.5         1.5     0
53          6.9         3.1          4.9         1.5     0
54          5.5         2.3          4.0         1.3     0
55          6.5         2.8          4.6         1.5     0
56          5.7         2.8          4.5         1.3     0

以下是rpart的结果,最大深度固定为1:

fit1 = rpart(data = D, label~., control = rpart.control(maxdepth=1), method = 'class')
fit1

n= 100 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 100 50 0 (0.50000000 0.50000000)  
  2) Petal.Width< 1.75 54  5 0 (0.90740741 0.09259259) *
  3) Petal.Width>=1.75 46  1 1 (0.02173913 0.97826087) *

分裂变量是Petal.Width,为1.75。

以下是来自gbmshrinkage为1:

的树
fit = gbm(data=D, label ~., shrinkage = 1, n.trees = 1, train.fraction = 1)
pretty.gbm.tree(fit, i.tree = 1)
  SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction
0        2      5.050000        1         2           3       9.610323     50  -0.240000
1       -1     -1.612903       -1        -1          -1       0.000000     31  -1.612903
2       -1      2.000000       -1        -1          -1       0.000000     19   2.000000
3       -1     -0.240000       -1        -1          -1       0.000000     50  -0.240000

树使用第3列(从0索引,因此2 + 1为3)将Petal.Length分配为5.05。

如果我删除选项train.fraction = 1,则拟合结果中会有一些随机性。是自动做一些装袋还是简历?

所以最重要的问题是,我们如何使用gbmrpart或其他人重现ctree结果中的第一棵树?我们应该使用什么收缩值来实现这一目标?

更新

如果添加bag.fraction = 1,结果将保持一致。

但为什么更改shrinkage不会影响结果?它只会影响第二棵树的结果吗?

我们如何使用gbm生成rpart结果中的第二棵树?

fit = gbm(data=D, label ~., shrinkage = 1, n.trees = 2, train.fraction = 1,bag.fraction = 1)
pretty.gbm.tree(fit, i.tree = 1)
  SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction
0        3      1.750000        1         2           3        19.4847    100   0.000000
1       -1     -1.629630       -1        -1          -1         0.0000     54  -1.629630
2       -1      1.913043       -1        -1          -1         0.0000     46   1.913043
3       -1      0.000000       -1        -1          -1         0.0000    100   0.000000
pretty.gbm.tree(fit, i.tree = 2)
  SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction
0        2     4.9500000        1         2           3       2.368983    100  0.1792148
1       -1    -0.9785858       -1        -1          -1       0.000000     54 -0.9785858
2       -1     1.5383721       -1        -1          -1       0.000000     46  1.5383721
3       -1     0.1792148       -1        -1          -1       0.000000    100  0.1792148

如果目标是连续的,我可以按照http://blog.kaggle.com/2017/01/23/a-kaggle-master-explains-gradient-boosting/

中的想法来实现

但我们如何才能为分类目标变量做到这一点?

0 个答案:

没有答案