Fuite par doublons : des lignes du test déjà vues au train
Hachage des lignes pour détecter les doublons exacts entre train et test, puis AUC recalculée avec et sans : la différence chiffre exactement de combien le score annoncé était gonflé.
Cas d'usage
Exports quotidiens chevauchants, clients dupliqués, snapshots : auditer tout dataset assemblé depuis plusieurs sources.
Prérequis
pandas, scikit-learn
Python
import pandas as pd
from sklearn.metrics import roc_auc_score
hash_train = set(pd.util.hash_pandas_object(X_train, index=False))
hash_test = pd.util.hash_pandas_object(X_test, index=False)
masque_vu = hash_test.isin(hash_train).values
print(f"lignes du test déjà vues au train : {masque_vu.sum()} "
f"({masque_vu.mean():.1%})")
proba = model.predict_proba(X_test)[:, 1]
auc_global = roc_auc_score(y_test, proba)
auc_dupes = roc_auc_score(y_test[masque_vu], proba[masque_vu])
auc_propre = roc_auc_score(y_test[~masque_vu], proba[~masque_vu])
print(f"AUC affichée (test complet) : {auc_global:.4f}")
print(f"AUC sur doublons : {auc_dupes:.4f}")
print(f"AUC honnête (sans doublons) : {auc_propre:.4f}")Résultat
lignes du test déjà vues au train : 1841 (14.7%) AUC affichée (test complet) : 0.8902 AUC sur doublons : 0.9871 AUC honnête (sans doublons) : 0.8614 Le score annoncé était gonflé de 2.9 pts par des lignes dupliquées (exports quotidiens chevauchants : un client actif apparaît dans plusieurs snapshots). Dédupliquer AVANT le split — ou mieux, splitter par entité et par date.
Fuite de donnéesDoublonsAuditAUC