La régression logistique glmnet peut-elle gérer directement les variables factorielles (catégorielles) sans avoir besoin de variables fictives? [fermé]

15

Je construis une régression logistique en R en utilisant la méthode LASSO avec les fonctions cv.glmnetpour sélectionner le lambdaet glmnetpour le modèle final.

Je connais déjà tous les inconvénients de la sélection automatique de modèle mais je dois quand même le faire.

Mon problème est que je dois inclure des variables factorielles (catégorielles) dans le modèle, y a-t-il un moyen de le faire sans créer beaucoup de variables fictives? Ces variables sont presque toutes des chaînes et non des nombres.

Dan
la source
2
Je suis également curieux de savoir la meilleure façon de procéder.
theforestecologist

Réponses:

26

glmnet ne peut pas prendre le facteur directement, vous devez transformer les variables de facteur en variables muettes. Ce n'est qu'une étape simple en utilisant model.matrix, par exemple:

x_train <- model.matrix( ~ .-1, train[,features])
lm = cv.glmnet(x=x_train,y = as.factor(train$y), intercept=FALSE ,family =   "binomial", alpha=1, nfolds=7)
best_lambda <- lm$lambda[which.min(lm$cvm)]

alpha = 1 va construire un LASSO.

Romain
la source
1
+1 Excellente réponse! Puis-je demander pourquoi vous ou quelqu'un pourquoi on utilise intercept = FALSE?
Erosennin
Cela semble échouer lorsqu'il y a deux variables catégorielles: je reçois à juste titre des colonnes L1 si var1 a des niveaux L1, mais des colonnes L2-1 pour var2 (qui a des niveaux L2).
Peter Straka
@Peter Straka: somme (sur les mannequins L1 pour var1) = 1 pour tous les enregistrements et somme (sur les mannequins L2 pour V2) = 1 pour tous les enregistrements, de sorte que les mannequins L1 pour var1 et les mannequins L2 pour var2 sont linéairement dépendants. Au moins un des mannequins L2 pour mannequins var2 est redondant (dans le but de construire un modèle linéaire).
VictorZurkowski