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.glmnet
simplesmente 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.glmnet
modelo?
Preciso fazer isso manualmente ou talvez a
caret
função seja útil para modelos glmnet?Utilizo dois "loops" concêntricos de validação cruzada? ... Utilizo um "loop interno" de CV
cv.glmnet
para 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 cadacv.glmnet
modelo 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.1se
ocv.glmnet
modelo.
- 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 é
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.
fonte
Respostas:
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
lambda
valores 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
caret
em vez decv.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.glmnet
em dados de treinamento e usa o modeloglmnet.fit
para prever os dados de teste.fonte
cv.glmnet
função comoR
é o código-fonte aberto. Basta digitarcv.glmnet
no console.