Dokładna definicja miary dewiacji w pakiecie glmnet, z weryfikacją krzyżową?

12

Dla mojego obecnego reseach używam metody Lasso poprzez pakiet glmnet w R na zmiennej zależnej dwumianowej.

W glmnet optymalna lambda jest określana poprzez walidację krzyżową, a uzyskane modele można porównać z różnymi miarami, np. Błędem błędnej klasyfikacji lub dewiacją.

Moje pytanie: jak dokładnie definiuje się dewiację w glmnet? Jak to jest obliczane?

(W odpowiednim artykule „Ścieżki regularyzacji dla uogólnionych modeli liniowych poprzez zejście współrzędnych” Friedmana i wsp. Znajduję tylko ten komentarz dotyczący dewiacji zastosowanej w cv.glmnet: „oznacza dewiację (minus dwukrotność prawdopodobieństwa logarytmu w lewo) dane) ”(s. 17)).

Jo Wmann
źródło
Jest to to samo, co używane dewiacje glm(a przynajmniej tak powinno być - istnieje tylko jedna definicja dewiacji).
Hong Ooi
Tak, ale myślę, że przedłużają to w jakiś sposób, jak wskazał cytat w moim pierwszym poście. Rozbieżność, którą rozumiem, może porównać wydajność dwóch modeli, ale w jaki sposób autorzy uwzględniają pominięte dane z weryfikacji krzyżowej? W jaki sposób ma sens „dwukrotność prawdopodobieństwa dziennika dla pominiętych danych”?
Jo Wmann
1
W porządku, dziękuję, teraz myślę, że to rozumiem: dewiację definiuje się jako -2 * log-prawdopodobieństwo, a raczej (2 * log-prawdopodobieństwo) / (log-prawdopodobieństwo modelu zerowego). To wyjaśnia również, dlaczego ich miara dewiacji dla różnych wartości lambda nie przekracza przedziału 0,2. Model szacuje się na fałdach k-1 walidacji krzyżowej i stosuje do pozostałych fałd. Dla aplikacji na pozostałej części obliczany jest wynik logarytmu wiarygodności. Jest to powtarzane k razy i zwracana jest średnia z wyników k dla każdej lambda wyżej określonej miary odchylenia.
Jo Wmann
1
Tak, zawsze uśrednia się dla wszystkich fałd dla każdej lambda. Myślę, że możesz użyć albo odchylenia bezpośrednio, albo stosunku wrt do modelu zerowego, który prawdopodobnie jest modelem tylko przechwytującym. Istnieją dwie pułapki: a) fałdy mogą nie mieć dokładnie takiej samej liczby punktów danych b) każda fałda zawiera inne dane (naturalnie). aby naprawić (a), możesz po prostu podzielić odchylenie przez liczbę punktów danych w wybranej zakładce. aby naprawić (a) i (b) w tym samym czasie, użyj metody proporcji. model dewiacji zakłada, że ​​zestaw danych jest taki sam w każdym modelu (ten sam pomysł w oszacowaniu MAP, w którym ignorują mianownik).
Cagdas Ozgenc
1
Jednak gdy fałdy pojawiają się na zdjęciu, mianownik nie jest taki sam na wszystkich fałdach. Tak więc stosunek to załatwia, eliminując mianowniki. Ale nie wiem, jak wielkim problemem jest to, że przeciętny pasujesz.
Cagdas Ozgenc

Odpowiedzi:

9

W Friedman, Hastie i Tibshirani (2010) odchylenie modelu dwumianowego do celów walidacji krzyżowej jest obliczane jako

minus dwukrotność prawdopodobieństwa dziennika dla pominiętych danych (s. 17)

Biorąc pod uwagę, że jest to papier cytowany w dokumentacji dlaglmnet (na s. 2 i 5), prawdopodobnie jest to wzór zastosowany w pakiecie.

I rzeczywiście, w kodzie źródłowym funkcji cvlognet, reszty odchylenia dla odpowiedzi są obliczane jako

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

gdzie predmatjest po prostu

predict(glmnet.object,x,lambda=lambda)

i przekazano z cv.glmnetfunkcji enkodowania . Użyłem kodu źródłowego dostępnego na stronie JStatSoft dla gazety i nie wiem, jak aktualny jest ten kod. Kod tego pakietu jest zaskakująco prosty i czytelny; zawsze możesz sprawdzić sam, pisząc glmnet:::cv.glmnet.

Shadowtalker
źródło
1

Oprócz odpowiedzi @shadowtalker, kiedy korzystałem z pakietu glmnet, mam wrażenie, że odchylenie w walidacji krzyżowej jest w jakiś sposób znormalizowane.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Patrz: dokument dewiacji R.

ponieważ jeśli zrobię podział,

head(deviance(fit$glmnet.fit)) / length(y))

wynik to

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

co jest bardzo zbliżone do dopasowanego $ cvm.

Być może tak powiedział komentarz @Hong Ooi na to pytanie:

/programming/43468665/poisson-deviance-glmnet

Vtshen
źródło