Gói GBM so với Caret sử dụng GBM


12

Tôi đã điều chỉnh mô hình bằng cách sử dụng caret, nhưng sau đó chạy lại mô hình bằng gbmgói. Theo hiểu biết của tôi rằng caretgói sử dụng gbmvà đầu ra phải giống nhau. Tuy nhiên, chỉ cần chạy thử nhanh bằng cách sử dụng data(iris)cho thấy sự khác biệt trong mô hình khoảng 5% khi sử dụng RMSE và R ^ 2 làm chỉ số đánh giá. Tôi muốn tìm hiệu suất mô hình tối ưu bằng cách sử dụng caretnhưng chạy gbmlại để sử dụng các ô phụ thuộc một phần. Mã dưới đây cho khả năng tái sản xuất.

Câu hỏi của tôi sẽ là:

1) Tại sao tôi thấy sự khác biệt giữa hai gói này mặc dù chúng giống nhau (tôi hiểu rằng chúng là ngẫu nhiên nhưng 5% là một sự khác biệt lớn, đặc biệt là khi tôi không sử dụng một bộ dữ liệu đẹp như vậy irischo mô hình của mình) .

2) Có bất kỳ lợi thế hay bất lợi nào khi sử dụng cả hai gói - nếu vậy, gói nào?

3) Không liên quan: Sử dụng iristập dữ liệu tối ưu interaction.depthlà 5 tuy nhiên nó cao hơn mức tôi đã đọc nên là mức tối đa sử dụng floor(sqrt(ncol(iris)))là 2. Đây có phải là một quy tắc nghiêm ngặt hay nó khá linh hoạt?

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`

Câu trả lời:


6

Sử dụng với lưới mặc định để tối ưu hóa các tham số và sử dụng dự đoán để có kết quả tương tự:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.