Régression Logistique : Modèle et Estimation

Objectif pédagogique : Comprendre le modèle de régression logistique binaire et maîtriser l’estimation par maximum de vraisemblance

À la fin de ce chapitre, tu seras capable de…

  • Définir la régression logistique binaire et ses applications
  • Comprendre la fonction logistique et l’interprétation probabiliste
  • Maîtriser l’estimation par maximum de vraisemblance
  • Interpréter les coefficients via les odd-ratios
  • Appliquer le seuil de classification à 0.5

💡 Prérequis : Maîtrise de la régression linéaire, notions de probabilités, bases de l’apprentissage supervisé et manipulation des variables catégorielles

Mise en contexte

Vous voulez prédire si un patient est malade selon sa température ? Contrairement à la régression linéaire qui prédit des valeurs continues, la régression logistique vous permet de classer vos observations en catégories. Vous découvrirez comment transformer une combinaison linéaire en probabilités grâce à la fonction logistique, et comment interpréter vos résultats avec les odd-ratios pour des décisions éclairées.

1 – Modèle

Définition

La régression logistique est utilisée dans le cadre d’une problématique d’apprentissage supervisé. Elle permet de modéliser une variable expliquée de type qualitatif, y, comme une fonction de la combinaison linéaire des variables explicatives, X.

À la différence de la problématique de régression linéaire que l’on a couverte tout au long du précédent notebook, la variable expliquée, y, est catégorielle, deux catégories ou plus la composent. Dans le cadre de ce notebook, nous traiterons de la régression logistique binaire : la variable expliquée est encodée de façon binaire et contient donc exactement deux catégories: 0 pour la classe dite négative et 1 pour la classe dite positive.

On parle de modèle de classification car la régression logistique nous permet de prédire la classe d’appartenance de chacune des observations : en d’autres termes, à partir des variables explicatives du modèle, on prédit si une observation appartient à la classe négative ou positive.

💡 À retenir : cette prédiction se base sur des probabilités qui vont déterminer l’appartenance à ces classes. La probabilité d’appartenance à la classe positive est donnée par une formule mathématique.

Comme vous le remarquez le dénominateur ressemble beaucoup à la combinaison linéaire des variables explicatives définie pour la régression linéaire. La fonction que l’on applique à cette combinaison linéaire est appelée fonction logistique et permet d’obtenir des valeurs comprises entre 0 et 1, que l’on interprète comme des probabilités.

Habituellement, le cut-off de probabilité est fixé à 0.5. Le cut-off correspond au seuil de probabilité au-dessus duquel on va considérer qu’une observation appartient à la classe positive.

Estimation et interprétation des coefficients

Comme nous l’avons évoqué dans le précédent notebook, il existe plusieurs sortes de méthodes d’estimation. Le plus souvent, c’est l’estimation par maximum de vraisemblance qui est privilégiée pour estimer les paramètres d’une régression logistique. Nous énonçons ci-dessous les formules, en particulier celles de la fonction de vraisemblance et de log-vraisemblance que l’on devra estimer pour obtenir nos paramètres.

Estimation par maximum de vraisemblance

La probabilité d’appartenir à la classe positive est donnée par :

La probabilité d’appartenir à la classe négative est donnée par :

La formule générale est celle-ci :

Plus généralement nous obtenons la fonction de vraisemblance, qui correspond au produit des probabilités.

Pour faciliter la résolution et puisque nous cherchons à différencier la fonction, on réalise une transformation monotone de la fonction en passant par le logarithme (propriétés du logarithme népérien) et on obtient une somme, qui correspond à la fonction de log-vraisemblance :

Afin d’estimer la valeur des paramètres il faut différencier la fonction de log-vraisemblance par rapport à chacun des paramètres que l’on souhaite estimer tel que :

Bien qu’instructives, les formules de résolution de la fonction de log-vraisemblance ne seront pas à connaître lorsque l’on utilise des logiciels de programmation. En particulier, la librairie Scikit-Learn ne demande pas une implémentation aussi poussée.

Interprétation : Odd Ratio

Contrairement à la régression linéaire, les coefficients estimés ne peuvent pas être interprétés tels qu’ils ont été estimés. Il faut interpréter les odd-ratios de ces paramètres, qui correspondent aux rapports des chances. Les odd-ratios sont obtenus en prenant l’exponentielle des paramètres. Par exemple, après avoir estimé β₁, son odd-ratio sera égal à exp(β₁).

