Jak przeprowadzić walidację krzyżową z cv.glmnet (regresja LASSO w R)?

10

Zastanawiam się, jak właściwie podejść do szkolenia i testowania modelu LASSO przy użyciu glmnet w R?

  • W szczególności zastanawiam się, jak to zrobić, jeśli brak zewnętrznego zestawu danych testowych wymaga użycia weryfikacji krzyżowej (lub innego podobnego podejścia) do przetestowania mojego modelu LASSO.

Pozwól mi rozbić mój scenariusz:

Mam tylko jeden zestaw danych do informowania i szkolenia mojego modelu glmnet. W rezultacie będę musiał użyć weryfikacji krzyżowej, aby podzielić moje dane i wygenerować sposób na przetestowanie mojego modelu.

Już używam cv.glmnet, który zgodnie ze szczegółami pakietu :

Dokonuje k-krotnej walidacji krzyżowej dla glmnet, tworzy wykres i zwraca wartość lambda.

  • Czy walidacja krzyżowa jest wykonywana cv.glmnetpo prostu w celu wybrania najlepszej lambda, czy też służy również jako bardziej ogólna procedura walidacji krzyżowej?

    • Innymi słowy, czy nadal muszę wykonać kolejny krok weryfikacji krzyżowej, aby „przetestować” mój model?

Pracuję z założeniem, że „tak, rozumiem”.

W takim razie jak podejść do weryfikacji krzyżowej mojego cv.glmnetmodelu?

  • Czy muszę to robić ręcznie, czy może caretfunkcja jest przydatna w modelach glmnet?

  • Czy używam dwóch koncentrycznych „pętli” walidacji krzyżowej? ... Czy używam „wewnętrznej pętli” CV poprzez, cv.glmnetaby określić najlepszą wartość lambda w każdym z k fałd „zewnętrznej pętli” przetwarzania k-krotnej walidacji krzyżowej ?

    • Jeśli przeprowadzam walidację krzyżową mojego już cv.glmnetmodelu walidacji krzyżowej , w jaki sposób oddzielić „najlepszy” model (od „najlepszej” wartości lambda) od każdego cv.glmnetmodelu w ramach każdej krotnie mojej „zewnętrznej pętli” walidacji krzyżowej?

      • Uwaga: definiuję „najlepszy” model jako model związany z lambda, który wytwarza MSE w ciągu 1 SE od minimum… tak jest $lambda.1sew cv.glmnetmodelu.

Kontekst:

Próbuję przewidzieć wiek drzewa („wiek”) na podstawie średnicy drzewa („D”), D ^ 2 i gatunku („czynnik (SPEC)”). [wynikowe równanie: Age ~ D + factor(SPEC) + D^2]. Mam ~ 50 000 wierszy danych, ale dane są podłużne (śledzą osobniki w czasie) i składają się z ~ 65 gatunków.

theforestecologist
źródło
1
Dla tych, którzy głosowali na zamknięcie bez komentowania: to nie jest pomocne ... daj mi znać, jaki jest twój problem w komentarzach, a ja postaram się go naprawić.
theforestecologist
1
Nie głosują na zamknięcie, głosują na migrację do CrossValidated. Właśnie do tego dodałem swój głos.
Hack-R
@theforestecologist: Powinieneś zobaczyć powody cytowania zamknięcia / migracji, klikając przycisk „zamknij”.
DWin
Dzięki, że pytasz, miałem dokładnie to pytanie. I nie mogę używać karetki, ponieważ mam wielowymiarową literę Y. Ale czy sprawdziłeś kod źródłowy i potwierdziłeś, że żadne dodatkowe CV nie jest potrzebne? Kod źródłowy może być dość trudny do naśladowania.
qoheleth

Odpowiedzi:

3

Czy weryfikacja krzyżowa przeprowadzana jest w cv.glmnet po prostu w celu wybrania najlepszej lambda, czy też służy ona również jako ogólniejsza procedura walidacji krzyżowej?

