Krzyżowa walidacja regresji lasso w R

10

Funkcja R cv.glm (biblioteka: boot) oblicza szacowany błąd prognozy krotności K-krotności dla uogólnionych modeli liniowych i zwraca deltę. Czy warto używać tej funkcji do regresji lasso (biblioteka: glmnet), a jeśli tak, to w jaki sposób można ją przeprowadzić? Biblioteka glmnet używa weryfikacji krzyżowej, aby uzyskać najlepszy parametr zwrotny, ale nie znalazłem żadnego przykładu, który sprawdzałby krzyżowo końcowe równanie glmnet.

kalakaru
źródło
2
Z pewnością ma to sens i chociaż LASSO optymalizuje tylko jeden (hiper-) parametr, jeśli chcesz uzyskać najlepszą możliwą ocenę wydajności poza próbą, potrzebujesz zewnętrznej pętli weryfikacji krzyżowej. Zobacz Czy potrafisz się dopasowywać, trenując algorytmy uczenia maszynowego za pomocą CV / Bootstrap? i cytowane artykuły.
Scortchi - Przywróć Monikę
Zaleca się używanie glmnet zamiast glm esp. jeśli robisz CV. O ile pamiętam, pakiet glm staje się bolesny w użyciu. Ponadto cv.glmnet udostępnia więcej parametrów niż cv.glm.
smci

Odpowiedzi:

9

Przykładem tego, jak zrobić zwykły waniliowy walidacji krzyżowej na lasso w glmnetsprawie mtcars zbioru danych.

  1. Załaduj zestaw danych.

  2. Przygotuj funkcje (zmienne niezależne). Powinny być matrixklasowe. Najłatwiejszym sposobem na konwersję dfzawierających zmienne jakościowe matrixjest użycie model.matrix. Pamiętaj, że domyślnie glmnetpasuje do przechwytywania, więc lepiej usuń przechwytywanie z matrycy modelu.

  3. Przygotuj odpowiedź (zmienna zależna). Kodujmy samochody powyżej średniej mpgjako „wydajne” („1”), a pozostałe jako nieefektywne („0”). Przelicz tę zmienną na współczynnik.

  4. Uruchom weryfikację krzyżową za pośrednictwem cv.glmnet. Będzie pobierał alpha=1z glmnetparametrów domyślnych , o co prosiłeś: regresja lasso.

  5. Analizując wyniki weryfikacji krzyżowej, możesz zainteresować się co najmniej 2 informacjami:

    • lambda, która minimalizuje błąd weryfikacji krzyżowej. glmnetfaktycznie zapewnia 2 lambdas: lambda.mini lambda.1se. To twój osąd jako praktyczny statystyk, z którego możesz skorzystać.

    • wynikające z tego współczynniki.

Zobacz kod R zgodnie z powyższymi instrukcjami:

# 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

Komentarze końcowe:

  • zauważ, że wyniki modelu nie mówią nic o istotności statystycznej współczynników, tylko wartości.

  • Penalizer l1 (lasso), o który prosiłeś, słynie z niestabilności, o czym świadczy ten post na blogu i pytanie o zmianę stosu . Lepszym sposobem może być również krzyżowa walidacja alpha, która pozwoliłaby ci wybrać odpowiednią kombinację penalizatorów l1 i l2.

  • alternatywnym sposobem przeprowadzenia weryfikacji krzyżowej może być zwrócenie się do firmy Caret train( ... method='glmnet')

  • i wreszcie najlepszym sposobem, aby dowiedzieć się więcej o cv.glmnetdomyślnych ustawieniach glmnetjest oczywiście ?glmnetkonsola R.)))

Siergiej Bushmanow
źródło
Niezła odpowiedź. .. warto również wielokrotnie uruchomić CV i uśrednić krzywą błędów (patrz? cv.glmnet), aby uwzględnić próbkowanie.
user20650,
@SergeyBushmanov BARDZO PRZYDATNY!
theforestecologist,
Cześć, wiem, że to stary post, ale chciałem zadać ci pytanie. Wspominasz, że dane wyjściowe modelu nie mówią nic o istotności statystycznej współczynników, więc jak ustalić, czy są one znaczące, czy nie?
Jun Jang
@JunJang „Nie ma znaczenia statystycznego dla współczynników” to stwierdzenie autorów pakietu, a nie mnie. Stwierdzenie to podano, nie pamiętam dokładnie ani w jednej z książek autorów paczki, ani w winiecie paczki. W takim przypadku zamiast powiedzieć, że współczynniki są znaczące lub nie, wolisz powiedzieć, że są one „przydatne” lub nie wyjaśniają celu poprzez walidację krzyżową.
Sergey Bushmanov