লাসো কেন আমার উচ্চতর মাত্রাতে নিখুঁত ভবিষ্যদ্বাণী জুটি খুঁজে পাচ্ছে না?


20

আমি যদি একটি নিখুঁত ভবিষ্যদ্বাণী জুটি খুঁজে পেতে সক্ষম হয় তা পরীক্ষা করতে আমি আর এস এ ল্যাসো রিগ্রেশন নিয়ে একটি ছোট পরীক্ষা চালাচ্ছি। জোড়টিকে এইরকম সংজ্ঞায়িত করা হয়: f1 + f2 = ফলাফল

এখানে ফলাফলটি 'বয়স' নামে পরিচিত একটি পূর্বনির্ধারিত ভেক্টর। F1 এবং f2 বয়স ভেক্টরের অর্ধেক নিয়ে এবং বাকী মানগুলি 0 তে সেট করে তৈরি করা হয়, উদাহরণস্বরূপ: বয়স = [1,2,3,4,5,6], এফ 1 = [1,2,3, 0,0,0] এবং এফ 2 = [0,0,0,4,5,6]। আমি এই পূর্বাভাসকারী জুটিকে একটি সাধারণ বিতরণ এন (1,1) থেকে নমুনা তৈরি করে এলোমেলোভাবে তৈরি ভেরিয়েবলের ক্রমবর্ধমান পরিমাণের সাথে একত্রিত করি।

আমি যা দেখি তা যখন আমি 2 ^ 16 ভেরিয়েবলগুলি আঘাত করি তখন লাসো আমার জুটি আর খুঁজে পাচ্ছে না। নীচে ফলাফল দেখুন।

প্রতিটি ডাটা আকারে ভাঁজ প্রতি বৈশিষ্ট্যের সংখ্যানিখুঁত জুটির সহগ

ইহা কি জন্য ঘটিতেছে? আপনি নীচের স্ক্রিপ্ট দিয়ে ফলাফল পুনরুত্পাদন করতে পারেন। আমি লক্ষ্য করেছি যে যখন আমি কোনও ভিন্ন বয়সের ভেক্টর বাছাই করি, যেমন: [1: 193] তখন লাসো এই জুটিকে উচ্চ মাত্রিকতার (> 2 ^ 16) খুঁজে পায় find

এই পান্ডুলিপি:

## Setup ##
library(glmnet)
library(doParallel)
library(caret)

mae <- function(errors){MAE <- mean(abs(errors));return(MAE)}
seed = 1
n_start <- 2 #start at 2^n features
n_end <- 16 #finish with 2^n features
cl <- makeCluster(3)
registerDoParallel(cores=cl)

#storage of data
features <- list()
coefs <- list()
L <- list() 
P <- list() 
C <- list() 
RSS <- list() 

