Je passe par la section LAB §6.6 sur Ridge Regression / Lasso dans le livre 'An Introduction to Statistical Learning with Applications in R' de James, Witten, Hastie, Tibshirani (2013).
Plus précisément, j'essaie d'appliquer le Ridge
modèle scikit-learn au jeu de données «Hitters» du package R «ISLR». J'ai créé le même ensemble de fonctionnalités que celui indiqué dans le code R. Cependant, je ne peux pas me rapprocher des résultats du glmnet()
modèle. J'ai sélectionné un paramètre de réglage L2 à comparer. (argument 'alpha' dans scikit-learn).
Python:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
R:
Notez que l'argument alpha=0
dans glmnet()
signifie qu'une pénalité L2 doit être appliquée (régression Ridge). La documentation vous avertit de ne pas entrer une seule valeur pour lambda
, mais le résultat est le même que dans ISL, où un vecteur est utilisé.
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
Qu'est-ce qui cause les différences?
Edit:
Lors de l'utilisation à penalized()
partir du package pénalisé dans R, les coefficients sont les mêmes qu'avec scikit-learn.
ridge.mod2 <- penalized(y,x,lambda2=11498)
Peut-être que la question pourrait alors être aussi: «Quelle est la différence entre glmnet()
et penalized()
quand faire une régression Ridge?
Nouveau wrapper python pour le code Fortran réel utilisé dans le package R glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
ne fait pas d'estimation d'interception non standardisée (standard) et la pénalité est telle qu'elle||Xb - y - intercept||^2 + alpha ||b||^2
est minimisée pourb
. Il peut y avoir des facteurs1/2
ou les1/n_samples
deux devant la pénalité, ce qui rend les résultats différents immédiatement. Pour éliminer le problème de mise à l'échelle de la pénalité, définissez la pénalité sur 0 dans les deux cas, résolvez les divergences là-bas, puis vérifiez l'effet de l'ajout de la pénalité. Et à mon humble avis, voici le bon endroit pour poser cette question.Réponses:
Il manque un facteur de ma réponse, veuillez consulter la réponse @visitors ci-dessous pour une comparaison correcte.1N
Voici deux références qui devraient clarifier la relation.
La documentation de sklearn indique que
linear_model.Ridge
optimise la fonction d'objectif suivanteLe papier glmnet dit que le filet élastique optimise la fonction objectif suivante
Notez que les deux implémentations utilisent de manières totalement différentes, sklearn utilise pour le niveau global de régularisation tandis que glmnet utilise à cet effet, réservant pour l'échange entre la régularisation de crête et de lasso. α λ αα α λ α
En comparant les formules, il semble que la configuration de et dans glmnet devrait récupérer la solution .λ = 2 α sklearnα=0 λ=2αsklearn
linear_model.Ridge
la source
standardize = FALSE
dansglmnet()
pour obtenir les mêmes résultats.linear_model.Ridge
pour toute analyse du monde réel.linear_model.Ridge
modèle sklearn standardise les fonctionnalités automatiquement. La normalisation est facultative. Je me demande pourquoi je dois ensuite désactiver la normalisationglmnet()
pour que les modèles produisent des résultats identiques.La réponse de Matthew Drury devrait avoir un facteur 1 / N. Plus précisément...
La documentation de glmnet indique que le filet élastique minimise la fonction de perte
La documentation de sklearn indique que
linear_model.Ridge
minimise la fonction de pertece qui revient à minimiser
Pour obtenir la même solution de glmnet et sklearn, leurs deux fonctions de perte doivent être égales. Cela signifie définir et dans glmnet.α=0 λ=2Nαsklearn
sortie glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955
sortie sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921
la source