Quelqu'un peut-il expliquer ce que fait l'argument foldid dans glmnet?

8

J'essaie de déterminer quel alpha utiliser dans ma glmnetfonction, mais le fichier d'aide me dit:

Notez que cv.glmnet ne recherche PAS de valeurs pour alpha. Une valeur spécifique doit être fournie, sinon alpha = 1 est supposé par défaut. Si les utilisateurs souhaitent également effectuer une validation croisée alpha, ils doivent appeler cv.glmnet avec un vecteur foldid pré-calculé , puis utiliser ce même vecteur de pli dans des appels distincts à cv.glmnet avec différentes valeurs d'alpha.

Cependant, je ne comprends pas:

  1. Quel est le vecteur / argument replié.
  2. Comment créer le vecteur foldid
  3. Comment utiliser l'argument foldid.

Toute aide à cet égard serait grandement appréciée!

le forestier
la source
Je pense que ce paramètre est logique lorsque vous comparez différents modèles. vous souhaitez donc contrôler les plis et les pré-spécifier. Pour sélectionner alpha, vous devez essayer différentes valeurs du paramètre.
marbel

Réponses:

6

fold.idpermet à l'utilisateur de prédéfinir les plis de validation croisée pour cv.glmnet. Par exemple, si j'ai des données

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

Ensuite, en passant dans la colonne indiquée comme fold.idargument, cv.glmnetles deux premières observations résideront par exemple dans le même pli et les troisième et quatrième observations résideront dans le même pli (différent).

Les auteurs suggèrent que si vous souhaitez choisir entre une collection discrète de basée sur une estimation de validation croisée d'une erreur à un optimal , alors il est préférable d'utiliser la même structure de pli dans chaque de vos validations croisées lors de la détermination de chaque .αλαλα

Matthew Drury
la source
Donc, le fold.id doit être une matrice avec le même nombre de lignes que ma matrice d'entrée (x)? Est-ce correct?
theforestecologist
Existe-t-il un moyen stratégique de définir le fold.id, ou est-ce complètement arbitraire? En d'autres termes, comment définir un fold.id approprié?
theforestecologist
2
Juste un vecteur d'entiers, je crois. Mais oui, le vecteur doit avoir une entrée pour chaque ligne de votre matrice de conception.
Matthew Drury
Cela dépend de vos données, mais le cas le plus simple est couvert par quelque chose comme rbinom(now(X), n.folds, rep(1/n.folds, n.folds)).
Matthew Drury
Quelle est la meilleure façon de configurer cela pour les données de séries chronologiques?
Frank
1

Selon la vignette Glmnet , une façon de configurer le foldidpour glmnet est la suivante:

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

Et ensuite appliquer à une série d'alphas:

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()fonction vous permet essentiellement de générer un vecteur de nombres aléatoires dans la plage que vous fournissez (= 1: nplis) pour la longueur de la matrice de variable de réponse y . De cette façon, vous affectez chacune de vos lignes de matrice d'entrée à un pli aléatoire (mais maintenant défini).

le forestier
la source
Quelqu'un comprend-il comment les auteurs de la vignette ont décidé qu'alpha = 1 est le mieux basé sur les 4 graphiques qu'ils impriment? Leur citation: Nous voyons que le lasso (alpha = 1) fait le meilleur ici. Nous voyons également que la gamme de lambdas utilisés diffère avec alpha. "... Je ne comprends tout simplement pas comment ils ont déterminé que alpha = 1 est le meilleur ??
theforestecologist
Je crois que la raison en est qu'il utilise le moins de variables. Ce qui signifie que c'est le modèle "le plus simple" et devrait mieux se généraliser.
marbel