Regrouper les variables catégorielles dans glmnet

8

Considérez l'ajustement suivant:

fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")

Comment indiquer quelles colonnes xsont catégoriques / multinomiales? Existe-t-il une option pour spécifier l'index des variables groupées?

La documentation décrit l'option type.multinomialcomme suit:

S'il est "groupé", alors une pénalité de lasso groupé est utilisée sur les coefficients multinomiaux pour une variable. Cela garantit qu'ils sont tous ensemble. La valeur par défaut est "dissocié".

James
la source

Réponses:

13

Les deux premiers arguments glmnet()attendus sont une matrice des prédicteurs ( x, dans votre cas) et un vecteur de la réponse ( g4, dans votre cas). Pour la xmatrice, il est prévu que vous ayez déjà supprimé toutes les variables catégorielles. En d'autres termes, glmnet()ne sait pas réellement si certains de vos prédicteurs sont catégoriques, car ils ont déjà été éliminés.

Si vos données sont dans un bloc de données, une bonne façon de construire la xmatrice utilise la model.matrix()fonction. Il accepte le langage de formule, exclura automatiquement la variable de réponse et créera des variables fictives pour tous les prédicteurs définis comme des facteurs.

Les options family="multinomial"et type.multinomial="grouped"font référence à la variable de réponse ayant plus de 2 résultats possibles. Vous pouvez passer la variable de réponse ( g4) comme facteur.

Les auteurs du paquet fournissent une belle vignette expliquant l'utilisation de glmnet(), bien qu'il ne donne malheureusement pas d'exemple à utiliser model.matrix()pour préparer la xmatrice.

Kevin Markham
la source
1
Un peu tard pour la fête, mais juste pour noter qu'une autre belle introduction à glmnet, avec un exemple utilisant model.matrix, est donnée dans An Introduction to Statistical Learning. www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
owen88
12

Comme le souligne justmarkham, vous pouvez construire la matrice de conception à l' xaide de model.matrix. Notez que vous souhaiterez exclure l'interception, car glmnet en inclut une par défaut. Vous pouvez également vouloir changer la fonction de contraste par défaut, qui par défaut omet un niveau de chaque facteur (codage de traitement). Mais à cause de la pénalité du lasso, celle-ci n'est plus nécessaire pour l'identifiabilité et rend en fait plus compliquée l'interprétation des variables sélectionnées. Pour ce faire, définissez

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

Maintenant, quels que soient les niveaux d'un facteur sélectionnés, vous pouvez penser que cela suggère que ces niveaux spécifiques importent, par rapport à tous les niveaux omis. Dans l'apprentissage automatique, j'ai vu ce codage appelé codage à chaud.

En supposant qu'il y g4ait des Kniveaux, l' type.multinomial="grouped"option spécifie que les caractéristiques de xentreront toutes dans le modèle simultanément pour chacun des Kprédicteurs linéaires, au lieu d'avoir le prédicteur linéaire pour chaque classe (en général) ayant ses propres caractéristiques. glmnetne prend pas (actuellement?) en charge les pénalités de type groupé des prédicteurs (la xmatrice). Le package le grplassofait, mais est écrit en R pur, il est donc plus lent que glmnet, mais vous pouvez essayer.

Andrew M
la source
Pourriez-vous peut-être expliquer cela un peu différemment? Ou (plus précisément
theforestecologist
Salut @AndrewM, model.matrixn'exclut aucun niveau de la première variable catégorielle lorsque nous omettons l'interception. La matrice de conception doit-elle être une entrée dans tous les cas glmnet? et comment interpréter le niveau non omis de la première variable catégorielle dans la régression au lasso?
Goldman Clarck