Was sind die Unterschiede zwischen der Ridge-Regression mit Rs glmnet und Pythons Scikit-Learn?

11

Ich gehe den LAB-Abschnitt §6.6 über Ridge Regression / Lasso in dem Buch 'Eine Einführung in das statistische Lernen mit Anwendungen in R' von James, Witten, Hastie, Tibshirani (2013) durch.

Insbesondere versuche ich, das Scikit-Learn- RidgeModell auf den ' Hitters'- Datensatz aus dem R-Paket' ISLR 'anzuwenden. Ich habe die gleichen Funktionen wie im R-Code erstellt. Ich kann mich den Ergebnissen des glmnet()Modells jedoch nicht annähern . Ich habe einen L2-Tuning-Parameter zum Vergleichen ausgewählt. ('Alpha'-Argument in Scikit-Learn).

Python:

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

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

R:

Beachten Sie, dass das Argument alpha=0in glmnet()bedeutet, dass eine L2-Strafe angewendet werden sollte (Ridge-Regression). Die Dokumentation warnt davor, einen einzelnen Wert für einzugeben lambda, aber das Ergebnis ist das gleiche wie in ISL, wo ein Vektor verwendet wird.

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

Was verursacht die Unterschiede?

Bearbeiten:
Bei Verwendung penalized()aus dem bestraften Paket in R sind die Koeffizienten dieselben wie bei Scikit-Learn.

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

Vielleicht könnte die Frage dann auch lauten: „Was ist der Unterschied zwischen glmnet()und penalized()bei der Ridge-Regression?

Neuer Python-Wrapper für den tatsächlichen Fortran-Code, der im R- Paket glmnet verwendet wird
https://github.com/civisanalytics/python-glmnet verwendet wird

Jordi
quelle
5
Völlig unbekannt mit der Glmnet Ridge Regression. Standardmäßig erfolgt sklearn.linear_model.Ridgejedoch eine nicht bestrafte Intercept-Schätzung (Standard), und die Strafe ist so, dass sie ||Xb - y - intercept||^2 + alpha ||b||^2für minimiert wird b. Es kann Faktoren 1/2oder 1/n_samplesbeides vor der Strafe geben, wodurch sich die Ergebnisse sofort unterscheiden. Um das Problem der Strafskalierung zu beseitigen, setzen Sie die Strafe in beiden Fällen auf 0, beheben Sie dort etwaige Unstimmigkeiten und prüfen Sie, was das Hinzufügen der Strafe bewirkt. Und übrigens hier ist der richtige Ort, um diese Frage zu stellen.

Antworten:

9

1N.


Hier sind zwei Referenzen, die die Beziehung verdeutlichen sollen.

Die sklearn-Dokumentation besagt, dass linear_model.Ridgedie folgende Zielfunktion optimiert wird

|X.β- -y|22+α|β|22

Das glmnet-Papier sagt, dass das elastische Netz die folgende Zielfunktion optimiert

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

ααλα für den Handel zwischen und Lasso-Regularisierung .

α=0λ=2αsklearnlinear_model.Ridge

Matthew Drury
quelle
Und das habe ich auch in @eickenbergs Kommentar total vermisst. Ich habe zu verwenden , standardize = FALSEin glmnet()die identischen Ergebnisse.
Jordi
@Jordi Sie sollten auf jeden Fall standardisiert sein, wenn Sie linear_model.Ridgefür eine Analyse in der realen Welt verwenden.
Matthew Drury
Ich verstehe, dass das sklearn- linear_model.RidgeModell die Funktionen automatisch standardisiert. Die Normalisierung ist optional. Ich frage mich, warum ich dann die Standardisierung deaktivieren muss glmnet(), damit die Modelle identische Ergebnisse liefern.
Jordi
10

Die Antwort von Matthew Drury sollte einen Faktor von 1 / N haben. Etwas präziser...

Die glmnet-Dokumentation besagt, dass das elastische Netz die Verlustfunktion minimiert

1N.X.β- -y22+λ(12(1- -α)β22+αβ1)

Die sklearn-Dokumentation besagt, linear_model.Ridgedass die Verlustfunktion minimiert wird

X.β- -y22+αβ22

Das entspricht einer Minimierung

1N.X.β- -y22+αN.β22

Um die gleiche Lösung von glmnet und sklearn zu erhalten, müssen beide Verlustfunktionen gleich sein. Dies bedeutet Einstellungα=0 und λ=2N.αsklearn in glmnet.

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-Ausgabe: –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-Ausgabe: –0,03862178, –0,0399697, –0,07276535, 0,42727921

Besucher
quelle
4
Die unterschiedlichen Definitionen von Parametern und deren Skalierung, die in verschiedenen Bibliotheken verwendet werden, sind eine häufige Quelle der Verwirrung.
AaronDefazio
1
Ich würde nicht erwarten, dass sowohl Gung als auch ich das falsch verstehen würden.
Michael R. Chernick
2
Ja, ihr beide habt es falsch verstanden. Ihre Gründe für die Ablehnung meiner Bearbeitung machen deutlich, dass Sie beide meinen Kommentar "Fehlender Faktor 1 / N" unter stats.stackexchange.com/review/suggested-edits/139985
Besucher
Ihre Bearbeitung wurde wahrscheinlich abgelehnt, weil sie viel mehr geändert hat als nur das, was Sie behaupten. Wenn Sie meinen Beitrag bearbeiten und nur den fehlenden Faktor ändern möchten, tun Sie dies bitte, aber das Ändern meiner Links sowie des Wortlauts und des Codes ist übertrieben. Die Kommentare zu Ihrer unfairen Behandlung in Ihrer Antwort sind unangemessen und beziehen sich nicht auf den Inhalt der Frage. Bitte entfernen Sie sie. Ihr Wortlaut hat auch meine Antwort plagariert. Dies ist nicht der richtige Weg, um auf eine abgelehnte Bearbeitung zu antworten. Wir würden uns über Ihre wertvollen Beiträge für unsere Community freuen, aber bitte machen Sie sich mit unseren Normen vertraut, bevor Sie uns ausnehmen.
Matthew Drury
1
@visitor Sorry wenn ich ein bisschen schroff rausgekommen bin. Ich sollte wirklich nur versuchen zu kommunizieren, dass Sie ein guter potenzieller Mitwirkender an der Website zu sein scheinen, und ich möchte, dass Sie eine gute Erfahrung machen. Wir haben einige soziale Normen, genau wie jede andere Gruppe, und Sie werden eine bessere Erfahrung machen, wenn Sie sich ihrer bewusst bleiben. Ich denke immer noch, dass "Matthew Drurys Antwort falsch ist" ziemlich hart ist. Es gibt sicherlich bessere Möglichkeiten zu kommunizieren, dass meiner Antwort fälschlicherweise ein Faktor fehlt1N.. "Xs Antwort ist falsch" liest sich als persönlicher Angriff.
Matthew Drury