我正在通过caret
R 中的包试验梯度提升机算法。
使用一个小型大学招生数据集,我运行了以下代码:
library(caret)
### Load admissions dataset. ###
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
### Create yes/no levels for admission. ###
mydata$admit_factor[mydata$admit==0] <- "no"
mydata$admit_factor[mydata$admit==1] <- "yes"
### Gradient boosting machine algorithm. ###
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(5000,1000000,5000), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)
令我惊讶的是,随着提升迭代次数的增加,模型的交叉验证准确度下降而不是增加,在约 450,000 次迭代时达到约 0.59 的最小准确度。
我是否错误地实现了 GBM 算法?
编辑:按照 Underminer 的建议,我重新运行了上面的caret
代码,但专注于运行 100 到 5,000 次增强迭代:
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(100,5000,100), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)
结果图显示,准确度实际上在约 1,800 次迭代时达到接近 0.705 的峰值:
奇怪的是,准确度并没有稳定在 0.70 左右,而是在 5,000 次迭代后下降。