Robi prawie wszystko, co jest potrzebne do weryfikacji krzyżowej. Na przykład dopasowuje możliwe lambdawartości do danych, wybiera najlepszy model i wreszcie trenuje model z odpowiednimi parametrami.

Na przykład w zwróconym obiekcie:

cvmjest średnim potwierdzonym krzyżowo błędem. cvsdjest szacowanym odchyleniem standardowym.

Podobnie jak inne zwracane wartości, są one obliczane na zestawie testowym. Wreszcie

glmnet.fit podaje model wytrenowany na wszystkich danych (szkolenie + test) z najlepszymi parametrami.

Czy muszę to robić ręcznie, czy może funkcja daszka jest przydatna w modelach glmnet?

Nie musisz tego robić ręcznie. „Caret” byłby bardzo przydatny i jest jednym z moich ulubionych pakietów, ponieważ działa dla wszystkich innych modeli o tej samej składni. Ja sam często używam caretzamiast cv.glmnet. Jednak w twoim scenariuszu jest to zasadniczo takie samo.

Czy używam dwóch koncentrycznych „pętli” walidacji krzyżowej? ... Czy używam „wewnętrznej pętli” CV przez cv.glmnet, aby określić najlepszą wartość lambda w każdym z k fałd „zewnętrznej pętli” k-krotnie przetwarzanie krzyżowej weryfikacji?

Możesz to zrobić, a ta koncepcja jest bardzo podobna do idei Nested Cross-Validation Nested Cross Validation do wyboru modelu .

Jeśli przeprowadzam walidację krzyżową mojego już sprawdzonego modelu cv.glmnet, w jaki sposób mogę wyodrębnić „najlepszy” model (od „najlepszej” wartości lambda) od każdego modelu cv.glmnet w ramach każdej fałdy mojej zewnętrznej pętli „weryfikacji krzyżowej?

Wystarczy uruchomić pętlę, w której wygenerujesz dane treningowe, a dane testowe uruchomisz cv.glmnetna danych treningowych i użyjesz modelu glmnet.fitdo prognozowania danych testowych.

discipulus
źródło
@discupulus: Dzięki. Czy możesz podać jakieś dowody na to? (tzn. proszę poprowadź mnie przez to). Czy, biorąc pod uwagę twoją odpowiedź, czy to oznacza, że ​​nie są potrzebne dalsze procesy weryfikacji krzyżowej w celu zgłoszenia metryki wydajności dla danych? (Czy mógłbym po prostu zgłosić MSE przypadku lambda.1se jako moją ostateczną wydajność modelu?)
theforestecologist
Tak, dalsza walidacja krzyżowa nie jest konieczna. Jako dowód możesz spojrzeć na kod źródłowy cv.glmnetfunkcji, tak jak Ropensource. Po prostu wpisz cv.glmnetw konsoli.
discipulus
3
@discipulus. Wysłałem e-mail do Trevora Hastiego z pytaniem: „czy cv.glmnet (implementacja R) robi tylko CV, aby wybrać lambda? Czy też robi zewnętrzne CV, aby zweryfikować wybraną lambdę? chcesz zweryfikować wybraną lambdę? ” i odpowiedział (raczej szybko) „Tak, po prostu wybrać lambda”, co interpretuję, że oznacza to tylko wewnętrzne CV i będziemy musieli zakodować własne zewnętrzne CV.
qoheleth
@theforestecologist Próbuję dowiedzieć się więcej na temat weryfikacji krzyżowej i znaleźć swój post edukacyjny. Nie rozumiem, co masz na myśli przez cv.glmnet, który służy również jako bardziej ogólna procedura walidacji krzyżowej. Myślałem, że jedynym parametrem dostępnym do wyboru jest lambda - jaka zewnętrzna warstwa walidacji krzyżowej istnieje? Byłbym wdzięczny, gdybyś mógł odpowiedzieć. Dzięki!
user2450223 24.0419