Validation croisée de la régression du lasso en R

10

La fonction R cv.glm (bibliothèque: boot) calcule l'erreur de prédiction de validation croisée K-fold estimée pour les modèles linéaires généralisés et renvoie delta. Est-il judicieux d'utiliser cette fonction pour une régression au lasso (bibliothèque: glmnet) et si oui, comment peut-elle être réalisée? La bibliothèque glmnet utilise une validation croisée pour obtenir le meilleur paramètre de rotation, mais je n'ai trouvé aucun exemple de validation croisée de l'équation glmnet finale.

kalakaru
la source
2
Cela a certainement du sens, et bien que LASSO n'optimise que sur un (hyper-) paramètre, si vous voulez obtenir la meilleure estimation possible des performances hors échantillon, vous avez besoin d'une boucle de validation croisée externe. Voir Pouvez-vous suréquiper en formant des algorithmes d'apprentissage automatique à l'aide de CV / Bootstrap? & les articles cités.
Scortchi - Réintégrer Monica
Il est recommandé d'utiliser glmnet plutôt que glm esp. si vous faites un CV. Si je me souviens bien, le paquet glm devient pénible à utiliser. En outre, cv.glmnet expose plus de paramètres que cv.glm.
smci

Réponses:

9

Un exemple sur la façon de faire la vanille validation croisée simple pour Lasso glmnetsur mtcars ensemble de données.

  1. Charger l'ensemble de données.

  2. Préparer des entités (variables indépendantes). Ils devraient être de matrixclasse. La façon la plus simple de convertir dfdes variables catégorielles contenant matrixest via model.matrix. Remarquez que, par défaut, elle glmnets'adapte à l'interception, il vaut donc mieux supprimer l'interception de la matrice du modèle.

  3. Préparez la réponse (variable dépendante). Codons les voitures avec une mpgefficacité supérieure à la moyenne ('1') et les autres comme inefficaces ('0'). Convertissez cette variable en facteur.

  4. Exécutez la validation croisée via cv.glmnet. Il reprendra alpha=1des glmnetparamètres par défaut , ce que vous avez demandé: régression lasso.

  5. En examinant les résultats de la validation croisée, vous pourriez être intéressé par au moins 2 informations:

    • lambda, qui minimise l'erreur de validation croisée. glmnetfournit en fait 2 lambdas: lambda.minet lambda.1se. C'est votre jugement en tant que statisticien pratiquant à utiliser.

    • coefficients régularisés résultants.

Veuillez voir le code R selon les instructions ci-dessus:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Commentaires finaux:

  • notez, la sortie du modèle ne dit rien sur la signification statistique des coefficients, seulement des valeurs.

  • Le pénalisant l1 (lasso), que vous avez demandé, est connu pour son instabilité, comme en témoignent ce billet de blog et cette question d' échange de pile . Une meilleure façon pourrait également être de procéder à une validation croisée alpha, ce qui vous permettrait de choisir le bon mélange de pénalisants l1 et l2.

  • une autre façon de faire la validation croisée pourrait être de se tourner vers le curseur train( ... method='glmnet')

  • et enfin, la meilleure façon d'en savoir plus cv.glmnetet ses valeurs par défaut glmnetest bien sûr ?glmnetdans la console de R)))

Sergey Bushmanov
la source
Bonne réponse. .. il vaut également la peine d'exécuter le CV plusieurs fois et de faire évoluer la courbe d'erreur (voir? cv.glmnet) pour tenir compte de l'échantillonnage.
user20650
@SergeyBushmanov TRÈS UTILE!
theforestecologist
Salut, je sais que c'est un ancien post, mais je voulais vous poser une question. Vous mentionnez que la sortie du modèle ne dit rien sur la signification statistique des coefficients, alors comment déterminez-vous qu'ils sont significatifs ou non?
Jun Jang
@JunJang "Il n'y a pas de signification statistique pour les coefficients" est la déclaration des auteurs du package, pas de moi. Cette déclaration est donnée, je ne me souviens pas exactement, ni dans l'un des livres des auteurs du package, ni dans la vignette du package. Dans un tel cas, au lieu de dire des coefficients significatifs ou non, vous préférez dire qu'ils sont "utiles" ou non pour expliquer la cible par validation croisée.
Sergey Bushmanov