📌 Leçon - 13

Maîtrisez l'Overfitting, l'Underfitting et la Validation Croisée

Techniques avancées pour évaluer et optimiser vos modèles de Machine Learning

Overfitting vs Underfitting
Le compromis fondamental entre biais et variance (Source: Medium)

🎯 Concepts Clés à Maîtriser

Biais (Bias)

Erreur due aux hypothèses simplificatrices du modèle

Variance

Sensibilité du modèle aux fluctuations de l'échantillon d'entraînement

Compromis Biais-Variance

Équilibre entre sous-adaptation et sur-adaptation

Validation Croisée

Technique robuste d'évaluation des performances

1

Overfitting (Sur-adaptation)

Définition : Phénomène où un modèle apprend trop bien les données d'entraînement (y compris le bruit et les détails non pertinents), ce qui dégrade sa performance sur de nouvelles données.

Haute Variance Faible Biais
Exemple d'overfitting
Un modèle overfit suit parfaitement les données d'entraînement mais généralise mal (Source: Medium)

💡 Exemple Concret : Reconnaissance d'images

Un modèle de classification d'images qui :

  • Atteint 99% de précision sur l'ensemble d'entraînement
  • N'obtient que 65% sur l'ensemble de test
  • A appris des artefacts spécifiques aux images d'entraînement (comme un filigrane présent seulement sur certaines images)

🔍 Signes d'Overfitting

  • Performance d'entraînement très supérieure à la performance de test
  • Modèle trop complexe (beaucoup de paramètres par rapport aux données)
  • Courbes d'apprentissage qui divergent (entraînement continue à s'améliorer tandis que test stagne ou se dégrade)
Causes Principales
  • Modèle trop complexe
  • Données d'entraînement insuffisantes
  • Entraînement trop long (pour les modèles itératifs)
  • Features non pertinentes ou redondantes
Solutions
  • Régularisation (L1/L2)
  • Early stopping
  • Augmentation des données
  • Simplification du modèle
  • Dropout (pour les réseaux de neurones)

🧪 Détection d'Overfitting en Pratique

# Python code to detect overfitting from sklearn.metrics import accuracy_score train_acc = accuracy_score(y_train, model.predict(X_train)) test_acc = accuracy_score(y_test, model.predict(X_test)) print(f"Training Accuracy: {train_acc:.2f}") print(f"Test Accuracy: {test_acc:.2f}") if train_acc - test_acc > 0.15: # Threshold to be adjusted print("Warning: Potential overfitting detected!")

Règle empirique : Un écart de plus de 10-15% entre entraînement et test peut indiquer un overfitting.

2

Underfitting (Sous-adaptation)

Définition : Phénomène où un modèle est trop simple pour capturer les motifs sous-jacents dans les données, résultant en de mauvaises performances à la fois sur les données d'entraînement et de test.

Faible Variance Haut Biais
Exemple d'underfitting
Un modèle underfit est trop simple pour les données (Source: Medium)

💡 Exemple Concret : Prédiction de prix

Un modèle linéaire pour prédire des prix immobiliers qui :

  • N'atteint que 60% de précision sur l'entraînement
  • Performance similaire sur le test
  • Ne capture pas les relations non-linéaires évidentes (comme l'effet de la superficie qui n'est pas purement linéaire)

🔍 Signes d'Underfitting

  • Performances médiocres à la fois sur entraînement et test
  • Modèle trop simple (peu de paramètres)
  • Résidus élevés et motifs non capturés dans les prédictions
  • Courbes d'apprentissage plates (peu d'amélioration avec plus d'entraînement)
Causes Principales
  • Modèle trop simple
  • Features insuffisantes ou non informatives
  • Trop de régularisation
  • Entraînement insuffisant (pour les modèles itératifs)
Solutions
  • Augmenter la complexité du modèle
  • Feature engineering plus poussé
  • Réduire la régularisation
  • Augmenter la durée d'entraînement
  • Utiliser des modèles plus puissants

📉 Courbes d'Apprentissage Typiques

Underfitting

Underfitting
Haute erreur sur entraînement et test

Good fit

Bon équilibre
Erreur similaire et faible sur les deux ensembles

Overfitting

Overfitting
Faible erreur d'entraînement mais haute erreur de test

3

Compromis Biais-Variance

Définition : Relation fondamentale en machine learning qui décrit le compromis entre la capacité d'un modèle à s'adapter aux données d'entraînement (faible biais) et sa capacité à généraliser à des données non vues (faible variance).

Théorie Fondamental
Compromis biais-variance
Le compromis optimal se trouve au point d'équilibre (Source: Medium)
Erreur totale = Biais² + Variance + Erreur irréductible

Cette décomposition mathématique montre que pour minimiser l'erreur totale, nous devons trouver le bon équilibre entre biais et variance.

📊 Impact de la Complexité du Modèle

Complexité Biais Variance Résultat
Faible Haut Faible Underfitting
Modérée Moyen Moyen Bon équilibre
Élevée Faible Haut Overfitting

⚖️ Stratégies pour Trouver l'Équilibre

Pour réduire le biais
  • Augmenter la complexité du modèle
  • Ajouter des features pertinentes
  • Réduire la régularisation
Pour réduire la variance
  • Réduire la complexité du modèle
  • Augmenter les données d'entraînement
  • Ajouter de la régularisation
  • Utiliser le bagging
4

Validation Croisée

Définition : Technique robuste d'évaluation des modèles qui consiste à diviser plusieurs fois le jeu de données en ensembles d'entraînement et de validation pour obtenir une estimation plus fiable des performances.

