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.