Tại sao Lars và Glmnet đưa ra các giải pháp khác nhau cho vấn đề Lasso?


22

Tôi muốn hiểu rõ hơn về các gói R LarsGlmnet, được sử dụng để giải quyết vấn đề Lasso: (đối với Biến và mẫu, xem www.stanford.edu/~hastie/Papers/glmnet.pdf trên trang 3)p

min(β0β)Rp+1[12Ni=1N(yiβ0xiTβ)2+λ||β||l1]
pN

Do đó, tôi đã áp dụng cả hai trên cùng một tập dữ liệu đồ chơi. Thật không may, hai phương pháp không đưa ra cùng một giải pháp cho cùng một dữ liệu đầu vào. Có ai có ý tưởng về sự khác biệt đến từ đâu không?

Tôi đã thu được kết quả như sau: Sau khi tạo một số dữ liệu (8 mẫu, 12 tính năng, thiết kế Toeplitz, mọi thứ đều tập trung), tôi đã tính toán toàn bộ đường dẫn Lasso bằng Lars. Sau đó, tôi chạy Glmnet bằng chuỗi lambdas được tính toán bởi Lars (nhân với 0,5) và hy vọng sẽ có được giải pháp tương tự, nhưng tôi đã không làm thế.

Người ta có thể thấy rằng các giải pháp là tương tự nhau. Nhưng làm thế nào tôi có thể giải thích sự khác biệt? Vui lòng tìm mã của tôi dưới đây. Có một câu hỏi liên quan ở đây: GLMNET hoặc LARS để tính toán các giải pháp LASSO? , nhưng nó không chứa câu trả lời cho câu hỏi của tôi.

Thiết lập:

# Load packages.
library(lars)
library(glmnet)
library(MASS)

# Set parameters.
nb.features <- 12
nb.samples <- 8
nb.relevant.indices <- 3
snr <- 1
nb.lambdas <- 10

# Create data, not really important. 
sigma <- matrix(0, nb.features, nb.features)
for (i in (1:nb.features)) {
  for (j in (1:nb.features)) {
    sigma[i, j] <- 0.99 ^ (abs(i - j))
  }
}

x <- mvrnorm(n=nb.samples, rep(0, nb.features), sigma, tol=1e-6, empirical=FALSE)
relevant.indices <- sample(1:nb.features, nb.relevant.indices, replace=FALSE)
x <- scale(x)
beta <- rep(0, times=nb.features)
beta[relevant.indices] <- runif(nb.relevant.indices, 0, 1)
epsilon <- matrix(rnorm(nb.samples),nb.samples, 1)
simulated.snr <-(norm(x %*% beta, type="F")) / (norm(epsilon, type="F"))
epsilon <- epsilon * (simulated.snr / snr)
y <- x %*% beta + epsilon
y <- scale(y)

kẻ nói dối

la <- lars(x, y, intercept=TRUE, max.steps=1000, use.Gram=FALSE)
co.lars <- as.matrix(coef(la, mode="lambda"))
print(round(co.lars, 4))

