J'ai ajusté le modèle à l'aide caret
, mais j'ai ensuite réexécuté le modèle à l'aide du gbm
package. Je crois comprendre que le caret
package utilise gbm
et que la sortie doit être la même. Cependant, un simple test rapide utilisant data(iris)
montre une différence dans le modèle d'environ 5% en utilisant RMSE et R ^ 2 comme métrique d'évaluation. Je veux trouver les performances optimales du modèle en utilisant caret
mais réexécuter gbm
pour utiliser les tracés de dépendance partielle. Code ci-dessous pour la reproductibilité.
Mes questions seraient:
1) Pourquoi est-ce que je vois une différence entre ces deux packages même s'ils devraient être les mêmes (je comprends qu'ils sont stochastiques mais 5% est quelque peu une grande différence, surtout quand je n'utilise pas un si bel ensemble de données que iris
pour ma modélisation) .
2) Y a-t-il des avantages ou des inconvénients à utiliser les deux packages - si oui, lesquels?
3) Indépendant: en utilisant l' iris
ensemble de données, l'optimal interaction.depth
est 5 mais il est supérieur à ce que j'ai lu devrait être le maximum à utiliser floor(sqrt(ncol(iris)))
qui serait 2. Est-ce une règle empirique stricte ou est-il assez flexible?
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`