R의 glmnet을 사용한 릿지 회귀와 파이썬의 scikit-learn의 차이점은 무엇입니까?


11

James, Witten, Hastie, Tibshirani (2013) 의 저서 'R의 통계 학습에 대한 통계 학습 소개' 에서 Ridge Regression / Lasso에 대한 LAB 섹션 §6.6을 살펴 보겠습니다 .

보다 구체적으로, scikit-learn Ridge모델을 R 패키지 'ISLR'의 'Hitters'데이터 세트에 적용하려고합니다 . R 코드에 표시된 것과 동일한 기능 세트를 작성했습니다. 그러나 glmnet()모델 의 결과에 가까이 갈 수는 없습니다 . 비교할 L2 튜닝 매개 변수를 하나 선택했습니다. (scikit-learn에서 'alpha'인수).

파이썬 :

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

http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb

아르 자형:

참고 인수 alpha=0glmnet()2 계층의 패널티가 적용되어야하는 수단 (릿지 회귀). 설명서에는에 단일 값을 입력하지 말 것을 경고 lambda하지만 결과는 벡터가 사용되는 ISL과 동일합니다.

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

차이점을 일으키는 원인은 무엇입니까?

편집 : R의 처벌 패키지에서
사용할 때 penalized()계수는 scikit-learn과 동일합니다.

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

아마도 릿지 회귀 분석 glmnet()penalized()릿지 회귀 분석 의 차이점은 무엇입니까 ?

R 패키지 glmnet에 사용 된 실제 포트란 코드를위한 새로운 파이썬 래퍼
https://github.com/civisanalytics/python-glmnet


5
glmnet 능선 회귀에 완전히 익숙하지 않습니다. 그러나 기본적으로 비 sklearn.linear_model.Ridge승인 된 인터셉트 추정 (표준)을 수행하고 위약금 ||Xb - y - intercept||^2 + alpha ||b||^2은 최소화됩니다 b. 패널티 앞에는 요소 1/2또는 1/n_samples둘 다가있어 결과가 즉시 달라집니다. 페널티 스케일링 문제를 해결하려면 두 경우 모두 페널티를 0으로 설정하고 불일치를 해결 한 다음 페널티를 다시 추가하여 수행하는 작업을 확인하십시오. 그리고 btw IMHO는이 질문을하기에 적합한 곳입니다.

답변:


9

내 답변에 요소가 누락되었습니다 . 정확한 비교를 위해 아래 @visitors 답변을 참조하십시오.1N


다음은 관계를 명확히하는 두 가지 참조입니다.

sklearn 문서에 따르면 linear_model.Ridge다음과 같은 목적 함수 를 최적화합니다.

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

glmnet 논문에 따르면 탄성 그물은 다음과 같은 목적 함수를 최적화합니다.

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

공지 사항 두 구현이 사용하는 완전히 다른 방법으로, sklearn의 사용에 glmnet 사용하면서 정규화의 전반적인 수준을 예약, 그 목적 능선과 올가미 정규화 사이의 거래에 대한합니다. α λ αααλα

공식을 비교하면 에서 및 을 설정하면에서 솔루션을 복구해야합니다 .λ = 2 α sklearnα=0λ=2αsklearnlinear_model.Ridge


그리고 @eickenberg의 의견에서도 완전히 놓쳤습니다. 내가 사용해야합니까 standardize = FALSE에서 glmnet()동일한 결과를 얻을 수 있습니다.
Jordi

@Jordi linear_model.Ridge실제 분석에 사용 하는 경우 반드시 표준화해야합니다 .
Matthew Drury

sklearn linear_model.Ridge모델은 기능을 자동으로 표준화 한다는 것을 알고 있습니다. 정규화는 선택 사항입니다. glmnet()모델이 동일한 결과를 얻도록 표준화를 비활성화해야하는 이유가 궁금 합니다.
Jordi

10

Matthew Drury의 답은 1 / N의 계수를 가져야합니다. 더 정확하게...

glmnet 문서 탄성 그물이 손실 함수를 최소화하는 것이 주

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

sklearn 문서는 말한다 linear_model.Ridge최소화에게 손실 함수를

Xβy22+αβ22

최소화하는 것과 같습니다

1NXβy22+αNβ22

glmnet과 sklearn에서 동일한 솔루션을 얻으려면 두 손실 기능이 동일해야합니다. 이는 및 을 의미합니다.α=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)

glmnet 출력 : –0.03862100, –0.03997036, –0.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_))

sklearn 출력 : –0.03862178, –0.0399697, –0.07276535, 0.42727921


4
다른 라이브러리에서 사용되는 매개 변수 및 스케일링의 다른 정의는 일반적인 혼동의 원인입니다.
AaronDefazio

1
나는 Gung과 나는 이것이 잘못 될 것이라고 기대하지 않을 것이다.
Michael R. Chernick

2
네, 둘 다 잘못했습니다. 내 편집을 거부 한 이유는 stats.stackexchange.com/review/suggested-edits/139985
방문자

주장한 것 이상의 내용이 변경되어 수정이 거부되었을 수 있습니다. 내 게시물을 편집하고 누락 된 요소 만 변경하려면 링크와 단어 및 코드를 변경하는 것은 너무 과도합니다. 답변에서 부당한 대우에 대한 의견은 부적절하며 질문의 내용과 관련이 없습니다. 삭제하십시오. 당신의 말은 또한 내 대답을 괴롭 혔습니다. 이것은 거부 된 편집에 응답하는 올바른 방법이 아닙니다. 우리는 지역 사회에 당신의 소중한 공헌을 사랑하지만, 우리를 규명하기 전에 우리의 규범을 숙지하십시오.
Matthew Drury

1
@visitor 내가 약간 욕심을 벗겨서 죄송합니다. 나는 정말로 당신이 사이트에 대한 잠재적 인 기여자 인 것처럼 보이고, 당신이 좋은 경험을하기를 바랍니다. 우리는 다른 그룹과 마찬가지로 사회적 규범을 가지고 있으며, 계속 알고 있으면 더 나은 경험을 할 수 있습니다. 나는 여전히 "Matthew Drury의 대답이 잘못되었다"고 생각하지만 내 대답에 잘못된 요소가 없다는 의사 소통을하는 더 좋은 방법이 있습니다. "X의 답변이 잘못되었습니다"는 개인적인 공격으로 읽습니다. 1N
Matthew Drury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.