ক্যারেট গ্ল্যামনেট বনাম সিভি.glmnet


14

একটি অনুকূল ল্যাম্বদা অনুসন্ধান করতে এবং একই কাজটি glmnetকরার caretজন্য ব্যবহারের মধ্যে তুলনা করে অনেক বিভ্রান্তি রয়েছে বলে মনে হয় cv.glmnet

অনেক প্রশ্ন উত্থাপিত হয়েছিল, যেমন:

শ্রেণিবিন্যাস মডেল ট্রেন.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

আপনার উত্তরের জন্য অনেক ধন্যবাদ - এটি আমার কাছে সঠিক ধারণা দেয়। যেহেতু আমি সিভিতে নবী তবে আমি ক) নমুনার আকার এবং খ) ভাঁজগুলির জন্য অ্যাকাউন্ট করিনি।
জোগি

পোস্টের জন্য ধন্যবাদ! সুতরাং আমি যদি এটি সঠিকভাবে পেলাম তবে সাধারণত একজন ডেটাসেটকে একটি বড় প্রশিক্ষণ সেট এবং আরও ছোট টেস্ট সেট (= হোল্ডআউট) এ বিভক্ত করে এবং প্রশিক্ষণ সেটে কে-ফোল্ড সিভি সঞ্চালন করে। অবশেষে একটি সিভি ফলাফল ডান ব্যবহার করে পরীক্ষা সেটে বৈধতা দেয়?
জোগি

@ যোগী এটি করার উপায় হবে। আপনার যদি আরও বৈধকরণের প্রয়োজন না হয় তবে আপনি কেবল সিভির জন্য পুরো ডেটাसेट ব্যবহার করতে পারেন, যেহেতু সিভি ইতিমধ্যে পরীক্ষার সেটগুলির প্রতিটি পুনরাবৃত্তির উপর মডেলটির গড় পারফরম্যান্সের ভিত্তিতে সেরা পরামিতিগুলি চয়ন করে।
স্টাটস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.