## MAIN ##
for (j in n_start:n_end){
  set.seed(seed)
  age <- c(55,31,49,47,68,69,53,42,58,67,60,58,32,52,63,31,51,53,37,48,31,58,36,42,61,49,51,45,61,57,52,60,62,41,28,45,39,47,70,33,37,38,32,24,66,54,59,63,53,42,25,56,70,67,44,33,50,55,60,50,29,51,49,69,70,36,53,56,32,43,39,43,20,62,46,65,62,65,43,40,64,61,54,68,55,37,59,54,54,26,68,51,45,34,52,57,51,66,22,64,47,45,31,47,38,31,37,58,66,66,54,56,27,40,59,63,64,27,57,32,63,32,67,38,45,53,38,50,46,59,29,41,33,40,33,69,42,55,36,44,33,61,43,46,67,47,69,65,56,34,68,20,64,41,20,65,52,60,39,50,67,49,65,52,56,48,57,38,48,48,62,48,70,55,66,58,42,62,60,69,37,50,44,61,28,64,36,68,57,59,63,46,36)
  beta2 <- as.data.frame(cbind(age,replicate(2^(j),rnorm(length(age),1,1))));colnames(beta2)[1] <-'age'

  f1 <- c(age[1:96],rep(0,97)) 
  f2 <- c(rep(0,96),age[97:193])
  beta2 <- as.data.frame(cbind(beta2,f1,f2))

  #storage variables
  L[[j]] <- vector()
  P[[j]] <- vector()
  C[[j]] <- list()
  RSS[[j]] <- vector()

  #### DCV LASSO ####
  set.seed(seed) #make folds same over 10 iterations
  for (i in 1:10){

    print(paste(j,i))
    index <- createFolds(age,k=10)
    t.train <- beta2[-index[[i]],];row.names(t.train) <- NULL
    t.test <- beta2[index[[i]],];row.names(t.test) <- NULL

    L[[j]][i] <- cv.glmnet(x=as.matrix(t.train[,-1]),y=as.matrix(t.train[,1]),parallel = T,alpha=1)$lambda.min #,lambda=seq(0,10,0.1)
    model <- glmnet(x=as.matrix(t.train[,-1]),y=as.matrix(t.train[,1]),lambda=L[[j]][i],alpha=1)
    C[[j]][[i]] <- coef(model)[,1][coef(model)[,1] != 0]
    pred <- predict(model,as.matrix(t.test[,-1]))
    RSS[[j]][i] <- sum((pred - t.test$age)^2)
    P[[j]][i] <- mae(t.test$age - pred)
    gc()
  }
}

##############
## PLOTTING ##
##############

#calculate plots features
beta_sum = unlist(lapply(unlist(C,recursive = F),function(x){sum(abs(x[-1]))}))
penalty = unlist(L) * beta_sum
RSS = unlist(RSS)
pair_coefs <- unlist(lapply(unlist(C,recursive = F),function(x){
  if('f1' %in% names(x)){f1 = x['f1']}else{f1=0;names(f1)='f1'}
  if('f2' %in% names(x)){f2 = x['f2']}else{f2=0;names(f2)='f2'}
  return(c(f1,f2))}));pair_coefs <- split(pair_coefs,c('f1','f2'))
inout <- lapply(unlist(C,recursive = F),function(x){c('f1','f2') %in% names(x)})
colors <- unlist(lapply(inout,function(x){if (x[1]*x[2]){'green'}else{'red'}}))
featlength <- unlist(lapply(unlist(C,recursive = F),function(x){length(x)-1}))

#diagnostics
plot(rep(n_start:n_end,each=10),pair_coefs$f1,col='red',xaxt = "n",xlab='n/o randomly generated features (log2)',main='Pair Coefficients',ylim=c(0,1),ylab='pair coefficients');axis(1, at=n_start:n_end);points(rep(n_start:n_end,each=10),pair_coefs$f2,col='blue');axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('bottomleft',fill=c('red','blue'),legend = c('f1','f2'),inset=.02)
plot(rep(n_start:n_end,each=10),RSS+penalty,col=colors,xaxt = "n",xlab='n/o randomly generated features (log2)',main='RSS+penalty');axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('topleft',fill=c('green','red'),legend = c('Pair Selected','Pair not Selected'),inset=.02)
plot(rep(n_start:n_end,each=10),penalty,col=colors,xaxt = "n",xlab='n/o randomly generated features (log2)',main='Penalty');axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('topleft',fill=c('green','red'),legend = c('Pair Selected','Pair not Selected'),inset=.02)
plot(rep(n_start:n_end,each=10),RSS,col=colors,xaxt = "n",xlab='n/o randomly generated features (log2)',main='RSS');axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('topleft',fill=c('green','red'),legend = c('Pair Selected','Pair not Selected'),inset=.02)
plot(rep(n_start:n_end,each=10),unlist(L),col=colors,xaxt = "n",xlab='n/o randomly generated features (log2)',main='Lambdas',ylab=expression(paste(lambda)));axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('topleft',fill=c('green','red'),legend = c('Pair Selected','Pair not Selected'),inset=.02)
plot(rep(n_start:n_end,each=10),featlength,ylab='n/o features per fold',col=colors,xaxt = "n",xlab='n/o randomly generated features (log2)',main='Features per Fold');axis(1, at=n_start:n_end, labels=(n_start:n_end));legend('topleft',fill=c('green','red'),legend = c('Pair Selected','Pair not Selected'),inset=.02)
plot(penalty,RSS,col=colors,main='Penalty vs. RSS')

