Ich habe das Modell mit optimiert caret, aber dann das Modell mit dem gbmPaket erneut ausgeführt. Nach meinem Verständnis sollten das verwendete caretPaket gbmund 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, caretaber 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 irisfür meine Modellierung verwende) .
2) Gibt es Vor- oder Nachteile bei der Verwendung beider Pakete - wenn ja, welche?
3) Unabhängig: Bei Verwendung des irisDatensatzes ist das Optimum interaction.depth5, 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`