Puisque les interprétations diffèrent selon la nature des variables explicatives (quantitative ou qualitative), prenons un exemple. On essaie de prédire si un individu est malade selon plusieurs informations qu’il a données.

Nous choisissons de nous concentrer uniquement sur sa température corporelle, on obtient donc ce modèle :

maladie = β₀ + β₁ temperature

La variable expliquée malade est encodé de façon binaire, la variable vaut 1 lorsque l’on est malade, 0 sinon et la seule variable explicative du modèle, la température, est quantitative.

Disons que l’on a estimé le paramètre β₁ à 0.2 alors l’odd ratio de β₁ sera égal à environ 1.22, ce qui peut s’interpréter ainsi: lorsque la température d’un individu augmente de 1, alors les chances qu’il a d’être malade augmentent de 22%. Si à l’inverse le paramèttre était estimé à -0.2 alors l’odd ratio serait de 0.8. On l’interprète ainsi: tout d’abord, on prend l’inverse de 0.8, on obtient alors 1.25 et on déduit que lorsque la température d’un individu augmente de 1 alors cela diminue les chances de 25% d’être malade. Le deuxième cas de figure est bien sûr contre-intuitif.

💡 À retenir : Si l’odd ratio est supérieur à 1, une augmentation de la variable augmente les chances d’appartenir à la classe positive. S’il est égal à 1, la variable ne semble pas avoir d’impact sur la répartition entre les classes. S’il est inférieur à 1, une augmentation de la valeur de la variable diminue les chances d’appartenir à la classe positive.

2 – Implémentation sur Scikit-Learn

Nous travaillons sur une problématique de prédiction de classe. On essaie de détecter à partir des variables explicatives à disposition si les patients sont atteints du cancer du sein. Autrement dit, on cherche à partir des variables explicatives contenues dans la base de données à prédire si l’individu est malade (1) ou non (0).

Charger le dataset (variables explicatives et target)

On importe la librairie pandas

import pandas as pd

A partir du module sklearn.datasets de la librarie scikit-learn, on importe la fonction load_breast_cancer qui renvoie une base de données sous forme de dictionnaire où les variables explicatives et la target sont déjà séparés

from sklearn.datasets import load_breast_cancer

Obtenir la description des variables présentes dans la base de données

print(load_breast_cancer().DESCR)

Instanciation du dataframe contenant les variables explicatives

X = pd.DataFrame(load_breast_cancer().data, columns=load_breast_cancer().feature_names)

Instanciation de la series contenant la variable cible

y = pd.Series(load_breast_cancer().target)

Exécuter le lignes de code ci-dessus et observer les sorties.

Séparer la base de données en partie train et test

De la même façon que nous l’avions implémenté plus haut, séparer la base de données en une partie train et une partie test, cette fois-ci ajoutons un argument dans notre fonction: stratify=y.

A partir du module model_selection de la librairie scikit-learn on importe la fonction train_test_split

from sklearn.model_selection import train_test_split

On applique la fonction train_test_split. L’argument stratify permet de s’assurer que la répartition des classes de y au sein de la base train et test est la même. La notion de stratification sera approfondie au sein du dernier notebook

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

On affiche les dimensions des datasets après avoir appliquer la fonction

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

Sortie attendue : (398, 30) (171, 30) (398,) (171,)

Entraîner le modèle et obtenir les prédictions

A partir du module linear_model de la librairie scikit learn on importe la fonction LogisticRegression

from sklearn.linear_model import LogisticRegression

On instantie le modèle et on l’entraîne

model_log=LogisticRegression(solver= »newton-cg »).fit(X_train, y_train)

On prédit les y à partir de X_test

y_pred=model_log.predict(X_test)

On affiche les coefficients obtenus

coeff=model_log.coef_

On affiche la constante

intercept=model_log.intercept_

On calcule les odd-ratios. On importe la librairie numpy

import numpy as np

On calcule les odd ratios

odd_ratios=np.exp(model_log.coef_)

On crée un dataframe qui combine à la fois variables, coefficients et odd-ratios

resultats=pd.DataFrame(load_breast_cancer().feature_names, columns=[« Variables »])

