Désolé si cette question pose un peu de base.
Je cherche à utiliser la sélection de variables LASSO pour un modèle de régression linéaire multiple dans R. J'ai 15 prédicteurs, dont l'un est catégorique (cela posera-t-il un problème?). Après avoir réglé mes et j'utilise les commandes suivantes:
model = lars(x, y)
coef(model)
Mon problème est quand je l'utilise coef(model)
. Cela renvoie une matrice de 15 lignes, avec un prédicteur supplémentaire ajouté à chaque fois. Cependant, il n'y a aucune suggestion quant au modèle à choisir. Ai-je raté quelque chose? Existe-t-il un moyen de faire en sorte que le package Lars renvoie un seul " meilleur " modèle?
Il y a d'autres publications suggérant d'utiliser à la glmnet
place, mais cela semble plus compliqué. Une tentative est la suivante, en utilisant les mêmes et . Ai-je oublié quelque chose ici ?:
cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")
La dernière commande renvoie une liste de mes variables, la majorité avec un coefficient bien que certaines soient = 0. Est-ce le bon choix du " meilleur " modèle sélectionné par LASSO? Si j'intègre ensuite un modèle linéaire avec toutes mes variables qui avaient des coefficients, not=0
j'obtiens des estimations de coefficients très similaires, mais légèrement différentes. Y a-t-il une raison à cette différence? Serait-il acceptable de réajuster le modèle linéaire avec ces variables choisies par LASSO et de prendre cela comme modèle final? Sinon, je ne vois aucune valeur-p pour la signification. Ai-je manqué quelque chose?
Est-ce que
type.gaussian="covariance"
s'assurer que glmnet
la régression linéaire multiple est utilisée?
La normalisation automatique des variables affecte-t-elle les coefficients? Est-il possible d'inclure des termes d'interaction dans une procédure LASSO?
Je cherche à utiliser cette procédure davantage pour démontrer comment LASSO peut être utilisé que pour tout modèle qui sera réellement utilisé pour toute inférence / prédiction importante si cela change quelque chose.
Merci de prendre du temps pour lire ceci. Tous les commentaires généraux sur LASSO / lars / glmnet seraient également grandement appréciés.
Réponses:
Utiliser
glmnet
est vraiment facile une fois que vous avez compris grâce à son excellente vignette dans http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (vous pouvez également consulter la page du package CRAN). Comme pour le meilleur lambda pourglmnet
, la règle de base est d'utiliserau lieu de
lambda.min
.Pour faire la même chose,
lars
vous devez le faire à la main. Voici ma solutionGardez à l’esprit que ce n’est pas exactement la même chose, car il s’arrête à un nœud de lasso (lorsqu’une variable entre) à la place de n’importe quel point.
Veuillez noter que
glmnet
c'est le paquet préféré à présent, il est activement maintenu, plus quelars
, et qu'il y a eu des questions surglmnet
vs vslars
répondu auparavant (les algorithmes utilisés diffèrent).Pour ce qui est de votre question d’utiliser Lasso pour choisir des variables, puis un ajustement avec MLS, le débat est en cours. Google pour OLS post Lasso et certains articles traitent du sujet. Même les auteurs de Elements of Statistical Learning reconnaissent que c'est possible.
Edit : Voici le code pour reproduire plus précisément ce que
glmnet
fait danslars
la source
Je reviens à cette question il y a un moment puisque je pense avoir résolu la bonne solution.
Voici une réplique utilisant le jeu de données mtcars:
"variables" vous donne la liste des variables qui résolvent la meilleure solution.
la source
nfolds=5
etalpha=0.5
?Peut-être que la comparaison avec la régression pas à pas avec sélection vers l’avant aidera (voir le lien suivant vers un site de l’un des auteurs, http://www-stat.stanford.edu/~tibs/lasso/simple.html).). C'est l'approche utilisée au chapitre 3.4.4 des Eléments de l'apprentissage statistique (disponible en ligne gratuitement). Je pensais que le chapitre 3.6 de ce livre permettait de comprendre la relation entre les moindres carrés, le meilleur sous-ensemble et le lasso (plus quelques autres procédures). Je trouve également utile de prendre la transposée du coefficient, t (coef (modèle)) et write.csv, pour pouvoir l'ouvrir dans Excel avec une copie du graphique (modèle) sur le côté. Vous voudrez peut-être trier selon la dernière colonne, qui contient l'estimation des moindres carrés. Vous pouvez ensuite voir clairement comment chaque variable est ajoutée à chaque étape par morceau et comment les coefficients changent en conséquence. Bien sûr, ce n’est pas tout, mais nous espérons que ce sera un début.
la source
lars
etglmnet
opérer sur des matrices brutes. Pour inclure les termes d'interaction, vous devrez construire les matrices vous-même. Cela signifie une colonne par interaction (qui est par niveau par facteur si vous avez des facteurs). Regardez danslm()
pour voir comment il fait (avertissement: il y a des dragons).Pour le faire maintenant, faites quelque chose comme: Pour créer un terme d'interaction manuellement, vous pourriez (mais vous ne devriez pas le faire , car c'est lent) faire:
Ensuite, pour utiliser ceci en gros (en supposant que vous ayez un
y
coup de pied):J'aimerais pouvoir vous aider davantage pour les autres questions. J'ai trouvé celui-ci parce que lars me donne du chagrin et que la documentation qui s'y trouve et sur le Web est très mince.
la source
model.matrix()
.LARS résout la totalité du chemin de la solution. Le chemin de la solution est linéaire par morceaux - il existe un nombre fini de points "encoches" (c'est-à-dire les valeurs du paramètre de régularisation) auxquels la solution change.
La matrice de solutions que vous obtenez correspond donc à toutes les solutions possibles. Dans la liste qu'il renvoie, il devrait également vous indiquer les valeurs du paramètre de régularisation.
la source