Regressão do laço de validação cruzada em R

9

A função R cv.glm (library: boot) calcula o erro de previsão de validação cruzada estimado em dobras K para modelos lineares generalizados e retorna delta. Faz sentido usar essa função para uma regressão do laço (library: glmnet) e, em caso afirmativo, como pode ser realizada? A biblioteca glmnet usa uma validação cruzada para obter o melhor parâmetro de rotação, mas não encontrei nenhum exemplo que valide cruzadamente a equação glmnet final.

kalakaru
fonte
2
Certamente faz sentido, e embora o LASSO otimize apenas um (hiper) parâmetro, se você deseja obter a melhor estimativa possível do desempenho fora da amostra, precisa de um loop externo de validação cruzada. Consulte Você pode se ajustar demais treinando algoritmos de aprendizado de máquina usando CV / Bootstrap? e os artigos citados.
Scortchi - Restabelecer Monica
É recomendável usar glmnet em vez de glm esp. se você estiver fazendo currículo. Se bem me lembro, o pacote glm se torna doloroso de usar. Além disso, o cv.glmnet expõe mais parâmetros que o cv.glm.
smci

Respostas:

9

Um exemplo de como fazer baunilha validação cruzada simples para lasso no glmnetno mtcars conjunto de dados.

  1. Carregar conjunto de dados.

  2. Prepare recursos (variáveis ​​independentes). Eles devem ser de matrixclasse. A maneira mais fácil de converter dfcontendo variáveis ​​categóricas em matrixé através de model.matrix. Lembre-se, por padrão, glmnetse encaixa na interceptação, então é melhor descartar a interceptação da matriz do modelo.

  3. Prepare a resposta (variável dependente). Vamos codificar carros com acima da média mpgcomo eficiente ('1') e o restante como ineficiente ('0'). Converta essa variável em fator.

  4. Execute a validação cruzada via cv.glmnet. Ele captará alpha=1os glmnetparâmetros padrão , que é o que você pediu: regressão do laço.

  5. Examinando a saída da validação cruzada, você pode estar interessado em pelo menos duas informações:

    • lambda, que minimiza erros de validação cruzada. glmnetrealmente fornece 2 lambdas: lambda.mine lambda.1se. É seu julgamento como estatístico praticante que você deve usar.

    • coeficientes regularizados resultantes.

Por favor, veja o código R de acordo com as instruções acima:

# 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

Comentários finais:

  • note que a saída do modelo não diz nada sobre a significância estatística dos coeficientes, apenas valores.

  • O penalizador l1 (laço), que você pediu, é notório por instabilidade, como evidenciado nesta postagem do blog e nesta pergunta de stackexchange . Uma maneira melhor poderia ser a validação cruzada alphatambém, o que permitiria decidir sobre a combinação adequada de penalizadores l1 e l2.

  • uma maneira alternativa de fazer a validação cruzada pode ser recorrer ao sinal de intercalação train( ... method='glmnet')

  • e, finalmente, a melhor maneira de aprender mais sobre cv.glmnete seus padrões glmneté, obviamente, ?glmnetno console do R)))

Sergey Bushmanov
fonte
Boa resposta. .. também vale a pena executar o CV várias vezes e calcular a curva de erro (consulte? cv.glmnet) para contabilizar a amostragem.
user20650
@SergeyBushmanov MUITO ÚTIL!
theforestecologist
Olá, sei que este é um post antigo, mas queria fazer uma pergunta. Você menciona que a saída do modelo não diz nada sobre a significância estatística dos coeficientes; então, como você determina que eles são significativos ou não?
Jun
@JunJang "Não há significância estatística para os coeficientes" é a afirmação dos autores do pacote, não eu. Esta afirmação é dada, não me lembro exatamente, nem em um livro dos autores do pacote nem na vinheta do pacote. Nesse caso, em vez de dizer coeficientes significativos ou não, você prefere dizer que eles são "úteis" ou não para explicar o destino por meio da validação cruzada.
Sergey Bushmanov