resultats[‘Coefficients’]=model_log.coef_.tolist()[0]

resultats[‘Odd_Ratios’]=np.exp(model_log.coef_).tolist()[0]

On choisit d’afficher les variables avec l’odd ratio le plus élevé et le plus faible

resultats.loc[(resultats[‘Odd_Ratios’]==max(resultats[‘Odd_Ratios’]))|(resultats[‘Odd_Ratios’]==min(resultats[‘Odd_Ratios’]))]

Sortie attendue :

Interprétation

  • mean radius : Lorsque la variable mean radius augmente de 1 alors cela augmente les chances d’appartenir à la classe positive d’environ 3 fois.
  • worst concavity : Lorsque la variable worst concavity augmente de 1 alors cela diminue les chances d’appartenir à la classe positive d’environ 3 fois.

💡 À retenir : En résumé, nous venons de réaliser les étapes suivantes :

  • Importer notre jeu de données: variables explicatives (X) et la variable cible (y)
  • Séparer la base de données en une partie train et une partie test en respectant la proportion de chaque classe au sein de la base
  • Entraîner le modèle de régression logistique sur nos données d’entraînement
  • Prédire les classes de la variable cible y à partir des coefficients estimés du modèle
  • Calculer les odd ratios à partir des coeficients estimés par le modèle, pour interpréter leur impact sur la variable cible.
Il reste ainsi à calculer les performances de notre modèle, pour cela nous allons utiliser la prédiction de y ainsi que des métriques adaptées au problème de classification, c’est ce que nous allons voir dans la partie suivante.

3 – Mesure de performance : Les métriques

Matrice de confusion

La matrice de confusion est un outil très simple permettant d’observer la différence entre la réelle appartenance des observations aux classes et les classes prédites. Elle contient, les vrais positifs: les observations classées dans la classe positive et qui lui appartiennent bien, les faux positifs: les observations classées dans la classe positive alors qu’ils sont de classe négative, les vrais négatifs : les observations classées dans la classe négative et qui lui appartiennent bien et enfin les faux négatifs: les observations classées dans la classe négative alors qu’ils sont de classe positive.

Il est à noter que la disposition de la matrice de confusion peut varier. Les vrais positifs peuvent se retrouver dans le coin supérieur gauche de la matrice par exemple. Egalement la matrice de confusion comporte 4 cases lorsque nous avons affaire à une problématique binaire. Si la variable cible comporte trois classes, on aura ainsi 9 cases. Si l’on généralise la matrice de confusion est toujours une matrice carrée qui a pour nombre de cases: le nombre de classes mis au carré.
  • A l’aide de la fonction confusion_matrix du module metrics de la librairie scikit-learn, affichez la matrice de confusion du modèle, à l’aide de votre prédiction et de y_test. Commenter les résultats.

On importe la fonction confusion_matrix du module metrics de la librairie Scikit Learn

from sklearn.metrics import confusion_matrix

On calcule la matrice de confusion et on l’affiche

print(« \n Matrice de confusion \n », confusion_matrix(y_test,y_pred))

On peut également afficher la signification de chaque élément de la matrice lorsque l’on a une problématique binaire

tn, fp, fn, tp = confusion_matrix(y_test,y_pred).ravel()

print(« \n Vrais négatifs: », tn, « \n Faux positifs: », fp, « \n Faux négatifs: », fn, « \n Vrais positifs: », tp)

Sortie attendue :

Nous constatons ainsi que 105 individus malades sont correctement classés sur 107.

Il y a donc 2 individus qui sont considérés comme sains alors qu’ils sont malades.

Concernant les individus sains, 57 sont correctement classés sur 64. Il y a donc 7 individus qui sont classés comme malade alors qu’ils ne le sont pas.

Accuracy et Balanced Accuracy

Accuracy

À partir des éléments de la matrice de confusion, il est possible de calculer plusieurs métriques telles que l’accuracy. L’accuracy est une mesure qui permet de savoir en proportion combien d’observations ont été correctement classés. L’accuracy est comprise entre 0 et 1, et plus l’accuracy est élevée plus cela indique des bonnes performances de classification du modèle. Pour le cas d’une classification binaire, on considère qu’une accuracy inférieure à 0.5 est mauvaise, cela signifie qu’en moyenne le modèle ne classe pas les observations dans leur classe d’appartenance.

