ทำไม LASSO ถึงไม่หาคู่ทำนายที่สมบูรณ์แบบของฉันในมิติที่สูง?


20

ฉันใช้การทดลองเล็ก ๆ กับ LASSO regression ใน R เพื่อทดสอบว่ามันสามารถหาคู่ทำนายที่สมบูรณ์แบบได้หรือไม่ ทั้งคู่มีการกำหนดดังนี้: f1 + f2 = result

ผลลัพธ์ที่ได้คือเวกเตอร์ที่กำหนดไว้ล่วงหน้าที่เรียกว่า 'อายุ' 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
ดูทฤษฎีบท 2a ของ 'Wainwright: threshold ที่คมชัดสำหรับการกู้คืนข้อมูลที่มีมิติและเสียงรบกวนสูง' ในระบอบการปกครองคุณอยู่ในที่ซึ่งการสนับสนุนที่แท้จริงมีความสำคัญต่อหัวใจคงที่ 2 และ p เติบโตขึ้นด้วย n คงที่ดูเหมือนว่าอาจมีความสัมพันธ์สูงมากหากมีคุณสมบัติเพียงพอซึ่งนำไปสู่ความน่าจะเป็นต่ำในการกู้คืนการสนับสนุนที่ประสบความสำเร็จ ที่คุณสังเกตเห็น (อย่างไรก็ตามเนื่องจากเวกเตอร์ที่ไม่ได้อยู่ในการสนับสนุนที่แท้จริงนั้นมีขนาดค่อนข้างเล็ก (หมายถึง 0 ความแปรปรวน 1) ดูเหมือนว่านี่อาจไม่ใช่เหตุผลเนื่องจากฟีเจอร์อายุที่แท้จริงมีการเข้าร่วมจำนวนมาก)
user795305

1
@Ben ฉันคิดว่านี่เป็นคำอธิบายที่ถูกต้องและด้วยความนิยมของคำถามนี้มันจะดีมากถ้าคุณสามารถให้คำตอบที่อธิบายว่าทำไมถึงเป็นเช่นนั้น
NRH

1
@Maddenker ^ส่งกลับค่า double สำหรับอาร์กิวเมนต์จำนวนเต็มหรือ double ในอาร์อาร์เสมอและจะสลับเป็นสองเท่าหากเกิดการล้นจำนวนเต็ม
Roland

1
FYI: ฉันได้เพิ่มสคริปต์ที่อัปเดตแล้วในหน้า GitHub ของฉัน ในสคริปต์นี้ฉันใช้ตัวอย่างน้อยลงซึ่งทำให้เกิดปัญหาที่ตัวแปร 2 ^ 5 สิ่งนี้จะช่วยให้เวลารันรวดเร็วและช่วยให้คุณสามารถทดลองกับข้อมูลได้มากขึ้น: github.com/sjorsvanheuveln/LASSO_pair_problem
Ansjovis86

คำตอบ:


4

พี>n

บาศเป็นเครื่องมือยอดนิยมสำหรับการถดถอยเชิงเส้นแบบเบาบางโดยเฉพาะอย่างยิ่งสำหรับปัญหาที่จำนวนตัวแปรเกินจำนวนการสังเกต แต่เมื่อ p> n เกณฑ์ของบ่วงบาศจะไม่นูนออกมาอย่างเข้มงวดและด้วยเหตุนี้จึงอาจไม่มีตัวย่อขนาดพิเศษ

ดังที่ @ben ได้กล่าวไว้เมื่อคุณมีโควาเรีย 2e16 มันไม่เหมือนกับบางโควาเรียที่แท้จริง ดังนั้นทำไมประเด็นข้างต้นจึงเกี่ยวข้อง: LASSO ไม่สนใจที่จะเลือกอย่างใดอย่างหนึ่ง

บางทีอาจมีความเกี่ยวข้องมากขึ้นและเร็ว ๆ นี้ (2013) มีกระดาษCandes อีกฉบับเกี่ยวกับวิธีการแม้ว่าเงื่อนไขทางสถิติจะเหมาะสมที่สุด (ตัวทำนายที่ไม่เกี่ยวข้องกับเอฟเฟ็กต์ขนาดใหญ่) LASSO ยังคงสร้างผลบวกปลอมเช่นสิ่งที่คุณเห็นในข้อมูลของคุณ

ในการตั้งค่าการถดถอยที่ตัวแปรอธิบายมีความสัมพันธ์ต่ำมากและมีผลกระทบน้อยมากแต่ละขนาดใหญ่เราคาดว่า Lasso จะค้นหาตัวแปรสำคัญที่มีข้อผิดพลาดเล็กน้อยถ้ามี กระดาษนี้แสดงให้เห็นว่าในระบอบการปกครองของ sparsity เชิงเส้นหมายถึงส่วนของตัวแปรที่มีเอฟเฟ็กต์ที่ไม่หายไปมีแนวโน้มที่จะคงที่ แต่ขนาดเล็ก --- นี่ไม่สามารถเป็นจริงได้แม้ในขณะที่ตัวแปรการออกแบบ .


ฉันไม่รู้ ฉันคิดว่า LASSO เป็นเครื่องมือมาตรฐานที่เชื่อถือได้ในการระบุรูปแบบกระจัดกระจาย (หรืออย่างน้อยนั่นก็คือความประทับใจของฉันโดยการอ่านหนังสือ Hastie และ Tibshirani สองเล่มและใช้วิธีการด้วยตัวเอง) เมื่อคุณพูดว่าปัญหาเป็นที่รู้จักกันดีคุณรู้หรือไม่ว่ายังมีวิธีแก้ไขปัญหา / หรือแนวทางอื่น
DeltaIV

หากฉันเข้าใจอย่างถูกต้องผลลัพธ์เหล่านี้ดูเหมือนจะเป็นเพียงเสี้ยมเชิงเส้นในขณะที่ปัญหาที่มือกังวลเกี่ยวกับการ
กระจัดกระจายเป็น

@Ben แน่นอน แต่นั่นไม่ได้ทำให้กระดาษไม่เกี่ยวข้อง มันเป็นหนึ่งในวรรณกรรมชิ้นล่าสุดที่ฉันรู้ว่ามันเกี่ยวกับเรื่องนี้ ฉันคิดว่ามันแสดงให้เห็นถึงสิ่งที่เรียบง่าย: แม้จะมีเงื่อนไขทางสถิติในอุดมคติ LASSO ก็ยังไม่มีคุณสมบัติที่ดีที่สุด
Mustafa S Eisa

@ DeltaIV, LASSO เป็นวิธีแก้ปัญหาการเพิ่มประสิทธิภาพนูนสำหรับวัตถุประสงค์ในการเลือกตัวแปร ในหนังสือของ Tibshirani พวกเขาแสดงให้เห็นว่าสามารถทำตามแนวทางที่คล้ายกันกับ AIC หรือวิธีการขั้นตอนที่ฉลาด แต่นี่ไม่ใช่การรับประกัน ในความคิดของฉันปัญหาส่วนใหญ่มาจากความจริงที่ว่ามันเป็นการแก้ปัญหาและไม่ใช่ของจริง แต่คุณยอมแพ้เพื่อให้ได้นูนซึ่งมีคุณสมบัติที่ดีอื่น ๆ
Mustafa S Eisa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.