LASSO neden mükemmel öngörücü çiftimi yüksek boyutta bulamıyor?


20

Mükemmel bir tahmin çifti bulabildiğini test etmek için R'de LASSO regresyonu ile küçük bir deney yapıyorum. Parite şöyle tanımlanır: f1 + f2 = sonuç

Buradaki sonuç, 'yaş' adı verilen önceden belirlenmiş bir vektördür. F1 ve f2, yaş vektörünün yarısını alıp değerlerin geri kalanını 0'a ayarlayarak oluşturulur, örneğin: age = [1,2,3,4,5,6], f1 = [1,2,3, 0,0,0] ve f2 = [0,0,0,4,5,6]. Bu öngörücü çifti, normal bir dağılım N'den (1, 1) örnekleyerek, rastgele oluşturulan değişkenlerin artan miktarıyla birleştiriyorum.

Gördüğüm şey, 2 ^ 16 değişkene bastığımda, LASSO artık çiftimi bulamıyor. Aşağıdaki sonuçlara bakın.

Veri boyutu başına kat başına özellik sayısıMükemmel çiftin katsayıları

Bu neden oluyor? Sonuçları aşağıdaki komut dosyasıyla çoğaltabilirsiniz. Farklı bir yaş vektörü seçtiğimde, örneğin: [1: 193], o zaman LASSO'nun çifti yüksek boyutta (> 2 ^ 16) bulduğunu fark ettim.

Senaryo:

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

küçük yorum: 'createFolds' kullanımı nedeniyle, ayrıca 'caret' paketinin yüklü olması gerekir.
IWS

2
Bkz. 'Wainwright: Yüksek boyutlu ve gürültülü sparlite iyileşmesi için keskin eşikler' teoremi 2a. Gerçek desteğin sabit kardinalite 2'ye sahip olduğu ve p'nin n sabitiyle büyüdüğü rejimde, yeterli destek varsa, yüksek destek iyileşmesi olasılığının düşük olmasına yol açan çok yüksek korelasyonlar olabilir gibi görünüyor. fark ettiniz. (Bununla birlikte, gerçek destekte olmayan vektörler oldukça küçük olduğu için (ortalama 0 varyans 1), gerçek yaş özelliğinin çok büyük girişleri olduğu için bunun nedeni olmayabilir gibi görünüyor.)
user795305 7:17

1
@Ben, bunun doğru bir açıklama olduğunu düşünüyorum ve bu sorunun popülaritesi göz önüne alındığında, bunun neden böyle olduğunu açıklayan bir cevap verebilirseniz harika olurdu.
NRH

1
@Maddenker ^, R'de tamsayı veya çift bağımsız değişkenler için her zaman bir çift döndürür. R ayrıca tamsayı taşması gerçekleşirse iki katına çıkar.
Roland

1
Bilginize: Github sayfama güncellenmiş bir komut dosyası ekledim. Bu komut dosyasında zaten 2 ^ 5 değişkenlerde soruna neden olan daha az örnek kullanıyorum. Bu, hızlı çalışma sürelerine izin verir ve verilerle daha fazla deneme yapmanızı sağlar: github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

Yanıtlar:


4

p>n

Kement, özellikle değişken sayısının gözlem sayısını aştığı problemler için seyrek doğrusal regresyon için popüler bir araçtır. Ancak p> n olduğunda, kement kriteri kesinlikle dışbükey değildir ve bu nedenle benzersiz bir küçültücü olmayabilir.

@Ben'in de belirttiği gibi, 2e16 ortak değişkeniniz olduğunda, bazıları gerçek ortak değişkenlere oldukça benzemez. Bu nedenle yukarıdaki nokta neden önemlidir: LASSO, birini seçmeye kayıtsızdır.

Belki daha sık olarak ve daha yakın (2013), başka Candes var , LASSO hala böyle verilerinizdeki gördükleri olarak yanlış pozitif, üretir nasıl istatistiksel koşullar olduğunda bile idealdir (ilintisiz belirleyicileri, sadece birkaç büyük etkileri) hakkında kağıt:

Açıklayıcı değişkenlerin çok düşük korelasyonlara sahip olduğu ve her birinin büyük büyüklükte görece az etkisi olduğu regresyon ortamlarında, Kement'in varsa az sayıda hata ile önemli değişkenleri bulmasını bekliyoruz. Bu makale, doğrusal bir uzamsallık rejiminde - yani yok olmayan bir etkiye sahip değişkenlerin oranının sabit olmasına rağmen, küçük olmasına rağmen - tasarım değişkenleri stokastik olarak bağımsız olsalar bile, durumun böyle olamayacağını göstermektedir. .


Bunu bilmiyordum. LASSO'nun seyrek modeli tanımlamak için standart, güvenilir bir araç olduğunu düşündüm (veya en azından iki Hastie ve Tibshirani kitabını okuyarak ve yöntemi kendim kullanarak izlenimimdi). Sorunun iyi bilindiğini söylediğiniz için, çözümlerin ve / veya alternatif yaklaşımların olup olmadığını biliyor musunuz?
DeltaIV

Doğru
anlarsam

@ Elbette, ama bu kağıdı ilgisiz kılmaz. Bu konuya değindiğini bildiğim en son edebiyat parçalarından biri. Bence basit bir şey göstermek için duruyor: İdeal istatistiksel koşullarla bile, LASSO en iyi özelliklere sahip değil.
Mustafa S Eisa

@DeltaIV, LASSO, değişken seçim amacıyla bir dışbükey optimizasyon sezgisidir. Tibshirani'nin kitabında, AIC veya adım adım yöntemlerle benzer bir yol izleyebileceğini gösteriyorlar, ancak bu bir garanti değil. Benim düşünceme göre, sorunlarının çoğu, gerçek bir şey değil sezgisel olduğu gerçeğinden kaynaklanıyor, ancak bunu diğer güzel özelliklere sahip olan dışbükeyliği kazanmak için vazgeçiyorsunuz.
Mustafa S Eisa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.