Comment l'interception est-elle calculée dans GLMnet?

8

J'ai implémenté la version GLMNET de filet élastique pour la régression linéaire avec un autre logiciel que R. J'ai comparé mes résultats avec la fonction R glmnet en mode lasso sur les données du diabète .

La sélection des variables est correcte lorsque l'on fait varier la valeur du paramètre (lambda) mais j'obtiens des valeurs de coefficients légèrement différentes. Pour cela et pour d'autres raisons, je pense que cela vient de l'interception dans la boucle de mise à jour, lorsque je calcule l'ajustement actuel, car je ne varie pas l'interception (que je considère comme la moyenne de la variable cible) dans l'ensemble de l'algorithme: as expliqué dans l'article de Trevor Hastie ( Chemins de régularisation pour les modèles linéaires généralisés via la descente de coordonnées , page 7, section 2.6):

l'ordonnée à l'origine n'est pas régularisée, [...] pour toutes les valeurs de [...] lambda [le paramètre de contrainte L1]

Mais malgré l'article, la fonction R glmnet fournit des valeurs différentes pour l'interception le long du chemin de régularisation (les différentes valeurs lambda). Quelqu'un a-t-il une idée de la façon dont les valeurs de l'interception sont calculées?

yelh
la source

Réponses:

8

J'ai trouvé que l'interception dans GLMnet est calculée après la convergence des nouvelles mises à jour de coefficients. L'ordonnée à l'origine est calculée avec la moyenne des et la moyenne des . La formule est similaire à la précédente que j'ai donnée mais avec les après la boucle de mise à jour: .yixijβjβ0=y¯j=1pβj^xj¯

En python, cela donne quelque chose comme:

        self.intercept_ = ymean - np.dot(Xmean, self.coef_.T)

que j'ai trouvé ici sur la page scikit-learn.

EDIT: les coefficients doivent être standardisés avant:

        self.coef_ = self.coef_ / X_std

β0=y¯j=1pβj^xj¯i=1nxij2 .

yelh
la source
Je dois ajouter qu'il s'agit d'une méthode standard de calcul de l'ordonnée à l'origine, en supposant que le modèle est linéaire et que les erreurs ont une moyenne nulle.
mpiktas
En effet, néanmoins les auteurs ont explicitement dit dans leur article: pour toutes les valeurs de et , et d'ailleurs ils ne disent pas à quel point de l'algorithme il est calculéβ0=y¯ αλ
yelh
Puisque les auteurs supposent que cela est vrai. A noter au début de la page 3, ils disent que nous supposons que les prédicteurs sont centrés, mais ce n'est pas restrictif, puisque les "... résultats se généralisent naturellement ..." au cas non standardisé. La formule que vous trouvez est cette généralisation naturelle. x¯=0
mpiktas
Cependant, même lorsque la normalisation est appliquée (et donc un centrage moyen) sur les prédicteurs de l'algorithme, ils prennent les données non normalisées (donc , en général) pour s'adapter aux différentes intersections affichées par . Ils utilisent le même pour mettre à jour les coefficients mais ajustent une intersection avec les données brutes, et ils le font a posteriori. x¯0glmnetβ0=constant=y¯
2011
3

que je prends comme moyenne de la variable cible

Je pense que c'est peut-être là que vous vous trompez: contrairement au modèle linéaire, vous ne pouvez pas reparamétrer les prédicteurs de telle sorte qu'ils seront toujours orthogonaux à l'interception, donc l'interception ne peut pas simplement être calculée comme la moyenne.

Simon Byrne
la source
J'ai pris la moyenne de la variable expliquée parce que dans l'article que j'ai cité, les auteurs de cette méthode écrivent qu'ils utilisent la moyenne du Y_i (les observations de la variable expliquée) pour toutes les valeurs de alpha et lambda. Maintenant, en regardant la sortie de la fonction glmnet, je suppose que ce n'est pas le cas pour tous les lambdas. Cela ne me dit donc pas comment calculer les interceptions pour chaque paramètre de régularisation lambda.
2011
Je suppose qu'ils utilisent la moyenne pondérée (car les poids changeront avec ). λ
Simon Byrne
Pourriez-vous préciser votre idée s'il vous plaît? Quelle expression de poids dois-je considérer?
2011
Dans l'article, chaque "boucle intérieure" est un problème de moindre carré pénalisé, les poids étant définis par la valeur ajustée précédente via l'équation 17.
Simon Byrne
1
C'est ok j'ai trouvé la réponse en regardant le code python scikit-learn (parce que le code source de glmnet est en Fortran et ce n'est pas ma tasse de thé). Je le partagerai plus tard si quelqu'un est intéressé. Merci quand même !
2011