সামান্য মন্তব্য: 'ক্রিয়েফোল্ডস' ব্যবহারের কারণে আপনার 'ক্যারেট' প্যাকেজও লোড হওয়া দরকার।
IWS

2
'ওয়েইনরাইট: উচ্চ মাত্রিক এবং কোলাহলপূর্ণ স্পারসিটি পুনরুদ্ধারের জন্য তীব্র প্রান্তিকতা' এর উপপাদ্য 2 এ দেখুন। আপনি যে শাসনব্যবস্থায় রয়েছেন সেখানে সত্যিকারের সহায়তায় কার্ডিনালিটি 2 নির্দিষ্ট হয়ে গেছে, এবং পি স্থির n এর সাথে বৃদ্ধি পেয়েছে, সম্ভবত যথেষ্ট বৈশিষ্ট্য উপস্থিত থাকলে খুব বেশি সংযোগ থাকতে পারে, যা সফল সমর্থন পুনরুদ্ধারের নিম্ন সম্ভাবনার দিকে নিয়ে যায় যে আপনি লক্ষ্য। (তবে সত্যিকারের সমর্থনে ভেক্টরগুলি যেহেতু খুব ছোট) (যার অর্থ 0 ভেরিয়েন্স 1) মনে হচ্ছে সত্য বয়সের বৈশিষ্ট্যের খুব বড় এন্ট্রি রয়েছে বলে এটি কারণ হতে পারে না) "
ইউজার 795305

1
@ বেন, আমি মনে করি এটি সঠিক ব্যাখ্যা, এবং এই প্রশ্নের জনপ্রিয়তা দেওয়া, আপনি যদি এমন কোনও উত্তর প্রদান করতে পারেন যা এটি কেন এমন তা ব্যাখ্যা করে।
এনআরএইচ

1
@ ম্যাডডেন্কার ^সর্বদা পূর্ণসংখ্যার জন্য আর ডাবল আর্গুমেন্টের জন্য আর। আর-তে ডাবল ফেরত দেয় যদি পূর্ণসংখ্যার ওভারফ্লো ঘটে তবে ডাবল স্যুইচও করে ।
রোল্যান্ড

1
এফওয়াইআই: আমি আমার গিথুব পৃষ্ঠায় একটি আপডেট স্ক্রিপ্ট যুক্ত করেছি। এই স্ক্রিপ্টে আমি কম নমুনা ব্যবহার করি, যা ইতিমধ্যে 2 ^ 5 ভেরিয়েবলগুলিতে সমস্যা প্ররোচিত করে। এটি দ্রুত রান করার সময় দেয় এবং আপনাকে ডেটা নিয়ে আরও পরীক্ষা-নিরীক্ষা করতে সক্ষম করে: github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

উত্তর:


4

এই সমস্যাটি শিক্ষাবিদ এবং গবেষকদের দ্বারা সুপরিচিত। উত্তরটি অবশ্য সহজ নয় এবং পরিসংখ্যানের তুলনায় my আমার মতে optim অপ্টিমাইজেশনের সাথে বেশি সম্পর্কিত per একটি অতিরিক্ত রিজ পেনাল্টি অন্তর্ভুক্ত করে লোকেরা এই ত্রুটিগুলি কাটিয়ে উঠার চেষ্টা করেছে, তাই স্থিতিস্থাপক নেট রিগ্রেশন। এই Tibshirani কাগজ সম্পর্কে সমস্যা (পর্যবেক্ষণ সংখ্যার চেয়ে বড় covariates অর্থাৎ সংখ্যা):পি>এন

