Comment interpréter le Lasso en réduisant tous les coefficients à 0?

8

J'ai un ensemble de données avec 338 prédicteurs et 570 instances (impossible de télécharger malheureusement) sur lequel j'utilise le Lasso pour effectuer la sélection des fonctionnalités. En particulier, j'utilise la cv.glmnetfonction glmnetcomme suit, où se mydata_matrixtrouve une matrice binaire 570 x 339 et la sortie est également binaire:

library(glmnet)
x_dat <- mydata_matrix[, -ncol(mydata_matrix)]
y <- mydata_matrix[, ncol(mydata_matrix)]
cvfit <- cv.glmnet(x_dat, y, family='binomial')

Ce graphique montre que l'écart le plus faible se produit lorsque toutes les variables ont été supprimées du modèle. Est-ce à dire que le simple fait d'utiliser l'interception est plus prédictif du résultat que d'utiliser même un seul prédicteur, ou ai-je fait une erreur, peut-être dans les données ou dans l'appel de fonction?

Ceci est similaire à une question précédente , mais n'a reçu aucune réponse.

plot(cvfit)

entrez la description de l'image ici

Stuart Lacy
la source
1
Je pense que ce lien peut étoffer certains détails. En substance, cela peut signifier que beaucoup (sinon tous) vos prédicteurs ne sont pas très significatifs. Le fil ci-dessous explique cela plus en détail. stats.stackexchange.com/questions/182595/…
Dhiraj
3
@Dhiraj Significant est un terme technique lié aux tests de signification d'hypothèse nulle. Ce n'est pas approprié ici.
Matthew Drury

Réponses:

11

Je ne pense pas que vous ayez fait une erreur dans le code. Il s'agit d'interpréter la sortie.

Le Lasso n'indique pas quels régresseurs individuels sont "plus prédictifs" que d'autres. Il a simplement une tendance intégrée à estimer les coefficients à zéro. Plus le coefficient de pénalité est élevélog(λ) est, plus cette tendance est grande.

Votre graphique de validation croisée montre qu'à mesure que de plus en plus de coefficients sont forcés à zéro, le modèle fait de mieux en mieux la prédiction de sous-ensembles de valeurs qui ont été supprimés de manière aléatoire de l'ensemble de données. Lorsque les meilleures erreurs de prédiction à validation croisée (mesurées ici comme la «déviance binomiale») sont obtenues lorsque tous les coefficients sont nuls, vous devez suspecter qu'aucune combinaison linéaire d'aucun sous-ensemble des régresseurs ne peut être utile pour prédire les résultats.

Vous pouvez le vérifier en générant des réponses aléatoires indépendantes de tous les régresseurs et en leur appliquant votre procédure d'ajustement. Voici un moyen rapide d'émuler votre jeu de données:

n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
                       dimnames=list(1:n, c("y", paste0("x", 1:k)))))

Le bloc de données Xa une colonne binaire aléatoire nommée "y" et 338 autres colonnes binaires (dont les noms n'ont pas d'importance). J'ai utilisé votre approche pour régresser "y" par rapport à ces variables, mais - juste pour être prudent - je me suis assuré que le vecteur de réponse yet la matrice du modèle xcorrespondent (ce qu'ils pourraient ne pas faire en cas de valeurs manquantes dans les données) :

f <- y ~ . - 1            # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")

Le résultat est remarquablement semblable au vôtre:

plot(fit)

Figure

En effet, avec ces données complètement aléatoires, le Lasso renvoie toujours neuf estimations de coefficient non nul (même si nous savons, par construction, que les valeurs correctes sont toutes nulles). Mais il ne faut pas s'attendre à la perfection. De plus, comme l'ajustement est basé sur la suppression aléatoire de sous-ensembles de données pour la validation croisée, vous n'obtiendrez généralement pas la même sortie d'une exécution à l'autre. Dans cet exemple, un deuxième appel à cv.glmnetproduit un ajustement avec un seul coefficient non nul. Pour cette raison, si vous avez le temps, c'est toujours une bonne idée de relancer la procédure d'ajustement plusieurs fois et de garder une trace des estimations de coefficient qui sont systématiquement non nulles. Pour ces données - avec des centaines de régresseurs - cela prendra quelques minutes pour répéter neuf fois de plus.

sim <- cbind(as.numeric(coef(fit)), 
             replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), 
     xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
     main="Results of Repeated Cross-Validated Lasso Fits")

Figure 2

Huit de ces régresseurs ont des estimations non nulles dans environ la moitié des ajustements; les autres n'ont jamais d'estimations non nulles. Cela montre dans quelle mesure le Lasso inclura toujours des estimations de coefficient non nul même lorsque les coefficients eux-mêmes sont vraiment nuls.

whuber
la source
1

Si vous souhaitez obtenir plus d'informations, utilisez la fonction

fit1<-glmnet(x_dat, y, family='binomial', alpha= x)

plot(fit1, xvar = "lambda", label = TRUE)

Le graphique doit être similaire à entrez la description de l'image ici Les étiquettes permettent d'identifier l'effet du lambda pour les régresseurs.

Pouvez-vous utiliser différentes valeurs de x (dans le modèle est appelé facteur alpha) à 0 (régression de crête) à 1 (régression LASSO). La valeur [0,1] est la régression nette élastique

Luigi Biagini
la source
La diminution de l'alpha à 0,5 a permis d'inclure plus de variables, merci pour l'astuce.
Stuart Lacy
0

La réponse selon laquelle il n'y a pas de combinaisons linéaires de variables utiles pour prédire les résultats est vraie dans certains cas, mais pas dans tous.

J'avais un tracé comme celui ci-dessus qui était causé par la multicolinéarité dans mes données. La réduction des corrélations a permis à Lasso de fonctionner, mais elle a également supprimé des informations utiles sur les résultats. De meilleurs ensembles de variables ont été obtenus en utilisant l'importance de la forêt aléatoire pour filtrer les variables, puis en utilisant Lasso.

Pluvieux
la source
-1

C'est possible mais un peu surprenant. LASSO peut faire des choses étranges lorsque vous avez une colinéarité, auquel cas vous devez probablement définir alpha <1 afin que vous ajustiez un filet élastique à la place. Vous pouvez choisir l'alpha par validation croisée, mais assurez-vous d'utiliser les mêmes plis pour chaque valeur d'alpha.

within_person
la source