RのglmnetとPythonのscikit-learnを使用したリッジ回帰の違いは何ですか?


11

James、Witten、Hastie、Tibshirani(2013)著の「An Introduction to Statistical Learning with Applications in R」の Ridge Regression / LassoのLABセクション§6.6を通過します

より具体的にはRidge、Rパッケージ 'ISLR'の 'Hitters'データセットにscikit-learn モデルを適用しようとしています。Rコードに示されているのと同じ機能セットを作成しました。ただし、glmnet()モデルの結果に近づくことはできません。比較するL2チューニングパラメーターを1つ選択しました。(scikit-learnの「alpha」引数)。

Python:

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

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

R:

の引数alpha=0glmnet()、L2ペナルティを適用する必要があることを意味することに注意してください(リッジ回帰)。ドキュメンテーションでは、に単一の値を入力しないように警告しています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で使用される実際のFortranコード用の新しいPythonラッパー
https://github.com/civisanalytics/python-glmnet


5
glmnet ridge回帰に完全に慣れていない。ただし、デフォルトでsklearn.linear_model.Ridgeは、ペナルティなしのインターセプト推定(標準)を実行||Xb - y - intercept||^2 + alpha ||b||^2bます。ペナルティの前に要因1/2または1/n_samplesその両方があり、結果がすぐに異なる場合があります。ペナルティスケーリングの問題を除外するには、両方のケースでペナルティを0に設定し、そこで不一致を解決してから、ペナルティを追加し直すことで確認します。ところで私はここでこの質問をするのに適切な場所です。

回答:


9

私の答えには要素がありません。正しい比較については、以下の@visitorsの答えを参照してください。1N


以下に、関係を明確にするための2つの参考資料を示します。

sklearnドキュメンテーションlinear_model.Ridge、次の目的関数を最適化すると言っています

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

glmnet論文によると、弾性ネットは次の目的関数を最適化します

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

2つの実装がまったく異なる方法でを使用していることに注意してください。sklearnはを正規化の全体的なレベルに使用し、glmnetはをその目的に使用して、リッジとlassoの正規化の間の取引にを予約します。 α λ αααλα

公式を比較すると、とを設定すると、から解が得られるはずです。λ = 2 α sklearnα=0λ=2αsklearnlinear_model.Ridge


そして、@ eickenbergのコメントもまったく見逃しました。同じ結果を得るには、standardize = FALSEin を使用するglmnet()必要があります。
ジョルディ2015

@Jordi linear_model.Ridge実際の分析に使用する場合は、必ず標準化する必要があります。
Matthew Drury

sklearn linear_model.Ridgeモデルが機能を自動的に標準化することを理解しています。正規化はオプションです。次にglmnet()、モデルで同じ結果を生成するために標準化を非アクティブ化する必要があるのはなぜですか。
ジョルディ2015

10

マシュー・ドゥルーリーの答えは、1 / Nの因数を持つべきです。より正確に...

glmnetドキュメント弾性ネットが損失関数を最小化すると述べています

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

sklearnのドキュメントは、それが言うlinear_model.Ridgeの損失関数を最小化します

Xβy22+αβ22

これは最小化と同等です

1NXβy22+αNβ22

glmnetとsklearnから同じソリューションを取得するには、両方の損失関数が等しくなければなりません。つまり、glmnetでとを設定します。λ = 2α=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 2017年

1
ガンと私がこれを間違えるとは思いません。
Michael R. Chernick 2017年

2
はい、どちらも間違っています。私の編集を拒否するためのあなたの理由はstats.stackexchange.com/review/suggested-edits/139985で「1 / Nの要因が見つからない」、それはあなたの両方が私のコメントを見ていないことが明らかに作る
訪問者

編集内容は、主張した内容以外にも多くの変更が加えられたため、おそらく拒否されました。私の投稿を編集して欠けている要素のみを変更したい場合は、実行してください。ただし、リンクや文言、コードも変更するのはやり過ぎです。回答における不当な扱いについてのコメントは不適切で、質問の内容とは無関係です。削除してください。あなたの言葉遣いも私の答えをばかげた、これは拒否された編集に応答する正しい方法ではない。私たちはあなたのコミュニティへのあなたの貴重な貢献を愛していますが、私たちに気づく前に私たちの規範を理解してください。
Matthew Drury 2017年

1
@visitor少し不機嫌になった場合はごめんなさい。私は本当にあなたがサイトへの良い潜在的な貢献者のように思われることを伝えようとするべきです、そして私はあなたに良い経験をして欲しいです。私たちは他のグループと同じようにいくつかの社会規範を持っています、そしてあなたがそれらに気づき続けるならあなたはより良い経験をするでしょう。「マシュードゥルーリーの答えは間違っている」とはまだかなり厳しいと思います。私の答えが誤って因子を欠いていることを伝えるより良い方法は確かにあります。「Xの答えは間違っています」は個人攻撃として読み取られます。1N
Matthew Drury 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.