Data Science, Python, Economie ...

Accueil

Régression logistique

La régression logistique estime la probabilité qu'une variable binaire soit égale à 1 sachant $X$ : $Pr(Y = 1 \vert X = x)$. En y ajoutant un seuil de décision, on en fait un classificateur linéaire permettant de séparer des classes entre elles.

Pour des solutions à plus de deux classes, on lui préfère en général l'analyse discriminanteAnalyse discriminante
L'analyse discriminante est une méthode de classification proche de la [[Régression logistique|régression logistique]].

Elle est appelée en anglais linear discriminant analysis.

Principe

Soit une variable réponse $Y$ possédant $k$ classes possibles. L'analyse discriminante linéaire consiste à modéliser la distribution de X pour chaque classe de la variable réponse et d'utiliser le [[Théorème-de-Bayes]] pour en déduire $Pr(Y=k \vert X=x)$

On peut donc utiliser le théorème de Bayes pour est...
1, bien que ce soit possible en pratique

Grand classique de l'économétrie, longtemps envié, rarement dépassé !

Explication du modèle

La régression linéaireRégression linéaire
La régression linéaire est une technique de base de l'analyse de données permettant d'estimer la relation linéaire qu'il peut exister entre deux variables.

Mise en pratique avec [[sklearn]] :

Séparation entre un jeu de données de test et d'entrainement

Avec train_test_split de sklearn.model_selection :

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)


Modèle

[[sklearn]] contient bien évidemment une classe propre à la régression linéaire, Linear...
classique ne permet pas d'estimer une probabilité qu'une observation appartienne à une classe donnée, ses résultats n'étant pas bornés entre 0 et 1. En pratique, cela n'empêche pas de réaliser une classification, mais les résultats seront instables, notamment si l'on a des données extrêmes dans l'échantillon de test.

Estimation (en bleu) de la probabilité de défaut en fonction du solde du compte en banque. A gauche, régression linéaire, à droite, régression logistique. Source : ISLR (Tibshirani et al.).

Toute observation appartenant à une classe2, on attribuera à chaque observation la classe ayant la cote la plus élevée, c'est à dire la classe la plus probable comparée aux autres.

Dans le cas simple où l'on a deux classes possibles ($Y=1$ ou $Y=0$), cela reviendra à calculer le ratio des deux probabilités :

$$ cote = \frac{\operatorname{P}(Y=1 \mid X=x)}{\operatorname{P}(Y=0 \mid X=x)} $$

Ce qui revient à :

$$ cote = \frac{\operatorname{P}(Y=1 \mid X=x)}{1-\operatorname{Pr}(Y=1 \mid X=x)} $$

Comment estimer la probabilité $\operatorname{P}(G=1 \mid X=x)$ de telle manière qu'elle soit comprise entre 0 et 1 ? On exploite la fonction logistique, qui possède ces propriétés :

$$ \operatorname{P}(Y=1 \mid X=x)=\frac{\exp \left(\beta_{0}+\beta^{T} x\right)}{1+\exp \left(\beta_{0}+\beta^{T} x\right)} $$

Sachant que :

$$ \operatorname{P}(Y=0 \mid X=x)=\frac{1}{1+\exp \left(\beta_{0}+\beta^{T} x\right)} $$

Ses paramètres $\theta = \beta_{0}+\beta^{T}x$ sont isolables en réalisant la transformation logit, log[p /(1-p)] suivante :

$$ \log \frac{\operatorname{Pr}(Y=1 \mid X=x)}{\operatorname{Pr}(Y=0 \mid X=x)}=\beta_{0}+\beta^{T} x $$

Cette propriété est très commode, car elle se rapproche de la régression linéaire et donne la contribution au modèle de chaque variable, ce qui permet une bonne interprétabilité.

Le cas à K > 2 classes est une généralisation de ce modèle :

$$ \log \frac{\operatorname{Pr}(Y=K-1 \mid X=x)}{\operatorname{Pr}(Y=K \mid X=x)}=\beta_{(K-1) 0}+\beta_{K-1}^{T} x $$

On calcule alors la cote de chaque classe par rapport à la dernière classe. En pratique, le choix de dénominateur est libre et n'influe pas sur le résultat. La probabilité postérieure associée à chaque classe, en fonction de $\theta$ est exprimée ainsi :

$$ \operatorname{Pr}(Y=k \mid X=x)=p_{k}(x ; \theta) $$

Où $\theta$ correspond aux paramètres du modèle, comme expliqué plus haut :

$$ \theta=\left\{\beta_{10}, \beta_{1}^{T}, \ldots, \beta_{(K-1) 0}, \beta_{K-1}^{T}\right\} $$

Estimation du modèle

On utilise l'estimateur du maximum de vraisemblance pour chercher la valeur $\theta$. La log-vraisemblance s'exprime ainsi :

$$ \ell(\theta)=\sum_{i=1}^{N} \log p_{y_{i}}\left(x_{i} ; \theta\right) $$

Dans le cas à deux classes (plus simple), où la variable objectif $y_i$ est binaire (0 ou 1) et $p_{1}(x ; \theta)=p(x ; \theta)$, $p_{2}(x ; \theta)=1-p(x ; \theta)$, on a :

$$ \begin{aligned} \ell\left(\beta_{0}, \beta\right) &=\sum_{i=1}^{n} y_{i} \log p\left(x_{i}\right)+\left(1-y_{i}\right) \log(1-p\left(x_{i}\right)) \\ &=\sum_{i=1}^{n} \log(1-p\left(x_{i}\right))+\sum_{i=1}^{n} y_{i} \log \frac{p\left(x_{i}\right)}{1-p\left(x_{i}\right)} \\ &=\sum_{i=1}^{n} \log(1-p\left(x_{i}\right))+\sum_{i=1}^{n} y_{i}\left(\beta_{0}+x_{i} \cdot \beta\right) \\ &=\sum_{i=1}^{n}-\log(1+e^{\beta_{0}+x_{i} \cdot \beta})+\sum_{i=1}^{n} y_{i}\left(\beta_{0}+x_{i} \cdot \beta\right) \end{aligned} $$

La maximisation de la log-vraisemblance se fait en dérivant son expression en fonction de ses paramètres. On cherche ensuite pour chaque équation dite de score le point où elles atteignent 0 :

$$ \begin{aligned} \frac{\partial \ell}{\partial \beta_{j}} &=-\sum_{i=1}^{n} \frac{1}{1+e^{\beta_{0}+x_{i} \cdot \beta}} e^{\beta_{0}+x_{i} \cdot \beta} x_{i j}+\sum_{i=1}^{n} y_{i} x_{i j} \\ &=\sum_{i=1}^{n}\left(y_{i}-p\left(x_{i} ; \beta_{0}, \beta\right)\right) x_{i j} \end{aligned} $$

A noter : Le coefficient $\beta_{k0}$ est égal à la répartition à priori de $y_i$.

L'approche de la valeur des paramètres du modèle se fait au moyen de l'algorithme de Newton-Raphson, que l'on peut retrouver p120-121 d'ESLII.

Régularisation

On peut utiliser les mêmes techniques de régularisationRégularisation
La régularisation consiste à modifier la fonction de coût d'une régression. Le but est de changer le comportement de l'estimateur des moindres carrés afin de pénaliser les coefficients trop importants ou de réduire le nombre de variables explicatives au strict minimum.

Application avec [[sklearn]]

Le module sklearn.linear_model contient des modèles prenant en compte les principales formules de régularisation. L'usage n'est pas différent de la mise en œuvre d'une [[Régression linéaire|régres...
que pour la régression linéaireRégression linéaire
La régression linéaire est une technique de base de l'analyse de données permettant d'estimer la relation linéaire qu'il peut exister entre deux variables.

Mise en pratique avec [[sklearn]] :

Séparation entre un jeu de données de test et d'entrainement

Avec train_test_split de sklearn.model_selection :

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)


Modèle

[[sklearn]] contient bien évidemment une classe propre à la régression linéaire, Linear...
. Il est seulement nécessaire de centrer et réduire les variables explicatives, la variable objectif étant déjà comprise entre 0 et 1.

A noter : La constante n'est pas concernée par la régularisation, étant simplement une variable d'ajustement a priori du modèle.

La pénalité est ajoutée à la vraisemblance :

$$ \ell\left(\beta_{0}, \beta\right)=\sum_{i=1}^{n}-\log \left(1+e^{\beta_{0}+x_{i} \cdot \beta}\right)+\sum_{i=1}^{n} y_{i}\left(\beta_{0}+x_{i} \cdot \beta\right)+\alpha \sum_{j=1}^{p}\left|\beta_{j}\right|+(1-\alpha) \sum_{j=1}^{p} \beta_{j}^{2} $$

Classification

Afin de maximiser la précision, choisira $y_i = 1$ lorsque le score $p(x_i)$ associé à l'observation est égal à 0,5 et $y_i = 0$ lorsque $p(x_i) < 0,5$, ce qui correspond au point où $P(y_i=1 \mid x_i)=P(y_i=0 \mid x_i)=\frac{1}{2}$.

Dans le cadre de la fonction logistique $p(X)=\frac{e^{\beta_{0}+\beta_{1} X}}{1+e^{\beta_{0}+\beta_{1} X}}$, cela revient à choisir $Y=1$ lorsque $\beta_{0}+\beta_{1} X$ est supérieur à 0 et $Y=0$ lorsque $\beta_{0}+\beta_{1} X$ est égal à 1. On crée de fait un classificateur linéaire.

A noter : On peut choisir une limite de décision (decision boundary) différente en fonction de l'évènement à détecter. Pour réduire les faux négatifs, on choisira une limite inférieure à 0,5, au prix d'un nombre accru de faux positifs. Un bon moyen de choisir est de consulter la courbe ROCIndicateurs de performance des classificateurs
Comment évaluer une classification ? Selon le contexte, on le but de la classification peut être différent. Par exemple :


Un système de justice peut chercher à établir la culpabilité d'un suspect mais en évitant au maximum de condamner un innocent.
Un fabricant de voiture cherchera lors de son contrôle qualité des freins à identifier absolument toutes les pièces défecteuses au prix de devoir changer certaines pièces correctes mais identifiées comme à risque.
Un médecin peut chercher à...
du modèle. Voir aussi cette bonne réponse sur SO sur l'aspect mathématique et graphique de cette question.

Interprétation

Si le modèle s'inspire de la régression linéaire, il n'est pas aussi explicatif que celle-ci.

En effet, comme on le constate, une augmentation de $x_i$ de une unité ne correspond pas à une variation égale à $\beta_{1i}$ de la probabilité $p(X=x_i)$ , mais à la côte de celle-ci.

Néanmoins, on peut toujours comparer les effets $\beta_i$ entre eux (à condition que les variables soient normaliséesMise à l'échelle des données - standardisation et normalisation
La mise à l'échelle consiste à altérer les données afin de réduire leur variance ou leur valeur absolue. Elle est utile pour les cas suivants :



Lorsque les variables d'un jeu de données ont des ordres de grandeur différents, ces derniers peuvent fausser les estimations des algorithmes d'apprentissage automatique.


Les classificateurs utilisant la distance euclidienne seront affectés si un des composant est distribué sur un espace beaucoup plus grand que les autres.


...
) et le signe de $\beta_i$ nous laisse une indication pertinente à propos de l'effet de la variable $X_i$ sur $p(X)$.

Sélection du modèle

L'interprétation des coefficients peut être complexifiée par la présence de variables correlées entre elles qui peuvent remplacer les variables explicatives ayant une relation de causalité et non seulement de corrélation.

Il semble y avoir des divergences sur la meilleure manière de choisir ses variables.

Plusieurs stratégies sont possibles, certaines algorithmiques, d'autres plus analytiques. Le choix dépendra du temps, des ressources à disposition, mais aussi de la culture de practicien (machine learning versus économétrie) et du sujet étudié.

  • Supprimer la variable la moins significative du modèle puis rééstimer ses paramètres, jusqu'à ce que toutes les variables soient significatives.

  • Estimer le modèle avec chaque variable en moins (soit $k-1$ variable à chaque fois), et choisir le modèle dont le $R^2$ est le plus élevé, puis répèter avec $k-2$ variables et ainsi de suite.

  • Tester les coefficients avec les tests de Rao (inclusion d'un coefficient) et de Wald (exclusion d'un coefficient). Plus de détails dans ce lien.

  • Comparer le score AIC des modèles un à un. $AIC=-2 \times \ln (\text {vraisemblance})+2 k$ où $k$ est égal au nombre de variables du modèle. On choisit le score AIC le plus faible.

Le package Python "Statsmodel" est très complet sur le sujet. Un bon guide pour avancer rapidement.

Utilisation simple avec scikit-learn

On utilise sklearn.linear_model.LogisticRegression. A noter que sklearn régularise la régresssion par défaut, ce qui peut produire des résultats différents d'une régression classique réalisée avec R ou statsmodels.

from sklearn import datasets
from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

digits = datasets.load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)

lr = LogisticRegression()
lr.fit(X_train,y_train)

# Précision d'entrainement :
lr.score(X_train,y_train))

# Précision de test :
lr.score(X_test, Y_test))

# Probabilités estimées pour la première observation :
lr.predict_proba(X_test[0])
  1. Voir https://www.stat.cmu.edu/~cshalizi/uADA/12/lectures/ch12.pdf, partie 12.2.2, par exemple. 

  2. Même les sans-classes, qui forment de facto une classe ! Imparable.