Como fazer a validação cruzada com cv.glmnet (regressão LASSO em R)?

10

Eu estou querendo saber como abordar adequadamente o treinamento e o teste de um modelo LASSO usando glmnet no R?

  • Especificamente, estou pensando em como fazer isso, se a falta de um conjunto de dados de teste externo exigir que eu use a validação cruzada (ou outra abordagem semelhante) para testar meu modelo LASSO.

Deixe-me detalhar meu cenário:

Eu só tenho um conjunto de dados para informar e treinar meu modelo glmnet. Como resultado, terei que usar a validação cruzada para dividir meus dados e também gerar uma maneira de testar meu modelo.

Eu já estou usando cv.glmnet, que de acordo com os detalhes do pacote :

Faz a validação cruzada k-fold para glmnet, produz um gráfico e retorna um valor para lambda.

  • A validação cruzada é realizada cv.glmnetsimplesmente para escolher o melhor lambda ou também está servindo como um procedimento de validação cruzada mais geral?

    • Em outras palavras, ainda preciso executar outra etapa de validação cruzada para "testar" meu modelo?

Estou trabalhando com a suposição de que "sim, sim".

Sendo esse o caso, como abordar a validação cruzada do meu cv.glmnetmodelo?

  • Preciso fazer isso manualmente ou talvez a caretfunção seja útil para modelos glmnet?

  • Utilizo dois "loops" concêntricos de validação cruzada? ... Utilizo um "loop interno" de CV cv.glmnetpara determinar o melhor valor lambda dentro de cada uma das k dobras de um "loop externo" do processamento de validação cruzada de dobras k ?

    • Se eu faço a validação cruzada do meu modelo já com validação cruzada cv.glmnet, como faço para isolar o modelo "melhor" (do "melhor" valor lambda) de cada cv.glmnetmodelo em cada dobra do meu "loop externo" de validação cruzada?

      • Nota: Estou definindo o "melhor" modelo como o modelo associado a um lambda que produz um MSE dentro de 1 SE do mínimo ... este é $lambda.1seo cv.glmnetmodelo.

Contexto:

Estou tentando prever a idade da árvore ("idade") com base no diâmetro da árvore ("D"), D ^ 2 e nas espécies ("fator (SPEC)"). [equação resultante: Age ~ D + factor(SPEC) + D^2]. Eu tenho ~ 50K linhas de dados, mas os dados são longitudinais (rastreiam indivíduos através do tempo) e consistem em ~ 65 espécies.

theforestecologist
fonte
11
Para aqueles que votaram no fechamento sem comentar: isso não ajuda ... deixe-me saber qual é o seu problema nos comentários e tentarei corrigi-lo.
Theforestecologist
11
Eles não estão votando para fechar, estão votando para migrá-lo para CrossValidated. Acabei de adicionar meu voto a isso.
Hack-R
@ theforestecologist: Você deve poder ver os motivos citados para o fechamento / migração clicando no botão "fechar".
Dwin
Obrigado por perguntar, eu tinha exatamente essa pergunta. E não posso usar o sinal de intercalação porque tenho Y multivariado. Mas você inspecionou o código-fonte e confirmou que nenhum CV adicional é necessário? O código fonte pode ser bastante difícil de seguir.
Qheleth

Respostas:

3

A validação cruzada é realizada no cv.glmnet simplesmente para escolher o melhor lambda ou também está servindo como um procedimento de validação cruzada mais geral?

Faz quase tudo o que é necessário em uma validação cruzada. Por exemplo, ele ajusta lambdavalores possíveis nos dados, escolhe o melhor modelo e finalmente treina o modelo com os parâmetros apropriados.

Por exemplo, no objeto retornado:

cvmé o erro validado cruzado médio. cvsdé o desvio padrão estimado.

Como outros valores retornados, estes são calculados no conjunto de testes. finalmente, o

glmnet.fit fornece o modelo treinado em todos os dados (treinamento + teste) com os melhores parâmetros.

Preciso fazê-lo manualmente, ou talvez a função circunflexo seja útil para modelos glmnet?

Você não precisa fazer isso manualmente. 'Caret' seria muito útil e é um dos meus pacotes favoritos, pois funciona para todos os outros modelos com a mesma sintaxe. Eu mesmo muitas vezes usam caretem vez de cv.glmnet. No entanto, no seu cenário, é essencialmente o mesmo.

Utilizo dois "loops" concêntricos de validação cruzada? ... Utilizo um "loop interno" do CV via cv.glmnet para determinar o melhor valor lambda dentro de cada uma das k dobras de um "loop externo" do k-fold processamento de validação cruzada?

Você poderia fazer isso e esse conceito é muito semelhante à idéia de Validação cruzada aninhada Validação cruzada aninhada para seleção de modelo .

Se eu faço a validação cruzada do meu modelo cv.glmnet já com validação cruzada, como faço para isolar o modelo "melhor" (do "melhor" valor lambda)) de cada modelo cv.glmnet dentro de cada dobra do loop externo? "de validação cruzada?

Basta executar um loop no qual você gera dados de treinamento e dados de teste executados cv.glmnetem dados de treinamento e usa o modelo glmnet.fitpara prever os dados de teste.

discípulo
fonte
@discupulus: Obrigado. Você poderia fornecer algum tipo de evidência para isso? (ou seja, me guie por isso). Além disso, dada sua resposta, isso significa que não são necessários mais processos de validação cruzada para relatar uma métrica de desempenho para os dados? (Eu poderia simplesmente relatar o MSE do caso lambda.1se como meu desempenho final modelo?)
theforestecologist
Sim, nenhuma validação cruzada adicional é necessária. Para a evidência, você pode olhar o código-fonte da cv.glmnetfunção como Ré o código-fonte aberto. Basta digitar cv.glmnetno console.
Discipulus
3
@discipulus. Enviei um email para Trevor Hastie perguntando "o cv.glmnet (implementação R) apenas faz CV para escolher lambda? Ou também faz um CV externo para validar o lambda escolhido? Em outras palavras, precisamos codificar nosso próprio CV externo se quisermos deseja validar a lambda escolhida? " e ele respondeu (com bastante rapidez) "Sim, apenas para escolher lambda", que eu interpreto para significar que apenas faz o CV interno e teremos que codificar nosso próprio CV externo.
Qoheleth 11/04
@theforestecologist Estou tentando aprender mais sobre validação cruzada e encontrar seu post educacional. Não entendo o que você quer dizer com cv.glmnet também servindo como um procedimento de validação cruzada mais geral. Eu pensei que o único parâmetro disponível para escolher é lambda - que camada externa de validação cruzada existe? Ficaria grato se você pudesse responder. Obrigado!
user2450223