包gbm
,rpart
或ctree
的基本树分类器是什么?
假设我们想要使用以下数据进行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。
以下是来自gbm
且shrinkage
为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
,则拟合结果中会有一些随机性。是自动做一些装袋还是简历?
所以最重要的问题是,我们如何使用gbm
,rpart
或其他人重现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/
中的想法来实现但我们如何才能为分类目标变量做到这一点?