লাসো বিচ্ছিন্ন রৈখিক প্রতিরোধের জন্য একটি জনপ্রিয় সরঞ্জাম, বিশেষত এমন সমস্যাগুলির জন্য যেখানে ভেরিয়েবলের সংখ্যা পর্যবেক্ষণের সংখ্যাকে অতিক্রম করে। তবে যখন পি> এন, লাসোর মানদণ্ডটি কঠোরভাবে উত্তল নয়, এবং এর ফলে এটির কোনও অনন্য মিনিমাইজার নাও থাকতে পারে।

@ বেন যেমন উল্লেখ করেছেন, যখন আপনার কাছে 2e16 covariates রয়েছে, এটি সত্যিকারের covariates এর সাথে কিছুটা মিল নয় unlike সুতরাং উপরোক্ত বিষয়টি কেন প্রাসঙ্গিক: লাসো দুটিই বেছে নিতে উদাসীন।

সম্ভবত আরও প্রাসঙ্গিকভাবে এবং আরও সাম্প্রতিকভাবে (২০১৩), পরিসংখ্যানগত পরিস্থিতি আদর্শ (অনিয়ন্ত্রিত ভবিষ্যদ্বাণীকারী, কেবল কয়েকটি বড় প্রভাব) এমনকি কীভাবে লাসো আরও একটি মিথ্যা পজিটিভ তৈরি করে, যেমন আপনি আপনার ডেটাতে যা দেখেন:

রিগ্রেশন সেটিংসে যেখানে ব্যাখ্যামূলক ভেরিয়েবলগুলির খুব কম পারস্পরিক সম্পর্ক থাকে এবং অপেক্ষাকৃত কয়েকটি প্রভাব রয়েছে, প্রতিটি বৃহত্তর মাত্রার, আমরা আশা করি লাসো যদি কিছু ত্রুটিযুক্ত ত্রুটিযুক্ত গুরুত্বপূর্ণ ভেরিয়েবলগুলি খুঁজে পায়। এই কাগজটি দেখায় যে লিনিয়ার স্পারসিটির শাসন ব্যবস্থায় --- এর অর্থ হ'ল অদৃশ্য প্রভাবের সাথে ভেরিয়েবলের ভগ্নাংশটি একটি ধ্রুবকের দিকে ঝোঁক দেয় যদিও ছোট - --- ডিজাইনের ভেরিয়েবলগুলি স্থবিরভাবে স্বতন্ত্র হলেও এমনটি ঘটতে পারে না ।


আমি এটা জানতাম না। আমি ভাসলাম মডেল শনাক্ত করার জন্য লাসো হ'ল একটি নির্ভরযোগ্য, নির্ভরযোগ্য হাতিয়ার (বা কমপক্ষে হ্যাস্টি এবং তিবশিরানী দুটি বই পড়ে এবং নিজেই পদ্ধতিটি ব্যবহার করে আমার ছাপ ছিল)। যেহেতু আপনি বলেন যে সমস্যাটি সুপরিচিত, আপনি কি জানেন যে এর সমাধান / এবং বা বিকল্প পদ্ধতিও আছে কিনা?
ডেল্টাআইভি

যদি আমি সঠিকভাবে বুঝতে পারি তবে এই ফলাফলগুলি কেবল লিনিয়ার স্পারসিটির জন্য বলে মনে হচ্ছে, যখন হাতের সমস্যাটি সাব লিনিয়ার
স্পারসিটি নিয়ে

@ বেন, নিশ্চিত, তবে এটি কাগজটিকে অপ্রাসঙ্গিক করে তোলে না। আমি জানি যে এটি এই সাম্প্রতিক সাহিত্যের এক সাম্প্রতিক টুকরো যা এই বিষয়টি সম্পর্কে স্পর্শ করে। আমি মনে করি এটি সহজ কিছু দেখায়। এমনকি আদর্শ পরিসংখ্যান শর্তের সাথেও লাসোর সেরা বৈশিষ্ট্য নেই।
মোস্তফা এস আইসা

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