Modélisation des données à variables dépendantes qualitatives : Regression logistique à variable dépendante dichotomique

Author

Djamal TOE

Published

March 2, 2025

Introduction

Le modèle logistique est une technique statistique largement utilisée pour modéliser des variables dépendantes binaires ou des proportions. Il est fondamental en économétrie, en sciences sociales, en biostatistique et dans de nombreux autres domaines.

Formulation du Modèle Logistique

La régression logistique permet de modéliser la probabilité d’un événement sous la forme : \[\begin{equation} P(Y=1 | X) = \frac{e^{\beta_0 + \beta_1 X_1 + \dots + \beta_k X_k}}{1 + e^{\beta_0 + \beta_1 X_1 + \dots + \beta_k X_k}}. \end{equation}\]

La fonction logistique peut être réécrite sous la forme des cotes (odds) : \[\begin{equation} \frac{P(Y=1 | X)}{1 - P(Y=1 | X)} = e^{\beta_0 + \beta_1 X_1 + \dots + \beta_k X_k}. \end{equation}\]

En prenant le logarithme des deux côtés, nous obtenons le modèle de régression logistique sous sa forme linéarisée : \[\begin{equation} \log \left( \frac{P(Y=1 | X)}{1 - P(Y=1 | X)} \right) = \beta_0 + \beta_1 X_1 + \dots + \beta_k X_k. \end{equation}\]

Importance en Classification

Le modèle logistique est particulièrement utilisé en classification binaire. Il permet d’attribuer une observation à l’une des deux catégories possibles en fonction d’un seuil de probabilité (souvent fixé à 0.5).

En apprentissage automatique, il est souvent employé pour des tâches telles que :

  • La détection de spams dans les emails.

  • La reconnaissance de fraudes bancaires.

  • La segmentation de clients en fonction de leur probabilité d’achat.

Interprétation des Coefficients

Dans un modèle logistique, chaque coefficient \(\beta_i\) représente l’effet d’une variation de \(X_i\) sur le logarithme des cotes. Cela signifie que pour une variation de \(X_i\) d’une unité, la variation relative des cotes est donnée par :

\[\begin{equation} e^{\beta_i}. \end{equation}\]

Si \(\beta_i > 0\), alors une augmentation de \(X_i\) accroît la probabilité de succès (\(Y=1\)). Si \(\beta_i < 0\), alors une augmentation de \(X_i\) diminue cette probabilité.

Cependant, si l’on souhaite interpréter directement l’effet de \(X_i\) sur \(P(Y=1)\), il faut calculer les effets marginaux : \[\begin{equation} \frac{\partial P(Y=1 | X)}{\partial X_i} = P(Y=1 | X) (1 - P(Y=1 | X)) \beta_i. \end{equation}\]

Les effets marginaux permettent d’exprimer l’impact de \(X_i\) sur la probabilité directement, sans passer par les cotes.

Méthodes d’Estimation

Les paramètres sont estimés par la méthode du maximum de vraisemblance. La fonction de vraisemblance pour \(n\) observations est donnée par : \[\begin{equation} L(\beta) = \prod_{i=1}^{n} P(Y_i | X_i)^{Y_i} (1 - P(Y_i | X_i))^{1 - Y_i}. \end{equation}\]

En prenant le logarithme, nous obtenons la log-vraisemblance : \[\begin{equation} \log L(\beta) = \sum_{i=1}^{n} \left[ Y_i \log P(Y_i | X_i) + (1 - Y_i) \log (1 - P(Y_i | X_i)) \right]. \end{equation}\]

L’estimation des paramètres se fait par :

  • La méthode de Newton-Raphson.
  • L’algorithme de descente de gradient (en apprentissage automatique).
  • Des solveurs numériques spécialisés (comme ceux implémentés dans R ou Python).

Applications

Le modèle logistique est utilisé dans divers domaines :

  • Médecine : prédiction de la présence d’une maladie en fonction de facteurs de risque.

  • Marketing : estimation de la probabilité qu’un client achète un produit donné.

  • Finance : modélisation du risque de défaut d’un emprunteur.

  • Économie : analyse des choix binaires comme l’adoption d’une nouvelle technologie.

Exemple d’Application

Supposons que nous souhaitions modéliser l’effet du revenu (\(X\)) sur la probabilité qu’un individu possède une assurance santé (\(Y\)). Nous estimons alors un modèle logistique : \[\begin{equation} P(Y=1 | X) = \frac{e^{\beta_0 + \beta_1 X}}{1 + e^{\beta_0 + \beta_1 X}}. \end{equation}\]

