Wie wird der Achsenabschnitt in GLMnet berechnet?

8

Ich habe die GLMNET-Version des elastischen Netzes für die lineare Regression mit einer anderen Software als R implementiert. Ich habe meine Ergebnisse mit der R-Funktion glmnet im Lasso-Modus für Diabetesdaten verglichen .

Die Variablenauswahl ist in Ordnung, wenn der Wert des Parameters (Lambda) variiert wird, aber ich erhalte leicht unterschiedliche Koeffizientenwerte. Aus diesem und anderen Gründen denke ich, dass es vom Achsenabschnitt in der Aktualisierungsschleife kommt, wenn ich die aktuelle Anpassung berechne, weil ich den Achsenabschnitt (den ich als Mittelwert der Zielvariablen nehme) im gesamten Algorithmus nicht verändere: as erklärt in Trevor Hasties Artikel ( Regularisierungspfade für verallgemeinerte lineare Modelle über Koordinatenabstieg , Seite 7, Abschnitt 2.6):

Der Achsenabschnitt wird nicht reguliert, [...] für alle Werte von [...] Lambda [dem L1-Constraint-Parameter]

Trotz des Artikels liefert die R-Funktion glmnet unterschiedliche Werte für den Achsenabschnitt entlang des Regularisierungspfads (die unterschiedlichen Lambda-Werte). Hat jemand eine Ahnung, wie die Werte des Intercept berechnet werden?

yelh
quelle

Antworten:

8

Ich fand heraus, dass der Achsenabschnitt in GLMnet berechnet wird, nachdem die neuen Koeffizientenaktualisierungen konvergiert haben. Der Achsenabschnitt wird mit den Mitteln der und dem Mittelwert der x i j berechnet . Die Formel ist siimilar den vorherigen I gab , aber mit der β j ‚s nach der Aktualisierungsschleife: β 0 = ˉ y - Σ p j = 1 ^ β j ¯ x j .yichxichjβjβ0=y¯- -j=1pβj^xj¯

In Python gibt dies so etwas wie:

        self.intercept_ = ymean - np.dot(Xmean, self.coef_.T)

was ich hier auf der scikit-learn-seite gefunden habe.

EDIT: Die Koeffizienten müssen standardisiert werden, bevor:

        self.coef_ = self.coef_ / X_std

.β0=y¯- -j=1pβj^xj¯ich=1nxichj2

yelh
quelle
Ich sollte hinzufügen, dass dies eine Standardmethode zur Berechnung des Abschnitts ist, vorausgesetzt, das Modell ist linear und die Fehler haben den Mittelwert Null.
mpiktas
β0=y¯ αλ
x¯=0
x¯0glmnetβ0=cÖnsteinnt=y¯
3

was ich als Mittelwert der Zielvariablen nehme

Ich denke, hier können Sie falsch liegen: Im Gegensatz zum linearen Modell können Sie die Prädiktoren nicht so umparametrieren, dass sie immer orthogonal zum Achsenabschnitt sind. Daher kann der Achsenabschnitt nicht einfach als Mittelwert berechnet werden.

Simon Byrne
quelle
Ich habe den Mittelwert der erklärten Variablen genommen, weil die Autoren dieser Methode in dem von mir zitierten Artikel schreiben, dass sie den Mittelwert des Y_i (die erklärten Variablenbeobachtungen) für alle Werte von Alpha und Lambda verwenden. Wenn ich nun die Ausgabe der glmnet-Funktion betrachte, denke ich, dass dies nicht bei allen Lambdas der Fall ist. Das sagt mir also nicht, wie ich die Abschnitte für jeden Regularisierungsparameter Lambda berechnen soll.
Yelh
λ
Könnten Sie bitte Ihre Idee präzisieren? Welchen Ausdruck von Gewichten sollte ich berücksichtigen?
Yelh
In der Arbeit ist jede "innere Schleife" ein Problem mit bestraften, gewichteten kleinsten Quadraten, wobei die Gewichte durch den vorherigen angepassten Wert über Gleichung 17 definiert werden.
Simon Byrne
1
Es ist in Ordnung, dass ich die Antwort beim Scikit-Learn-Python-Code gefunden habe (weil der glmnet-Quellcode in Fortran ist und nicht meine Tasse Tee ist). Ich werde es später teilen, wenn jemand interessiert ist. Danke trotzdem !
Yelh