Pakiet GBM vs. Caret korzystający z GBM

13

Stroiłem model przy użyciu caret, ale potem ponownie uruchomiłem model przy użyciu gbmpakietu. Rozumiem, że caretpakiet używa gbmi wynik powinien być taki sam. Jednak tylko szybki test przy użyciu data(iris)wykazuje rozbieżność w modelu około 5% przy użyciu RMSE i R ^ 2 jako metryki oceny. Chcę znaleźć optymalną wydajność modelu przy użyciu, caretale uruchom ponownie, gbmaby użyć wykresów częściowej zależności. Kod poniżej dla odtwarzalności.

Moje pytania brzmiałyby:

1) Dlaczego widzę różnicę między tymi dwoma pakietami, mimo że powinny być takie same (Rozumiem, że są one stochastyczne, ale 5% to nieco duża różnica, szczególnie gdy nie używam tak ładnego zestawu danych jak irisdo mojego modelowania) .

2) Czy są jakieś zalety lub wady korzystania z obu pakietów - jeśli tak, to które?

3) Niepowiązane: przy użyciu iriszestawu danych optymalne interaction.depthjest 5, ale jest ono wyższe niż to, co przeczytałem, powinno być maksymalne, floor(sqrt(ncol(iris)))które wynosi 2. Czy jest to ścisła zasada, czy jest dość elastyczna?

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
źródło

Odpowiedzi:

6

Użyj z domyślną siatką, aby zoptymalizować parametry i użyj przewidywania, aby uzyskać te same wyniki:

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
źródło