Cv.glmnet ফলাফলগুলিতে ভেরিয়েবলিটি


18

আমি cv.glmnetভবিষ্যদ্বাণীকারীদের খুঁজতে ব্যবহার করছি । আমি যে সেটআপটি ব্যবহার করি তা নিম্নরূপ:

lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min

results<-predict(lassoResults,s=bestlambda,type="coefficients")

choicePred<-rownames(results)[which(results !=0)]

নিশ্চিত ফলাফল গঠনকর আমি হয় set.seed(1)। ফলাফল অত্যন্ত পরিবর্তনশীল। ফলাফলগুলি কতটা পরিবর্তনশীল তা দেখতে আমি একই কোডটি 100 চালিয়েছি। 98/100 রান একটি নির্দিষ্ট ভবিষ্যদ্বাণী সর্বদা নির্বাচিত ছিল (কখনও কখনও কেবল এটি নিজস্ব); অন্যান্য ভবিষ্যদ্বাণীকারী সাধারণত 50/100 বার নির্বাচিত হন (সহ-কার্যক্ষম শূন্য নয়)।

সুতরাং এটি আমাকে বলে যে প্রতিটি সময় ক্রস বৈধকরণ চলমান এটি সম্ভবত একটি ভিন্ন সেরা ল্যাম্বডা নির্বাচন করতে চলেছে, কারণ ভাঁজগুলির প্রাথমিক র্যান্ডমাইজেশন বিষয়টি বিবেচনা করে। অন্যরা এই সমস্যাটি দেখেছেন ( CV.glmnet ফলাফল ) তবে এর প্রস্তাবিত সমাধান নেই।

আমি ভাবছি যে সম্ভবত 98/100 দেখায় এমন একটি সম্ভবত অন্য সকলের সাথে খুব বেশি সংযুক্ত? ফলাফল কি স্থির তাহলে আমি ঠিক চালানো LOOCV ( fold-size=n ), কিন্তু আমি আগ্রহী কেন তারা এত পরিবর্তনশীল যখন হয় nfold<n


1
স্পষ্টতই, আপনি কি set.seed(1)একবার বোঝাচ্ছেন একবার cv.glmnet()100 বার চালাবেন ? প্রজননযোগ্যতার জন্য এটি দুর্দান্ত পদ্ধতি নয়; set.seed()প্রতিটি রান আগে ডান থেকে ভাল , বা অন্যথায় রানগুলি জুড়ে স্থির রাখুন। আপনার প্রতিটি কলকে এন বার কল করা cv.glmnet()হচ্ছে sample()। সুতরাং আপনার ডেটার দৈর্ঘ্য যদি কখনও পরিবর্তন হয় তবে পুনরুত্পাদনীয়তা পরিবর্তন হয়।
smci

উত্তর:


14

এখানে মূল কথাটি হ'ল cv.glmnetকে ভাঁজগুলিতে ("অংশগুলি") এলোমেলোভাবে বাছাই করা হয়।

ক্রস বৈধতা ডেটাসেটে ভাগ করা হয়েছে কে-folds অংশ, এবং অংশের k- তম অংশ ভবিষ্যদ্বাণী করা ব্যবহৃত হয় (এই কাজ করা হয় বার, একটি ভিন্ন ব্যবহার অংশ প্রতিটি সময়)। এটি সমস্ত ল্যাম্বডাসের জন্য করা হয়, এবং এটিই হ'ল ক্ষুদ্রতম ক্রস বৈধকরণের ত্রুটি দেয়।KK1KKlambda.min

এ কারণেই আপনি যখন ব্যবহার ফলাফল পরিবর্তন হয় না: প্রতিটি গ্রুপ একটির তৈরি, তাই গ্রুপগুলির জন্য খুব বেশি পছন্দ নেই ।কেnfolds=nK

থেকে cv.glmnet()সহায়িকা:

ভাঁজগুলি এলোমেলোভাবে নির্বাচিত হওয়ার কারণে cv.glmnet এর ফলাফলগুলি এলোমেলো। ব্যবহারকারীরা cv.glmnet বহুবার চালিয়ে, এবং ত্রুটিযুক্ত বক্ররেখাকে গড় দিয়ে এই এলোমেলোতা হ্রাস করতে পারে।

