Dans l’article précédent « Introduction à la classification et à la régression logistique », j’ai exposé les bases mathématiques de l’algorithme de régression logistique, dont la tâche est de séparer les choses dans l’exemple d’entraînement en calculant la frontière de décision.
La frontière de décision peut être décrite par une équation. Comme dans la régression linéaire, l’algorithme de régression logistique sera capable de trouver les meilleurs paramètres \thetas afin que la frontière de décision sépare effectivement les points de données correctement. Dans cet article, nous allons voir comment calculer ces \thetas.
Supposons que nous avons un ensemble d’entraînement générique
\{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \dots, (x^{(m)}, y^{(m)}). \}
fait de m exemples d’entraînement, où (x^{(1)}, y^{(1)}) est le 1er exemple et ainsi de suite. Plus précisément, x^{(m)} est la variable d’entrée du m-ième exemple, tandis que y^{(m)} est sa variable de sortie. S’agissant d’un problème de classification, chaque exemple a bien sûr la sortie y bornée entre 0 et 1. En d’autres termes, y \in {0,1}.
Chaque exemple est représenté comme d’habitude par son vecteur de caractéristiques
\vec{x} = \begin{bmatrix} x_0 \\\\ x_1 \\\dots \\ x_n \end{bmatrix}
où x_0 = 1 (le même vieux truc). C’est un exemple générique, nous ne connaissons pas le nombre exact de caractéristiques.
Enfin, nous avons la fonction d’hypothèse pour la régression logistique, comme vu dans l’article précédent:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}
Notre tâche consiste maintenant à choisir les meilleurs paramètres \thetas dans l’équation ci-dessus, étant donné l’ensemble d’entraînement actuel, afin de minimiser les erreurs. Rappelez-vous que \theta n’est pas un paramètre unique : il s’étend à l’équation de la frontière de décision qui peut être une ligne ou une formule plus complexe (avec plus de \thetas à deviner).
La procédure est similaire à ce que nous avons fait pour la régression linéaire : définir une fonction de coût et essayer de trouver les meilleures valeurs possibles de chaque \theta en minimisant la sortie de la fonction de coût. La minimisation sera effectuée par un algorithme de descente de gradient, dont la tâche est d’analyser la sortie de la fonction de coût jusqu’à ce qu’il trouve le point minimum le plus bas.
La fonction de coût utilisée dans la régression linéaire ne fonctionnera pas ici
Vous vous souvenez peut-être de la fonction de coût originale J(\theta) utilisée dans la régression linéaire. Je peux vous dire dès maintenant qu’elle ne fonctionnera pas ici avec la régression logistique. Si vous essayez d’utiliser la fonction de coût de la régression linéaire pour générer J(\theta) dans un problème de régression logistique, vous vous retrouveriez avec une fonction non convexe : un graphique de forme bizarre sans point global minimum facile à trouver, comme on le voit dans l’image ci-dessous.
Ce résultat étrange est dû au fait que dans la régression logistique, nous avons la fonction sigmoïde autour, qui est non linéaire (c’est-à-dire pas une ligne). Avec le J(\theta) décrit dans la figure 1. l’algorithme de descente de gradient pourrait rester bloqué dans un point minimum local. C’est pourquoi nous avons toujours besoin d’une fonction convexe soignée comme pour la régression linéaire : une fonction en forme de bol qui facilite le travail de la fonction de descente de gradient pour converger vers le point minimum optimal.
Une meilleure fonction de coût pour la régression logistique
Retournons un instant à la fonction de coût que nous avons utilisée dans la régression linéaire :
J(\vec{\theta}) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)})^2
qui peut être réécrite d’une manière légèrement différente:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Il ne s’est rien passé d’effrayant : J’ai juste déplacé le \frac{1}{2} à côté de la partie sommation. Maintenant, rendons-le plus général en définissant une nouvelle fonction
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
En d’autres termes, une fonction \mathrm{Cost} qui prend deux paramètres en entrée : h_\theta(x^{(i)}) comme fonction d’hypothèse et y^{(i)} comme sortie. Vous pouvez le considérer comme le coût que l’algorithme doit payer s’il fait une prédiction h_\theta(x^{(i)}) alors que l’étiquette réelle était y^{(i)}.
Avec cette nouvelle pièce du puzzle, je peux réécrire la fonction de coût pour la régression linéaire comme suit :
J(\theta) = \dfrac{1}{m}. \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
Nous savons cependant que la fonction de coût de la régression linéaire ne peut pas être utilisée dans les problèmes de régression logistique. Alors, de quoi s’agit-il ? Eh bien, il s’avère que pour la régression logistique, nous devons simplement trouver une fonction \mathrm{Cost} différente, tandis que la partie sommation reste la même.
Fonction de coût de la régression logistique
Pour la régression logistique, la fonction \mathrm{Cost} est définie comme:
\mathrm{Cost}(h_\theta(x),y) =\begin{cases}-\log(h_\theta(x)) & \text{if y = 1} \\-\log(1-h_\theta(x)) & \text{if y = 0}\end{cases}
Les indices i ont été supprimés pour plus de clarté. En d’autres termes, il s’agit du coût que l’algorithme paie s’il prédit une valeur h_\theta(x) alors que l’étiquette de coût réelle s’avère être y. En utilisant cette fonction, nous accordons la convexité à la fonction que l’algorithme de descente de gradient doit traiter, comme discuté ci-dessus. Il existe également une preuve mathématique pour cela, qui sort du cadre de ce cours d’introduction.
Dans le cas où y = 1, la sortie (c’est-à-dire le coût à payer) se rapproche de 0 lorsque h_\theta(x) se rapproche de 1. Inversement, le coût à payer croît à l’infini lorsque h_\theta(x) s’approche de 0. Vous pouvez clairement le voir dans le tracé 2. ci-dessous, côté gauche. Il s’agit d’une propriété souhaitable : nous voulons une pénalité plus importante lorsque l’algorithme prédit quelque chose de très éloigné de la valeur réelle. Si l’étiquette est y = 1 mais que l’algorithme prédit h_\theta(x) = 0, le résultat est complètement faux.
À l’inverse, la même intuition s’applique lorsque y = 0, représenté dans le tracé 2. ci-dessous, côté droit. Pénalités plus importantes lorsque l’étiquette est y = 0 mais que l’algorithme prédit h_\theta(x) = 1.
Optimisations supplémentaires de la fonction de coût
Ce que nous venons de voir est la version verbeuse de la fonction de coût pour la régression logistique. Nous pouvons la rendre plus compacte en une expression d’une ligne : cela permettra d’éviter les énoncés if/else ennuyeux lors de la conversion de la formule en algorithme.
\mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Preuve : essayez de remplacer y par 0 et 1 et vous vous retrouverez avec les deux morceaux de la fonction originale.
Avec l’optimisation en place, la fonction de coût de la régression logistique peut être réécrite comme:
\begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \\N& = – \dfrac{1}{m} \\\\\Nend{align}
J’ai déplacé le signe moins à l’extérieur pour éviter des parenthèses supplémentaires.
Collage de la fonction de coût et de la descente de gradient
Que reste-t-il ? Nous avons la fonction d’hypothèse et la fonction de coût : nous avons presque terminé. Il est maintenant temps de trouver les meilleures valeurs pour les paramètres \thetas dans la fonction de coût, ou en d’autres termes de minimiser la fonction de coût en exécutant l’algorithme de descente de gradient. La procédure est identique à ce que nous avons fait pour la régression linéaire.
Plus formellement, nous voulons minimiser la fonction de coût :
\min_{\theta} J(\theta)
Ce qui produira un ensemble de paramètres \theta, les meilleurs (c’est-à-dire avec moins d’erreur). Une fois fait, nous serons prêts à faire des prédictions sur de nouveaux exemples d’entrée avec leurs caractéristiques x, en utilisant les nouveaux \thetas dans la fonction d’hypothèse :
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top}. x}}
Où h_\theta(x) est la sortie, la prédiction, ou encore la probabilité que y = 1.
La façon dont nous allons minimiser la fonction de coût est en utilisant la descente de gradient. La bonne nouvelle est que la procédure est identique à 99% à ce que nous avons fait pour la régression linéaire.
Pour minimiser la fonction de coût, nous devons exécuter la fonction de descente de gradient sur chaque paramètre :
\begin{align} \text{répéter jusqu’à convergence \{} \\\\theta_j & := \theta_j – \alpha \frac{\partial}{\partial \theta_j} J(\theta) \\\text{\}}\end{align}
N’oubliez pas de mettre à jour simultanément tous les \theta_j comme nous l’avons fait dans la contrepartie de la régression linéaire : si vous avez n caractéristiques, c’est-à-dire un vecteur de caractéristiques \vec{\theta} = , tous ces paramètres doivent être mis à jour simultanément à chaque itération:
\begin{align} \text{répéter jusqu’à convergence \{} \\\\N-theta_0 & := \cdots \N-theta_1 & := \cdots \N-theta_n & := \cdots \\\\N\N\N\N\N\N\N\N\N
Retour à l’algorithme, je vous épargne le calcul de la redoutable dérivée \frac{\partial}{\partial \theta_j} J(\theta), qui devient:
\frac{\partial}{\partial \theta_j} J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Donc la boucle ci-dessus peut être réécrite comme:
\begin{align} \text{répéter jusqu’à convergence \{} \\\\N-theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)} \\\\\N- \N- \N- \N-\N-\N-\N-\N-
Surprenant, cela semble identique à ce que nous faisions pour la régression linéaire multivariée. Ce qui a changé par contre, c’est la définition de l’hypothèse h_\theta(x) : pour la régression linéaire, nous avions h_\theta(x) = \theta^{\top}{x}, alors que pour la régression logistique, nous avons h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}.
À partir de maintenant, vous pouvez appliquer les mêmes techniques pour optimiser l’algorithme de descente de gradient que nous avons vu pour la régression linéaire, afin de vous assurer que la conversion au point minimum fonctionne correctement. Dans le prochain chapitre, je vais approfondir certaines astuces d’optimisation avancées, ainsi que définir et éviter le problème de l’overfitting.