Saya telah menggunakan model tuning caret
, tetapi kemudian menjalankan kembali model menggunakan gbm
paket. Ini adalah pemahaman saya bahwa caret
paket menggunakan gbm
dan 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 caret
tetapi menjalankan kembali gbm
untuk 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 iris
untuk pemodelan saya) .
2) Apakah ada kelebihan atau kekurangan menggunakan kedua paket - jika demikian, yang mana?
3) Tidak Terkait: Menggunakan iris
dataset optimal interaction.depth
adalah 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`