Régression Ridge (régularisation L2)

Temps de lecture : 6 minutes

Au menu de ce billet, un type de régression que tu n’as probablement pas vu au lycée mais qui peut être utile dans certains problèmes de machine learning : la régression ridge. Mais avant tout, pour comprendre ce que c’est, faisons un petit rappel sur la régression linéaire classique . Avant que tu ne me demandes pourquoi, oui, les deux ont des choses en commun 😀.

Petit rappel sur la régression linéaire classique
Régression linéaire

Supposons qu’on veuille connaitre la relation entre le nombre de pompes Y que peut effectuer une personne en fonction de la taille de son biceps X (exprimé en cm par exemple) – oui la gonflette c’est bien 😛. On organise alors une compétition avec 10 participants (bien narcissiques). On en choisit 3 au hasard; conlusion : plus le biceps est énorme et plus la personne effectue de pompes. Plutôt logique non ? Et comme, en plus, la croissance a l’air linéaire, on veut appliquer une régression linéaire i.e. écrire Y sous la forme Y = aX + b (a est la pente et b est la valeur à l’intersection avec l’axe Y). Rien de bien nouveau jusque-là, juste un petit rappel. Et bien sûr, il faut trouver a et b en minimisant la somme des carrés des écarts entre les valeurs prédites par la régression et les valeurs réelles i.e. minimiser \sum{\delta_i^2}.

Evolution du nombre de pompes en fonction de la taille de biceps (régression linéaire)
Régression ridge

Alors, maintenant qu’on a les esprits fixés, que viendra faire notre régression ridge ?  Eh, bien, ceci :

Evolution du nombre de pompes en fonction de la taille de biceps (principe de la régression Ridge)

Et là, tu dois surement te dire « mais qu’est ce qu’il fait, ce fou, on était très bien avant avec la régression linéaire, là clairement, c’est pire qu’avant » ! Oui, tu as raison, c’est un peu le principe de la régression ridge : « augmenter l’imprécision (biais) pour favoriser la généralisation (diminution de la variance) ». Je t’explique. Tu te souviens, on avait bien 10 participants à notre compétition. On en a représenté que 3 au hasard, et si on fait un modèle, l’objectif c’est bien de pouvoir l’appliquer à toutes les autres données ultérieurement; il faut que notre régression soit généralisable ! 

Intérêt de la régression ridge

Le problème, c’est que parfois, en travaillant sur une petite portion des données en entrée (données d’apprentissage), notre modèle essaie de s’ajuster parfaitement à cette petite portion… A tel point que par la suite, quand on lui donne de nouvelles données, même légèrement différentes, il effectue des prédictions erronées. Dans le jargon technique cela s’appelle de l’overfitting. Vois-ça un peu comme un modèle fermé d’esprit. Il a vécu dans sa petite ville toute sa vie, et il pense que tout le reste du monde marche comme sa petite ville. Et surtout il essaie de forcer tout le monde à être comme lui (des noms qui te viennent en tête dans l’actualité ?  😛). Bah, comme dans la vraie vie, ce comportement est très négatif en traitement de données. La solution ? Dire au modèle d’être moins conformiste et de s’écarter un peu des données d’apprentissage pour mieux s’adapter aux données ultérieures. C’est ce que fait la régression ridge pour les problèmes linéaires. Par exemple si, on retrace les données des 7 autres participants sur le graphe, l’approche prend tout son sens :

Evolution du nombre de pompes en fonction de la taille de biceps (régression Ridge)

Meilleure la généralisation non ? Là, ok, je te l’accorde, c’est vrai, on connait toutes les données et j’ai choisi très spécifiquement les points de l’apprentissage pour te prouver que j’ai raison sur la nécessité de la régression ridge… Mais dans les problèmes réels, on ignore souvent les données ultérieures. Et quand on ne sait pas tout, il est toujours préférable de relativiser en se donnant de la marge… Maintenant, la bonne question, c’est : quelle marge est la plus optimale ? Pour répondre à cette question, regardons d’un peu plus près le principe de la régression ridge !

Principe de la régression Ridge, un peu de math (juste un peu… comme d’habitude)

