Alguém pode explicar o que o argumento foldid no glmnet faz?

8

Estou tentando determinar qual alfa usar na minha glmnetfunção, mas o arquivo de ajuda diz-me:

Observe que o cv.glmnet NÃO procura valores para alfa. Um valor específico deve ser fornecido, caso contrário, alfa = 1 é assumido por padrão. Se os usuários também desejam validar cruzadamente o alfa, eles devem chamar o cv.glmnet com um vetor pré-calculado foldid e, em seguida, usar esse mesmo vetor de dobra em chamadas separadas para o cv.glmnet com valores diferentes de alfa.

No entanto, eu não entendo:

  1. Qual é o vetor / argumento foldid.
  2. Como criar o vetor foldid
  3. Como usar o argumento foldid.

Qualquer assistência com isso seria muito apreciada!

theforestecologist
fonte
Eu acho que esse parâmetro faz sentido quando você está comparando modelos diferentes. então você deseja controlar as dobras e pré-especificá-las. Para selecionar alfa, você deve tentar diferentes valores do parâmetro.
Marcel4

Respostas:

6

fold.idpermite que o usuário pré-especifique as dobras de validação cruzada cv.glmnet. Por exemplo, se eu tiver alguns dados

x    | y    | fold.id
-----+------+--------
0    | 1    | 1
1    | 1    | 1
0    | 0    | 2
1    | 2    | 2
.    | .    | .

Passar na coluna indicada como fold.idargumento para cv.glmnetfazer com que (por exemplo) as duas primeiras observações residam na mesma dobra e a terceira e quarta observações na mesma dobra (diferente).

Os autores estão sugerindo que, se você desejar escolher entre uma coleção discreta de base em uma estimativa de validação cruzada de algum erro com uma ideal , é recomendável usar a mesma estrutura de dobra em cada de suas validações cruzadas ao determinar cada .λ α λ ααλαλα

Matthew Drury
fonte
Então o fold.id precisa ser uma matriz com o mesmo número de linhas que minha matriz de entrada (x)? Isso está certo?
Theforestecologist
Existe uma maneira estratégica de definir o fold.id, ou é completamente arbitrário? Em outras palavras, como defino um fold.id adequado?
Theforestecologist
2
Apenas um vetor de números inteiros, acredito. Mas sim, o vetor deve ter uma entrada para cada linha da sua matriz de design.
Matthew Drury
Isso depende dos seus dados, mas o caso mais simples é coberto por algo parecido rbinom(now(X), n.folds, rep(1/n.folds, n.folds)).
Matthew Drury
Qual é a melhor maneira de configurar isso para dados de séries temporais?
28419 Frank
1

De acordo com a Glmnet Vignette , uma maneira de configurar o foldidglmnet é:

foldid<-sample(1:10,size=length(y),replace=TRUE)

E, em seguida, aplique a uma série de alfas:

cv1=cv.glmnet(x,y,foldid=foldid,alpha=1)
cv.5=cv.glmnet(x,y,foldid=foldid,alpha=.5)
cv0=cv.glmnet(x,y,foldid=foldid,alpha=0)

A sample()função basicamente permite gerar um vetor de números aleatórios no intervalo que você fornece (= 1: nfolds) para o comprimento da variável de resposta matriz y . Dessa maneira, você atribui cada uma das linhas da matriz de entrada a uma dobra aleatória (mas agora definida).

theforestecologist
fonte
Alguém entende como os autores da vinheta decidiram que alfa = 1 é melhor com base nos 4 gráficos que imprimem? A citação deles: Vemos que o laço (alfa = 1) faz o melhor aqui. Também vemos que o intervalo de lambdas usado difere do alfa. "... Eu simplesmente não entendo como eles determinaram que alfa = 1 é o melhor ??"
theforestecologist
Acredito que o motivo é que ele usa a menor quantidade de variáveis. Ou seja, é o modelo "mais simples" e deve generalizar melhor.
Marcel4