ดูเหมือนจะมีความสับสนมากในการเปรียบเทียบการใช้glmnet
ภายในcaret
เพื่อค้นหาแลมบ์ดาที่ดีที่สุดและใช้cv.glmnet
ในการทำงานเดียวกัน
มีการตั้งคำถามมากมายเช่น:
โมเดลการจำแนกประเภท train.glmnet vs. cv.glmnet
วิธีที่เหมาะสมในการใช้ glmnet กับคาเร็ตคืออะไร?
การตรวจสอบข้าม `glmnet 'โดยใช้` คาเร็ต'
แต่ไม่ได้รับคำตอบซึ่งอาจเป็นเพราะความสามารถในการทำซ้ำของคำถาม ตามคำถามแรกฉันให้ตัวอย่างที่คล้ายกัน แต่มีคำถามเดียวกัน: ทำไม lambdas โดยประมาณแตกต่างกันอย่างไร
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
ในcv.glmnet()
นั้นไม่แนะนำให้เลือก แต่ฉันต้องการเปรียบเทียบทั้งสองวิธีโดยใช้ข้อกำหนดเบื้องต้นเดียวกัน ในฐานะที่เป็นคำอธิบายหลักฉันคิดว่าวิธีการสุ่มตัวอย่างสำหรับแต่ละครั้งอาจเป็นปัญหา - แต่ฉันใช้เมล็ดเดียวกันและผลลัพธ์นั้นแตกต่างกันมาก
ดังนั้นฉันจึงติดอยู่จริงๆว่าทำไมทั้งสองวิธีจึงแตกต่างกันในขณะที่พวกเขาควรจะคล้ายกันมาก? - ฉันหวังว่าชุมชนมีความคิดว่าปัญหาคืออะไรที่นี่