R:如何提高梯度提升模型的拟合度

R: how to improve gradient boosting model fit

我尝试使用 gbm 包中的 gbm 将梯度提升模型(弱学习器是 max.depth = 2 棵树)拟合到 iris 数据集。我将迭代次数设置为 M = 1000,学习率为 learning.rate = 0.001。然后我将结果与回归树的结果进行了比较(使用 rpart)。然而,回归树似乎优于梯度提升模型。这背后的原因是什么?我怎样才能提高梯度提升模型的性能?我认为 0.001 的学习率应该足以满足 1000 iterations/boosted 棵树。

library(rpart)
library(gbm)
data(iris)

train.dat <- iris[1:100, ]
test.dat <- iris[101:150, ]

learning.rate <- 0.001
M <- 1000
gbm.model <- gbm(Sepal.Length ~ ., data = train.dat, distribution = "gaussian", n.trees = M, 
    interaction.depth = 2, shrinkage = learning.rate, bag.fraction = 1, train.fraction = 1)
yhats.gbm <- predict(gbm.model, newdata = test.dat, n.trees = M)

tree.mod <- rpart(Sepal.Length ~ ., data = train.dat)
yhats.tree <- predict(tree.mod, newdata = test.dat)

> sqrt(mean((test.dat$Sepal.Length - yhats.gbm)^2))
[1] 1.209446
> sqrt(mean((test.dat$Sepal.Length - yhats.tree)^2))
[1] 0.6345438

在鸢尾花数据集中,有 3 个不同的物种,前 50 行是 setosa,接下来的 50 行是 versicolor,最后 50 行是 virginica。所以我认为最好混合行,并使 Species 列相关。

library(ggplot2)
ggplot(iris,aes(x=Sepal.Width,y=Sepal.Length,col=Species)) + geom_point()

其次,你应该在不同的几次重复中这样做,看看它的不确定性。为此,我们可以使用插入符号,我们可以预先定义训练样本,还可以提供固定网格。我们感兴趣的是交叉验证训练期间的错误,这与您正在做的类似:

set.seed(999)
idx = split(sample(nrow(iris)),1:nrow(iris) %% 3)
tr = trainControl(method="cv",index=idx)
this_grid = data.frame(interaction.depth=2,shrinkage=0.001,
n.minobsinnode=10,n.trees=1000)

gbm_fit = train(Sepal.Width ~ . ,data=iris,method="gbm", 分布="gaussian",tuneGrid=tg,trControl=tr)

然后我们使用相同的样本来拟合 rpart:

#the default for rpart
this_grid = data.frame(cp=0.01)
rpart_fit = train(Sepal.Width ~ . ,data=iris,method="rpart",
trControl=tr,tuneGrid=this_grid)

最后我们比较一下,很相似:

gbm_fit$resample
       RMSE  Rsquared       MAE Resample
1 0.3459311 0.5000575 0.2585884        0
2 0.3421506 0.4536114 0.2631338        1
3 0.3428588 0.5600722 0.2693837        2

       RMSE  Rsquared       MAE Resample
1 0.3492542 0.3791232 0.2695451        0
2 0.3320841 0.4276960 0.2550386        1
3 0.3284239 0.4343378 0.2570833        2

所以我怀疑上面的例子有些奇怪。同样,它始终取决于您的数据,对于某些数据,例如 iris,rpart 可能就足够了,因为有非常强大的预测因子。同样对于像 gbm 这样的复杂模型,您很可能需要使用类似上述的方法进行训练以找到最佳参数。