Prédire linéairement l'appartenance à une classe
Nous allons maintenant nous intéresser à des problèmes de classification binaire. Nos données sont toujours n points en p dimensions, représentés par la matrice X∈Rn×p, mais leurs étiquettes, représentées par un vecteur y∈{0,1}n, représentent maintenant l'appartenance (1) ou non (0) à une classe.
Par exemple, les p variables peuvent représenter le niveau de gris des p pixels d'une image, et on peut disposer de n images étiquetées en fonction de si elles représentent ou non un panda. Comment créer un modèle linéaire qui prédise si une image représente ou non un panda ?
Nous savons déjà (voir le chapitre Trouvez une combinaison linéaire de variables qui approxime leurs étiquettes de ce cours) résoudre des problèmes de régression linéaire. Peut-on utiliser cette base pour résoudre ce problème ?
Application directe de la régression linéaire
Dans un problème de régression, les étiquettes y(i) sont à valeurs dans R . 0 et 1 sont des éléments de R. Peut-on utiliser directement une régression linéaire ?
Le problème de cette approche est que beaucoup de points de coordonnées différentes doivent avoir la même étiquette exactement : f(x(i))=1 pour tous les points x(i) positifs. Une fonction linéaire n'est pas le bon outil pour cela…
Transformation d'une fonction linéaire en probabilité
Très bien, s'il faut que les points positifs puissent avoir des valeurs différentes les unes des autres, et pareil pour les points négatifs, peut-on essayer de prédire un nombre proche de 1 pour les points positifs, et un nombre proche de 0 pour les points négatifs ?
D'accord, mais « proches » et « différents » comment ? Cela ressemble de plus en plus à une probabilité : et si l'on essayait plutôt de prédire p(Y=1|x) ?
Il nous reste encore quelques problèmes :
Une probabilité est comprise entre 0 et 1. Une fonction linéaire, à moins d'être constante, va nous sortir des nombres entre −∞ et + ∞ .
Les probabilités ne se comportent pas linéairement : on voudrait une fonction qui varie peu près de 0 et près de 1, et plus fortement près de 0.5.
Pour résoudre ces problèmes, nous allons utiliser une transformation logistique : au lieu de prédire p(Y=1|x) directement comme la valeur d'une fonction linéaire en x, nous allons composer cette fonction linéaire avec la fonction logistique : Logistic:R→[0,1],u↦11+e−u.
Nous avons donc le modèle suivant :
C'est ce qu'on appelle une régression logistique.
Solution de la régression logistique
Comme la régression linéaire, la régression logistique peut s'apprendre par maximum de vraisemblance (voir la section correspondante du chapitre « Trouvez une combinaison linéaire de variables qui approxime leurs étiquettes » de ce cours). Souvenez-vous, nous allons chercher à maximiser le logarithme de la vraisemblance, à savoir résoudre
Comment calculer p(Y=y(i)|x(i),β) ? Il y a deux cas possibles :
- soit y(i)=1, auquel cas il s'agit de p(Y=1|x(i),β) ;
- soit y(i)=0, auquel cas il s'agit de p(Y=0|x(i),β), qui vaut 1−p(Y=1|x(i),β).
Autrement dit :
Il ne nous reste plus qu'à remplacer p(Y=1|x(i),β) par sa valeur, à savoir la transformation logistique d'une combinaison linéaire des variables, et on obtient le problème suivant :
Contrairement au cas de la régression linéaire, le gradient de la fonction objective (celle que l'on cherche à maximiser) n'a pas de forme explicite et nous ne pouvons donc pas trouver de solution analytique. Cependant, la fonction objective est concave et nous pouvons utiliser la méthode du gradient.
La régression logistique est implémentée dans scikit-learn : sklearn.linear_model.LogisticRegression.
Régularisation
Nous avons vu dans les chapitres précédents que l'on peut utiliser la régularisation pour contrôler les coefficients d'une régression linéaire, et éviter le sur-apprentissage ou créer des modèles parcimonieux. Les mêmes concepts s'appliquent à la régression logistique, à la différence que la régression logistique régularisée par la norme ℓ2 n'admet pas de solution explicite.
On pourra donc utiliser :
La régression logistique avec régularisation ℓ2 pour éviter le sur-apprentissage (dans scikit-learn, c'est même l'implémentation par défaut de la régression logistique) ;
La régression logistique avec régularisation ℓ1 pour obtenir un modèle parcimonieux (dans scikit-learn, il suffit d'utiliser l'option
'penalty'=l1
).
Conclusion
La régression logistique modélise la probabilité qu'une observation appartienne à la classe positive comme une transformation logistique d'une combinaison linéaire des variables.
Les coefficients d'une régression logistique s'apprennent par maximisation de vraisemblance, mais il n'existe pas de solution explicite.
La vraisemblance est convexe, et de nombreux solveurs peuvent être utilisés pour trouver une solution numérique.
Les concepts de régularisation ℓ1 et ℓ2 s'appliquent aussi à la régression logistique.