为什么LASSO在高维度上找不到我的理想预测变量对?


20

我正在R中进行LASSO回归的小型实验,以测试它是否能够找到理想的预测变量对。该对的定义如下:f1 + f2 =结果

这里的结果是称为“年龄”的预定向量。通过取年龄向量的一半并将其余值设置为0,可以创建F1和f2,例如: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,2017年

1
@Ben,我认为这是正确的解释,并且鉴于这个问题的普遍性,如果您能提供一个解释为什么如此的答案,那将是很好的。
NRH

1
@Maddenker ^始终为R中的整数或双精度参数返回双精度。如果将发生整数溢出,R也会切换为双精度。
罗兰

1
仅供参考:我在github页面上添加了更新的脚本。在此脚本中,我使用的样本更少,这已经在2 ^ 5变量处引发了问题。这样可以缩短运行时间,并使您可以对数据进行更多的实验:github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

Answers:


4

这个问题是学者和研究人员所熟知的。但是,答案并不简单,在我看来,与优化相比,与优化有关的更多。人们已经尝试通过包括额外的岭惩罚来克服这些缺陷,从而实现弹性净回归。Tibshirani的这篇文章是关于p>ñ (即协变量的数量大于观察值的数量)问题:

套索是用于稀疏线性回归的流行工具,尤其是对于变量数超过观察数的问题。但是当p> n时,套索准则不是严格凸的,因此它可能没有唯一的极小值。

正如@ben所提到的,当您拥有2e16个协变量时,它与某些真正的协变量非常相似。因此,上述观点为何有意义:LASSO毫不犹豫地选择其中一个。

也许更相关且最近(2013年),还有Candes的一篇论文,关于即使统计条件理想(不相关的预测变量,只有几个大的影响)时,LASSO仍会产生假阳性,例如您在数据中看到的结果:

在回归变量中,解释变量的相关性非常低,影响相对较小,每个变量的影响幅度都很大,我们希望套索能够找到误差很小的重要变量,如果有的话。本文表明,在线性稀疏状态下-意味着具有不消失效果的变量比例趋于恒定,尽管很小-即使设计变量是随机独立的,情况也并非如此。


我不知道 我以为LASSO是识别稀疏模型的标准,可靠工具(或者至少通过阅读Hastie和Tibshirani的两本书,以及自己使用该方法,给我留下的印象)。既然您说问题是众所周知的,那么您是否知道是否还有解决方案和/或替代方法?
DeltaIV

如果我正确理解,这些结果似乎仅适用于线性稀疏性,而当前的问题涉及次线性稀疏性
user795305

@Ben,当然,但这不会使纸张无关紧要。这是我所知的涉及这一问题的最新文献之一。我认为这似乎表明很简单:即使具有理想的统计条件,LASSO也不具有最佳性能。
Mustafa S Eisa '02

@ DeltaIV,LASSO是用于变量选择的凸优化启发式方法。在Tibshirani的书中,他们表明,它可以遵循与AIC或逐步方法类似的路径,但这不是保证。在我看来,它的大多数问题都来自这样一个事实,那就是它是一种启发式方法,而不是真实的东西,但是您放弃了它而获得了具有其他不错特性的凸性。
Mustafa S Eisa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.