### cycle for doing 100 cross validations
### and take the average of the mean error curves
### initialize vector for final data.frame with Mean Standard Errors
MSEs <- NULL
for (i in 1:100){
                 cv <- cv.glmnet(y, x, alpha=alpha, nfolds=k)  
                 MSEs <- cbind(MSEs, cv$cvm)
             }
  rownames(MSEs) <- cv$lambda
  lambda.min <- as.numeric(names(which.min(rowMeans(MSEs))))

এমএসইগুলি হ'ল ডেটা ফ্রেম যা সমস্ত lambda.minল্যাম্বডাসের জন্য সমস্ত ত্রুটি রয়েছে (100 রানের জন্য) এটি ন্যূনতম গড় ত্রুটিযুক্ত আপনার ল্যাম্বডা।


আমি যে বিষয়টি সম্পর্কে সবচেয়ে বেশি উদ্বিগ্ন তা হ'ল এন নির্বাচনটি সত্যই মাঝে মধ্যে গুরুত্বপূর্ণ মনে হয়। এতগুলি পরিবর্তনশীল হতে পারে এমন ফলাফলগুলিতে আমার বিশ্বাস করা উচিত? বা আমি এটি একাধিকবার চালিয়ে গেলেও স্কেচি হিসাবে এটি খড়ি উচিত?
ব্যবহারকারী 4673

1
নমুনার আকারের উপর নির্ভর করে আপনার এন নির্বাচন করা উচিত যাতে আপনার প্রতি গ্রুপে কমপক্ষে 10 টি পর্যবেক্ষণ থাকে। সুতরাং আপনার যদি 100 এর চেয়ে কম নমুনা আকার থাকে তবে এটি ডিফল্ট এন (= 10) হ্রাস করা ভাল This এটি বলেছে, কোডের টুকরা সহ সম্পাদিত উত্তরটি দেখুন: লুপের জন্য আপনি সিভি.glmnet 100 বার পুনরাবৃত্তি করতে পারবেন এবং গড় গড় পেতে পারেন ত্রুটি বক্ররেখা কয়েকবার চেষ্টা করে দেখুন আপনি সেই ল্যাম্বদা.মিনটি বদলাবেন না।
এলিস

2
আপনি এটি কিভাবে করেছেন তা আমি পছন্দ করি। আমার একই লুপ আছে তবে শেষ পর্যন্ত একটি ব্যতিক্রম ছাড়াও: আমি দেখি যে সমস্ত পুনরাবৃত্তি থেকে সর্বনিম্ন এমএসইয়ের বিপরীতে বিভিন্ন বৈশিষ্ট্যগুলি প্রায়শই কীভাবে পপ আপ হয়। আমি একটি নির্বিচার কাটা পয়েন্ট বাছাই করি (অর্থাত্ 50/100 পুনরাবৃত্তিগুলি দেখান) এবং সেই বৈশিষ্ট্যগুলি ব্যবহার করি। কৌতূহল বৈপরীত্য দুটি পদ্ধতির।
ব্যবহারকারী 4673

1
lambdaerror,sincecv

ব্যবহারকারী 4581 হিসাবে উল্লেখ করা হয়েছে, দৈর্ঘ্যের পরিবর্তনশীলতার কারণে এই ফাংশনটি ব্যর্থ হতে পারে cv.glmnet(...)$lambda। আমার বিকল্পগুলি এটি ঠিক করে: stats.stackexchange.com/a/173895/19676
ম্যাক্স ঘেনিস

9

λααλα

αλ

তারপরে, প্রতিটি পূর্বাভাসীর জন্য আমি পাই:

  • মানে সহগ
  • আদর্শ চ্যুতি
  • 5 সংখ্যার সারাংশ (মিডিয়ান, কোয়ার্টাইলস, মিনিট এবং সর্বাধিক)
  • বারের শতাংশের পরিমাণ শূন্যের চেয়ে পৃথক (যেমন একটি প্রভাব রয়েছে)

