Sự khác biệt giữa hồi quy Ridge khi sử dụng glmnet của R và scikit-learn của Python là gì?


11

Tôi đang xem phần LAB §.6.6 về Hồi quy độ dốc / Lasso trong cuốn sách 'Giới thiệu về học thống kê với các ứng dụng trong R' của James, Witten, Hastie, Tibshirani (2013).

Cụ thể hơn, tôi đang cố gắng áp dụng Ridgemô hình scikit-learn cho bộ dữ liệu 'Hitters' từ gói R 'ISLR'. Tôi đã tạo cùng một bộ tính năng như được hiển thị trong mã R. Tuy nhiên, tôi không thể đến gần với kết quả từ glmnet()mô hình. Tôi đã chọn một tham số điều chỉnh L2 để so sánh. (Đối số 'alpha' trong scikit-learn).

Con trăn

regr = Ridge(alpha=11498)
regr.fit(X, y)

http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Ch CHƯƠNG% 206.ipynb

R:

Lưu ý rằng đối số alpha=0trong glmnet()phương tiện mà một hình phạt L2 nên được áp dụng (Ridge hồi quy). Tài liệu cảnh báo không nhập một giá trị duy nhất cho lambda, nhưng kết quả giống như trong ISL, trong đó một vectơ được sử dụng.

ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)

Điều gì gây ra sự khác biệt?

Chỉnh sửa:
Khi sử dụng penalized()từ gói bị phạt trong R, các hệ số tương tự như với scikit-learn.

ridge.mod2 <- penalized(y,x,lambda2=11498)

Có lẽ câu hỏi sau đó cũng có thể là: 'Sự khác biệt giữa glmnet()penalized()khi thực hiện hồi quy Ridge là gì?

Trình bao bọc python mới cho mã Fortran thực tế được sử dụng trong gói R glmnet
https://github.com/civisanalytics/python-glmnet


5
Hoàn toàn không quen thuộc với hồi quy sườn núi glmnet. Nhưng theo mặc định, sklearn.linear_model.Ridgeước tính đánh chặn không được đánh giá (tiêu chuẩn) và hình phạt là như vậy ||Xb - y - intercept||^2 + alpha ||b||^2được giảm thiểu cho b. Có thể có các yếu tố 1/2hoặc 1/n_sampleshoặc cả hai trước hình phạt, làm cho kết quả khác nhau ngay lập tức. Để giải quyết vấn đề mở rộng hình phạt, đặt hình phạt thành 0 trong cả hai trường hợp, giải quyết bất kỳ sự khác biệt nào ở đó và sau đó kiểm tra xem việc thêm lại hình phạt nào. Và btw IMHO ở đây là nơi thích hợp để đặt câu hỏi này.

Câu trả lời:


9

Câu trả lời của tôi thiếu một yếu tố , vui lòng xem @visitor trả lời bên dưới để so sánh chính xác.1N


Dưới đây là hai tài liệu tham khảo nên làm rõ mối quan hệ.

Tài liệu sklearn nói rằng linear_model.Ridgetối ưu hóa chức năng mục tiêu sau đây

|Xβy|22+α|β|22

Tờ báo glmnet nói rằng lưới đàn hồi tối ưu hóa chức năng mục tiêu sau đây

|Xβy|22+λ(12(1α)|β|22+α|β|1)

Lưu ý rằng hai triển khai sử dụng theo những cách hoàn toàn khác nhau, sklearn sử dụng cho mức độ chính quy hóa tổng thể trong khi glmnet sử dụng cho mục đích đó, bảo lưu để giao dịch giữa chính quy của riled và lasso. ααλα

So sánh các công thức, có vẻ như cài đặt và trong glmnet sẽ phục hồi giải pháp từ đó .λ = 2 α sklearnα=0λ=2αsklearnlinear_model.Ridge


Và tôi hoàn toàn nhớ điều đó trong bình luận của @eickenberg. Tôi phải sử dụng standardize = FALSEtrong glmnet()để có được những kết quả giống hệt nhau.
Jordi

@Jordi Bạn chắc chắn nên chuẩn hóa nếu sử dụng linear_model.Ridgecho bất kỳ phân tích thế giới thực.
Matthew Drury

