Ich frage mich, wie ich ein LASSO-Modell mit glmnet in R richtig trainieren und testen soll.
- Insbesondere frage ich mich, wie ich dies tun soll, wenn das Fehlen eines externen Testdatensatzes die Kreuzvalidierung (oder einen ähnlichen Ansatz) zum Testen meines LASSO-Modells erfordert .
Lassen Sie mich mein Szenario aufschlüsseln:
Ich habe nur einen Datensatz, um mein glmnet-Modell zu informieren und zu trainieren. Daher muss ich meine Daten mithilfe der Kreuzvalidierung aufteilen, um auch eine Möglichkeit zum Testen meines Modells zu generieren.
Ich benutze bereits cv.glmnet
, was laut Paketdetails :
Führt eine k-fache Kreuzvalidierung für glmnet durch, erstellt ein Diagramm und gibt einen Wert für Lambda zurück.
Wird die Kreuzvalidierung nur durchgeführt
cv.glmnet
, um das beste Lambda auszuwählen, oder dient sie auch als allgemeineres Kreuzvalidierungsverfahren?- Mit anderen Worten, muss ich noch einen weiteren Kreuzvalidierungsschritt durchführen, um mein Modell zu "testen"?
Ich gehe davon aus, dass "Ja, das tue ich".
Wie gehe ich in diesem Fall mit der Kreuzvalidierung meines cv.glmnet
Modells um?
Muss ich das manuell machen oder ist die
caret
Funktion vielleicht für glmnet-Modelle nützlich?Benutze ich zwei konzentrische "Schleifen" der Kreuzvalidierung? ... Benutze ich eine "innere Schleife" von CV via
cv.glmnet
, um den besten Lambda-Wert innerhalb jeder der k Falten einer "externen Schleife" der k-fachen Kreuzvalidierungsverarbeitung zu bestimmen ?Wenn ich eine Kreuzvalidierung meines bereits kreuzvalidierenden
cv.glmnet
Modells durchführe, wie isoliere ich das "beste" Modell (aus dem "besten" Lambda-Wert) von jedemcv.glmnet
Modell innerhalb jeder Falte meiner ansonsten "externen Schleife" der Kreuzvalidierung?- Hinweis: Ich definiere "bestes" Modell als das Modell, das einem Lambda zugeordnet ist, das eine MSE innerhalb von 1 SE des Minimums erzeugt ... dies ist das
$lambda.1se
imcv.glmnet
Modell.
- Hinweis: Ich definiere "bestes" Modell als das Modell, das einem Lambda zugeordnet ist, das eine MSE innerhalb von 1 SE des Minimums erzeugt ... dies ist das
Kontext:
Ich versuche, das Baumalter ("Alter") basierend auf dem Baumdurchmesser ("D"), D ^ 2 und der Art ("Faktor (SPEC)") vorherzusagen. [resultierende Gleichung: Age ~ D + factor(SPEC) + D^2
]. Ich habe ~ 50.000 Datenzeilen, aber die Daten sind in Längsrichtung (verfolgt Individuen durch die Zeit) und bestehen aus ~ 65 Arten.
quelle
Antworten:
Wird die Kreuzvalidierung in cv.glmnet nur durchgeführt, um das beste Lambda auszuwählen, oder dient sie auch als allgemeineres Kreuzvalidierungsverfahren?
Es macht fast alles, was für eine Kreuzvalidierung benötigt wird. Zum Beispiel passt es mögliche
lambda
Werte an die Daten an, wählt das beste Modell aus und trainiert schließlich das Modell mit den entsprechenden Parametern.Zum Beispiel im zurückgegebenen Objekt ::
cvm
ist der mittlere kreuzvalidierte Fehler.cvsd
ist die geschätzte Standardabweichung.Wie andere zurückgegebene Werte werden diese auf dem Testsatz berechnet. Endlich, das
glmnet.fit
gibt das Modell an, das auf allen Daten (Training + Test) mit den besten Parametern trainiert wurde.Muss ich das manuell machen oder ist die Caret-Funktion für glmnet-Modelle nützlich?
Sie müssen dies nicht manuell tun. 'Caret' wäre sehr nützlich und gehört zu meinen Lieblingspaketen, da es für alle anderen Modelle mit derselben Syntax funktioniert. Ich selbst benutze oft
caret
eher alscv.glmnet
. In Ihrem Szenario ist es jedoch im Wesentlichen dasselbe.Benutze ich zwei konzentrische "Schleifen" der Kreuzvalidierung? ... Verwende ich eine "innere Schleife" von CV über cv.glmnet, um den besten Lambda-Wert innerhalb jeder der k-Falten einer "externen Schleife" von k-fach zu bestimmen Kreuzvalidierungsverarbeitung?
Sie können dies tun, und dieses Konzept ist der Idee der verschachtelten Kreuzvalidierung sehr ähnlich. Verschachtelte Kreuzvalidierung für die Modellauswahl .
Wenn ich eine Kreuzvalidierung meines bereits kreuzvalidierenden cv.glmnet-Modells durchführe, wie isoliere ich das "beste" Modell (aus dem "besten" Lambda-Wert) von jedem cv.glmnet-Modell innerhalb jeder Falte meiner ansonsten "externen Schleife? "der Kreuzvalidierung?
Führen Sie einfach eine Schleife aus, in der Sie Trainingsdaten und Testdaten generieren, die
cv.glmnet
auf Trainingsdaten ausgeführt werden, und verwenden Sie das Modellglmnet.fit
, um die Testdaten vorherzusagen.quelle
cv.glmnet
Funktion alsR
OpenSource betrachten. Geben Sie einfach diecv.glmnet
Konsole ein.