我一直在使用 进行模型调整caret
,但随后使用包重新运行模型gbm
。我的理解是caret
包使用gbm
和输出应该是一样的。但是,data(iris)
使用 RMSE 和 R^2 作为评估指标,仅使用 RMSE 和 R^2 进行的快速测试显示模型的差异约为 5%。我想使用caret
但重新运行gbm
以使用部分依赖图来找到最佳模型性能。下面的代码用于重现性。
我的问题是:
1)为什么我看到这两个包之间的差异,即使它们应该是相同的(我知道它们是随机的,但 5% 是一个很大的差异,特别是当我没有使用如此好的数据集作为iris
我的建模时) .
2) 使用这两个软件包有什么优点或缺点 - 如果有,是哪些?
3) 不相关:使用iris
数据集的最佳值interaction.depth
是 5,但它高于我读到的最大值floor(sqrt(ncol(iris)))
,应该是 2。这是严格的经验法则还是非常灵活?
library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)
# Using caret
caretGrid <- expand.grid(interaction.depth=c(1, 3, 5), n.trees = (0:50)*50,
shrinkage=c(0.01, 0.001),
n.minobsinnode=10)
metric <- "RMSE"
trainControl <- trainControl(method="cv", number=10)
set.seed(99)
gbm.caret <- train(Sepal.Length ~ ., data=iris, distribution="gaussian", method="gbm",
trControl=trainControl, verbose=FALSE,
tuneGrid=caretGrid, metric=metric, bag.fraction=0.75)
print(gbm.caret)
# caret determines the optimal model to be at n.tress=700, interaction.depth=5, shrinkage=0.01
# and n.minobsinnode=10
# RMSE = 0.3247354
# R^2 = 0.8604
# Using GBM
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ ., data=iris, distribution="gaussian", n.trees=700, interaction.depth=5,
n.minobsinnode=10, shrinkage=0.01, bag.fraction=0.75, cv.folds=10, verbose=FALSE)
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)
# Here the optimal n.trees = 540
train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 700)
print(rmse(iris$Sepal.Length, train.predict))
# RMSE = 0.2377
R2 <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2)
# R^2 = 0.9178`