Definição exata da medida de desvio no pacote glmnet, com validação cruzada?

12

Para minha pesquisa atual, estou usando o método Lasso através do pacote glmnet em R em uma variável dependente binomial.

No glmnet, o lambda ideal é encontrado via validação cruzada e os modelos resultantes podem ser comparados com várias medidas, por exemplo, erro de classificação incorreta ou desvio.

Minha pergunta: como exatamente o desvio é definido no glmnet? Como é calculado?

(No artigo correspondente "Caminhos de regularização para modelos lineares generalizados via descida de coordenadas" de Friedman et al., Encontrei este comentário apenas sobre o desvio usado no cv.glmnet: "desvio médio (menos duas vezes a probabilidade de log no lado de fora) dados) "(p. 17)).

Jo Wmann
fonte
É o mesmo que o desvio usado glm(ou pelo menos deveria ser - há apenas uma definição de desvio que eu saiba).
Hong Ooi
Sim, mas acho que eles o estendem de alguma forma, conforme indicado pela citação no meu primeiro post. O desvio que eu entendo pode comparar o desempenho de dois modelos, mas como os autores incluem os dados deixados de fora da validação cruzada? Como o "menos o dobro da probabilidade de log nos dados deixados de fora" faz sentido?
Jo Wmann
11
Tudo bem, obrigado, agora acho que entendi: o desvio é definido como -2 * probabilidade de log ou melhor (2 * probabilidade de log) / (probabilidade de log do modelo nulo). Isso também explica por que a medida de desvio dos diferentes valores de lambda não excede o intervalo 0,2. O modelo é estimado nas dobras k-1 da validação cruzada e aplicado à dobra restante. Para a aplicação na dobra restante, o escore de probabilidade de log é calculado. Isso é repetido k vezes e a média dos resultados de k para cada lambda da medida de desvio definido acima é retornada.
Jo Wmann
11
Sim, é sempre calculada a média de todas as dobras para cada lambda. Eu acho que você pode usar o desvio diretamente ou a relação wrt para o modelo nulo, que provavelmente é o único modelo de interceptação. Existem duas armadilhas: a) as dobras podem não ter exatamente o mesmo número de pontos de dados b) cada dobra contém dados diferentes (naturalmente). para corrigir (a) você pode simplesmente dividir o desvio pelo número de pontos de dados na dobra selecionada. para corrigir (a) e (b) ao mesmo tempo, use a abordagem de razão. O modelo de desvio assume que o conjunto de dados é o mesmo em cada modelo (a mesma idéia na estimativa do MAP onde eles ignoram o denominador).
Cagdas Ozgenc
11
No entanto, uma vez que as dobras entram na imagem, o denominador não é o mesmo nas dobras. Portanto, a relação cuida disso cancelando os denominadores. Mas não sei quão grande é esse problema quando você calcula a média de dobras.
Cagdas Ozgenc

Respostas:

9

Em Friedman, Hastie e Tibshirani (2010) , o desvio de um modelo binomial, para fins de validação cruzada, é calculado como

menos o dobro da probabilidade de log nos dados deixados de fora (p. 17)

Dado que este é o artigo citado na documentação paraglmnet (nas p. 2 e 5), essa é provavelmente a fórmula usada na embalagem.

E, de fato, no código fonte da função cvlognet, os resíduos de desvio para a resposta são calculados como

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

onde predmaté simplesmente

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

e transmitido da cv.glmnetfunção encolsing . Usei o código-fonte disponível na página da JStatSoft para o jornal e não sei como esse código está atualizado. O código para este pacote é surpreendentemente simples e legível; você sempre pode verificar por si mesmo digitando glmnet:::cv.glmnet.

shadowtalker
fonte
1

Além da resposta do @shadowtalker, quando eu estava usando o pacote glmnet, sinto que o desvio na validação cruzada é de alguma forma normalizado.

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

Ref: documento de desvio R

porque se eu fizer a divisão,

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

o resultado é

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

o que é muito próximo do $ cvm adequado.

Pode ser o que o comentário de @Hong Ooi disse sobre esta questão:

/programming/43468665/poisson-deviance-glmnet

vtshen
fonte