Paket GBM vs. Caret menggunakan GBM

13

Saya telah menggunakan model tuning caret, tetapi kemudian menjalankan kembali model menggunakan gbmpaket. Ini adalah pemahaman saya bahwa caretpaket menggunakan gbmdan hasilnya harus sama. Namun, hanya menjalankan tes cepat menggunakan data(iris)menunjukkan perbedaan dalam model sekitar 5% menggunakan RMSE dan R ^ 2 sebagai metrik evaluasi. Saya ingin menemukan kinerja model yang optimal menggunakan carettetapi menjalankan kembali gbmuntuk memanfaatkan plot dependensi parsial. Kode di bawah ini untuk reproduksibilitas.

Pertanyaan saya adalah:

1) Mengapa saya melihat perbedaan antara kedua paket ini walaupun keduanya harus sama (saya mengerti bahwa mereka bersifat stokastik tetapi 5% adalah perbedaan yang besar, terutama ketika saya tidak menggunakan dataset yang bagus irisuntuk pemodelan saya) .

2) Apakah ada kelebihan atau kekurangan menggunakan kedua paket - jika demikian, yang mana?

3) Tidak Terkait: Menggunakan irisdataset optimal interaction.depthadalah 5 tetapi lebih tinggi dari apa yang saya baca harus menggunakan maksimum floor(sqrt(ncol(iris)))yang akan 2. Apakah ini aturan praktis atau cukup fleksibel?

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
sumber

Jawaban:

6

Gunakan dengan kisi default untuk mengoptimalkan parameter dan gunakan prediksi untuk memiliki hasil yang sama:

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
sumber