Tại sao LASSO không tìm thấy cặp dự đoán hoàn hảo của tôi ở chiều cao?


20

Tôi đang chạy một thử nghiệm nhỏ với hồi quy LASSO trong R để kiểm tra xem nó có thể tìm thấy một cặp dự đoán hoàn hảo hay không. Cặp được định nghĩa như thế này: f1 + f2 = kết quả

Kết quả ở đây là một vectơ định trước được gọi là 'tuổi'. F1 và f2 được tạo bằng cách lấy một nửa vectơ tuổi và đặt phần còn lại của các giá trị thành 0, ví dụ: age = [1,2,3,4,5,6], f1 = [1,2,3, 0,0,0] và f2 = [0,0,0,4,5,6]. Tôi kết hợp cặp dự đoán này với số lượng biến được tạo ngẫu nhiên ngày càng tăng bằng cách lấy mẫu từ phân phối bình thường N (1,1).

Những gì tôi thấy là khi tôi nhấn 2 ^ 16 biến, LASSO không tìm thấy cặp của tôi nữa. Xem kết quả dưới đây.

Số lượng tính năng trên mỗi lần cho mỗi kích thước dữ liệuHệ số của cặp hoàn hảo

Tại sao chuyện này đang xảy ra? Bạn có thể tái tạo kết quả với kịch bản dưới đây. Tôi đã nhận thấy rằng khi tôi chọn một vectơ tuổi khác, ví dụ: [1: 193] thì LASSO sẽ tìm thấy cặp ở chiều cao (> 2 ^ 16).

Kịch bản:

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

nhận xét nhỏ: do sử dụng 'createFold', bạn cũng cần gói 'caret' được tải.
IWS

2
Xem định lý 2a của 'Wainwright: Ngưỡng sắc nét để phục hồi độ thưa và chiều cao'. Trong chế độ bạn đang ở, nơi hỗ trợ thực sự đã cố định cardinality 2 và p phát triển với n cố định, có vẻ như có thể có tương quan rất cao nếu có đủ tính năng, dẫn đến xác suất phục hồi hỗ trợ thành công thấp mà bạn nhận thấy (Tuy nhiên, vì các vectơ không có trong hỗ trợ thực sự khá nhỏ (trung bình 0 phương sai 1) nên có vẻ như đây không phải là lý do vì tính năng tuổi thật có các mục rất lớn.)
user795305 7/2/2017

1
@Ben, tôi nghĩ rằng đây là lời giải thích chính xác, và với sự phổ biến của câu hỏi này, nó sẽ rất tuyệt, nếu bạn có thể cung cấp một câu trả lời giải thích tại sao điều này lại như vậy.
NRH

1
@Maddenker ^luôn trả về giá trị gấp đôi cho số nguyên hoặc số kép trong R. R cũng chuyển sang nhân đôi nếu xảy ra tràn số nguyên.
Roland

1
FYI: Tôi đã thêm một tập lệnh cập nhật trên trang github của mình. Trong kịch bản này, tôi sử dụng ít mẫu hơn, điều này gây ra sự cố ở 2 ^ 5 biến. Điều này cho phép thời gian chạy nhanh và cho phép bạn thử nghiệm nhiều hơn với dữ liệu: github.com/sjorsvanheuveln/LASSO_
Pair_probols

Câu trả lời:


3

p>n

Lasso là một công cụ phổ biến để hồi quy tuyến tính thưa thớt, đặc biệt đối với các vấn đề trong đó số lượng biến vượt quá số lượng quan sát. Nhưng khi p> n, tiêu chí Lasso không lồi hoàn toàn, và do đó nó có thể không có một bộ thu nhỏ duy nhất.

Như @ben đã đề cập, khi bạn có 2e16 đồng biến, không khác gì một số khá giống với hiệp phương sai thực sự. Do đó, tại sao điểm trên có liên quan: LASSO không quan tâm đến việc chọn một trong hai.

Có lẽ phù hợp hơn và gần đây hơn (2013), có một bài báo khác về cách thức, ngay cả khi điều kiện thống kê là lý tưởng (dự đoán không tương thích, chỉ có một vài hiệu ứng lớn), LASSO vẫn tạo ra các kết quả dương tính giả, như những gì bạn nhìn thấy trong dữ liệu của mình:

Trong cài đặt hồi quy nơi các biến giải thích có tương quan rất thấp và có tương đối ít hiệu ứng, mỗi cường độ lớn, chúng tôi hy vọng Lasso sẽ tìm thấy các biến quan trọng với một vài lỗi, nếu có. Bài viết này cho thấy rằng trong một chế độ thưa thớt tuyến tính --- có nghĩa là phần các biến có hiệu ứng không biến mất có xu hướng không đổi, tuy nhiên nhỏ --- điều này thực sự không thể xảy ra, ngay cả khi các biến thiết kế độc lập ngẫu nhiên .


Tôi không biết điều đó. Tôi nghĩ rằng LASSO là một công cụ tiêu chuẩn, đáng tin cậy để xác định mô hình thưa thớt (hoặc ít nhất đó là ấn tượng của tôi bằng cách đọc hai cuốn sách của Hastie và Tibshirani và bằng cách sử dụng phương pháp này). Vì bạn nói rằng vấn đề là nổi tiếng, bạn có biết nếu có cũng có giải pháp / và phương pháp thay thế không?
DeltaIV

Nếu tôi hiểu chính xác, những kết quả này dường như chỉ dành cho độ thưa tuyến tính, trong khi vấn đề hiện tại liên quan đến độ thưa tuyến tính phụ
user795305

@Ben, chắc chắn, nhưng điều đó không làm cho bài báo không liên quan. Đó là một trong những tác phẩm văn học gần đây nhất mà tôi biết về vấn đề này. Tôi nghĩ rằng nó thể hiện một điều đơn giản: Ngay cả với các điều kiện thống kê lý tưởng, LASSO không có các thuộc tính tốt nhất.
Mustafa S Eisa

@DeltaIV, LASSO là một heuristic tối ưu hóa lồi cho mục đích lựa chọn biến. Trong cuốn sách của Tibshirani, họ cho thấy nó có thể đi theo một con đường tương tự như phương pháp AIC hoặc phương pháp từng bước, nhưng điều này không đảm bảo. Theo tôi, hầu hết các vấn đề của nó xuất phát từ thực tế rằng đó là một vấn đề heuristic và không phải là thực tế, nhưng bạn từ bỏ điều đó để đạt được sự lồi lõm có các tính chất tốt đẹp khác.
Mustafa S Eisa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.