এইভাবে আমি ভবিষ্যদ্বাণীকারীর প্রভাব সম্পর্কে একটি দৃ solid় দৃ description় বিবরণ পাই। আপনি সহগের জন্য বিতরণ হয়ে গেলে, আপনি সিআই, পি মান ইত্যাদি মূল্যবান বলে মনে করেন এমন কোনও পরিসংখ্যান সামগ্রী চালাতে পারেন ... তবে আমি এখনও এটি তদন্ত করিনি।

আমি ভাবতে পারি যে কোনও নির্বাচন পদ্ধতিতে এই পদ্ধতিটি ব্যবহার করা যেতে পারে।


4
আপনি কি এখানে আপনার কোড পোস্ট করতে পারেন?
rbm

হ্যাঁ, আপনি কি এখানে আপনার কোড পোস্ট করতে পারেন?
smci

4

আমি আরও একটি সমাধান যুক্ত করব, যা ল্যাম্বডাস হারিয়ে যাওয়ার কারণে @ অ্যালিসের মধ্যে বাগটি পরিচালনা করে তবে @ ম্যাক্স ঘেনিসের মতো অতিরিক্ত প্যাকেজগুলির প্রয়োজন নেই। অন্যান্য সমস্ত জবাবের জন্য ধন্যবাদ !ণী - সবাই দরকারী পয়েন্ট তোলে!

lambdas = NULL
for (i in 1:n)
{
    fit <- cv.glmnet(xs,ys)
    errors = data.frame(fit$lambda,fit$cvm)
    lambdas <- rbind(lambdas,errors)
}
# take mean cvm for each lambda
lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)

# select the best one
bestindex = which(lambdas[2]==min(lambdas[2]))
bestlambda = lambdas[bestindex,1]

# and now run glmnet once more with it
fit <- glmnet(xy,ys,lambda=bestlambda)

3

অ্যালিসের উত্তর বেশিরভাগ ক্ষেত্রে ভাল কাজ করে তবে কখনও cv.glmnet$lambdaকখনও বিভিন্ন দৈর্ঘ্যের ফলাফল ফেরত দেওয়ার কারণে ত্রুটিগুলি বের হয়ে যায় , যেমন:

রোনেয়ামে ত্রুটি <- (টিএমপি, মান = সি (0.135739830284452, 0.12368107787663,: 'নামের দৈর্ঘ্য' [1] অ্যারের পরিমাণের সমান নয়)।

OptimLambdaনীচে সাধারণ ক্ষেত্রে কাজ করা উচিত, এবং mclapplyসমান্তরাল প্রক্রিয়াকরণ এবং লুপগুলি এড়ানোর জন্য উপকারের মাধ্যমে আরও দ্রুত হয় ।

Lambdas <- function(...) {
  cv <- cv.glmnet(...)
  return(data.table(cvm=cv$cvm, lambda=cv$lambda))
}

OptimLambda <- function(k, ...) {
  # Returns optimal lambda for glmnet.
  #
  # Args:
  #   k: # times to loop through cv.glmnet.
  #   ...: Other args passed to cv.glmnet.
  #
  # Returns:
  #   Lambda associated with minimum average CV error over runs.
  #
  # Example:
  #   OptimLambda(k=100, y=y, x=x, alpha=alpha, nfolds=k)
  #
  require(parallel)
  require(data.table)
  MSEs <- data.table(rbind.fill(mclapply(seq(k), function(dummy) Lambdas(...))))
  return(MSEs[, list(mean.cvm=mean(cvm)), lambda][order(mean.cvm)][1]$lambda)
}

1

আপনি যদি স্পষ্টভাবে ফোল্ডিড সেট করেন তবে আপনি এলোমেলোতা নিয়ন্ত্রণ করতে পারেন। এখানে 5-ভাঁজ সিভির একটি উদাহরণ

library(caret)
set.seed(284)
flds <- createFolds(responseDiffs, k = cvfold, list = TRUE, returnTrain = FALSE)
foldids = rep(1,length(responseDiffs))
foldids[flds$Fold2] = 2
foldids[flds$Fold3] = 3
foldids[flds$Fold4] = 4
foldids[flds$Fold5] = 5

এখন এই ফোল্ডারগুলি দিয়ে cv.glmnet চালান।

lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,foldid = foldids)

আপনি প্রতিবার একই ফলাফল পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.