Ich habe das Modell mit optimiert caret
, aber dann das Modell mit dem gbm
Paket erneut ausgeführt. Nach meinem Verständnis sollten das verwendete caret
Paket gbm
und die Ausgabe identisch sein. Nur ein kurzer Testlauf mit data(iris)
zeigt jedoch eine Diskrepanz im Modell von etwa 5% unter Verwendung von RMSE und R ^ 2 als Bewertungsmetrik. Ich möchte die optimale Modellleistung mithilfe von ermitteln, caret
aber erneut ausführen gbm
, um die partiellen Abhängigkeitsdiagramme zu verwenden. Code unten für die Reproduzierbarkeit.
Meine Fragen wären:
1) Warum sehe ich einen Unterschied zwischen diesen beiden Paketen, obwohl sie gleich sein sollten (ich verstehe, dass sie stochastisch sind, aber 5% ist ein etwas großer Unterschied, insbesondere wenn ich keinen so schönen Datensatz wie iris
für meine Modellierung verwende) .
2) Gibt es Vor- oder Nachteile bei der Verwendung beider Pakete - wenn ja, welche?
3) Unabhängig: Bei Verwendung des iris
Datensatzes ist das Optimum interaction.depth
5, jedoch ist es höher als das, was ich gelesen habe, und sollte das Maximum sein, bei floor(sqrt(ncol(iris)))
dem 2 verwendet werden würde. Ist dies eine strenge Faustregel oder ist es ziemlich flexibel?
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`