LASSO को उच्च आयामीता में मेरी सही भविष्यवक्ता जोड़ी क्यों नहीं मिल रही है?


20

मैं आर में LASSO प्रतिगमन के साथ एक छोटा सा प्रयोग कर रहा हूं ताकि यह जांचा जा सके कि क्या वह एक सटीक भविष्यवक्ता जोड़ी खोजने में सक्षम है। जोड़ी को इस तरह परिभाषित किया गया है: f1 + f2 = परिणाम

यहाँ परिणाम एक पूर्वनिर्धारित वेक्टर है जिसे 'आयु' कहा जाता है। एफ 1 और एफ 2 आयु वेक्टर के आधे हिस्से को लेकर और शेष मानों को 0 पर सेट करके बनाया जाता है, उदाहरण के लिए: आयु = [1,2,3,4,5,6], f1 = [1,2,3, 0,0,0] और f2 = [0,0,0,4,5,6]। मैं इस भविष्यवक्ता की जोड़ी को एक सामान्य वितरण एन (1,1) से नमूने द्वारा यादृच्छिक रूप से बनाए गए चर की बढ़ती मात्रा के साथ जोड़ता हूं।

जब मैं देखता हूं कि जब मैं 2 ^ 16 चर मारता हूं, तो LASSO को मेरी जोड़ी नहीं मिल रही है। नीचे परिणाम देखें।

प्रति डेटा आकार प्रति गुना सुविधाओं की संख्यासही जोड़ी के गुणांक

ये क्यों हो रहा है? आप नीचे स्क्रिप्ट के साथ परिणाम पुन: पेश कर सकते हैं। मैंने देखा है कि जब मैं एक अलग आयु का सदिश चुनता हूं, जैसे: [1: 193] तो LASSO उच्च आयामीता (> 2 ^ 16) में जोड़ी पाता है।

लिपी:

## 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')

मामूली टिप्पणी: 'createFolds' के उपयोग के कारण, आपको 'caret' पैकेज लोड करने की भी आवश्यकता है।
IWS