Tôi hiểu rằng linear_model.Ridgemô hình sklearn tự động tiêu chuẩn hóa các tính năng. Bình thường hóa là tùy chọn. Tôi tự hỏi tại sao sau đó tôi cần phải hủy kích hoạt tiêu chuẩn hóa glmnet()để có được các mô hình để tạo ra kết quả giống hệt nhau.
Jordi

10

Câu trả lời của Matthew Drury nên có hệ số 1 / N. Chính xác hơn ...

Các tài liệu glmnet bang mà lưới đàn hồi giảm thiểu hàm tổn thất

1NXβy22+λ(12(1α)β22+αβ1)

Các tài liệu sklearn nói rằng linear_model.Ridgegiảm thiểu chức năng mất

Xβy22+αβ22

tương đương với giảm thiểu

1NXβy22+αNβ22

Để có được cùng một giải pháp từ glmnet và sklearn, cả hai hàm mất mát của chúng phải bằng nhau. Điều này có nghĩa là cài đặt và trong glmnet.α=0λ=2Nαsklearn

library(glmnet)
X = matrix(c(1, 1, 2, 3, 4, 2, 6, 5, 2, 5, 5, 3), byrow = TRUE, ncol = 3)
y = c(1, 0, 0, 1)
reg = glmnet(X, y, alpha = 0, lambda = 2 / nrow(X))
coef(reg)

đầu ra glmnet: mật0.03862100, mật0.03997036, ngay0.07276511, 0.42727955

import numpy as np
from sklearn.linear_model import Ridge
X = np.array([[1, 1, 2], [3, 4, 2], [6, 5, 2], [5, 5, 3]])
y = np.array([1, 0, 0, 1])
reg = Ridge(alpha = 1, fit_intercept = True, normalize = True)
reg.fit(X, y)
np.hstack((reg.intercept_, reg.coef_))

sản lượng sklearn: mật0.03862178, ăn0.0399697, tích0.07276535, 0.42727921


4
Các định nghĩa khác nhau của các tham số và tỷ lệ của chúng được sử dụng trong các thư viện khác nhau là một nguồn gây nhầm lẫn phổ biến.
AaronDefazio

1
Tôi không mong đợi rằng cả Gung và tôi sẽ hiểu sai điều này.
Michael R. Chernick 30/03/2017

2
Vâng, cả hai bạn đã hiểu sai. Lý do từ chối chỉnh sửa của tôi cho thấy rõ rằng cả hai bạn đều không thấy nhận xét của tôi "Yếu tố mất tích 1 / N" tại stats.stackexchange.com/review/suggested-edits/139985
khách truy cập

Chỉnh sửa của bạn có thể đã bị từ chối vì nó thay đổi nhiều hơn chỉ những gì bạn yêu cầu. Nếu bạn muốn chỉnh sửa bài đăng của tôi và chỉ thay đổi yếu tố còn thiếu, vui lòng thực hiện, nhưng thay đổi liên kết cũng như từ ngữ và mã của tôi là quá mức cần thiết. Các ý kiến ​​về cách đối xử không công bằng trong câu trả lời của bạn là không phù hợp và không liên quan đến nội dung câu hỏi, vui lòng xóa chúng. Từ ngữ của bạn cũng nhấn mạnh câu trả lời của tôi, đây không phải là cách phù hợp để trả lời một chỉnh sửa bị từ chối. Chúng tôi rất thích những đóng góp quý báu của bạn cho cộng đồng của chúng tôi, nhưng xin vui lòng chấp nhận các tiêu chuẩn của chúng tôi trước khi làm phiền chúng tôi.
Matthew Drury

1
@visitor Xin lỗi nếu tôi hơi cộc cằn. Tôi thực sự chỉ nên cố gắng truyền đạt rằng bạn có vẻ như là một người đóng góp tiềm năng tốt cho trang web, và tôi muốn bạn có một trải nghiệm tốt. Chúng tôi có một số chuẩn mực xã hội, giống như bất kỳ nhóm nào khác, và bạn sẽ có trải nghiệm tốt hơn nếu bạn biết về chúng. Tôi vẫn nghĩ rằng "câu trả lời của Matthew Drury là sai" khá khắc nghiệt, chắc chắn có nhiều cách tốt hơn để truyền đạt rằng câu trả lời của tôi bị thiếu một cách sai lầm là một yếu tố của . "Câu trả lời của X là sai" đọc như một cuộc tấn công cá nhân. 1N
Matthew Drury
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.