Xác nhận chéo hồi quy Lasso trong R


9

Hàm R cv.glm (library: boot) tính toán lỗi dự đoán xác thực chéo K ước tính cho các mô hình tuyến tính tổng quát và trả về delta. Liệu nó có ý nghĩa để sử dụng chức năng này cho hồi quy lasso (thư viện: glmnet) và nếu vậy, làm thế nào nó có thể được thực hiện? Thư viện glmnet sử dụng xác thực chéo để có được tham số quay tốt nhất, nhưng tôi không tìm thấy bất kỳ ví dụ nào xác thực chéo phương trình glmnet cuối cùng.


2
Điều này chắc chắn có ý nghĩa, và mặc dù LASSO chỉ tối ưu hóa trên một tham số (siêu), nếu bạn muốn có được ước tính tốt nhất bạn có thể thực hiện ngoài mẫu bạn cần một vòng xác thực chéo bên ngoài. Xem Bạn có thể tập luyện quá sức bằng cách đào tạo các thuật toán học máy bằng CV / Bootstrap không? & các giấy tờ được trích dẫn.
Scortchi - Tái lập Monica

Bạn nên sử dụng glmnet thay vì glm. nếu bạn đang làm CV. Nếu tôi nhớ lại, gói glm trở nên đau đớn khi sử dụng. Ngoài ra, cv.glmnet hiển thị nhiều tham số hơn cv.glm.
smci

Câu trả lời:


9

Một ví dụ về cách làm vani đồng bằng cross-validation cho Lasso ở glmnettrên mtcars tập dữ liệu.

  1. Tải tập dữ liệu.

  2. Chuẩn bị các tính năng (biến độc lập). Họ nên là của matrixlớp. Cách dễ nhất để chuyển đổi dfcó chứa các biến phân loại thành matrixthông qua model.matrix. Theo bạn, mặc định glmnetphù hợp với việc chặn, vì vậy bạn nên chặn dải tốt hơn khỏi ma trận mô hình.

  3. Chuẩn bị phản ứng (biến phụ thuộc). Hãy mã hóa những chiếc xe có mpghiệu suất trên trung bình là hiệu quả ('1') và phần còn lại là không hiệu quả ('0'). Chuyển đổi biến này thành yếu tố.

  4. Chạy xác thực chéo qua cv.glmnet. Nó sẽ lấy alpha=1từ glmnetcác tham số mặc định , đó là những gì bạn đã yêu cầu: hồi quy lasso.

  5. Bằng cách kiểm tra đầu ra của xác thực chéo, bạn có thể quan tâm đến ít nhất 2 thông tin:

    • lambda, mà giảm thiểu lỗi xác nhận chéo. glmnetthực sự cung cấp 2 lambdas: lambda.minlambda.1se. Đó là phán đoán của bạn như một nhà thống kê thực hành sẽ sử dụng.

    • kết quả hệ số chính quy.

Vui lòng xem mã R theo hướng dẫn ở trên:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Nhận xét cuối cùng:

  • lưu ý, đầu ra của mô hình không nói gì về ý nghĩa thống kê của các hệ số, chỉ các giá trị.

  • penalizer l1 (Lasso), mà bạn yêu cầu, là khét tiếng cho sự bất ổn như được minh chứng trong này bài viết trên blog và stackexchange này câu hỏi . Một cách tốt hơn có thể là xác nhận chéo alphacũng vậy, điều này sẽ cho phép bạn quyết định kết hợp đúng các hình phạt l1 và l2.

  • một cách khác để xác thực chéo có thể là chuyển sang dấu mũ train( ... method='glmnet')

  • và cuối cùng, cách tốt nhất để tìm hiểu thêm về cv.glmnetvà mặc định đến từ glmnettất nhiên là ?glmnettrong bảng điều khiển của R)))


Câu trả lời tốt đẹp. .. cũng đáng để chạy CV nhiều lần và lấy trung bình đường cong lỗi (xem? cv.glmnet) để tính toán việc lấy mẫu.
20650

@SergeyBushmanov RẤT HỮU ÍCH!
bác sĩ lâm sàng

Xin chào, tôi biết rằng đây là một bài viết cũ, nhưng tôi muốn hỏi bạn một câu hỏi. Bạn đề cập rằng đầu ra của mô hình không nói gì về ý nghĩa thống kê của các hệ số, vậy làm thế nào để bạn xác định rằng chúng có ý nghĩa hay không?
Jun Jang

@JunJang "Không có ý nghĩa thống kê cho các hệ số" là tuyên bố từ các tác giả của gói, không phải tôi. Tuyên bố này được đưa ra, tôi không nhớ chính xác, trong một trong những cuốn sách của các tác giả gói hoặc trong họa tiết của gói. Trong trường hợp như vậy, thay vì nói hệ số có ý nghĩa hay không, bạn muốn nói rằng chúng "hữu ích" hay không trong việc giải thích mục tiêu thông qua xác nhận chéo.
Sergey Bushmanov
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.