Gruppieren Sie kategoriale Variablen in glmnet

8

Betrachten Sie die folgende Passform:

fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")

Wie gebe ich an, welche Spalten xkategorisch / multinomial sind? Gibt es eine Option, um den Index der gruppierten Variablen anzugeben?

In der Dokumentation wird die Option type.multinomialwie folgt beschrieben:

Wenn "gruppiert", wird eine gruppierte Lasso-Strafe für die multinomialen Koeffizienten für eine Variable verwendet. Dies stellt sicher, dass sie alle zusammen in unserem Out sind. Der Standardwert ist "nicht gruppiert".

James
quelle

Antworten:

13

Die ersten beiden glmnet()erwarteten Argumente sind eine Matrix der Prädiktoren ( xin Ihrem Fall) und ein Vektor der Antwort ( g4in Ihrem Fall). Für die xMatrix wird erwartet, dass Sie bereits kategoriale Variablen ausgeblendet haben. Mit anderen Worten, glmnet()weiß nicht wirklich, ob einer Ihrer Prädiktoren kategorisch ist, da er bereits ausgeblendet wurde.

Wenn sich Ihre Daten in einem Datenrahmen befinden, können Sie die xMatrix mithilfe der model.matrix()Funktion erstellen . Es akzeptiert die Formelsprache, schließt die Antwortvariable automatisch aus und erstellt Dummy-Variablen für alle als Faktoren definierten Prädiktoren.

Die Optionen family="multinomial"und type.multinomial="grouped"beziehen sich auf die Antwortvariable mit mehr als zwei möglichen Ergebnissen. Sie können die Antwortvariable ( g4) als Faktor übergeben.

Die Paketautoren stellen eine schöne Vignette zur Verfügung , die die Verwendung von erklärt glmnet(), obwohl sie leider kein Beispiel model.matrix()für die Erstellung der xMatrix enthält.

Kevin Markham
quelle
1
Ein bisschen zu spät zur Party, aber nur um zu erwähnen, dass eine weitere nette Einführung in glmnet zusammen mit einem Beispiel mit model.matrix in Eine Einführung in das statistische Lernen gegeben wird. www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
owen88
12

Wie justmarkham betont, können Sie die Entwurfsmatrix xmithilfe von erstellen model.matrix. Beachten Sie, dass Sie den Intercept ausschließen möchten, da glmnet standardmäßig einen enthält. Möglicherweise möchten Sie auch die Standardkontrastfunktion ändern, bei der standardmäßig eine Ebene jedes Faktors weggelassen wird (Behandlungscodierung). Aufgrund der Lasso-Strafe ist dies jedoch für die Identifizierbarkeit nicht mehr erforderlich und erschwert die Interpretation der ausgewählten Variablen. Stellen Sie dazu ein

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

Unabhängig davon, welche Ebenen eines Faktors ausgewählt sind, können Sie sich vorstellen, dass diese spezifischen Ebenen im Vergleich zu allen ausgelassenen Ebenen von Bedeutung sind. Beim maschinellen Lernen habe ich gesehen, dass diese Codierung als One-Hot-Codierung bezeichnet wird.

Unter der Annahme , dass g4hat KEbene, die type.multinomial="grouped"Option gibt , dass die Funktionen von xwerden alle das Modell gleichzeitig für jeden der Eingabe Klinearen Prädiktoren, im Gegensatz zu mit dem linearen Prädiktors für jede Klasse (im allgemeinen) ein eigenes Merkmal aufweist. glmnetunterstützt (derzeit?) keine gruppierten Strafen von Prädiktoren (die xMatrix). Das Paket grplassofunktioniert, ist aber in reinem R geschrieben, ist also langsamer als glmnet, aber Sie könnten es versuchen.

Andrew M.
quelle
Könnten Sie das vielleicht etwas anders erklären? Oder (mehr auf den Punkt) vielleicht könnten Sie einen Einblick in meine weitere Frage liefern: stats.stackexchange.com/questions/238623/...
theforestecologist
Hallo @AndrewM, model.matrixschließt keine Ebene von der ersten kategorialen Variablen aus, wenn wir den Achsenabschnitt weglassen. Sollte die Entwurfsmatrix glmnetunabhängig davon eine Eingabe sein ? und wie interpretieren wir die nicht ausgelassene Ebene der ersten kategorialen Variablen in der Lasso-Regression?
Goldman Clarck vor