Sử dụng gói LASSO từ lars (hoặc glmnet) trong R để chọn biến


39

Xin lỗi nếu câu hỏi này đi qua một chút cơ bản.

Tôi đang tìm cách sử dụng lựa chọn biến LASSO cho mô hình hồi quy tuyến tính đa biến trong R. Tôi có 15 dự đoán, một trong số đó là phân loại (điều đó có gây ra vấn đề không?). Sau khi đặt và tôi sử dụng các lệnh sau:yxy

model = lars(x, y)
coef(model)

Vấn đề của tôi là khi tôi sử dụng coef(model). Điều này trả về một ma trận có 15 hàng, với một dự đoán bổ sung được thêm vào mỗi lần. Tuy nhiên, không có gợi ý nào để chọn mô hình. Tôi đã bỏ lỡ một cái gì đó? Có cách nào để tôi có thể lấy gói lars để trả về chỉ một mô hình " tốt nhất " không?

Có những bài viết khác đề nghị sử dụng glmnetthay thế nhưng điều này có vẻ phức tạp hơn. Một nỗ lực như sau, sử dụng cùng và . Tôi đã bỏ lỡ điều gì ở đây?: yxy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

Lệnh cuối cùng trả về một danh sách các biến của tôi, phần lớn có hệ số mặc dù một số là = 0. Đây có phải là lựa chọn chính xác của mô hình " tốt nhất " được LASSO chọn? Nếu sau đó tôi phù hợp với một mô hình tuyến tính với tất cả các biến có hệ số not=0tôi nhận được rất giống nhau, nhưng hơi khác, ước tính hệ số. Có một lý do cho sự khác biệt này? Có thể chấp nhận cải tiến mô hình tuyến tính với các biến này do LASSO chọn và lấy đó làm mô hình cuối cùng của tôi không? Mặt khác, tôi không thể thấy bất kỳ giá trị p nào cho ý nghĩa. Tôi đã bỏ lỡ bất cứ điều gì?

Làm

type.gaussian="covariance" 

đảm bảo rằng glmnetsử dụng nhiều hồi quy tuyến tính?

Liệu chuẩn hóa tự động của các biến có ảnh hưởng đến các hệ số không? Có cách nào để bao gồm các điều khoản tương tác trong thủ tục LASSO không?

Tôi đang tìm cách sử dụng quy trình này nhiều hơn như một minh chứng về cách sử dụng LASSO so với bất kỳ mô hình nào thực sự sẽ được sử dụng cho bất kỳ suy luận / dự đoán quan trọng nào nếu điều đó thay đổi bất cứ điều gì.

Cảm ơn bạn đa bỏ thơi gian ra đọc nhưng điêu nay. Bất kỳ nhận xét chung nào về LASSO / lars / glmnet cũng sẽ được đánh giá rất cao.


4
Là một bình luận phụ, nếu bạn muốn diễn giải kết quả, hãy chắc chắn chứng minh rằng tập hợp các biến được chọn bởi lasso là ổn định. Điều này có thể được thực hiện bằng cách sử dụng mô phỏng Monte Carlo hoặc bằng cách bootstrapping dữ liệu của riêng bạn.
Frank Harrell

Câu trả lời:


28

Việc sử dụng glmnetthực sự dễ dàng một khi bạn nắm bắt được nó nhờ họa tiết tuyệt vời của nó trong http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (bạn cũng có thể kiểm tra trang gói CRAN). Đối với lambda tốt nhất cho glmnet, quy tắc của ngón tay cái là sử dụng

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

thay vì lambda.min.

Để làm tương tự cho larsbạn phải làm bằng tay. Đây là giải pháp của tôi

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

Hãy nhớ rằng điều này không hoàn toàn giống nhau, bởi vì điều này dừng lại ở một nút thắt (khi một biến đi vào) thay vì tại bất kỳ điểm nào.

Xin lưu ý rằng glmnetbây giờ là gói ưu tiên, nó được duy trì tích cực, hơn thế nữa lars, và đã có câu hỏi về glmnetso với larscâu trả lời trước đó (thuật toán được sử dụng khác nhau).

Đối với câu hỏi của bạn về việc sử dụng lasso để chọn các biến và sau đó phù hợp với OLS, đó là một cuộc tranh luận đang diễn ra. Google cho OLS đăng Lasso và có một số bài viết thảo luận về chủ đề này. Ngay cả các tác giả của Yếu tố học tập thống kê cũng thừa nhận điều đó là có thể.

Chỉnh sửa : Đây là mã để tái tạo chính xác hơn những gì glmnettronglars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1 Câu trả lời tuyệt vời! Bạn có thể hoặc bất cứ ai có thể giải thích lý do tại sao lambda.1se là quy tắc của ngón tay cái, thay vì lambda.min?
Erosennin

Sau 4 năm viết bài này (và không sử dụng Lasso trong một thời gian), ký ức của tôi đã biến mất. Lấy làm tiếc!
Juancentro

