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 :




Interprétation : Odd Ratio
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
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.
2 – Implémentation sur Scikit-Learn
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)
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’]))]

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.
3 – Mesure de performance : Les métriques
Matrice de confusion

- 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

- 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.
Balanced Accuracy
- 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.