Data Leakage
La fuite de données introduit dans l’entraînement ou l’évaluation des informations indisponibles au moment de la prédiction, gonflant les scores qui ne se confirment pas en production. Découvre les causes et les solutions.
La fuite de données en apprentissage automatique (ML) se produit lorsque les données d’entraînement ou l’évaluation d’un modèle incluent des informations auxquelles il n’aura pas accès pour produire des prédictions réelles, par exemple des exemples de l’ensemble de test, des valeurs futures ou des caractéristiques qui codent la réponse. Le modèle semble précis durant le développement et les tests du modèle, puis ses performances diminuent en production, car le raccourci sur lequel il s’appuyait a disparu. Les fuites sont une cause majeure de résultats non reproductibles : une étude des sciences reposant sur l’apprentissage automatique a recensé 294 articles concernés dans 17 domaines ; en prédiction des guerres civiles, les modèles complexes ont perdu l’avantage annoncé sur la régression logistique vieille de plusieurs décennies une fois la fuite corrigée.
Comment se produisent les fuites de données#
Les fuites surviennent lors du découpage ou du traitement des données, ou du choix des entrées ; les mêmes erreurs se répètent dans les modèles tabulaires, l’analyse de séries temporelles et les tâches de vision telles que la reconnaissance d’actions :
- Contamination entre entraînement et test : Les opérations qui apprennent à partir des données, comme le calcul des statistiques de normalisation, l’imputation ou la sélection de caractéristiques, sont ajustées sur l’ensemble du jeu de données avant le découpage ; les données d’entraînement contiennent donc des informations sur l’ensemble d’évaluation. Les images dupliquées et les copies augmentées créées avant le découpage ont le même effet.
- Fuite liée aux groupes : Des échantillons liés sont répartis dans des ensembles différents, par exemple des images consécutives d’une vidéo, plusieurs scans d’un patient ou des photos d’une scène. Le modèle peut alors obtenir un bon score en reconnaissant la scène ou la personne plutôt qu’en apprenant la tâche.
- Fuite temporelle : Le découpage aléatoire de données ordonnées dans le temps, ou le calcul de caractéristiques à partir de valeurs postérieures au moment de la prédiction, permet au modèle de voir l’avenir.
- Fuite de la cible : Une entrée est une conséquence ou un substitut de l’étiquette, par exemple un champ « traitement reçu » dans un modèle qui prédit une maladie.
- Réutilisation de l’évaluation : Ajuster un modèle à partir de l’ensemble de test, ou inclure des questions de benchmark dans les données de préentraînement à l’échelle du Web d’un grand modèle de langage, transforme l’évaluation en signal d’entraînement.
Les images peuvent elles aussi contenir une fuite de la cible. Dans le jeu de données ChestX-ray14, 80 % des radiographies de pneumothorax de l’ensemble de test montraient aussi un drain thoracique, le tube utilisé pour traiter cette affection. Un classifieur entraîné sur le jeu de données a obtenu une AUC de ROC de 0,94 sur les images avec drain, mais seulement 0,77 sur celles qui n’en avaient pas — les cas non traités qu’un détecteur est censé repérer.
Illustrer une fuite dans le code#
Ajuster une étape dépendante des données avant la validation croisée est l’erreur classique, et son effet est facile à mesurer. L’exemple suivant génère du bruit pur, de sorte qu’aucun modèle ne peut dépasser 50 % de précision sur de nouvelles données, puis sélectionne les 20 caractéristiques qui séparent le mieux les étiquettes et valide deux fois une régression logistique par validation croisée : une fois en ajustant la sélection sur tous les échantillons, et une fois en l’intégrant à un pipeline scikit-learn qui la réajuste sur chaque pli d’entraînement.
import numpy as np
from sklearn.feature_selection import SelectKBest
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
# Pure noise: 100 samples, 5,000 random features, random labels (true accuracy is 50%)
rng = np.random.default_rng(0)
X = rng.normal(size=(100, 5000))
y = rng.integers(0, 2, size=100)
# Leaky: pick the 20 features that best separate the labels using every sample, then cross-validate
X_selected = SelectKBest(k=20).fit_transform(X, y)
leaky = cross_val_score(LogisticRegression(), X_selected, y, cv=5).mean()
# Correct: feature selection is refit inside each training fold
pipeline = make_pipeline(SelectKBest(k=20), LogisticRegression())
clean = cross_val_score(pipeline, X, y, cv=5).mean()
print(f"Leaky CV accuracy: {leaky:.2f}, correct CV accuracy: {clean:.2f}")La version avec fuite affiche une précision de 85 % sur des étiquettes aléatoires, tandis que le pipeline affiche 48 %, soit le hasard. Avec 5 000 caractéristiques et 100 échantillons, certaines caractéristiques sont corrélées aux étiquettes par chance ; les choisir en incluant les plis de validation intègre cette chance au score de chaque pli.
Prévenir les fuites de données#
La prévention commence par le découpage, qui doit précéder toute étape d’apprentissage à partir des données, afin que les ensembles de validation et de test restent inconnus :
- Découpe avant l’ingénierie des caractéristiques : Ajuste les normaliseurs, les imputeurs, les encodeurs et les sélecteurs de caractéristiques uniquement sur l’ensemble d’entraînement, puis applique-les sans modification aux autres ensembles.
- Découpe par groupe ou par période : Garde tous les échantillons d’un même patient, d’une même vidéo ou d’une même scène dans un seul ensemble, et entraîne le modèle sur le passé pour le tester sur l’avenir.
- Déduplique à l’aide de hachages et d’embeddings : Compare les hachages de fichiers pour repérer les copies exactes et la similarité des embeddings pour repérer les quasi-doublons entre les ensembles avant l’entraînement.
- Audite les entrées : Demande-toi si chaque caractéristique existe au moment de la prédiction et considère toute caractéristique dominante ou tout score anormalement élevé comme un bug à examiner.
Les fuites faussent également la sélection des points de contrôle. Ultralytics YOLO apprend à partir des images train indiquées dans un fichier YAML de jeu de données et enregistre best.pt à partir de l’époque où la qualité sur l’ensemble de validation est la plus élevée — mAP50-95 pour la détection ; les images quasi identiques partagées entre train et val gonflent donc à la fois le score qui sélectionne le point de contrôle et le score publié.
Fuite de données et notions connexes#
- Surapprentissage : Le modèle mémorise le bruit des données d’entraînement légitimes et obtient de mauvais résultats sur un ensemble de validation propre. La fuite fausse le score de validation lui-même, de sorte qu’un modèle surajusté peut sembler performant.
- Apprentissage par raccourci : Le modèle s’appuie sur un indice fallacieux, comme un filigrane ou l’arrière-plan, corrélé à l’étiquette. Il y a fuite lorsque cet indice parvient à l’entraînement ou à l’évaluation à partir d’informations indisponibles lors du déploiement.
- Sécurité des données : En cybersécurité, une fuite de données désigne l’exposition de données sensibles à des personnes non autorisées ; les contrôles d’accès, le chiffrement et les outils de prévention des pertes de données permettent d’y remédier. Les deux sens n’ont en commun que leur nom.