8

Tôi đã trở lại câu hỏi này một thời gian trước vì tôi nghĩ rằng tôi đã giải quyết được giải pháp chính xác.

Đây là bản sao sử dụng bộ dữ liệu mtcars:

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

'biến' cung cấp cho bạn danh sách các biến giải quyết giải pháp tốt nhất.


1
Tôi đã tìm mã và tôi thấy rằng "thử nghiệm" chưa được xác định và do đó mã: "Final.list <-testing [-remond] #removing biến" đưa ra lỗi: không tìm thấy đối tượng Vì vậy, tìm mã giả sử thay vì sử dụng "thử nghiệm" thì nên sử dụng "cp.list" để mã sẽ là: Final.list <-cp.list [-remond] #removing biến Final.list <-c (Final.list, trùng lặp) #adding trong các vars đã bị xóa sau đó được thêm vào sau Hãy cho tôi biết nếu điều này đúng Loại liên quan

3
`% ni%` <-Negate (`% ni%`); ## có vẻ sai. Trong khi `% ni%` <-Negate (`% in%`); ## có vẻ đúng. Tôi nghĩ rằng trình định dạng stackexchange đã làm rối tung nó ...
Chris

Bạn có thể giải thích làm thế nào bạn chọn nfolds=5alpha=0.5tham số?
colin

7

Có lẽ việc so sánh với lựa chọn chuyển tiếp hồi quy từng bước sẽ giúp ích (xem liên kết sau đến một trang web của một trong những tác giả http://www-stat.stanford.edu/~tibs/lasso/simple.html). Đây là cách tiếp cận được sử dụng trong Chương 3.4.4 của Các yếu tố của học thống kê (có sẵn trực tuyến miễn phí). Tôi nghĩ rằng Chương 3.6 trong cuốn sách đó đã giúp hiểu được mối quan hệ giữa các bình phương nhỏ nhất, tập hợp con tốt nhất và Lasso (cộng với một vài thủ tục khác). Tôi cũng thấy hữu ích khi lấy chuyển vị của hệ số, t (coef (model)) và write.csv, để tôi có thể mở nó trong Excel cùng với một bản sao của âm mưu (mô hình) ở bên cạnh. Bạn có thể muốn sắp xếp theo cột cuối cùng, chứa ước tính bình phương nhỏ nhất. Sau đó, bạn có thể thấy rõ từng biến được thêm vào ở mỗi bước của từng phần và kết quả là các hệ số thay đổi như thế nào. Tất nhiên đây không phải là toàn bộ câu chuyện, nhưng hy vọng nó sẽ là một khởi đầu.


3

larsglmnethoạt động trên ma trận thô. Để bao gồm các điều khoản tương tác, bạn sẽ phải tự xây dựng các ma trận. Điều đó có nghĩa là một cột trên mỗi tương tác (tính theo cấp độ cho mỗi yếu tố nếu bạn có yếu tố). Nhìn vào lm()để xem nó hoạt động như thế nào (cảnh báo: có rồng).

Để thực hiện ngay bây giờ, hãy làm một cái gì đó như: Để tạo một thuật ngữ tương tác theo cách thủ công, bạn có thể (nhưng có thể không nên , vì nó chậm) làm:

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

Sau đó, để sử dụng điều này trong lars (giả sử bạn có một ycú đá xung quanh):

lars(as.matrix(D), as.matrix(y))

Tôi ước tôi có thể giúp bạn nhiều hơn với các câu hỏi khác. Tôi tìm thấy cái này bởi vì những người nói dối đang mang đến cho tôi sự đau buồn và tài liệu trong đó và trên web rất mỏng.


2
"Cảnh báo: có rồng" Điều này khá dễ dàng với model.matrix().
Gregor

2

LARS giải quyết đường dẫn giải pháp ENTIRE. Đường dẫn giải pháp là tuyến tính piecewise - có một số lượng hữu hạn các điểm "notch" (nghĩa là các giá trị của tham số chính quy) mà tại đó giải pháp thay đổi.

Vì vậy, ma trận của các giải pháp bạn nhận được là tất cả các giải pháp có thể. Trong danh sách mà nó trả về, nó cũng sẽ cung cấp cho bạn các giá trị của tham số chính quy.


Cảm ơn bạn vì câu trả lời. Có cách nào để hiển thị các giá trị của tham số chính quy không? Ngoài ra, có cách nào để chọn giữa các giải pháp dựa trên tham số này không? (Cũng là tham số lambda?)
James

Lưu ý rằng piecewise-linearity không có nghĩa là các đường nằm ngang và do đó, giải pháp luôn thay đổi với lambda. Ví dụ, với mục đích dự đoán, người ta sẽ có một lưới các giá trị lambda không chỉ tại mà còn giữa các nút thắt. Hoàn toàn có thể là một số điểm giữa các nút mang lại hiệu suất dự đoán tốt hơn.
Richard Hardy
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.