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