Dường như có rất nhiều nhầm lẫn trong việc so sánh sử dụng glmnet
bên trong caret
để tìm kiếm một lambda tối ưu và sử dụng cv.glmnet
để thực hiện cùng một nhiệm vụ.
Nhiều câu hỏi đã được đặt ra, ví dụ:
Mô hình phân loại train.glmnet so với cv.glmnet?
Cách thích hợp để sử dụng glmnet với caret là gì?
Xác thực chéo `glmnet` bằng cách sử dụng` caret`
nhưng không có câu trả lời nào được đưa ra, điều này có thể là do độ lặp lại của câu hỏi. Sau câu hỏi đầu tiên, tôi đưa ra một ví dụ khá giống nhau nhưng lại có cùng một câu hỏi: Tại sao các lambdas ước tính lại khác nhau như vậy?
library(caret)
library(glmnet)
set.seed(849)
training <- twoClassSim(50, linearVars = 2)
set.seed(849)
testing <- twoClassSim(500, linearVars = 2)
trainX <- training[, -ncol(training)]
testX <- testing[, -ncol(testing)]
trainY <- training$Class
# Using glmnet to directly perform CV
set.seed(849)
cvob1=cv.glmnet(x=as.matrix(trainX),y=trainY,family="binomial",alpha=1, type.measure="auc", nfolds = 3,lambda = seq(0.001,0.1,by = 0.001),standardize=FALSE)
cbind(cvob1$lambda,cvob1$cvm)
# best parameter
cvob1$lambda.mi
# best coefficient
coef(cvob1, s = "lambda.min")
# Using caret to perform CV
cctrl1 <- trainControl(method="cv", number=3, returnResamp="all",classProbs=TRUE,summaryFunction=twoClassSummary)
set.seed(849)
test_class_cv_model <- train(trainX, trainY, method = "glmnet", trControl = cctrl1,metric = "ROC",
tuneGrid = expand.grid(alpha = 1,lambda = seq(0.001,0.1,by = 0.001)))
test_class_cv_model
# best parameter
test_class_cv_model$bestTune
# best coefficient
coef(test_class_cv_model$finalModel, test_class_cv_model$bestTune$lambda)
Tóm lại, lambdas tối ưu được đưa ra là:
0,055 bằng cách sử dụng
cv.glmnet()
0,001 bằng cách sử dụng
train()
Tôi biết rằng không nên sử dụng standardize=FALSE
in cv.glmnet()
, nhưng tôi thực sự muốn so sánh cả hai phương pháp sử dụng cùng một điều kiện tiên quyết. Là khám phá chính, tôi nghĩ rằng phương pháp lấy mẫu cho mỗi lần gấp có thể là một vấn đề - nhưng tôi sử dụng cùng một hạt giống và kết quả khá khác nhau.
Vì vậy, tôi thực sự bế tắc về lý do tại sao hai cách tiếp cận rất khác nhau, trong khi chúng nên khá giống nhau? - Tôi hy vọng cộng đồng có một số ý tưởng vấn đề ở đây