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.glmnet
po 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.glmnet
modelu?
Czy muszę to robić ręcznie, czy może
caret
funkcja 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.glmnet
aby 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.glmnet
modelu walidacji krzyżowej , w jaki sposób oddzielić „najlepszy” model (od „najlepszej” wartości lambda) od każdegocv.glmnet
modelu 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.1se
wcv.glmnet
modelu.
- Uwaga: definiuję „najlepszy” model jako model związany z lambda, który wytwarza MSE w ciągu 1 SE od minimum… tak jest
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.
źródło
Odpowiedzi:
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
lambda
wartości do danych, wybiera najlepszy model i wreszcie trenuje model z odpowiednimi parametrami.Na przykład w zwróconym obiekcie:
cvm
jest średnim potwierdzonym krzyżowo błędem.cvsd
jest 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
caret
zamiastcv.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.glmnet
na danych treningowych i użyjesz modeluglmnet.fit
do prognozowania danych testowych.źródło
cv.glmnet
funkcji, tak jakR
opensource. Po prostu wpiszcv.glmnet
w konsoli.