Module 8 — Validation croisée, découpage temporel et fuite de données
Ce module ne présente pas un modèle, mais la discipline qui rend tous les autres crédibles. Un modèle ne vaut que par l'honnêteté de son évaluation. La validation croisée fiabilise l'estimation de performance, et la traque de la fuite de données évite le pire des pièges : un score magnifique qui s'effondre en production.
Le problème d'un seul découpage
Réserver 20 % pour le test (module 1) est nécessaire, mais un seul découpage donne une estimation fragile : selon les observations tombées dans le test, le score peut varier sensiblement. On mesure alors autant la chance du tirage que la qualité du modèle.
La validation croisée en k blocs
La validation croisée en blocs résout cela. On découpe les données en parts égales (souvent 5). Puis, fois, on entraîne sur parts et on évalue sur la part restante — chaque bloc servant de test à tour de rôle. On obtient scores, dont on lit la moyenne (performance attendue) et l'écart-type (stabilité).
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_train, y_train, cv=5, scoring="f1")
print(f"F1 : {scores.mean():.3f} ± {scores.std():.3f}")
Deux raffinements : en classification déséquilibrée, on utilise une version stratifiée (proportions de classes préservées dans chaque bloc), automatique dans scikit-learn ; et l'écart-type compte autant que la moyenne — un modèle un peu moins bon mais plus stable est souvent préférable.
Le découpage temporel : ne jamais prédire le passé avec le futur
Quand les données ont un ordre temporel (ventes, capteurs, cours), la validation croisée classique triche : mélanger les dates revient à entraîner sur le futur pour prédire le passé. On utilise alors un découpage temporel : on entraîne toujours sur le passé, on valide sur le futur, en avançant par fenêtres.
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
C'est la seule façon d'estimer honnêtement ce que fera le modèle en conditions réelles, où le futur est par définition inconnu.
La fuite de données : le tueur silencieux
La fuite de données survient quand une information indisponible au moment de la prédiction s'infiltre dans l'entraînement. Le score explose à la validation… puis s'effondre en production. Ses formes les plus courantes :
- Prétraitement sur toutes les données : calculer une moyenne, une normalisation ou un encodage sur l'ensemble avant de découper. Les statistiques du test fuient dans l'entraînement.
- Variable issue du futur : inclure une colonne qui n'existera qu'après la cible (le piège du module 1).
- Doublons entre entraînement et test : la même observation des deux côtés.
La parade décisive tient en un mot : Pipeline. En enchaînant prétraitement et modèle dans un pipeline, scikit-learn garantit que chaque étape est apprise sur le seul pli d'entraînement, à chaque itération de la validation croisée.
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
pipe = make_pipeline(StandardScaler(), model)
cross_val_score(pipe, X_train, y_train, cv=5) # standardisation apprise dans chaque pli
Une exactitude de 99,9 % n'est pas une bonne nouvelle : c'est un signal d'alarme. Presque toujours, elle trahit une fuite — une variable trop proche de la cible, ou un prétraitement contaminé. Le réflexe professionnel face à un score irréaliste n'est pas de se réjouir, mais de chercher la fuite. Mieux vaut un modèle honnête à 82 % qu'un mirage à 99 % qui s'effondrera le jour de la mise en production.
En résumé
- Un seul découpage donne une estimation fragile ; la validation croisée en blocs en donne la moyenne et l'écart-type.
- En classification déséquilibrée, on stratifie ; l'écart-type (stabilité) compte autant que la moyenne.
- Les données temporelles imposent un découpage temporel : entraîner sur le passé, valider sur le futur.
- La fuite de données gonfle les scores en trompe-l'œil ; le
Pipelinel'évite en apprenant chaque prétraitement sur le seul pli d'entraînement. Un score trop beau doit alerter.
Module suivant : les métriques de classification — au-delà de l'exactitude, précision, rappel, F1 et aire sous la courbe ROC pour juger vraiment un modèle.