#          [,1] [,2] [,3]   [,4]   [,5]   [,6]    [,7]   [,8]    [,9]   [,10]
#  [1,]  0.0000    0    0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000  0.0000
#  [2,]  0.0000    0    0 0.0000 0.0000 0.1735  0.0000 0.0000  0.0000  0.0000
#  [3,]  0.0000    0    0 0.2503 0.0000 0.4238  0.0000 0.0000  0.0000  0.0000
#  [4,]  0.0000    0    0 0.1383 0.0000 0.7578  0.0000 0.0000  0.0000  0.0000
#  [5,] -0.1175    0    0 0.2532 0.0000 0.8506  0.0000 0.0000  0.0000  0.0000
#  [6,] -0.3502    0    0 0.2676 0.3068 0.9935  0.0000 0.0000  0.0000  0.0000
#  [7,] -0.4579    0    0 0.6270 0.0000 0.9436  0.0000 0.0000  0.0000  0.0000
#  [8,] -0.7848    0    0 0.9970 0.0000 0.9856  0.0000 0.0000  0.0000  0.0000
#  [9,] -0.3175    0    0 0.0000 0.0000 3.4488  0.0000 0.0000 -2.1714  0.0000
# [10,] -0.4842    0    0 0.0000 0.0000 4.7731  0.0000 0.0000 -3.4102  0.0000
# [11,] -0.4685    0    0 0.0000 0.0000 4.7958  0.0000 0.1191 -3.6243  0.0000
# [12,] -0.4364    0    0 0.0000 0.0000 5.0424  0.0000 0.3007 -4.0694 -0.4903
# [13,] -0.4373    0    0 0.0000 0.0000 5.0535  0.0000 0.3213 -4.1012 -0.4996
# [14,] -0.4525    0    0 0.0000 0.0000 5.6876 -1.5467 1.5095 -4.7207  0.0000
# [15,] -0.4593    0    0 0.0000 0.0000 5.7355 -1.6242 1.5684 -4.7440  0.0000
# [16,] -0.4490    0    0 0.0000 0.0000 5.8601 -1.8485 1.7767 -4.9291  0.0000
#         [,11]  [,12]
#  [1,]  0.0000 0.0000
#  [2,]  0.0000 0.0000
#  [3,]  0.0000 0.0000
#  [4,] -0.2279 0.0000
#  [5,] -0.3266 0.0000
#  [6,] -0.5791 0.0000
#  [7,] -0.6724 0.2001
#  [8,] -1.0207 0.4462
#  [9,] -0.4912 0.1635
# [10,] -0.5562 0.2958
# [11,] -0.5267 0.3274
# [12,]  0.0000 0.2858
# [13,]  0.0000 0.2964
# [14,]  0.0000 0.1570
# [15,]  0.0000 0.1571

glmnet với lambda = (lambda_lars / 2):

glm2 <- glmnet(x, y, family="gaussian", lambda=(0.5 * la$lambda), thresh=1e-16)
co.glm2 <- as.matrix(t(coef(glm2, mode="lambda")))
print(round(co.glm2, 4))

#     (Intercept)      V1 V2 V3     V4     V5     V6      V7     V8      V9
# s0            0  0.0000  0  0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000
# s1            0  0.0000  0  0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000
# s2            0  0.0000  0  0 0.2385 0.0000 0.4120  0.0000 0.0000  0.0000
# s3            0  0.0000  0  0 0.2441 0.0000 0.4176  0.0000 0.0000  0.0000
# s4            0  0.0000  0  0 0.2466 0.0000 0.4200  0.0000 0.0000  0.0000
# s5            0  0.0000  0  0 0.2275 0.0000 0.4919  0.0000 0.0000  0.0000
# s6            0  0.0000  0  0 0.1868 0.0000 0.6132  0.0000 0.0000  0.0000
# s7            0 -0.2651  0  0 0.2623 0.1946 0.9413  0.0000 0.0000  0.0000
# s8            0 -0.6609  0  0 0.7328 0.0000 1.6384  0.0000 0.0000 -0.5755
# s9            0 -0.4633  0  0 0.0000 0.0000 4.6069  0.0000 0.0000 -3.2547
# s10           0 -0.4819  0  0 0.0000 0.0000 4.7546  0.0000 0.0000 -3.3929
# s11           0 -0.4767  0  0 0.0000 0.0000 4.7839  0.0000 0.0567 -3.5122
# s12           0 -0.4715  0  0 0.0000 0.0000 4.7915  0.0000 0.0965 -3.5836
# s13           0 -0.4510  0  0 0.0000 0.0000 5.6237 -1.3909 1.3898 -4.6583
# s14           0 -0.4552  0  0 0.0000 0.0000 5.7064 -1.5771 1.5326 -4.7298
#         V10     V11    V12
# s0   0.0000  0.0000 0.0000
# s1   0.0000  0.0000 0.0000
# s2   0.0000  0.0000 0.0000
# s3   0.0000  0.0000 0.0000
# s4   0.0000  0.0000 0.0000
# s5   0.0000 -0.0464 0.0000
# s6   0.0000 -0.1293 0.0000
# s7   0.0000 -0.4868 0.0000
# s8   0.0000 -0.8803 0.3712
# s9   0.0000 -0.5481 0.2792
# s10  0.0000 -0.5553 0.2939
# s11  0.0000 -0.5422 0.3108
# s12  0.0000 -0.5323 0.3214
# s13 -0.0503  0.0000 0.1711
# s14  0.0000  0.0000 0.1571

