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 gbm
gói. Theo hiểu biết của tôi rằng caret
gói sử dụng gbm
và đầ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 caret
nhưng chạy gbm
lạ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 iris
cho 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 iris
tập dữ liệu tối ưu interaction.depth
là 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`