Estou usando cv.glmnet
para encontrar preditores. A configuração que eu uso é a seguinte:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Garantir que os resultados sejam reprodutíveis set.seed(1)
. Os resultados são altamente variáveis. Corri exatamente o mesmo código 100 para ver como os resultados eram variáveis. Nas corridas 98/100, sempre havia um preditor em particular selecionado (às vezes por conta própria); outros preditores foram selecionados (o coeficiente era diferente de zero) geralmente 50/100 vezes.
Por isso, diz-me que cada vez que a validação cruzada estiver em execução, provavelmente irá selecionar um melhor lambda diferente, porque a randomização inicial das dobras é importante. Outros viram esse problema ( resultados do CV.glmnet ), mas não há uma solução sugerida.
Eu estou pensando que talvez aquele que aparece 98/100 provavelmente esteja bastante correlacionado com todos os outros? Os resultados não estabilizar, se eu LOOCV apenas correr ( ), mas estou curioso por que eles são tão variáveis quando \ text {nfold} <n .
fonte
set.seed(1)
corre uma vezcv.glmnet()
100 vezes? Essa não é uma ótima metodologia para reprodutibilidade; melhor para aset.seed()
direita antes de cada corrida, ou mantenha as dobras constantes entre as corridas. Cada uma das chamadas paracv.glmnet()
está chamandosample()
N vezes. Portanto, se o comprimento dos seus dados mudar, a reprodubilidade será alterada.Respostas:
O ponto aqui é que nas
cv.glmnet
dobras K ("partes") são escolhidas aleatoriamente.Na validação cruzada de dobras K, o conjunto de dados é dividido em partes partes são usadas para prever a parte K-ésima (isso é feito vezes, usando uma parte diferente a cada vez). Isso é feito para todas as lambdas e é a que fornece o menor erro de validação cruzada.K - 1 K KK K- 1 K K
lambda.min
É por isso que, quando você usa os resultados não mudam: cada grupo é composto de um, portanto, não há muita escolha para os gruposKn fo l ds = n K
No
cv.glmnet()
manual de referência:MSEs é o quadro de dados que contém todos os erros para todas as lambdas (para as 100 execuções),
lambda.min
é sua lambda com erro médio mínimo.fonte
cv.glmnet(...)$lambda
. Meus correções alternativas isto: stats.stackexchange.com/a/173895/19676Ultimamente, enfrentei o mesmo problema. Tentei repetir o CV várias vezes, como 100, 200, 1000 no meu conjunto de dados, tentando encontrar o melhor e (estou usando uma rede elástica). Mas, mesmo se eu criar 3 testes cv, cada um com 1000 iterações que calculam a média dos mínimos MSEs para cada , recebo três casais diferentes ( , ).α α λ αλ α α λ α
Não tocarei no problema aqui, mas decidi que minha melhor solução não é calcular a média dos min MSEs, mas extrair os coeficientes para cada iteração best e depois tratá-los como uma distribuição de valores (uma variável aleatória).λα λ
Então, para cada preditor, recebo:
Dessa forma, recebo uma descrição bastante sólida do efeito do preditor. Depois de ter distribuições para os coeficientes, você pode executar qualquer coisa estatística que considere valer para obter IC, valores de p, etc ... mas ainda não investiguei isso.
Este método pode ser usado com mais ou menos qualquer método de seleção que eu possa pensar.
fonte
Vou adicionar outra solução, que lida com o bug no @ Alice devido à falta de lambdas, mas não requer pacotes extras como o @Max Ghenis. Agradecemos a todas as outras respostas - todo mundo faz pontos úteis!
fonte
A resposta de Alice funciona bem na maioria dos casos, mas às vezes ocorre erros devido às
cv.glmnet$lambda
vezes retornando resultados de diferentes tamanhos, por exemplo:OptimLambda
abaixo deve funcionar no caso geral e também é mais rápido, aproveitando omclapply
processamento paralelo e evitando loops.fonte
Você pode controlar a aleatoriedade se definir explicitamente foldid. Aqui está um exemplo de CV 5 vezes
Agora execute o cv.glmnet com esses foldids.
Você obterá os mesmos resultados todas as vezes.
fonte