TP2 – Apprentissage Supervisé (Heart
Disease Dataset)
🎯 Objectifs pédagogiques
• Comprendre la formalisation d’un problème supervisé
• Implémenter un modèle simple de classification (régression logistique)
• Calculer le risque empirique et manipuler différentes fonctions de coût
• Visualiser les effets de la complexité du modèle sur la généralisation
• Illustrer le compromis biais/variance à travers des exemples concrets
📁 Dataset utilisé
Vous utiliserez le fichier [Link], contenant des données médicales de patients :
- Exemples de variables : âge, cholestérol, tension, fréquence cardiaque, etc.
- Objectif : prédire la présence d’une maladie cardiaque (1 = oui, 0 = non).
Ce dataset est adapté à une tâche de classification binaire supervisée.
🔧 Partie 1 – Chargement et préparation des données
• • Charger les données dans un DataFrame avec pandas.
👉 Indication : Utilisez pd.read_csv() pour charger les données.
Affichez les premières lignes avec .head().
• • Vérifier les valeurs manquantes et les gérer.
👉 Indication : Utilisez .isnull().sum() et remplacez ou supprimez si
nécessaire.
• • Isoler la variable cible `target` et les variables explicatives.
👉 Indication : `X = [Link]('target', axis=1)` et `y = df['target']`.
🧠 Partie 2 – Formalisation du problème
• • Identifier les entrées X et la sortie y.
• • Quel est le type du problème ?
• • Exprimer l’objectif du modèle comme une fonction f : X → Y.
⚙️ Partie 3 – Modèle et entraînement
• • Séparer les données en jeu d’entraînement et de test.
👉 Indication : Utilisez train_test_split() avec test_size=0.2.
• • Entraîner un modèle de régression logistique.
👉 Indication : Utilisez :
model = LogisticRegression(max_iter=1000)
[Link](X_train, y_train)
• • Prédire les classes sur le jeu de test.
👉 Indication : Utilisez y_pred =[Link]( X_test).
📉 Partie 4 – Risque empirique et fonctions de coût
• • Calculer l’erreur d’entraînement (risque empirique).
👉 Indication : Utilisez
empirical_risk_train = zero_one_loss(y_train, y_train_pred)
• • Calculer l’erreur sur le test.
👉 Indication : Même fonction, mais avec y_test et y_pred .
• • Calculer la log-loss (entropie croisée).
👉 Indication : Utilisez :
probas = model.predict_proba(X_test)
logloss = log_loss(y_test, probas)
• • Calculer l’erreur quadratique moyenne (MSE).
👉 Indication : Utilisez mse = mean_squared_error(y_test, y_pred).
📊 Partie 5 – Visualisation : sur-apprentissage
• • Créer un modèle simple avec une seule variable (ex : age).
👉 Indication : Entraînez la régression logistique sur une seule
colonne.
X_train_age = X_train[['age']]
X_test_age = X_test[['age']]
• • Créer un modèle plus complexe avec un polynôme de degré élevé.
👉 Indication : Utilisez PolynomialFeatures() de
[Link].
• • Comparer les erreurs d’apprentissage et de test pour les degrés de 1 à 9.
👉 Indication : Faites une boucle for sur les degrés et tracez les
erreurs avec matplotlib.
train_errors = []
test_errors = []
for degree in range(1, 10):
# 1. Créer un pipeline : transforme les données + applique un modèle
model = make_pipeline(
PolynomialFeatures(degree=degree),
LogisticRegression(max_iter=1000)
)
# 2. Entraînement sur X_train_age
[Link](X_train_age, y_train)
# 3. Prédictions
y_train_pred = [Link](X_train_age)
y_test_pred = [Link](X_test_age)
# 4. Calcul des erreurs 0/1
train_error = zero_one_loss(y_train, y_train_pred)
test_error = zero_one_loss(y_test, y_test_pred)
train_errors.append(train_error)
test_errors.append(test_error)
• • Tracer les courbes d’erreurs train/test en fonction du degré.
👉 Indication : Utilisez [Link]() pour tracer les deux courbes.
import [Link] as plt
[Link](range(1, 10), train_errors, label="Erreur train")
[Link](range(1, 10), test_errors, label="Erreur test")
[Link]("Degré du polynôme")
[Link]("Erreur 0/1")
[Link]()
[Link]("Biais/Variance – Régression logistique sur 'age'")
[Link](True)
[Link]()
📈 Partie 6 – Visualisation des fonctions de coût (bonus)
• • Tracer la log loss et la hinge loss.
👉 Indication : Créez une fonction x → L(y · f(x)) et affichez les
courbes sur [-3, 3].
import numpy as np
x = [Link](-3, 3, 100)
log_loss_curve = [Link](1 + [Link](-x))
hinge_loss_curve = [Link](0, 1 - x)
[Link](x, log_loss_curve, label="Log Loss")
[Link](x, hinge_loss_curve, label="Hinge Loss")
[Link]("Comparaison des fonctions de coût")
[Link]("y · f(x)")
[Link]()
[Link](True)
[Link]()
• • Comparer visuellement les punitions infligées aux erreurs.
👉 Indication : Observez comment chaque fonction traite les
mauvaises prédictions.
🧠 Partie 7 – Frontière de décision (bonus)
• • Générer des données synthétiques 2D (make_classification).
👉 Indication : Spécifiez n_features=2 et n_informative=2.
from [Link] import make_classification
X2D, y2D = make_classification(n_samples=500, n_features=2, n_informative=2,
n_redundant=0, random_state=42)
• • Entraîner un modèle de régression logistique.
👉 Indication : Même procédure que précédemment.
clf = LogisticRegression()
[Link](X2D, y2D)
• • Tracer la frontière de décision.
👉 Indication : Utilisez [Link]() et contourf() pour visualiser
le résultat.
xx, yy = [Link]([Link](X2D[:, 0].min(), X2D[:, 0].max(), 100),
[Link](X2D[:, 1].min(), X2D[:, 1].max(), 100))
Z = [Link](np.c_[[Link](), [Link]()])
Z = [Link]([Link])
[Link](xx, yy, Z, alpha=0.3)
[Link](X2D[:, 0], X2D[:, 1], c=y2D, edgecolors='k')
[Link]("Frontière de décision - Régression Logistique")
[Link]()
🧠 Partie 8 – Analyse réflexive
• • Identifier un cas de sous-apprentissage.
👉 Indication : Faible performance sur train ET test.
• • Identifier un cas de sur-apprentissage.
👉 Indication : Très bon sur train, mauvais sur test.
• • Quel modèle offre un bon compromis biais/variance ?
👉 Indication : Celui dont les erreurs train/test sont proches et
raisonnablement basses.
• • Pourquoi ne faut-il pas se contenter du risque empirique ?
👉 Indication : Car il ne reflète pas la capacité à généraliser sur de
nouvelles données.
📎 À remettre
• Un notebook `.ipynb` avec tout le code exécuté
• Les visualisations demandées
• Vos réponses aux questions réflexives