Dans la régression linéaire Y = a.X + b, plus la valeur absolue de la pente a est grande, et plus de petits changement de X entrainent de grands changements de Y, ce qui complique la généralisation. Dans l’idée de la régression ridge, on essaie donc de réduire l’amplitude de la pente a . Pour cela, au lieu de minimiser \sum{\delta_i^2} comme on le faisait pour la régression linéaire, on minimisera plutôt \sum{\delta_i^2} + \lambda a^2. \lambda est le facteur de pénalité. Plus il est grand, plus on diminuera l’amplitude de la pente, il varie entre 0 et +\infty (le cas 0 correspondant bien sûr au cas d’une régression linéaire simple).

Régression Ridge, influence de l’effet du facteur de pénalité \lambda

Tu l’auras compris, le paramètre le plus important, c’est finalement \lambda et comment le choisir ? à tâtons, voilà ! Il n’y pas de règle précise donc il faut tester plusieurs valeurs pour voir celle qui marche le mieux. Habituellement, on se fixe une gamme au départ et on utilise la technique de la validation croisée (cross-validation) pour trouver la valeur optimale. J’écrirai un article sur cette technique mais pour faire simple, dans notre cas, ça consisterait par exemple à faire un premier choix de 3 données, à régler un \lambda pour qu’il marche sur les 7 données restantes, puis on re-choisit 3 autres données et on refait la validation…ainsi de suite. Et à la fin, on obtient la valeur optimale de \lambda.

Quelques cas d’usage

Maintenant qu’on a vu l’essentiel, je peux comprendre si tu te dis « …c’est bien beau tout ça mais moi je ne veux pas me casser la tête, je vais rester sur la régression linéaire ». Tu peux ! C’est la régression la plus commune (…et accessoirement tu fais ce que tu veux, on est en démocratie 😛). Mais dans certains cas spécifiques, tu sera obligé de changer de musique.

Cas 1

Dans notre exemple, on a fait une régression avec une seule variable en entrée. Dans les vrais problèmes, on a plus d’une variable en entrée. Ici, par exemple, en dehors de la taille du biceps, les autres variables qui auraient pu déterminer le nombre de pompes effectuées par les participants sont le tour de taille (gros pectoraux ou pas), la quantité de glucides consommée avant la compétition (à jeun ou pas à jeun, ce n’est pas la même performance), le nombre de pompes effectuées la veille (déjà fatigué ou non) …etc, tu vois l’idée. Donc dans la vraie vie, on fait plus souvent des régressions multilinéaires que linéaires. Et si dans un tel cas de figure, tu as certaines de tes variables qui sont corrélées les unes avec les autres (même un peu), le problème de la régression multilinéaire simple est mathématiquement mal posé (problème de la multicolinéarité) ! Je ne rentre pas dans les détails mathématiques mais retiens que dans de tels cas, une régression type ridge peut être une bonne porte de sortie.

Cas 2

Pour faire une régression multilinéaire simple, tu as besoin d’un minimum de données. Pour une régression linéaire (avec a et b ) par exemple, il faut au moins 2 points… (même si j’ai déjà vu des gens désespérés essayer de faire une régression linéaire sur un point ! Ne juge pas, un doctorat, c’est dur parfois 😂). Et même quand tu as juste le nombre minimal de points, il faut prendre la régression multilinéaire simple avec des pincettes, parce que le modèle sera trop dépendant des données d’apprentissage.

Cas 3

Enfin, quand tu n’as pas le minimum de points nécessaires, avec la validation croisée, la régression Ridge te permet quand même de déterminer un modèle. Et ça, quand tu n’as pas suffisamment de données, ça te sauve la journée !

Implémentation sur Python

Simple ! La librairie sklearn dans son module linear_model offre la classe Rigde (). Dans son usage le plus simple, il faut juste spécifier la valeur de \lambda (sklearn dit plus \alpha (alpha) au lieu de \lambda (lambda) mais c’est juste des conventions, \lambda reste quand même ce qu’il s’emploie le plus souvent en maths).

from sklearn.linear_model import Ridge
modele = Ridge(alpha = 1)
# Entrainement du modèle
modele.fit(X,Y)
# On peut après l'utiliser pour prédire des sorties sur de nouvelles données Xnew
modele.predict(Xnew)

Et voilà !

Une autre régression hautement similaire à la régression Ridge est la régression Lasso. Si tu veux savoir ce que c’est, c’est par ici que ça se passe 😉!

Partager

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *