GBM-Paket vs. Caret mit GBM

12

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`
Danib90
quelle

Antworten:

6

Verwenden Sie diese Option mit dem Standardraster, um die Parameter zu optimieren, und verwenden Sie "Vorhersagen", um dieselben Ergebnisse zu erzielen:

R2.caret-R2.gbm = 0,0009125435

rmse.caret-rmse.gbm = -0.001680319

library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)

# Using caret with the default grid to optimize tune parameters automatically
# GBM Tuning parameters:
# n.trees (# Boosting Iterations)
# interaction.depth (Max Tree Depth)
# shrinkage (Shrinkage)
# n.minobsinnode (Min. Terminal Node Size)

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.predict <- predict(gbm.caret, newdata=iris, type="raw")

rmse.caret<-rmse(iris$Sepal.Length, caret.predict)
print(rmse.caret)

R2.caret <- cor(gbm.caret$finalModel$fit, iris$Sepal.Length)^2
print(R2.caret)

#using gbm without caret with the same parameters
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ .
               , data=iris
               , distribution="gaussian"
               , n.trees=150
               , interaction.depth=3
               , n.minobsinnode=10
               , shrinkage=0.1
               , bag.fraction=0.75
               , cv.folds=10
               , verbose=FALSE
               )
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)

train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 150)

rmse.gbm<-rmse(iris$Sepal.Length, train.predict)
print(rmse.gbm)

R2.gbm <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2.gbm)

print(R2.caret-R2.gbm)
print(rmse.caret-rmse.gbm)
42n4
quelle