Comment appliquer la méthode des moindres carrés itérativement repondérés (IRLS) au modèle LASSO?

12

J'ai programmé une régression logistique en utilisant l' algorithme IRLS . Je souhaite appliquer une pénalisation LASSO afin de sélectionner automatiquement les bonnes fonctionnalités. À chaque itération, le problème suivant est résolu:

(XTWX)δβ^=XT(yp)

Soit un nombre réel non négatif. Je ne pénalise pas l'interception comme suggéré dans The Elements of. Apprentissage statistique . Idem pour les coefficients déjà nuls. Sinon, je soustrais un terme du côté droit:λ

XT(yp)λ×sign(β^)

Cependant, je ne suis pas sûr de la modification de l'algorithme IRLS. Est-ce la bonne façon de procéder?


Edit: Bien que je n'étais pas confiant à ce sujet, voici une des solutions que j'ai finalement trouvé. Ce qui est intéressant, c'est que cette solution correspond à ce que je comprends maintenant de LASSO. Il y a en effet deux étapes à chaque itération au lieu d'une seule:

  • la première étape est la même que précédemment: on fait une itération de l'algorithme (comme si dans la formule du gradient ci-dessus),λ=0
  • la deuxième étape est la nouvelle: on applique un seuillage progressif à chaque composante (à l'exception de la composante , qui correspond à l'ordonnée à l'origine) du vecteur obtenu à la première étape. C'est ce qu'on appelle l' algorithme itératif de seuil doux . ββ0β

i1,βisign(βi)×max(0,|βi|λ)
Wok
la source
Ne pouvait toujours pas obtenir une meilleure convergence en adaptant IRLS. : '(
Wok

Réponses:

12

Ce problème est généralement résolu par ajustement par descente de coordonnées ( voir ici ). Cette méthode est à la fois plus sûre, plus efficace numériquement, algorithmiquement plus facile à mettre en œuvre et applicable à un tableau plus général de modèles (y compris également la régression de Cox). Une implémentation R est disponible dans le package R glmnet . Les codes sont open source (en partie en et en C, en partie en R), vous pouvez donc les utiliser comme modèles.

user603
la source
@wok Notez que le paquet scikit.learn offre également une implémentation efficace en Python pour ce genre de choses.
chl
L'algorithme de descente de coordonnées est intéressant. Merci. J'y pense toujours.
Wok
5

La fonction de perte LASSO a une discontinuité à zéro le long de chaque axe, donc IRLS va avoir des problèmes avec elle. J'ai trouvé une approche de type optimisation minimale séquentielle (SMO) très efficace, voir par exemple

http://bioinformatics.oxfordjournals.org/content/19/17/2246

une version avec le logiciel MATLAB est

http://bioinformatics.oxfordjournals.org/content/22/19/2348

le logiciel est disponible ici:

http://theoval.cmp.uea.ac.uk/~gcc/cbl/blogreg/

L'idée de base est d'optimiser les coefficients un par un et de tester pour voir si vous traversez la discontinuité un coefficient à la fois, ce qui est facile car vous effectuez une optimisation scalaire. Cela peut sembler lent, mais il est en fait assez efficace (même si je m'attends à ce que de meilleurs algorithmes aient été développés depuis - probablement par Keerthi ou Chih-Jen Lin qui sont tous deux des experts de premier plan dans ce genre de choses).

Dikran Marsupial
la source
Merci. Je lis ceci et j'y pense. Cependant, ce serait une énorme modification de l'algorithme actuel.
Wok
4

Vous pouvez consulter l'article: Régression logistique régularisée L1 efficace, qui est un algorithme basé sur IRLS pour LASSO. Concernant l'implémentation, le lien peut vous être utile (http://ai.stanford.edu/~silee/softwares/irlslars.htm).


la source
0

L'IRL pour le problème LASSO est le suivant:

argminx12Axb22+λx1=argminx12Axb22+λxTWx

Où est une matrice diagonale - . Cela vient de .WX1=i| xi| =ix 2 iWi,i=1|xi|
x1=i|xi|=ixi2|xi|

Maintenant, ce qui précède est juste la régularisation de Tikhonov .
Pourtant, puisque dépend de il faut le résoudre de manière itérative (cela annule également le facteur 2 de la régularisation de Tikhonov , car la dérivée de par rapport à tout en maintenant comme constante est qui est égal à ):x x T W x x x diag ( signe ( x ) ) W xWxxTWxxxdiag(sign(x))Wx

xk+1=(ATA+λWk)1ATb

Où .Wi,iK=1|xik|

L' initialisation peut être par .W=I

Faites attention, cela ne fonctionne pas bien pour les grandes valeurs de et vous feriez mieux d'utiliser ADMM ou Coordinate Descent.λ

Royi
la source