LASSO가 높은 차원에서 완벽한 예측 변수 쌍을 찾지 못하는 이유는 무엇입니까?


20

완벽한 예측 변수 쌍을 찾을 수 있는지 테스트하기 위해 R에서 LASSO 회귀로 작은 실험을 진행하고 있습니다. 쌍은 다음과 같이 정의됩니다 : f1 + f2 = 결과

결과는 '나이'라고하는 미리 정해진 벡터입니다. F1 및 f2는 연령 벡터의 절반을 취하고 나머지 값을 0으로 설정하여 작성합니다 (예 : age = [1,2,3,4,5,6], f1 = [1,2,3, 0,0,0] 및 f2 = [0,0,0,4,5,6]. 정규 분포 N (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
'Wainwright : 고차원 및 시끄러운 희소성 회복을위한 예리한 임계 값'정리 2a를 참조하십시오. 실제 지원이 카디널리티 2를 고정하고 p가 n 고정으로 증가하는 정권에서 충분한 기능이 있으면 상관 관계가 매우 높아서 지원 복구 성공 가능성이 낮아지는 것처럼 보입니다. 알다시피 (그러나 실제 지원에 포함되지 않은 벡터는 매우 작기 때문에 (평균 0 분산 1) 실제 연령 피처가 매우 큰 항목이므로 이것이 이유가 아닐 수 있습니다.)
user795305

1
@ 벤, 나는 이것이 올바른 설명이라고 생각하며,이 질문의 인기를 감안할 때 이것이 왜 그런지를 설명하는 대답을 제공 할 수 있다면 좋을 것입니다.
NRH

1
@Maddenker는 ^항상 R에서 정수 또는 이중 인수에 대해 double을 반환합니다. 정수 오버플로가 발생하면 R도 double로 전환됩니다.
Roland

1
참고 : github 페이지에 업데이트 된 스크립트를 추가했습니다. 이 스크립트에서는 더 적은 샘플을 사용하므로 2 ^ 5 변수에서 이미 문제가 발생합니다. 이를 통해 빠른 실행 시간이 가능하고 데이터를 더 많이 실험 할 수 있습니다. github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

답변:


3

> (즉, 관측치보다 큰 공변량의 수) 문제에 관한 것입니다.

올가미는 희소 선형 회귀 분석, 특히 변수 수가 관측치 수를 초과하는 문제에 널리 사용되는 도구입니다. 그러나 p> n 일 때 올가미 기준은 엄격하게 볼록하지 않으므로 고유 한 최소화 기가 없을 수 있습니다.

@ben에서 언급했듯이 2e16 공변량이 있으면 일부가 실제 공변량과 매우 유사하지는 않습니다. 따라서 위의 요점이 중요한 이유 : LASSO는 어느 하나를 선택하는 데 무관심합니다.

아마도 더 관련성 있고 최근에 (2013), 통계 조건이 이상적 일 때 ( 무관심한 예측 변수, 몇 가지 큰 효과 만) LASSO가 데이터에서 보는 것과 같이 여전히 거짓 긍정을 생성하는 방법에 대한 또 다른 Candes 논문이 있습니다.

설명 변수가 상관 관계가 매우 낮고 각 효과가 상대적으로 적은 효과가있는 회귀 설정에서 올가미는 오류가 거의없는 중요한 변수를 찾을 것으로 예상합니다. 이 논문은 선형 희소성 체제에서 (비 소멸 효과를 갖는 변수의 비율이 일정하지만 작은 경향이 있음을 의미 함), 설계 변수가 확률 적으로 독립적 일 때도 실제로는 불가능합니다. .


나는 몰랐다. 나는 LASSO가 희소 모델을 식별하기위한 표준적이고 신뢰할 수있는 도구라고 생각했다. (또는 적어도 두 개의 Hastie와 Tibshirani 책을 읽고 그 방법을 사용함으로써 나의 인상이었다). 문제가 잘 알려져 있다고 말하면서 솔루션 및 / 또는 대체 방법이 있는지 알고 있습니까?
DeltaIV

만약 내가 제대로 이해하고, 이러한 결과는 만 선형 희소성이 될 것 같다 동안 희소성 선형 손 우려 하위의 문제
user795305

@Ben, 물론 그렇다고해서 용지가 관련이없는 것은 아닙니다. 그것은 내가 아는 가장 최근의 문헌 중 하나입니다. 이상적인 통계 조건이 있더라도 LASSO는 최상의 특성을 갖지 않습니다.
Mustafa S Eisa

@DeltaIV, LASSO는 변수 선택을 목적으로 볼록 최적화 휴리스틱입니다. Tibshirani의 저서에서는 AIC 또는 단계별 방법과 유사한 경로를 따를 수 있음을 보여 주지만 이것이 보장되는 것은 아닙니다. 내 의견으로는, 대부분의 문제는 그것이 휴리스틱이고 실제가 아니라는 사실에서 비롯되지만 다른 멋진 속성을 가진 볼록성을 얻기 위해 포기합니다.
Mustafa S Eisa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.