Bootstrap de la différence d'AUC : l'écart est-il réel ?
Bootstrap APPARIÉ sur le jeu de test : les deux modèles sont évalués sur les mêmes tirages, ce qui isole la différence de qualité du simple bruit d'échantillonnage. Verdict par intervalle de confiance.
Cas d'usage
Valider qu'un challenger bat le champion en production avant un remplacement, avec un IC 95 % sur le delta d'AUC.
Prérequis
scikit-learn, numpy
Python
import numpy as np
from sklearn.metrics import roc_auc_score
proba_a = modele_a.predict_proba(X_test)[:, 1] # challenger
proba_b = modele_b.predict_proba(X_test)[:, 1] # champion
rng = np.random.default_rng(42)
n = len(y_test)
deltas = []
for _ in range(2000):
idx = rng.integers(0, n, n) # MÊME tirage pour les 2 modèles
y_b = y_test.values[idx]
if y_b.sum() in (0, len(y_b)):
continue
deltas.append(roc_auc_score(y_b, proba_a[idx])
- roc_auc_score(y_b, proba_b[idx]))
deltas = np.array(deltas)
lo, hi = np.percentile(deltas, [2.5, 97.5])
print(f"AUC A {roc_auc_score(y_test, proba_a):.4f} | "
f"AUC B {roc_auc_score(y_test, proba_b):.4f}")
print(f"delta AUC (A - B) : {deltas.mean():+.4f}")
print(f"IC 95% : [{lo:+.4f}, {hi:+.4f}]")
print("significatif :", "OUI" if lo > 0 or hi < 0 else "NON")Résultat
AUC A 0.8714 | AUC B 0.8590 delta AUC (A - B) : +0.0124 IC 95% : [+0.0031, +0.0218] significatif : OUI L'IC ne contient pas 0 : le challenger peut remplacer le champion. Le bootstrap apparié (mêmes tirages pour A et B) compare bien les modèles entre eux, pas le bruit d'échantillonnage du test set.
BootstrapAUCComparaisonIntervalle de confiance