¿Alguien puede explicar lo que hace el argumento foldid en glmnet?

8

Estoy tratando de determinar qué alfa usar en mi glmnetfunción, pero el archivo de ayuda me dice:

Tenga en cuenta que cv.glmnet NO busca valores para alfa. Se debe proporcionar un valor específico; de lo contrario, se supone alfa = 1 de forma predeterminada. Si los usuarios desean validar también alfa, deben llamar a cv.glmnet con un vector foldid precalculado y luego usar este mismo vector de pliegue en llamadas separadas a cv.glmnet con diferentes valores de alpha.

Sin embargo, no entiendo:

  1. Qué es el vector / argumento foldid.
  2. Cómo crear el vector foldid
  3. Cómo usar el argumento foldid.

Cualquier ayuda con esto sería muy apreciada!

el forestalteólogo
fuente
Creo que este parámetro tiene sentido cuando se comparan diferentes modelos. por lo que le gustaría controlar los pliegues y especificarlos previamente. Para seleccionar alfa, debe probar diferentes valores del parámetro.
marbel

Respuestas:

6

fold.idpermite al usuario especificar previamente los pliegues de validación cruzada para cv.glmnet. Por ejemplo, si tengo algunos datos

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

Luego, pasar la columna indicada como fold.idargumento cv.glmnethará que (por ejemplo) las dos primeras observaciones residan en el mismo pliegue, y la tercera y cuarta observaciones residan en el mismo pliegue (diferente).

Los autores sugieren que si desea elegir entre una colección discreta de basada en una estimación de validación cruzada de algún error en una óptima , entonces es mejor utilizar la misma estructura de pliegue en cada de sus validaciones cruzadas al determinar cada .αλαλα

Matthew Drury
fuente
Entonces, ¿fold.id debe ser una matriz con el mismo número de filas que mi matriz de entrada (x)? ¿Está bien?
theforestecologist
¿Hay alguna forma estratégica de establecer el fold.id, o es completamente arbitrario? En otras palabras, ¿cómo defino un fold.id adecuado?
theforestecologist
2
Solo un vector de enteros, creo. Pero sí, el vector debe tener una entrada para cada fila de su matriz de diseño.
Matthew Drury
Eso depende de sus datos, pero el caso más simple está cubierto por algo así rbinom(now(X), n.folds, rep(1/n.folds, n.folds)).
Matthew Drury
¿Cuál es la mejor manera de configurar esto para datos de series temporales?
Frank
1

De acuerdo con la viñeta de Glmnet , una forma de configurar foldidfor glmnet es:

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

Y luego aplicar a una serie 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)

La sample()función básicamente le permite generar un vector de números aleatorios en el rango que proporciona (= 1: nfolds) para la longitud de la variable de respuesta matriz y . De esta manera, asigna cada una de sus filas de matriz de entrada a un pliegue aleatorio (pero ahora configurado).

el forestalteólogo
fuente
¿Alguien entiende cómo los autores de la viñeta decidieron que alpha = 1 se basa mejor en los 4 gráficos que imprimen? Su cita: vemos que el lazo (alfa = 1) hace lo mejor aquí. También vemos que la gama de lambdas utilizado difiere con alfa "... Simplemente no entiendo cómo se determinan alfa = 1 es el mejor ??.
theforestecologist
Creo que la razón es que usa la menor cantidad de variables. Lo que significa que es el modelo "más simple" y debería generalizarse mejor.
marbel