Si l’estimation de \(\beta_1\) est positive et significative, cela signifie que plus le revenu est élevé, plus la probabilité de posséder une assurance santé est grande.

Conclusion

      Le modèle logistique est un outil puissant pour la modélisation des variables binaires et la classification. Il permet d’assigner des probabilités à des événements et d’interpréter les relations entre variables explicatives et réponse. Son estimation repose sur le maximum de vraisemblance, et son interprétation nécessite souvent le calcul des effets marginaux pour comprendre directement l’impact des variables explicatives sur la probabilité d’occurrence de l’événement étudié.

Place à la pratique avec des données sur le diabète

Importation des bibliothèques necessaires

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import display
import numpy as np

Chargement des données et verification suscinte de leur qualité

      Avant de commencer quoi que ce soit, il est nécessaire de préciser que les données proviennent de la plateforme kaggle (!cliquez ici pour y acceder).

df = pd.read_csv('diabetes-dataset.csv')
print('\nAffichage des données\n')

Affichage des données
display(df.head(5))
   Pregnancies  Glucose  BloodPressure  ...  DiabetesPedigreeFunction  Age  Outcome
0            6      148             72  ...                     0.627   50        1
1            1       85             66  ...                     0.351   31        0
2            8      183             64  ...                     0.672   32        1
3            1       89             66  ...                     0.167   21        0
4            0      137             40  ...                     2.288   33        1

[5 rows x 9 columns]
print('\nInformations sur les données\n')

Informations sur les données
display(df.info)
<bound method DataFrame.info of      Pregnancies  Glucose  ...  Age  Outcome
0              6      148  ...   50        1
1              1       85  ...   31        0
2              8      183  ...   32        1
3              1       89  ...   21        0
4              0      137  ...   33        1
..           ...      ...  ...  ...      ...
763           10      101  ...   63        0
764            2      122  ...   27        0
765            5      121  ...   30        0
766            1      126  ...   47        1
767            1       93  ...   23        0

[768 rows x 9 columns]>
print('\nResumé statistique des données\n')

Resumé statistique des données
display(df.describe)
<bound method NDFrame.describe of      Pregnancies  Glucose  ...  Age  Outcome
0              6      148  ...   50        1
1              1       85  ...   31        0
2              8      183  ...   32        1
3              1       89  ...   21        0
4              0      137  ...   33        1
..           ...      ...  ...  ...      ...
763           10      101  ...   63        0
764            2      122  ...   27        0
765            5      121  ...   30        0
766            1      126  ...   47        1
767            1       93  ...   23        0

[768 rows x 9 columns]>

Chargement des données et verification suscinte de leur qualité

Affichage des informations sur les données

df = pd.read_csv('diabetes-dataset.csv')
print('\nAffichage des données\n')

Affichage des données
display(df.head(5))
   Pregnancies  Glucose  BloodPressure  ...  DiabetesPedigreeFunction  Age  Outcome
0            6      148             72  ...                     0.627   50        1
1            1       85             66  ...                     0.351   31        0
2            8      183             64  ...                     0.672   32        1
3            1       89             66  ...                     0.167   21        0
4            0      137             40  ...                     2.288   33        1

[5 rows x 9 columns]
print('\nInformations sur les données\n')

Informations sur les données
display(df.info)
<bound method DataFrame.info of      Pregnancies  Glucose  ...  Age  Outcome
0              6      148  ...   50        1
1              1       85  ...   31        0
2              8      183  ...   32        1
3              1       89  ...   21        0
4              0      137  ...   33        1
..           ...      ...  ...  ...      ...
763           10      101  ...   63        0
764            2      122  ...   27        0
765            5      121  ...   30        0
766            1      126  ...   47        1
767            1       93  ...   23        0

[768 rows x 9 columns]>
print('\nResumé statistique des données\n')

Resumé statistique des données
display(df.describe)
<bound method NDFrame.describe of      Pregnancies  Glucose  ...  Age  Outcome
0              6      148  ...   50        1
1              1       85  ...   31        0
2              8      183  ...   32        1
3              1       89  ...   21        0
4              0      137  ...   33        1
..           ...      ...  ...  ...      ...
763           10      101  ...   63        0
764            2      122  ...   27        0
765            5      121  ...   30        0
766            1      126  ...   47        1
767            1       93  ...   23        0

[768 rows x 9 columns]>

Vérification des valeurs manquantes

