कैरट glmnet बनाम cv.glmnet


14

वहाँ का उपयोग कर की तुलना में भ्रम का एक बहुत हो रहा है glmnetके भीतर caretएक इष्टतम लैम्ब्डा के लिए खोज करने के लिए और का उपयोग कर cv.glmnetएक ही काम करने के लिए।

कई सवाल किए गए, उदाहरण के लिए:

वर्गीकरण मॉडल train.glmnet बनाम 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में cv.glmnet()उचित नहीं है, लेकिन मैं वास्तव में एक ही आवश्यक शर्तें का उपयोग कर दोनों तरीकों की तुलना करना चाहते हैं। मुख्य विस्फोट के रूप में, मुझे लगता है कि प्रत्येक तह के लिए नमूना दृष्टिकोण एक मुद्दा हो सकता है - लेकिन मैं एक ही बीज का उपयोग करता हूं और परिणाम काफी अलग हैं।

इसलिए मैं वास्तव में इस बात पर अड़ा हुआ हूं कि दोनों दृष्टिकोण इतने अलग क्यों हैं, जबकि उन्हें काफी समान होना चाहिए? - मुझे उम्मीद है कि समुदाय को कुछ विचार है कि यहां क्या मुद्दा है

जवाबों:


17

मैं यहां दो मुद्दे देखता हूं। सबसे पहले, आपका प्रशिक्षण सेट आपके परीक्षण सेट के सापेक्ष बहुत छोटा है। आम तौर पर, हम एक प्रशिक्षण सेट चाहते हैं जो परीक्षण सेट के आकार में कम से कम तुलनीय हो। एक और ध्यान दें कि क्रॉस सत्यापन के लिए, आप परीक्षण सेट का उपयोग बिल्कुल नहीं कर रहे हैं, क्योंकि एल्गोरिथ्म मूल रूप से "प्रशिक्षण सेट" का उपयोग करके आपके लिए परीक्षण सेट बनाता है। इसलिए आप अपने प्रारंभिक प्रशिक्षण सेट के रूप में अधिक डेटा का उपयोग करने से बेहतर होंगे।

दूसरा, आपके सीवी के विश्वसनीय होने के लिए 3 तह बहुत छोटा है। आमतौर पर, 5-10 परतों (की सिफारिश की है nfolds = 5के लिए cv.glmnetऔर number=5के लिए caret)। इन परिवर्तनों के साथ, मुझे दो विधियों में एक ही लैम्ब्डा मान मिला और लगभग समान अनुमान:

set.seed(849)
training <- twoClassSim(500, linearVars = 2)
set.seed(849)
testing <- twoClassSim(50, 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 = 5, lambda = seq(0.001,0.1,by = 0.001),
                standardize=FALSE)

cbind(cvob1$lambda,cvob1$cvm)

# best parameter
cvob1$lambda.min

# best coefficient
coef(cvob1, s = "lambda.min")


# Using caret to perform CV
cctrl1 <- trainControl(method="cv", number=5, 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)

परिणाम:

> cvob1$lambda.min
[1] 0.001

> coef(cvob1, s = "lambda.min")
8 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.781015706
TwoFactor1  -1.793387005
TwoFactor2   1.850588656
Linear1      0.009341356
Linear2     -1.213777391
Nonlinear1   1.158009360
Nonlinear2   0.609911748
Nonlinear3   0.246029667

> test_class_cv_model$bestTune
alpha lambda
1     1  0.001

> coef(test_class_cv_model$finalModel, test_class_cv_model$bestTune$lambda)
8 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.845792624
TwoFactor1  -1.786976586
TwoFactor2   1.844767690
Linear1      0.008308165
Linear2     -1.212285068
Nonlinear1   1.159933335
Nonlinear2   0.676803555
Nonlinear3   0.309947442

आपके उत्तर के लिए बहुत बहुत धन्यवाद - यह मेरे लिए एकदम सही समझ में आता है। चूंकि मैं CV के लिए एक newbee हूं इसलिए मैंने a) नमूने का आकार और b) सिलवटों का हिसाब नहीं दिया।
जोगी

पोस्ट के लिए धन्यवाद! इसलिए अगर मुझे यह सही लगता है, तो आमतौर पर डेटासेट एक बड़े प्रशिक्षण सेट और छोटे परीक्षण सेट (= होल्डआउट) में विभाजित होता है और प्रशिक्षण सेट पर के-गुना सीवी का प्रदर्शन करता है। अंत में CV सेट के परिणामों का उपयोग करके, एक परीक्षण सेट पर मान्य होता है?
जोगी

@ जोगी यह करने का तरीका होगा। आप CV के लिए पूरे डेटासेट का उपयोग कर सकते हैं यदि आपको आगे सत्यापन की आवश्यकता नहीं है, क्योंकि CV पहले से ही परीक्षण सेट के प्रत्येक पुनरावृत्ति पर मॉडल के औसत प्रदर्शन के आधार पर सर्वोत्तम मापदंडों को चुनता है।
StAtS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.