Évaluation Robuste
Validation croisée k-fold
Processus de validation croisée k-fold (Source: Medium)

🧩 Types de Validation Croisée

k-Fold

Division en k sous-ensembles égaux, chaque sous-ensemble sert une fois de validation

Avantage : Toutes les données sont utilisées pour l'entraînement et la validation

Stratifiée

Préserve la distribution des classes dans chaque fold

Utile pour : Données déséquilibrées

Leave-One-Out (LOO)

k = n (chaque observation est un fold)

Avantage : Maximise l'utilisation des données

Inconvénient : Coûteux pour grands datasets

🐍 Implémentation avec scikit-learn

from sklearn.model_selection import cross_val_score, KFold from sklearn.ensemble import RandomForestClassifier # Création du modèle model = RandomForestClassifier(n_estimators=100) # Validation croisée 5-fold kfold = KFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(model, X, y, cv=kfold, scoring='accuracy') print(f"Scores de validation croisée: {scores}") print(f"Moyenne: {scores.mean():.2f} (±{scores.std():.2f})")
Avantages
  • Meilleure utilisation des données limitées
  • Estimation plus robuste des performances
  • Détection plus fiable de l'overfitting
  • Permet de comparer différents modèles objectivement
Limitations
  • Coût computationnel plus élevé
  • Pas toujours nécessaire pour les très grands datasets
  • Plus complexe à mettre en œuvre que simple split train/test

📝 Bonnes Pratiques

  1. Choix de k : 5 ou 10 folds sont généralement un bon compromis
  2. Mélange des données : Toujours shuffle les données avant de créer les folds
  3. Stratification : Utiliser la version stratifiée pour les problèmes de classification avec déséquilibre
  4. Répétabilité : Fixer un random_state pour des résultats reproductibles
  5. Métriques : Choisir des métriques adaptées au problème (accuracy, F1, ROC-AUC, etc.)

🔧 Cas Pratique : Optimisation d'un Modèle

1. Diagnostic Initial

Évaluer les performances via validation croisée et analyser les courbes d'apprentissage pour identifier overfitting/underfitting

2. Stratégie d'Amélioration

Choisir des techniques adaptées au problème identifié (régularisation, augmentation de complexité, etc.)

3. Validation

Vérifier l'impact des changements via une nouvelle validation croisée

📈 Workflow Complet en Python

from sklearn.model_selection import learning_curve, validation_curve import matplotlib.pyplot as plt import numpy as np # 1. Courbes d'apprentissage train_sizes, train_scores, test_scores = learning_curve( estimator=model, X=X_train, y=y_train, train_sizes=np.linspace(0.1, 1.0, 10), cv=5, scoring='accuracy' ) plt.figure() plt.plot(train_sizes, np.mean(train_scores, axis=1), label='Training score') plt.plot(train_sizes, np.mean(test_scores, axis=1), label='Cross-validation score') plt.title('Courbes d\'apprentissage') plt.xlabel('Taille de l\'ensemble d\'entraînement') plt.ylabel('Score') plt.legend() # 2. Optimisation des hyperparamètres (ex: régularisation) param_range = np.logspace(-3, 3, 7) train_scores, test_scores = validation_curve( estimator=model, X=X_train, y=y_train, param_name='alpha', param_range=param_range, cv=5, scoring='accuracy' ) plt.figure() plt.semilogx(param_range, np.mean(train_scores, axis=1), label='Training score') plt.semilogx(param_range, np.mean(test_scores, axis=1), label='Cross-validation score') plt.title('Courbe de validation') plt.xlabel('Paramètre de régularisation') plt.ylabel('Score') plt.legend()

🧠 Quiz Final : Testez Votre Compréhension

1. Votre modèle a 98% d'accuracy sur l'entraînement mais seulement 65% sur le test. Quel est le problème ?

2. Quelle technique n'aide PAS à réduire l'overfitting ?

📝 Voir les réponses

Réponse 1 : Overfitting (grand écart entre performance entraînement et test)

Réponse 2 : "Ajouter des paramètres" (cela augmenterait l'overfitting)

🎯 Conclusion & Bonnes Pratiques

1. Diagnostiquez d'abord

Utilisez les courbes d'apprentissage et la validation croisée pour identifier overfitting/underfitting avant d'intervenir

2. Choisissez la bonne stratégie

Overfitting → Simplifiez le modèle ou régularisez
Underfitting → Augmentez la complexité ou feature engineering

3. Validez systématiquement

Toujours évaluer les changements via validation croisée pour des résultats robustes

📋 Checklist d'Optimisation

  • ☑️ Analyser les courbes d'apprentissage
  • ☑️ Implémenter la validation croisée (k=5 ou 10)
  • ☑️ Pour overfitting: régularisation, dropout, early stopping
  • ☑️ Pour underfitting: features additionnelles, modèle plus complexe
  • ☑️ Toujours garder un jeu de test final pour évaluation finale
  • ☑️ Documenter toutes les expérimentations et résultats

📚 Ressources Complémentaires

Livres

  • "Elements of Statistical Learning" - Hastie, Tibshirani, Friedman
  • "Machine Learning Yearning" - Andrew Ng

Articles

  • "Understanding the Bias-Variance Tradeoff" - Scott Fortmann-Roe
  • Scikit-learn documentation on model evaluation

Outils

  • Scikit-learn learning_curve et validation_curve
  • TensorBoard pour visualisation des modèles DL

Commentaires