Чому LASSO не знаходить мою ідеальну пару передбачувачів у високій розмірності?


20

Я проводжу невеликий експеримент з регресією LASSO в R, щоб перевірити, чи зможе він знайти ідеальну пару передбачувачів. Пара визначається так: 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
Дивіться теорему 2а «Вайнрайт: Різні пороги для відновлення великої розмірності та шумного розрідження». У режимі, в якому ви перебуваєте, де справжня підтримка має фіксовану кардинальність 2, а p росте з n фіксованими, мабуть, може бути дуже висока кореляція, якщо є достатньо функцій, що призводить до низької ймовірності успішного відновлення підтримки що ви помічаєте (Однак, оскільки векторів, що не відповідають справжній підтримці, досить мало (середнє значення 0 відхилення 1), схоже, це не може бути причиною, оскільки у функції вірного віку є дуже великі записи.)
user795305

1
@Ben, я думаю, що це правильне пояснення, і зважаючи на популярність цього питання, було б чудово, якби ви могли дати відповідь, яка пояснює, чому це так.
NRH

1
@Maddenker ^завжди повертає дубль для цілих чи подвійних аргументів у R. R також перемикається на подвійні, якщо відбудеться переповнення цілого числа.
Роланд

1
FYI: Я додав оновлений сценарій на свою сторінку github. У цьому сценарії я використовую менше зразків, що викликає проблему вже на 2 ^ 5 змінних. Це дозволяє швидко виконувати час та дає змогу більше експериментувати з даними: github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

Відповіді:


4

p>н

Ласо є популярним інструментом для розрідженої лінійної регресії, особливо для проблем, в яких кількість змінних перевищує кількість спостережень. Але коли p> n, критерій ласо не є строго опуклим, а значить, він може не мати унікального мінімізатора.

Як згадував @ben, коли у вас є 2e16 коваріатів, це не на відміну від того, що деякі досить схожі на справжні коваріати. Звідси актуальне вищезазначене: LASSO байдуже до вибору будь-якого.

Можливо, більш доречно і нещодавно (2013 р.), Є ще один документ Candes про те, як навіть коли статистичні умови є ідеальними (некорельовані прогнози, лише декілька великих ефектів), LASSO все ще видає помилкові позитиви, наприклад, що ви бачите у своїх даних:

У налаштуваннях регресії, де пояснювальні змінні мають дуже низьку кореляцію і є порівняно мало ефектів, кожен з яких має велику величину, ми очікуємо, що Лассо знайде важливі змінні з невеликими помилками, якщо такі є. У цій роботі показано, що в режимі лінійної розрідженості - це означає, що частка змінних з не зникаючим ефектом має тенденцію до постійної, хоч і невеликої --- це насправді не може бути, навіть коли проектні змінні стохастично незалежні .


Я цього не знав. Я подумав, що LASSO є стандартним, надійним інструментом для виявлення розрідженої моделі (або, принаймні, таке було моє враження, читаючи дві книги Хасті та Тібшірані та сам використовуючи метод). Оскільки ви кажете, що проблема загальновідома, чи знаєте ви, чи є також рішення / та чи альтернативні підходи?
DeltaIV

Якщо я правильно розумію, ці результати здаються лише лінійною рідкістю, тоді як проблема, що стосується, стосується
сублінійної

@ Безумовно, але це не робить папір неактуальною. Це один із останніх відомих мені літературних творів, який стосується цієї проблеми. Я думаю, що варто показати щось просте: Навіть при ідеальних статистичних умовах LASSO має не найкращі властивості.
Mustafa S Eisa

@DeltaIV, LASSO - евристика опуклої оптимізації з метою вибору змінної. У книзі Тібшірані вони показують, що він може пройти аналогічний шлях, як AIC або поетапні методи, але це не є гарантією. На мою думку, більшість її проблем пов'язані з тим, що це евристична, а не реальна річ, але ви відмовляєтесь від цього, щоб отримати опуклість, яка має й інші приємні властивості.
Мустафа S Еїза
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.