la division d’un dataset
Généralisation, surapprentissage (overfitting)
et sous-apprentissage (underfitting)
K. Nassiri
la division d’un dataset
1. Un algorithme d’apprentissage automatique reçoit un ensemble d’exemples (données
d’entraînement).
2. À partir de ces exemples, il construit un modèle — autrement dit un programme — qui
capture des régularités dans les données.
3. Ce modèle doit ensuite être capable de faire des prédictions ou prendre des décisions sur
de nouvelles observations (données de test) qu’il n’a jamais vues : on parle de
généralisation.
la division d’un dataset
Exemples concrets
Classification d’images : entraînement sur images étiquetées (chats/chiens)
→ modèle capable de classer de nouvelles photos.
Régression (prédiction de valeurs continues) : entraînement sur données historiques
de prix immobiliers (surface, localisation, âge)
→ modèle qui prédit le prix d’un nouveau bien.
Filtrage anti-spam : entraînement sur e-mails marqués « spam » ou « non-spam »
→ modèle détectant les nouveaux spams.
Régression temporelle / séries chronologiques : entraînement sur mesures passées
(température, ventes)
→ modèle prévoyant les valeurs futures.
la division d’un dataset
La division d’un dataset consiste à séparer les données en plusieurs parties distinctes :
Une partie pour apprendre (entraînement) (Training set)
Une partie pour valider et ajuster les réglages (Validation set)
Une partie pour tester la performance finale (Test set)
la division d’un dataset
Pourquoi c’est obligatoire ?
• La division des données est une étape cruciale en ML pratique : il garantit une
évaluation honnête et aide à construire des modèles capables de généraliser.
• Si le modèle voit toutes les données pendant l’entraînement, il « apprend par cœur » et
ne sait pas généraliser sur des données nouvelles. On appelle ça overfitting
(surapprentissage).
• Séparer les données pour empêcher le modèle de « voir » les exemples d’évaluation
pendant l’entraînement et pour permettre le réglage des hyperparamètres sans fuite
d’information.
la division d’un dataset
Schémas courants de fractionnement
a. Deux ensembles (train / test)
1. Train : utilisé pour entraîner le modèle (apprentissage des paramètres).
2. Test : utilisé une seule fois après l'entraînement pour estimer la performance finale
sur des données jamais vues.
Usage : projets simples ou lorsque la validation croisée remplace un set de validation
distinct.
b. Trois ensembles (train / validation / test)
1. Train : apprentissage des paramètres du modèle.
2. Validation : réglage des hyperparamètres, sélection de modèle, arrêt précoce (early
stopping). Évaluations répétées autorisées.
3. Test : estimation finale, ne doit pas être consulté pendant la conception du modèle.
Usage : flux standard en production, essentiel pour éviter la fuite d’information.
la division d’un dataset
Les techniques courantes de la division
1. Division aléatoire (Random Splitting)
La division aléatoire répartit aléatoirement l’ensemble de données en sous-ensembles
distincts : entraînement, validation et test.
Rôles des sous-ensembles.
Ensemble d’entraînement : utilisé pour entraîner le modèle. C’est le jeu principal qui
permet au modèle d’apprendre les tendances et relations présentes dans les données.
Ensemble de validation : utilisé pendant l’entraînement pour évaluer et affiner le
modèle (réglage des hyperparamètres, early stopping). Il aide à prévenir le
surapprentissage.
Ensemble de test : utilisé une seule fois, après toutes les étapes de conception et
d’optimisation, pour estimer de façon impartiale la capacité du modèle à généraliser
sur des données inédites.
la division d’un dataset
Les techniques courantes de la division
1. Division aléatoire (Random Splitting)
1er schéma.
2ieme schéma.
la division d’un dataset
Les techniques courantes de la division
1. Division aléatoire (Random Splitting) : 1er schéma
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
o La fonction divise le jeu de données en un ensemble d'entraînement (X_train, y_train) et un ensemble de
test (X_test, y_test). Ici, 20 % des données sont affectées à l'ensemble de test.
Reproductibilité
o Le paramètre random_state=42 fixe la graine aléatoire pour garantir des partitions identiques à chaque
exécution.
Utilité
o X_train / y_train : entraînement du modèle (apprentissage des paramètres).
o X_test / y_test : évaluation finale et impartiale de la capacité de généralisation.
la division d’un dataset
Les techniques courantes de la division
1. Division aléatoire (Random Splitting) : 2ieme schéma
from sklearn.model_selection import train_test_split
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size= 0.5 , random_state= 42 )
Étape 1 — Split initial
o La fonction divise le jeu de données en un ensemble d'entraînement (X_train, y_train) et un ensemble
temporaire (X_temp, y_temp). Ici, 20 % des données sont affectées à l'ensemble temporaire.
Étape 2 — Split du temporaire
o L'ensemble temporaire est ensuite séparé en ensemble de validation (X_val, y_val) et ensemble de test
(X_test, y_test). Chaque sous-ensemble reçoit 50 % de X_temp (soit 10 % du jeu de données total).
Reproductibilité
o Le paramètre random_state=42 fixe la graine aléatoire pour garantir des partitions identiques à chaque
exécution.
Utilité
o X_train / y_train : entraînement du modèle (apprentissage des paramètres).
o X_val / y_val : réglage des hyperparamètres, choix du modèle et prévention du surapprentissage.
o X_test / y_test : évaluation finale et impartiale de la capacité de généralisation.
la division d’un dataset
Les techniques courantes de la division
2. Division stratifiée (Stratified Splitting)
Lorsqu'il s'agit d'ensembles de données déséquilibrés, la stratification assure la
cohérence de la répartition des classes entre les ensembles d'entraînement, de
validation et de test.
from sklearn.model_selection import train_test_split
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size= 0.3 , stratify=y, random_state= 42 )
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size= 0.5 , stratify=y_temp, random_state= 42 )
Exemple :
Un dataset déséquilibré où 90 % des instances appartiennent à la classe 0 et seulement 10 % à la classe 1.
L'application d'une répartition stratifiée est cruciale pour maintenir une distribution cohérente des classes
entre les ensembles d'entraînement, de validation et de test.
Résultat attendu (proportions des classes)
Après stratification :
o Train ≈ 90 % / 10 %
o Validation ≈ 90 % / 10 %
o Test ≈ 90 % / 10 %
la division d’un dataset
Les techniques courantes de la division
3. Validation croisée à K plis(K-Fold Cross-Validation)
La validation croisée K-Fold divise l’ensemble de données en k plis (folds) de taille à
peu près égale et effectue k itérations d’entraînement/validation. À chaque itération, un
pli sert de jeu de validation et les k−1 plis restants forment le jeu d’entraînement :
1. Diviser l'ensemble de données en plusieurs parties.
2. Entraîner le modèle sur certaines parties et le tester sur la partie restante.
3. Répéter ce processus de rééchantillonnage plusieurs fois en choisissant différentes
parties de l'ensemble de données.
4. Faire la moyenne des résultats de chaque étape de validation pour obtenir la
performance finale.
la division d’un dataset
Les techniques courantes de la division
3. Validation croisée à K plis(K-Fold Cross-Validation)
from sklearn.model_selection import KFold
kf = KFold(n_splits= 5 , shuffle= True , random_state= 42 )
for train_index, val_index in [Link](X):
X_train, X_val = X[train_index], X[val_index]
y_train, y_val = y[train_index], y[val_index]
Fonctionnement :
[Link] les données en k plis.
[Link] i = 1..k :
1. Entraîner le modèle sur les k−1 plis (tout sauf le pli
i).
Points pratiques
Choix de k : k = 5 ou 10 sont des valeurs
2. Évaluer sur le pli i (validation).
courantes. k élevé → estimation moins
[Link]éger les métriques (moyenne ± écart-type) pour
biaisée mais coût computationnel plus
obtenir l’estimation finale.
important
la division d’un dataset
Les techniques courantes de la division
4. Validation croisée pour données déséquilibrées StratifiedKFold
Pour des classes déséquilibrées, utiliser StratifiedKFold pour préserver la
distribution des classes dans chaque pli.
o Même que K-Fold, mais on garde la même proportion de classes dans
chaque fold.
o Exemple : Si 2 % des diamants sont très chers, chaque fold aura exactement
2 % de diamants chers.
from sklearn.model_selection import StratifiedKFold
la division d’un dataset
Les techniques courantes de la division
3. Validation croisée à K plis(K-Fold Cross-Validation)
Points pratiques
Choix de k : k = 5 ou 10 sont des valeurs courantes. k élevé → estimation moins
biaisée mais coût computationnel plus important.
Pour classes déséquilibrées, utiliser StratifiedKFold pour préserver la
distribution des classes dans chaque pli.
Dataset petit (< 10 000 lignes) → Stratified K-Fold
Dataset moyen/grand → 80 % Train + 10 % Val + 10 % Test + validation
croisée
Pour données temporelles, éviter K-Fold standard ; préférer TimeSeriesSplit ou
validations chronologiques (préserver l’ordre temporel) (jamais mélanger passé
et futur).
Retourner les scores moyens et l’écart-type pour mesurer la stabilité du modèle.
la division d’un dataset
Les techniques courantes de la division
4. Validation croisée par exclusion d'un élément(Leave-One-Out Cross-Validation)
La validation Leave-One-Out est une variante extrême de la validation croisée : pour
un jeu de données de taille N, on réalise N itérations où, à chaque itération, un seul
échantillon sert de jeu de test et les N−1 autres constituent le jeu d’entraînement.
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
for train_index, val_index in [Link](X):
Fonctionnement (procédure) X_train, X_val = X[train_index], X[val_index]
y_train, y_val = y[train_index], y[val_index]
[Link] i = 1..N :
1. Utiliser l’échantillon i comme test.
2. Entraîner le modèle sur les N−1 autres échantillons.
3. Évaluer la performance sur l’échantillon i.
[Link]éger les N scores (moyenne ± éventuellement écart-type) pour obtenir
l’estimation finale de la performance.
la division d’un dataset
Les techniques courantes de la division
4. Validation croisée par exclusion d'un élément(Leave-One-Out Cross-Validation)
Avantages
Utilise presque toutes les données pour l’entraînement à chaque itération
→ utile pour très petits jeux de données.
Pas de hasard lié au partitionnement : chaque observation est testée exactement une fois.
Estimation sans biais d’un type particulier (parfois meilleure que un simple split) pour
certains modèles.
Inconvénients et limites
Coût computationnel élevé : nécessite l’entraînement du modèle N fois (problématique si
N grand ou si l’entraînement est coûteux).
Variance potentiellement élevée des estimations individuelles (agrégées ensuite).
Pour certains modèles (ex. très instables), l’évaluation peut être bruyante.
Ne remplace pas nécessairement des méthodes plus adaptées pour des tâches temporelles,
groupées ou fortement déséquilibrées.
la division d’un dataset
Les techniques courantes de la division
5. Division des séries temporelles (Time Series Splitting)
Contexte
Les séries temporelles sont des séquences d'observations indexées par le temps (cours
boursiers, relevés météo, trafic web, etc.). L’ordre des observations est essentiel : les
événements futurs ne doivent pas « regarder » les événements passés lors de
l’entraînement.
Problème avec un split aléatoire
Un split aléatoire casse l’ordre temporel et peut provoquer des fuites d’information
(data leakage) : des exemples plus récents pourraient se retrouver dans l’ensemble
d’entraînement alors qu’ils devraient être exclus lors de la prédiction des futurs.
la division d’un dataset
Les techniques courantes de la division
5. Division des séries temporelles (Time Series Splitting)
Principe du fractionnement temporel
Conserver l’ordre chronologique en découpant les données en segments successifs.
Entraîner sur des périodes antérieures et valider/tester sur des périodes ultérieures pour
simuler un déploiement réel.
Permet d’évaluer correctement la capacité de généralisation temporelle du modèle.
Méthodes courantes
Hold-out temporel simple : train sur t0..t_train, val sur t_train+1..t_val, test sur t_val+1..t_test.
Rolling window (fenêtre glissante) : entraîner sur une fenêtre temporelle glissante et tester sur
l’intervalle suivant.
Expanding window (fenêtre croissante) : à chaque étape, on ajoute des données récentes au
jeu d’entraînement (train grows), test toujours période future.
TimeSeriesSplit (scikit-learn) : implémente des splits respectant l’ordre temporel (expanding-
style folds).
Généralisation, surapprentissage (overfitting)
et sous-apprentissage (underfitting)
1. Notion centrale — généralisation
Objectif d’un modèle d’apprentissage : apprendre des régularités à partir
d’exemples pour pouvoir bien prédire sur des observations nouvelles (non vues lors
de l’entraînement). Cette capacité à bien fonctionner sur des données inédites
s’appelle la généralisation.
On ne veut pas que le modèle "connaisse" le passé, on veut qu'il "prédise" le futur.
Mesure pratique : on estime la généralisation en évaluant les performances sur un
jeu de test indépendant (ou via validation croisée).
La réalité : Un modèle qui réussit à 100% sur ses données d'entraînement mais
échoue dans la vraie vie est un modèle inutile.
Généralisation, surapprentissage (overfitting)
et sous-apprentissage (underfitting)
2. Surapprentissage (overfitting)
le modèle « mémorise » les détails et le bruit des exemples d’entraînement au lieu
d’apprendre les tendances générales. Il obtient généralement d’excellents résultats sur
les données d’entraînement mais des performances dégradées sur des données nouvelles.
Signes observables :
Erreur d’entraînement très faible, erreur de test beaucoup plus élevée.
Une précision incroyable sur l'entraînement, mais une performance catastrophique
sur le test.
Complexité excessive du modèle (trop de paramètres, profondeur de réseau élevée).
Forte variance des performances selon les splits de données.
Causes fréquentes :
Ensemble d’entraînement trop petit ou non représentatif.
Modèle trop expressif par rapport à la quantité d’information disponible.
Données bruitées ou étiquetage imparfait.
Généralisation, surapprentissage (overfitting)
et sous-apprentissage (underfitting)
2. Sous-apprentissage (underfitting)
le modèle est trop simple pour capturer les relations essentielles dans les données ; il
n’apprend pas suffisamment et reste incapable de bien prédire, même sur les données
d’entraînement.
Signes observables :
Une erreur élevée sur les données d'entraînement ET sur les données de test.
Modèle incapable de représenter la complexité du problème (par exemple, utiliser
une régression linéaire quand la vraie relation est fortement non linéaire).
Causes fréquentes :
Choix d’un modèle insuffisamment expressif.
Sous-entraînement (trop peu d’itérations, hyperparamètres mal réglés).
Features insuffisantes ou mal construites.