Câu trả lời:


20

Cuối cùng, chúng tôi đã có thể tạo ra cùng một giải pháp với cả hai phương pháp! Vấn đề đầu tiên là glmnet giải quyết vấn đề Lasso như đã nêu trong câu hỏi, nhưng những người nói dối có sự bình thường hóa hơi khác trong hàm mục tiêu, nó thay thế bởi . Thứ hai, cả hai phương thức bình thường hóa dữ liệu khác nhau, do đó, chuẩn hóa phải được loại bỏ khi gọi các phương thức.12N12

Để tái tạo điều đó, và thấy rằng các giải pháp tương tự cho vấn đề Lasso có thể được tính bằng lars và glmnet, các dòng sau trong đoạn mã trên phải được thay đổi:

la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)

đến

la <- lars(X,Y,intercept=TRUE, normalize=FALSE, max.steps=1000, use.Gram=FALSE)

glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)

đến

glm2 <- glmnet(X,Y,family="gaussian",lambda=1/nbSamples*la$lambda,standardize=FALSE,thresh=1e-16)

1
Tôi rất vui vì bạn đã tìm ra điều này. Bất kỳ suy nghĩ về phương pháp bình thường hóa có ý nghĩa hơn? Tôi thực sự đã nhận được kết quả tồi tệ hơn khi sử dụng chuẩn hóa trong glmnet (đối với lasso) và tôi vẫn không chắc tại sao.
Ben Ogorek

Tôi thực sự bình thường hóa dữ liệu một cách thủ công và áp dụng các phương pháp này và so sánh nếu chúng giống nhau. Các biến có hiệu ứng nhỏ hơn thường được xem là có các hệ số khác nhau
KarthikS

0

Rõ ràng nếu các phương pháp sử dụng các mô hình khác nhau, bạn sẽ nhận được câu trả lời khác nhau. Trừ các điều khoản chặn không dẫn đến mô hình mà không bị chặn bởi vì các hệ số phù hợp nhất sẽ thay đổi và bạn không thay đổi chúng theo cách bạn đang tiếp cận nó. Bạn cần phải phù hợp với cùng một mô hình với cả hai phương pháp nếu bạn muốn các câu trả lời giống nhau hoặc gần giống nhau.


1
Vâng, bạn đã đúng, các phương pháp sử dụng các mô hình hơi khác nhau, tôi đã không nhận thức được điều đó. Cảm ơn đã gợi ý. (Tôi sẽ giải thích sự khác biệt chi tiết hơn trong một câu trả lời riêng)
Andre

-2

Kết quả phải giống nhau. gói lars sử dụng theo mặc định type = "lar", thay đổi giá trị này thành type = "lasso". Chỉ cần hạ thấp tham số 'thresh = 1e-16' cho glmnet vì việc giảm tọa độ dựa trên sự hội tụ.


2
Cảm ơn bạn vì câu trả lời. Có thể tôi đang đọc sai, nhưng có vẻ mâu thuẫn với độ phân giải được đăng trong câu trả lời của Andre sáu năm trước. Vui lòng xem xét xây dựng bài đăng của bạn để bao gồm một lời giải thích đầy đủ hơn về những gì bạn đang cố gắng nói và cho thấy lý do tại sao chúng ta nên tin rằng nó là chính xác và những điều khác thì không.
whuber
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.