Wie führt man eine Kreuzvalidierung mit cv.glmnet durch (LASSO-Regression in R)?

10

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.glmnetModells um?

  • Muss ich das manuell machen oder ist die caretFunktion 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.glmnetModells durchführe, wie isoliere ich das "beste" Modell (aus dem "besten" Lambda-Wert) von jedem cv.glmnetModell 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.1seim cv.glmnetModell.

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.

der Waldökologe
quelle
1
Für diejenigen, die ohne Kommentar für das Schließen gestimmt haben: Das ist nicht hilfreich. Lassen Sie mich wissen, was Ihr Problem in den Kommentaren ist, und ich werde versuchen, es zu beheben.
Theforestecologist
1
Sie stimmen nicht für den Abschluss ab, sondern für die Migration zu CrossValidated. Ich habe gerade meine Stimme hinzugefügt.
Hack-R
@theforestecologist: Sie sollten in der Lage sein, die Gründe für die Schließung / Migration zu sehen, indem Sie auf die Schaltfläche "Schließen" klicken.
DWin
Danke, dass Sie gefragt haben, ich hatte genau diese Frage. Und ich kann Caret nicht verwenden, weil ich ein multivariates Y habe. Aber haben Sie den Quellcode überprüft und bestätigt, dass kein zusätzlicher Lebenslauf erforderlich ist? Der Quellcode kann sehr schwer zu befolgen sein.
Qoheleth

Antworten:

3

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 lambdaWerte 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 ::

cvmist der mittlere kreuzvalidierte Fehler. cvsdist 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 careteher als cv.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.glmnetauf Trainingsdaten ausgeführt werden, und verwenden Sie das Modell glmnet.fit, um die Testdaten vorherzusagen.

Discipulus
quelle
@ Discupulus: Danke. Könnten Sie dafür Beweise liefern? (dh führen Sie mich bitte durch). Bedeutet dies angesichts Ihrer Antwort auch, dass keine weiteren Kreuzvalidierungsprozesse erforderlich sind, um eine Leistungsmetrik für die Daten zu melden? (Ich könnte einfach die MSE des Lambda.1se-Falls als meine endgültige Modellleistung melden?)
Theforestecologist
Ja, eine weitere Kreuzvalidierung ist nicht erforderlich. Als Beweis können Sie den Quellcode der cv.glmnetFunktion als ROpenSource betrachten. Geben Sie einfach die cv.glmnetKonsole ein.
Discipulus
3
@ Discipulus. Ich schickte Trevor Hastie eine E-Mail mit der Frage: "Führt cv.glmnet (R-Implementierung) nur einen Lebenslauf aus, um Lambda auszuwählen? Oder führt es auch einen äußeren Lebenslauf durch, um das ausgewählte Lambda zu validieren? Mit anderen Worten, müssen wir unseren eigenen äußeren Lebenslauf codieren, wenn wir willst du das gewählte Lambda validieren? " und er antwortete (ziemlich schnell) "Ja, nur um Lambda zu wählen", was ich so interpretiere, dass es nur den inneren Lebenslauf macht, und wir müssen unseren eigenen äußeren Lebenslauf codieren.
Qoheleth
@theforestecologist Ich versuche mehr über Kreuzvalidierung zu erfahren und finde deinen Beitrag lehrreich. Ich verstehe nicht, was Sie unter cv.glmnet verstehen, das auch als allgemeineres Kreuzvalidierungsverfahren dient. Ich dachte, der einzige verfügbare Parameter ist Lambda - welche äußere Schicht der Kreuzvalidierung gibt es? Wäre dankbar, wenn Sie antworten könnten. Vielen Dank!
user2450223