glmnet
within caret
を使用して最適なラムダを検索cv.glmnet
し、同じタスクを実行するために使用することの比較には、多くの混乱があるようです。
次のような多くの質問が提起されました。
しかし、答えはありません。これは、質問の再現性による可能性があります。最初の質問に続いて、非常に似た例を挙げますが、同じ質問があります:推定されるラムダはなぜそんなに違うのですか?
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)
要約すると、最適なラムダは次のように与えられます。
0.055を使用して
cv.glmnet()
0.001を使用して
train()
standardize=FALSE
in を使用することcv.glmnet()
はお勧めできませんが、同じ前提条件を使用して両方の方法を比較する必要があります。主な説明として、各フォールドのサンプリングアプローチが問題になる可能性があると思いますが、同じシードを使用しているため、結果はまったく異なります。
だから、私は2つのアプローチが非常に似ているはずなのに、なぜ2つのアプローチがそんなに違うのか本当に悩んでいますか?-私は、コミュニティがここで問題を理解していることを願っています