df.columns.isna().sum()
0

      Il y’ a aucune valeur manquante car les données ont bien été nettoyées avant d’être mise à disposition sur kaggle.

Affichage des statistiques des variables

      Etant données que les informations sur les variables sont en ce moment ou j’écris indisponibles sur kaggle.

print('Affichage des valeurs uniques des variables\n')
Affichage des valeurs uniques des variables
for variable in df.columns:
    if variable != "DiabetesPedigreeFunction": # je saute car ça fait beaucoup long à l'affichage
      print(f'\n {variable}\n')
      print(df[variable].unique())

 Pregnancies

[ 6  1  8  0  5  3 10  2  4  7  9 11 13 15 17 12 14]

 Glucose

[148  85 183  89 137 116  78 115 197 125 110 168 139 189 166 100 118 107
 103 126  99 196 119 143 147  97 145 117 109 158  88  92 122 138 102  90
 111 180 133 106 171 159 146  71 105 101 176 150  73 187  84  44 141 114
  95 129  79   0  62 131 112 113  74  83 136  80 123  81 134 142 144  93
 163 151  96 155  76 160 124 162 132 120 173 170 128 108 154  57 156 153
 188 152 104  87  75 179 130 194 181 135 184 140 177 164  91 165  86 193
 191 161 167  77 182 157 178  61  98 127  82  72 172  94 175 195  68 186
 198 121  67 174 199  56 169 149  65 190]

 BloodPressure

[ 72  66  64  40  74  50   0  70  96  92  80  60  84  30  88  90  94  76
  82  75  58  78  68 110  56  62  85  86  48  44  65 108  55 122  54  52
  98 104  95  46 102 100  61  24  38 106 114]

 SkinThickness

[35 29  0 23 32 45 19 47 38 30 41 33 26 15 36 11 31 37 42 25 18 24 39 27
 21 34 10 60 13 20 22 28 54 40 51 56 14 17 50 44 12 46 16  7 52 43 48  8
 49 63 99]

 Insulin

[  0  94 168  88 543 846 175 230  83  96 235 146 115 140 110 245  54 192
 207  70 240  82  36  23 300 342 304 142 128  38 100  90 270  71 125 176
  48  64 228  76 220  40 152  18 135 495  37  51  99 145 225  49  50  92
 325  63 284 119 204 155 485  53 114 105 285 156  78 130  55  58 160 210
 318  44 190 280  87 271 129 120 478  56  32 744 370  45 194 680 402 258
 375 150  67  57 116 278 122 545  75  74 182 360 215 184  42 132 148 180
 205  85 231  29  68  52 255 171  73 108  43 167 249 293  66 465  89 158
  84  72  59  81 196 415 275 165 579 310  61 474 170 277  60  14  95 237
 191 328 250 480 265 193  79  86 326 188 106  65 166 274  77 126 330 600
 185  25  41 272 321 144  15 183  91  46 440 159 540 200 335 387  22 291
 392 178 127 510  16 112]

 BMI

[33.6 26.6 23.3 28.1 43.1 25.6 31.  35.3 30.5  0.  37.6 38.  27.1 30.1
 25.8 30.  45.8 29.6 43.3 34.6 39.3 35.4 39.8 29.  36.6 31.1 39.4 23.2
 22.2 34.1 36.  31.6 24.8 19.9 27.6 24.  33.2 32.9 38.2 37.1 34.  40.2
 22.7 45.4 27.4 42.  29.7 28.  39.1 19.4 24.2 24.4 33.7 34.7 23.  37.7
 46.8 40.5 41.5 25.  25.4 32.8 32.5 42.7 19.6 28.9 28.6 43.4 35.1 32.
 24.7 32.6 43.2 22.4 29.3 24.6 48.8 32.4 38.5 26.5 19.1 46.7 23.8 33.9
 20.4 28.7 49.7 39.  26.1 22.5 39.6 29.5 34.3 37.4 33.3 31.2 28.2 53.2
 34.2 26.8 55.  42.9 34.5 27.9 38.3 21.1 33.8 30.8 36.9 39.5 27.3 21.9
 40.6 47.9 50.  25.2 40.9 37.2 44.2 29.9 31.9 28.4 43.5 32.7 67.1 45.
 34.9 27.7 35.9 22.6 33.1 30.4 52.3 24.3 22.9 34.8 30.9 40.1 23.9 37.5
 35.5 42.8 42.6 41.8 35.8 37.8 28.8 23.6 35.7 36.7 45.2 44.  46.2 35.
 43.6 44.1 18.4 29.2 25.9 32.1 36.3 40.  25.1 27.5 45.6 27.8 24.9 25.3
 37.9 27.  26.  38.7 20.8 36.1 30.7 32.3 52.9 21.  39.7 25.5 26.2 19.3
 38.1 23.5 45.5 23.1 39.9 36.8 21.8 41.  42.2 34.4 27.2 36.5 29.8 39.2
 38.4 36.2 48.3 20.  22.3 45.7 23.7 22.1 42.1 42.4 18.2 26.4 45.3 37.
 24.5 32.2 59.4 21.2 26.7 30.2 46.1 41.3 38.8 35.2 42.3 40.7 46.5 33.5
 37.3 30.3 26.3 21.7 36.4 28.5 26.9 38.6 31.3 19.5 20.1 40.8 23.4 28.3
 38.9 57.3 35.6 49.6 44.6 24.1 44.5 41.2 49.3 46.3]

 Age

