Định nghĩa chính xác của phép đo Deviance trong gói glmnet, với giá trị chéo?


12

Đối với nghiên cứu hiện tại của tôi, tôi đang sử dụng phương pháp Lasso thông qua gói glmnet trong R trên biến phụ thuộc nhị thức.

Trong glmnet, lambda tối ưu được tìm thấy thông qua xác nhận chéo và các mô hình kết quả có thể được so sánh với các biện pháp khác nhau, ví dụ như lỗi phân loại sai hoặc sai lệch.

Câu hỏi của tôi: Làm thế nào chính xác được xác định sai lệch trong glmnet? Nó được tính như thế nào?

(Trong bài viết tương ứng "Đường dẫn chính quy cho các mô hình tuyến tính tổng quát thông qua việc điều phối gốc" của Friedman và cộng sự. Tôi chỉ tìm thấy nhận xét này về độ lệch được sử dụng trong cv.glmnet: "độ lệch trung bình (trừ hai lần khả năng đăng nhập ở bên trái dữ liệu) "(trang 17)).


Nó giống như độ lệch được sử dụng trong glm(hoặc ít nhất, nó phải vậy - chỉ có một định nghĩa về độ lệch mà tôi biết).
Hồng Ooi

Vâng, nhưng tôi nghĩ rằng họ mở rộng nó theo một cách nào đó như được chỉ ra bởi trích dẫn trong bài viết đầu tiên của tôi. Sự lệch lạc theo tôi hiểu có thể so sánh hiệu suất của hai mô hình nhưng làm thế nào để các tác giả bao gồm dữ liệu bên trái của xác thực chéo sau đó? Làm thế nào để "trừ hai lần khả năng đăng nhập trên dữ liệu bên trái" có ý nghĩa?
Jo Wmann

1
Được rồi, cảm ơn, bây giờ tôi nghĩ rằng tôi đã hiểu: Độ lệch được định nghĩa là -2 * khả năng đăng nhập hoặc đúng hơn (khả năng đăng nhập 2 *) / (khả năng đăng nhập của mô hình null). Điều này cũng giải thích, tại sao độ lệch của chúng đối với các giá trị khác nhau của lambda không vượt quá khoảng 0,2. Mô hình được ước tính trên các nếp gấp k-1 của xác nhận chéo và áp dụng cho các nếp gấp còn lại. Đối với ứng dụng ở lần gấp còn lại, điểm khả năng đăng nhập được tính. Điều này được lặp lại k lần và giá trị trung bình của kết quả k cho mỗi lambda của biện pháp sai lệch xác định ở trên được trả về.
Jo Wmann

1
Có, nó luôn được tính trung bình trên tất cả các nếp gấp cho mỗi lambda. Tôi nghĩ rằng bạn có thể sử dụng mô hình lệch trực tiếp hoặc tỷ lệ wrt thành mô hình null, có lẽ là mô hình chỉ chặn. Có hai cạm bẫy: a) các nếp gấp có thể không có cùng số điểm dữ liệu b) mỗi nếp gấp chứa dữ liệu khác nhau (một cách tự nhiên). để khắc phục (a) bạn có thể chỉ cần chia độ lệch cho số điểm dữ liệu trong nếp gấp đã chọn. để sửa (a) và (b) đồng thời sử dụng phương pháp tỷ lệ. mô hình lệch lạc giả định rằng tập dữ liệu giống nhau trong mỗi mô hình (cùng một ý tưởng trong ước tính MAP khi chúng bỏ qua mẫu số).
Cagdas Ozgenc

1
Tuy nhiên, một khi các nếp gấp được đưa vào hình ảnh thì mẫu số không giống nhau trên các nếp gấp. Vì vậy, tỷ lệ quan tâm đến điều đó bằng cách hủy bỏ mẫu số. Nhưng tôi không biết vấn đề này lớn đến mức nào khi bạn trung bình trên các nếp gấp.
Cagdas Ozgenc

Câu trả lời:


9

Trong Friedman, Hastie và Tibshirani (2010) , sự sai lệch của mô hình nhị thức, với mục đích xác nhận chéo, được tính như sau

trừ hai lần khả năng đăng nhập trên dữ liệu bên trái (trang 17)

Cho rằng đây là bài báo được trích dẫn trong tài liệu choglmnet (trên trang 2 và 5), đó có lẽ là công thức được sử dụng trong gói.

Và thực tế, trong mã nguồn của hàm cvlognet, phần dư sai lệch cho phản hồi được tính như

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

predmatđơn giản là ở đâu

predict(glmnet.object,x,lambda=lambda)

và được truyền vào từ cv.glmnethàm encolsing . Tôi đã sử dụng mã nguồn có sẵn trên trang JStatSoft cho bài báo và tôi không biết mã đó được cập nhật như thế nào. Mã cho gói này là đơn giản và dễ đọc đáng ngạc nhiên; bạn luôn có thể tự kiểm tra bằng cách gõ glmnet:::cv.glmnet.


1

Ngoài câu trả lời của @shadowtalker, khi tôi đang sử dụng gói glmnet, tôi cảm thấy như sự sai lệch trong xác thực chéo được bằng cách nào đó được bình thường hóa.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Tài liệu tham khảo: lệch lạc

bởi vì nếu tôi làm việc này

head(deviance(fit$glmnet.fit)) / length(y))

kết quả là

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

rất gần với $ cvm phù hợp.

Đây có thể là những gì nhận xét từ @Hong Ooi nói về câu hỏi này:

/programming/43468665/poisson-deviance-glmnet

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.