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- Ridge
Modell 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=0
in 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
sklearn.linear_model.Ridge
jedoch eine nicht bestrafte Intercept-Schätzung (Standard), und die Strafe ist so, dass sie||Xb - y - intercept||^2 + alpha ||b||^2
für minimiert wirdb
. Es kann Faktoren1/2
oder1/n_samples
beides 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:
Hier sind zwei Referenzen, die die Beziehung verdeutlichen sollen.
Die sklearn-Dokumentation besagt, dass
linear_model.Ridge
die folgende Zielfunktion optimiert wirdDas glmnet-Papier sagt, dass das elastische Netz die folgende Zielfunktion optimiert
linear_model.Ridge
quelle
standardize = FALSE
inglmnet()
die identischen Ergebnisse.linear_model.Ridge
für eine Analyse in der realen Welt verwenden.linear_model.Ridge
Modell die Funktionen automatisch standardisiert. Die Normalisierung ist optional. Ich frage mich, warum ich dann die Standardisierung deaktivieren mussglmnet()
, damit die Modelle identische Ergebnisse liefern.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
Die sklearn-Dokumentation besagt,
linear_model.Ridge
dass die Verlustfunktion minimiert wirdDas entspricht einer Minimierung
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.
glmnet-Ausgabe: –0,03862100, –0,03997036, –0,07276511, 0,42727955
sklearn-Ausgabe: –0,03862178, –0,0399697, –0,07276535, 0,42727921
quelle