Il est néanmoins important de noter que l’accuracy peut se révéler être une métrique faible notamment lorsque nous avons affaire à un déséquilibre de classes. Prenons pour exemple notre cas pratique, s’il y a une majorité de personnes saines dans le dataset et que le modèle prédit très bien les membres de cette classe, alors l’accuracy sera élevée de fait. Imaginons qu’en parallèle les membres de la classe positive soient mal classés en partie car ils font parties de la classe minoritaire, alors cela impactera assez peu l’accuracy puisqu’en proportion ces observations représentent une petite partie du jeu de données. Cette mesure donne donc une vision globale mais ne permet pas de distinguer les problèmes de classification dûes au déséquilibre de classes.
  • A l’aide de la fonction accuracy_score du module metrics de la librairie scikit-learn, afficher l’accuracy du modèle, à l’aide de votre prédiction et de y_test. Commenter le résultat.

On importe la fonction accuracy_score du module metrics de la librairie Scikit Learn

from sklearn.metrics import accuracy_score

On affiche l’accuracy du modèle

print(« Accuracy: »,accuracy_score(y_test,y_pred))

Sortie attendue :

Accuracy: 0.9473684210526315

Nous obtenons une accuracy proche des 0.95, ce qui reflète donc d’excellentes performances pour notre modèle.

C’est cohérent avec les résultats que l’on a pu observer grâce à la matrice de confusion.

💡 À retenir : Puisque la proportion d’individus malades et sains n’est pas équilibré au sein du jeu de données, il est important de se référer à d’autres métriques que l’accuracy.

Balanced Accuracy

La balanced accuracy mesure la part moyenne d’éléments bien classés au sein de chaque classe. Lorsque l’on est confronté à un déséquilibre de classes, il n’est donc pas conseillé d’utiliser une métrique telle que l’accuracy. En revanche, la balanced accuracy peut se révéler être une solution pour pallier à ce problème.
  • A l’aide de la fonction balanced_accuracy_score du module metrics de la librairie scikit-learn, affichez la balanced accuracy du modèle, à l’aide de votre prédiction et de y_test. Commentez le résultat.

On importe la fonction balanced_accuracy_score du module metrics de la librairie Scikit Learn

from sklearn.metrics import balanced_accuracy_score

On vérifie la répartition des classes

print(« Répartition des classes : \n »,y.value_counts(), »\n »)

La classe positive est surreprésentée par rapport à la classe 0.

On affiche la balanced accuracy du modèle

print(« Balanced accuracy: »,balanced_accuracy_score(y_test,y_pred))

Sortie attendue :

4 – Autres modèles de classification

Au sein de ce notebook nous avons uniquement évoqué le modèle de régression logistique néanmoins d’autres modèles de classification existent : les modèles linéaires pénalisés, des modèles non linéaires permettant de modéliser des relations non linéaires, les arbres de décision et enfin les techniques d’ensemble learning qui donnent souvent d’excellents résultats mais qui ont le désavantage d’être moins interprétables.

Modèles linéaires pénalisés

  • Lasso (L1-Regularisation)
  • Ridge (L2-Regularisation)
  • ElasticNet (L1 et L2 – Regularisation)

Les modèles de classification pénalisée par l’ajout d’un terme de pénalité ont été pensés pour pallier à la problématique d’overfitting évoquée dans le premier notebook du module.

Modèles non-linéaires

  • SVM : Séparateur à vastes marges
  • Algorithme des kNN : Algorithme des k plus proches voisins

Arbres de décision et Ensemble Learning

  • Decision Tree
  • Random Forest et Bagging
  • Boosting

Conclusion

  • La régression linéaire est un modèle de régression qui correspond à une problématique d’apprentissage supervisé
  • La variable à prédire est de type quantitatif
  • L’interprétation des coefficients est réalisée selon leur signe et leur valeur.
  • La régression logistique est un modèle de classification qui correspond à une problématique d’apprentissage supervisé ;
  • La variable à prédire est de type catégoriel (variable qualitative) ;
  • L’interprétation des coefficients se fait en calculant les odd-ratios ;
  • La problématique de déséquilibre de classes implique un choix minutieux des métriques.