Machine Learning

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

Snippets liés

Retour au Data Lab