[50 31 32 21 33 30 26 29 53 54 34 57 59 51 27 41 43 22 38 60 28 45 35 46
 56 37 48 40 25 24 58 42 44 39 36 23 61 69 62 55 65 47 52 66 49 63 67 72
 81 64 70 68]

 Outcome

[1 0]

Au vu de ces valeurs, on peut dire que (vu qu’il n’y a aucune description des disponible sur kaggle):

  • pregnancies represente le nombre de grossesses contractées;

  • glucose represente la quantité de glucose dans le sang;

  • BloodPressure represente la pression sanguine;

  • SkinThickness represente l’épaisseur du pli cutané tricipital;

  • BMI correspond à l’Indice de Masse Corporelle (IMC)

  • Age de la patiente

  • Insulin représente la concentration sérique d’insuline mesurée (généralement en micro-unités par millilitre (μU/ml))

  • DiabetesPedigreeFunction représente une mesure de la prédisposition génétique au diabète

  • Outcome represente l’état de la patiente (atteinte ou non du diabète)

Analyse exploratoire des données

      Cette analyse est effectuée dans l’optique de mieux comprendre les données afin de pouvoir bien spécifier le modèle logistique.

Analyse descriptives rapides (Voir la distribution des données)

# Création de la figure avec une grille 3 lignes x 2 colonnes
fig, axes = plt.subplots(3, 2, figsize=(12, 12))

# Premier sous-graphe : Distribution du nombre de grossesses
sns.histplot(data=df['Pregnancies'], ax=axes[0, 0])
axes[0, 0].set_title("Distribution du nombre de grossesses")

# Deuxième sous-graphe : Distribution du niveau de glucose
sns.histplot(data=df['Glucose'], ax=axes[0, 1])
axes[0, 1].set_title("Distribution du niveau de glucose")

# Troisième sous-graphe : Distribution de la pression sanguine
sns.histplot(data=df['BloodPressure'], ax=axes[1, 0])
axes[1, 0].set_title("Distribution de la pression sanguine")

# Quatrième sous-graphe : Distribution de l'épaisseur du pli cutané (SkinThickness)
sns.histplot(data=df['SkinThickness'], ax=axes[1, 1])
axes[1, 1].set_title("Distribution de l'épaisseur du pli cutané")

# Cinquième sous-graphe : Distribution de l'insuline
sns.histplot(data=df['Insulin'], ax=axes[2, 0])
axes[2, 0].set_title("Distribution de l'insuline")

# Sixième sous-graphe : Distribution de l'IMC (BMI)
sns.histplot(data=df['BMI'], ax=axes[2, 1])
axes[2, 1].set_title("Distribution de l'IMC")

# Ajustement automatique des espaces pour
# éviter le chevauchement des titres et labels
plt.tight_layout()

# Affichage de la figure
plt.show()

Verification de la colinéarité

      En effet avant de spécifier un modèle, il faut s’assurer qu’il n’y a pas multicolinéarité. C’est-à-dire verifier que les variables ne sont pas corrélées entre elles ce qui permettra d’éviter de fausses estimations.

# Sélectionner que les variables numériques des données
df_variables_numeriques = df.select_dtypes(include=[np.number])

