Ho usato il tuning del modello caret, ma poi rieseguendo il modello usando il gbmpacchetto. Comprendo che il caretpacchetto utilizza gbme l'output dovrebbe essere lo stesso. Tuttavia, solo un rapido test eseguito utilizzando data(iris)mostra una discrepanza nel modello di circa il 5% utilizzando RMSE e R ^ 2 come metrica di valutazione. Voglio trovare le prestazioni ottimali del modello usando caretma rieseguire gbmper utilizzare i grafici di dipendenza parziale. Codice sotto per riproducibilità.
Le mie domande sarebbero:
1) Perché vedo una differenza tra questi due pacchetti anche se dovrebbero essere uguali (capisco che sono stocastici ma il 5% è in qualche modo una grande differenza, specialmente quando non sto usando un set di dati così bello come irisper la mia modellazione) .
2) Ci sono vantaggi o svantaggi nell'uso di entrambi i pacchetti - se sì, quali?
3) Non correlato: l'utilizzo del irisset di dati l'ottimale interaction.depthè 5, tuttavia è superiore a quello che ho letto dovrebbe essere l'utilizzo massimo floor(sqrt(ncol(iris)))che sarebbe 2. È una regola empirica rigorosa o è abbastanza flessibile?
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`