Comment faire une validation croisée avec cv.glmnet (régression LASSO en R)?

10

Je me demande comment aborder correctement la formation et le test d'un modèle LASSO à l'aide de glmnet dans R?

  • Plus précisément, je me demande comment procéder si l'absence d'un ensemble de données de test externe nécessite que j'utilise la validation croisée (ou une autre approche similaire) pour tester mon modèle LASSO.

Permettez-moi de décomposer mon scénario:

Je n'ai qu'un seul ensemble de données pour informer et former mon modèle glmnet. En conséquence, je devrai utiliser la validation croisée pour fractionner mes données et générer également un moyen de tester mon modèle.

J'utilise déjà cv.glmnet, qui selon les détails du paquet :

Effectue une validation croisée k-fold pour glmnet, produit un tracé et renvoie une valeur pour lambda.

  • La validation croisée est-elle effectuée cv.glmnetsimplement pour sélectionner la meilleure lambda, ou sert-elle également de procédure de validation croisée plus générale?

    • En d'autres termes, dois-je encore effectuer une autre étape de validation croisée pour «tester» mon modèle?

Je travaille avec l'hypothèse que "oui je le fais".

Cela étant, comment aborder la validation croisée de mon cv.glmnetmodèle?

  • Dois-je le faire manuellement ou la caretfonction est-elle utile pour les modèles glmnet?

  • Dois-je utiliser deux "boucles" concentriques de validation croisée? ... Dois-je utiliser une "boucle interne" de CV via cv.glmnetpour déterminer la meilleure valeur lambda dans chacun des k plis d'une "boucle externe" de traitement de validation croisée k-fold ?

    • Si je fais une validation croisée de mon cv.glmnetmodèle déjà à validation croisée , comment puis-je isoler le "meilleur" modèle (de la "meilleure" valeur lambda) de chaque cv.glmnetmodèle dans chaque pli de ma "boucle externe" de validation croisée autrement?

      • Remarque: Je définis le "meilleur" modèle comme le modèle associé à un lambda qui produit un MSE à 1 SE du minimum ... c'est le $lambda.1sedans le cv.glmnetmodèle.

Le contexte:

J'essaie de prédire l'âge de l'arbre ("âge") en fonction du diamètre de l'arbre ("D"), de D ^ 2 et des espèces ("facteur (SPEC)"). [équation résultante: Age ~ D + factor(SPEC) + D^2]. J'ai environ 50 000 lignes de données, mais les données sont longitudinales (suivent les individus dans le temps) et se composent d'environ 65 espèces.

le forestier
la source
1
Pour ceux qui ont voté pour clore sans commenter: ce n'est pas utile ... faites-moi savoir quel est votre problème dans les commentaires et je vais essayer de le résoudre.
theforestecologist
1
Ils ne votent pas pour fermer, ils votent pour le migrer vers CrossValidated. Je viens d'y ajouter mon vote.
Hack-R du
@theforestecologist: Vous devriez pouvoir voir les raisons invoquées pour la fermeture / migration en cliquant sur le bouton "Fermer".
DWin
Merci d'avoir posé la question, j'avais exactement cette question. Et je ne peux pas utiliser caret parce que j'ai multivarié Y. Mais avez-vous inspecté le code source et confirmé qu'aucun CV supplémentaire n'est nécessaire? Le code source peut être assez difficile à suivre.
qoheleth

Réponses:

3

La validation croisée est-elle effectuée dans cv.glmnet simplement pour sélectionner la meilleure lambda, ou sert-elle également de procédure de validation croisée plus générale?

Il fait presque tout le nécessaire dans une validation croisée. Par exemple, il ajuste les lambdavaleurs possibles sur les données, choisit le meilleur modèle et forme finalement le modèle avec les paramètres appropriés.

Par exemple, dans l'objet renvoyé ::

cvmest l'erreur moyenne à validation croisée. cvsdest l'écart type estimé.

Comme les autres valeurs renvoyées, celles-ci sont calculées sur l'ensemble de test. Finalement, le

glmnet.fit donne au modèle formé sur toutes les données (formation + test) avec les meilleurs paramètres.

Dois-je le faire manuellement ou la fonction caret est-elle utile pour les modèles glmnet?

Vous n'avez pas besoin de le faire manuellement. 'Caret' serait très utile, et est l'un de mes packages préférés car il fonctionne pour tous les autres modèles avec la même syntaxe. J'utilise moi-même souvent caretplutôt que cv.glmnet. Cependant, dans votre scénario, c'est essentiellement la même chose.

Dois-je utiliser deux "boucles" concentriques de validation croisée? ... Dois-je utiliser une "boucle intérieure" de CV via cv.glmnet pour déterminer la meilleure valeur lambda dans chacun des k plis d'une "boucle externe" de k-pli traitement de validation croisée?

Vous pouvez le faire et ce concept est très similaire à l'idée de la validation croisée imbriquée. La validation croisée imbriquée pour la sélection de modèle .

Si je fais une validation croisée de mon modèle cv.glmnet déjà validé, comment puis-je isoler le "meilleur" modèle (de la "meilleure" valeur lambda) de chaque modèle cv.glmnet dans chaque pli de ma boucle externe autrement " "de validation croisée?

Exécutez simplement une boucle où vous générez des données d'entraînement et des données de test exécutées cv.glmnetsur les données d'entraînement et utilisez le modèle glmnet.fitpour prédire les données de test.

discipulus
la source
@discupulus: Merci. Pourriez-vous fournir une sorte de preuve à ce sujet? . De plus, compte tenu de votre réponse, cela signifie-t-il qu'aucun autre processus de validation croisée n'est nécessaire pour signaler une mesure de performance pour les données? (Je pourrais simplement signaler le MSE du cas lambda.1se comme ma performance finale du modèle?)
theforestecologist
Oui, aucune validation croisée supplémentaire n'est nécessaire. Pour la preuve, vous pouvez regarder le code source de la cv.glmnetfonction comme Rc'est open source . Tapez simplement cv.glmnetdans la console.
discipulus
3
@discipulus. J'ai envoyé un e-mail à Trevor Hastie pour lui demander "cv.glmnet (implémentation R) ne fait-il que CV pour choisir lambda? Ou fait-il également un CV externe pour valider la lambda choisie? En d'autres termes, devons-nous coder notre propre CV externe si nous vous voulez valider la lambda choisie? " et il a répondu (assez rapidement) "Oui, juste pour choisir lambda", ce que j'interprète comme signifiant que cela ne fait que le CV intérieur, et nous devrons coder notre propre CV extérieur.
qoheleth
@theforestecologist J'essaie d'en savoir plus sur la validation croisée et de trouver votre post éducatif. Je ne comprends pas ce que vous entendez par cv.glmnet servant également de procédure de validation croisée plus générale. Je pensais que le seul paramètre disponible était Lambda - quelle couche externe de validation croisée existe-t-il? Je vous serais reconnaissant de bien vouloir répondre. Merci!
user2450223