plt.figure(figsize=(10, 8))
sns.heatmap(df_variables_numeriques.corr(), annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Heatmap de correlation des variables numériques du jeu de données')
plt.tight_layout()
plt.show()

      Ce corrélollogramme montre que les variables ne sont pas linéairement corrélées entre elle. Donc on peut ajuster le modèle de regression logistique.

Spécification et évalution du modèle logistique

      A ce niveau, j’ai partitionné les données en ammont dans le but de faire du machine learning (ajustement, prediction et validation du modèle) plus tard (dans la section suivante). Nous avons les données d’entrainement qui constituent 80% des données et des données de test qui en constituent 20. Ici j’ajuste juste un modèle de regression logistique aux données que j’essaie d’interpreter.

# Les bibliothèques de machine learning
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc
from sklearn.inspection import permutation_importance
# Separation des variables explicatives and de la variable dépendante

# X : matrice des variables explicatives
X = df.drop('Outcome', axis=1)

# y : variable dépendante
y = df['Outcome']

# partition des données en données de tests et d'entrainement
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
import statsmodels.api as sm

# Ajout d'une colonne de 1 pour l'intercept (obligatoire dans statsmodels)
X_train_const = sm.add_constant(X_train)

# Création du modèle logistique
model = sm.Logit(y_train, X_train_const)

# Ajustement du modèle
result = model.fit()
Optimization terminated successfully.
         Current function value: 0.467835
         Iterations 6
# Affichage du résumé avec les p-values
display(result.summary())
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                Outcome   No. Observations:                  614
Model:                          Logit   Df Residuals:                      605
Method:                           MLE   Df Model:                            8
Date:                Thu, 03 Jul 2025   Pseudo R-squ.:                  0.2752
Time:                        04:07:07   Log-Likelihood:                -287.25
converged:                       True   LL-Null:                       -396.34
Covariance Type:            nonrobust   LLR p-value:                 9.311e-43
============================================================================================
                               coef    std err          z      P>|z|      [0.025      0.975]
--------------------------------------------------------------------------------------------
const                       -9.0359      0.837    -10.802      0.000     -10.675      -7.396
Pregnancies                  0.0645      0.036      1.791      0.073      -0.006       0.135
Glucose                      0.0341      0.004      8.055      0.000       0.026       0.042
BloodPressure               -0.0139      0.006     -2.260      0.024      -0.026      -0.002
SkinThickness                0.0031      0.008      0.397      0.691      -0.012       0.019
Insulin                     -0.0018      0.001     -1.782      0.075      -0.004       0.000
BMI                          0.1026      0.017      5.948      0.000       0.069       0.136
DiabetesPedigreeFunction     0.6945      0.330      2.107      0.035       0.049       1.341
Age                          0.0371      0.011      3.400      0.001       0.016       0.058
============================================================================================

Qualité d’Ajustement

  • Log-Likelihood : -287.25. Un log-vraisemblance plus élevé (moins négatif) indique un meilleur ajustement.

  • Pseudo R-squared : 0.2752. Cela signifie que le modèle explique environ 27.52% de la variabilité dans les données, ce qui indique un ajustement modéré. Dans les modèles linéaires généralisés, il est fréquent d’avoir des pseudo-R2 un peu faible.

  • LLR p-value : 9.311e-43, très faible, indiquant que le modèle est significatif globalement.

Adéquation du Modèle

  • Convergence : Le modèle a convergé en 6 itérations, suggérant un bon comportement de l’algorithme d’optimisation.

  • Df Model : 8, indiquant 8 variables explicatives.

Interprétation des Coefficients

La probabilité \(p\) que \(y = 1\) (c’est-à-dire que la patiente ait le diabète) est donnée par la fonction sigmoïde :

\(p = \frac{1}{1 + \exp(-\beta)}\)

où : - \(\beta\) est le coefficient du modèle de régression logistique.

  • \(\exp(-\beta)\) représente l’exponentielle de \(-\beta\).

Ainsi, cette fonction transforme la valeur linéaire ( ) en une probabilité entre 0 et 1.

  • Intercept (-9.0359) : Lorsque toutes les variables sont à 0, la probabilité prédite que y=1 est proche de 0.

  • Glucose (0.0341, p<0.001) : Une augmentation de 1 unité de glucose augmente significativement les odds de l’issue y=1.

  • BMI (0.1026, p<0.001) : Indique une relation positive forte entre l’IMC et l’issue.

  • BloodPressure (-0.0139, p=0.024) : Relation négative significative, mais l’effet est faible.

  • DiabetesPedigreeFunction (0.6945, p=0.035) : Un antécédent familial a un impact positif significatif.

  • Age (0.0371, p=0.001) : L’âge est un facteur significatif.

  • SkinThickness et Insulin : Effet non significatif (au seuil de risque \(\alpha\) = 0,05).

Conclusion

Le modèle a une bonne capacité prédictive mais n’explique pas toute la variabilité. Certaines variables sont significatives (Glucose, BMI, Age), alors que d’autres, comme l’Insuline, ne le sont pas.

Machine learning

Ajustement du modèle aux données d’apprentissage

# Initialisation et entrainnement du classificateur (Regression Logistique)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
LogisticRegression(max_iter=1000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
# faire les prediction sur les données de test
y_pred = model.predict(X_test)

# calcul du score de l'exactitude
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy Score: {accuracy:.4f}')
Accuracy Score: 0.7468

      L’accuracy score de 0.7468 signifie que le modèle a correctement classé 74.68% des échantillons dans le jeu de test. Cette métrique donne une indication de la proportion des prédictions correctes par rapport au nombre total d’observations. Plus l’accuracy est proche de 1 (ou 100%), plus le modèle est performant.

Evaluation du modèle

Matrice de confusion

cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6,4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Matrice de confusion')
plt.xlabel('Données prédites')
plt.ylabel('Données observées')
plt.tight_layout()
plt.show()

\[ \textbf{Vrais Positifs (VP)} = 37 \quad \text{(Modèle prédit que la patiente a le diabète et c'est correct)} \] \[ \textbf{Faux Positifs (FP)} = 21 \quad \text{(Modèle prédit que la patiente a le diabète, mais c'est incorrect)} \]

\[ \textbf{Faux Négatifs (FN)} = 18 \quad \text{(Modèle prédit que la patiente n'a pas le diabète, mais c'est incorrect)} \]

\[ \textbf{Vrais Négatifs (VN)} = 78 \quad \text{(Modèle prédit que la patiente n'a pas le diabète et c'est correct)} \]

Métriques de performance

\[ \text{Précision} = \frac{\text{VP}}{\text{VP} + \text{FP}} = \frac{37}{37 + 21} = \frac{37}{58} \approx 0.6379 \]

\[ \textbf{Rappel} (Recall) : \text{Rappel} = \frac{\text{VP}}{\text{VP} + \text{FN}} = \frac{37}{37 + 18} = \frac{37}{55} \approx 0.6727 \]

\[ \textbf{Score F1} (F1-Score) : \text{F1-Score} = 2 \times \frac{\text{Précision} \times \text{Rappel}}{\text{Précision} + \text{Rappel}} = 2 \times \frac{0.6379 \times 0.6727}{0.6379 + 0.6727} \approx 0.6548 \]

\[ \textbf{Exactitude} (Accuracy) : \text{Exactitude} = \frac{\text{VP} + \text{VN}}{\text{Total}} = \frac{37 + 78}{37 + 78 + 21 + 18} = \frac{115}{154} \approx 0.7468 \]

Courbe de ROC

y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

plt.figure(figsize=(6,4))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'Courbe ROC (Aire = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('Taux de Faux Positifs')
plt.ylabel('Taux de Vrais Positifs')
plt.title('Caractéristique de Performance du Modèle (Courbe ROC)')
plt.legend(loc='lower right')
plt.show()

      La courbe ROC (Receiver Operating Characteristic) est un graphique qui permet d’évaluer la performance d’un modèle de classification binaire. Elle trace la relation entre :

  • Le Taux de Vrais Positifs (TPR, True Positive Rate) : La proportion des vrais positifs parmi les cas positifs réels.

  • Le Taux de Faux Positifs (FPR, False Positive Rate) : La proportion des faux positifs parmi les cas négatifs réels.

      La courbe ROC montre comment le modèle se comporte pour différents seuils de décision. Un modèle parfait aura une courbe qui monte rapidement vers le coin supérieur gauche (haute TPR et faible FPR), tandis qu’un modèle aléatoire suivra la diagonale du graphique (FPR = TPR).

      L’Aire Sous la Courbe (AUC) mesure la qualité globale du modèle. Une AUC proche de 1 indique un excellent modèle, tandis qu’une AUC proche de 0.5 indique un modèle équivalent à un choix aléatoire.

Dans notre cas AUC vaut 0,81 donc notre modèle tient la route.

Verifions qu’on a les même coefficients que ceux de l’ajustement à la section précédente

model.intercept_
array([-9.00707993])
# affichage des coefficients estimés du modèle
model.coef_
array([[ 0.06436473,  0.03410147, -0.01387533,  0.00326297, -0.00180169,
         0.10262329,  0.62588811,  0.03708342]])

Et oui on a les mêmes coefficients.

Si vous avez des questions, vous pouvez me contacter !!!

Retour à la page d’accueuil