แพคเกจ GBM กับ Caret ใช้ GBM


13

ฉันเคยใช้การจูนโมเดลcaretแต่แล้วก็รันโมเดลอีกครั้งโดยใช้gbmแพ็คเกจ ฉันเข้าใจว่าcaretแพ็กเกจที่ใช้gbmและเอาต์พุตควรเหมือนกัน อย่างไรก็ตามการทดสอบการทำงานอย่างรวดเร็วโดยใช้data(iris)แสดงความแตกต่างในรูปแบบประมาณ 5% โดยใช้ RMSE และ R ^ 2 เป็นตัวชี้วัดการประเมินผล ฉันต้องการค้นหาประสิทธิภาพของแบบจำลองที่ดีที่สุดโดยใช้caretแต่เรียกใช้อีกครั้งgbmเพื่อใช้ประโยชน์จากแผนการพึ่งพาบางส่วน รหัสด้านล่างสำหรับการทำซ้ำ

คำถามของฉันจะเป็น:

1) เหตุใดฉันจึงเห็นความแตกต่างระหว่างแพ็คเกจทั้งสองนี้ถึงแม้ว่าพวกเขาจะเหมือนกัน (ฉันเข้าใจว่าพวกมันสุ่ม แต่ 5% ค่อนข้างแตกต่างกันมากโดยเฉพาะอย่างยิ่งเมื่อฉันไม่ได้ใช้ชุดข้อมูลที่ดีirisสำหรับการสร้างแบบจำลองของฉัน) .

2) มีข้อดีหรือข้อเสียในการใช้ทั้งสองแพคเกจหรือไม่

3) ไม่เกี่ยวข้อง: การใช้irisชุดข้อมูลที่ดีที่สุดinteraction.depthคือ 5 แต่สูงกว่าที่ฉันได้อ่านควรจะใช้สูงสุดfloor(sqrt(ncol(iris)))ซึ่งควรจะเป็น 2 นี่เป็นกฎง่ายๆหรือเข้มงวดหรือไม่?

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`

คำตอบ:


6

ใช้กับกริดเริ่มต้นเพื่อปรับพารามิเตอร์ให้เหมาะสมและใช้การคาดการณ์เพื่อให้ได้ผลลัพธ์ที่เหมือนกัน:

R2.caret-R2.gbm = 0.0009125435

rmse.caret-rmse.gbm = -.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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.