2
'वेनराईट: हाई डायनॉमिक और नॉइज़ स्पार्सिटी रिकवरी के लिए तेज दहलीज' का प्रमेय 2a देखें। आप जिस शासन में हैं, जहाँ सच्चे समर्थन में कार्डिनैलिटी 2 निर्धारित है, और p, n निश्चित के साथ बढ़ता है, तो संभावना है कि पर्याप्त सुविधाएँ होने पर बहुत अधिक सहसंबंध हो सकते हैं, जिससे सफल समर्थन पुनर्प्राप्ति की कम संभावना होती है आप ध्यान दें। (हालांकि, क्योंकि वेक्टर्स सच्चे सपोर्ट में नहीं होते हैं, वे बहुत छोटे होते हैं (मतलब 0 वेरिएशन 1) ऐसा लगता है कि यह कारण नहीं हो सकता है क्योंकि ट्रू एज फीचर में बहुत बड़ी
एंट्रीज हैं

1
@, मुझे लगता है कि यह सही स्पष्टीकरण है, और इस प्रश्न की लोकप्रियता को देखते हुए, यह बहुत अच्छा होगा, यदि आप एक उत्तर दे सकते हैं जो बताता है कि ऐसा क्यों है।
NRH

1
@ मैडेनकर ^हमेशा पूर्णांक के लिए एक डबल लौटाता है या आर। आर में डबल तर्क भी दोगुना हो जाता है यदि पूर्णांक ओवरफ़्लो होता।
रोलैंड

1
FYI करें: मैंने अपने github पेज पर एक अद्यतन स्क्रिप्ट जोड़ी है। इस स्क्रिप्ट में मैं कम नमूनों का उपयोग करता हूं, जो पहले से ही 2 ^ 5 चर पर समस्या को प्रेरित करता है। यह त्वरित रन समय की अनुमति देता है और आपको डेटा के साथ अधिक प्रयोग करने में सक्षम बनाता है: github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

जवाबों:


4

इस समस्या को शिक्षाविदों और शोधकर्ताओं द्वारा अच्छी तरह से जाना जाता है। हालाँकि, इसका उत्तर सरल नहीं है और यह मेरी राय से अधिक है-आँकड़ों की तुलना में अनुकूलन के लिए। लोगों ने एक अतिरिक्त रिज दंड को शामिल करके इन कमियों को दूर करने का प्रयास किया है, इसलिए लोचदार शुद्ध प्रतिगमन। यह तिब्शीरानी पेपर बारे में है (अर्थात संख्या का अवलोकनों की संख्या की तुलना में बड़ा) समस्या:पी>n

लसो विरल रेखीय प्रतिगमन के लिए एक लोकप्रिय उपकरण है, विशेष रूप से समस्याओं के लिए जिसमें चर की संख्या अवलोकन की संख्या से अधिक है। लेकिन जब p> n, लसो मानदंड कड़ाई से उत्तल नहीं होता है, और इसलिए इसमें एक अद्वितीय न्यूनतम नहीं हो सकता है।

जैसा कि @बेन ने उल्लेख किया है, जब आपके पास 2e16 कोवरिएट होते हैं, तो इसके विपरीत नहीं, कुछ सच्चे कोवरिएट्स के समान होते हैं। इसलिए, उपरोक्त बिंदु प्रासंगिक क्यों है: LASSO किसी एक को चुनने के लिए उदासीन है।

शायद अधिक प्रासंगिक रूप से और हाल ही में (2013), एक और कैंडिस पेपर है कि कैसे, यहां तक ​​कि जब सांख्यिकीय स्थितियां आदर्श होती हैं (असंबंधित भविष्यवाणियां, केवल कुछ बड़े प्रभाव), LASSO अभी भी गलत सकारात्मकता पैदा करता है, जैसे कि आप अपने डेटा में क्या देखते हैं:

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


मुझे नहीं पता था। मैंने सोचा कि LASSO विरल मॉडल की पहचान करने के लिए एक मानक, विश्वसनीय उपकरण था (या कम से कम दो हस्ति और तिब्शीरानी पुस्तकों को पढ़कर और स्वयं विधि का उपयोग करके मेरी छाप थी)। चूंकि आप कहते हैं कि समस्या अच्छी तरह से ज्ञात है, क्या आप जानते हैं कि क्या समाधान / और वैकल्पिक दृष्टिकोण भी हैं?
डेल्टा

अगर मैं सही ढंग से समझूं, तो ये परिणाम केवल लीनियर स्पार्सिटी के लिए ही प्रतीत होते हैं, जबकि हाथ में समस्या उप लीनियर स्पार्सिटी की समस्या है
user795305

@, यकीन है, लेकिन यह कागज अप्रासंगिक नहीं करता है। यह साहित्य के सबसे हालिया टुकड़ों में से एक है जो मुझे पता है कि इस मुद्दे पर छूता है। मुझे लगता है कि यह कुछ सरल दिखाने के लिए खड़ा है: आदर्श सांख्यिकीय स्थितियों के साथ भी, LASSO में सर्वोत्तम गुण नहीं हैं।
मुस्तफा एस आइसा

@DeltaIV, LASSO परिवर्तनीय चयन के उद्देश्य के लिए उत्तल अनुकूलन है। टिब्शीरानी की पुस्तक में, वे बताते हैं कि यह एआईसी या चरण-वार तरीकों के समान मार्ग का अनुसरण कर सकता है, लेकिन यह कोई गारंटी नहीं है। मेरी राय में, इसकी अधिकांश समस्याएं इस तथ्य से आती हैं कि यह एक हेयुरिस्टिक है और वास्तविक चीज नहीं है, लेकिन आप इसे उत्तलता प्राप्त करने के लिए देते हैं जिसमें अन्य अच्छे गुण हैं।
मुस्तफा एस आइसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.