Kreuzvalidierende Lasso-Regression in R.

9

Die R-Funktion cv.glm (Bibliothek: Boot) berechnet den geschätzten K-fachen Kreuzvalidierungs-Vorhersagefehler für verallgemeinerte lineare Modelle und gibt Delta zurück. Ist es sinnvoll, diese Funktion für eine Lasso-Regression (Bibliothek: glmnet) zu verwenden, und wenn ja, wie kann sie ausgeführt werden? Die glmnet-Bibliothek verwendet eine Kreuzvalidierung, um den besten Drehparameter zu erhalten, aber ich habe kein Beispiel gefunden, das die endgültige glmnet-Gleichung kreuzvalidiert.

Kalakaru
quelle
2
Dies ist auf jeden Fall sinnvoll. Obwohl LASSO nur über einen (Hyper-) Parameter optimiert, benötigen Sie eine äußere Kreuzvalidierungsschleife, um die bestmögliche Schätzung der Leistung außerhalb der Stichprobe zu erhalten. Siehe Können Sie durch Training von Algorithmen für maschinelles Lernen mit CV / Bootstrap überanpassen? & die zitierten Papiere.
Scortchi - Monica wieder einsetzen
Es wird empfohlen, glmnet anstelle von glm esp zu verwenden. wenn du einen Lebenslauf machst. Wenn ich mich erinnere, wird die Verwendung des glm-Pakets schmerzhaft. Außerdem stellt cv.glmnet mehr Parameter zur Verfügung als cv.glm.
smci

Antworten:

9

Ein Beispiel, wie man für lasso Vanille Ebene Kreuzvalidierung zu tun , in glmnetauf mtcars Datensatz.

  1. Datensatz laden.

  2. Bereiten Sie Funktionen vor (unabhängige Variablen). Sie sollten von matrixKlasse sein. Der einfachste Weg, um dfkategoriale Variablen zu konvertieren , matrixist via model.matrix. Wohlgemerkt, standardmäßig glmnetpasst Intercept, daher sollten Sie Intercept besser aus der Modellmatrix entfernen.

  3. Antwort vorbereiten (abhängige Variable). Codieren wir Autos mit überdurchschnittlich mpgeffizient ('1') und dem Rest als ineffizient ('0'). Konvertieren Sie diese Variable in Faktor.

  4. Führen Sie die Kreuzvalidierung über aus cv.glmnet. Es wird alpha=1von den Standardparametern übernommen glmnet, nach denen Sie gefragt haben: Lasso-Regression.

  5. Wenn Sie die Ergebnisse der Kreuzvalidierung untersuchen, sind Sie möglicherweise an mindestens zwei Informationen interessiert:

    • Lambda, das den kreuzvalidierten Fehler minimiert. glmnetbietet tatsächlich 2 Lambdas: lambda.minund lambda.1se. Es ist Ihr Urteilsvermögen als praktizierender Statistiker, das Sie verwenden sollten.

    • resultierende regulierte Koeffizienten.

Bitte beachten Sie den R-Code gemäß den obigen Anweisungen:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Letzte Kommentare:

  • Beachten Sie, dass die Ausgabe des Modells nichts über die statistische Signifikanz der Koeffizienten aussagt, sondern nur über Werte.

  • l1 Penalizer (Lasso), nach dem Sie gefragt haben, ist für seine Instabilität berüchtigt, wie in diesem Blog-Beitrag und dieser Frage zum Stapelaustausch gezeigt wird . Ein besserer Weg könnte darin bestehen, auch eine alphaKreuzvalidierung durchzuführen, bei der Sie sich für die richtige Mischung von l1- und l2-Strafen entscheiden können.

  • Eine alternative Möglichkeit zur Kreuzvalidierung könnte darin bestehen, sich an Carets zu wenden train( ... method='glmnet')

  • und schließlich ist der beste Weg, mehr über cv.glmnetdie Standardeinstellungen zu erfahren, glmnetnatürlich ?glmnetin Rs Konsole)))

Sergey Bushmanov
quelle
Gute Antwort. Es lohnt sich auch, den Lebenslauf mehrmals auszuführen und die Fehlerkurve (siehe? cv.glmnet) zu mitteln, um die Stichprobe zu berücksichtigen.
user20650
@ SergeyBushmanov SEHR NÜTZLICH!
Theforestecologist
Hallo, ich weiß, dass dies ein alter Beitrag ist, aber ich wollte dir eine Frage stellen. Sie erwähnen, dass die Ausgabe des Modells nichts über die statistische Signifikanz der Koeffizienten aussagt. Wie stellen Sie also fest, ob sie signifikant sind oder nicht?
Jun Jang
@JunJang "Es gibt keine statistische Signifikanz für Koeffizienten" ist die Aussage der Autoren des Pakets, nicht von mir. Ich erinnere mich nicht genau an diese Aussage, weder in einem der Bücher der Paketautoren noch in der Vignette des Pakets. In einem solchen Fall würden Sie, anstatt signifikante oder nicht signifikante Koeffizienten zu sagen, eher sagen, dass sie "nützlich" sind oder nicht, um das Ziel durch Kreuzvalidierung zu erklären.
Sergey Bushmanov