Validation adversariale : train et test sont-ils comparables ?
Entraîner un classifieur à distinguer train et production : une AUC proche de 0.5 signifie des distributions semblables ; au-delà de 0.7, les features les plus importantes désignent la source du drift.
Cas d'usage
Diagnostiquer un écart validation/production ou un dataset de compétition au split douteux.
Prérequis
scikit-learn, numpy, pandas
Python
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
X_adv = pd.concat([X_train, X_prod], ignore_index=True)
y_adv = np.r_[np.zeros(len(X_train)), np.ones(len(X_prod))]
clf = RandomForestClassifier(n_estimators=200, max_depth=6,
n_jobs=-1, random_state=42)
auc = cross_val_score(clf, X_adv, y_adv, cv=5, scoring="roc_auc").mean()
print(f"AUC adversariale : {auc:.3f}")
print("~0.50 = distributions similaires | >0.70 = drift sérieux")
if auc > 0.6:
clf.fit(X_adv, y_adv)
imp = pd.Series(clf.feature_importances_, index=X_adv.columns)
print("Features qui trahissent l'époque/la source :")
print(imp.sort_values(ascending=False).head(5).round(3))Résultat
AUC adversariale : 0.731 ~0.50 = distributions similaires | >0.70 = drift sérieux Features qui trahissent l'époque/la source : montant 0.412 delai_jours 0.218 solde_moyen 0.097 age 0.054 nb_produits 0.041 dtype: float64
Adversarial validationDriftDiagnosticDistribution