Machine Learning

Bootstrap de la diferencia de AUC: ¿es real la brecha?

Bootstrap PAREADO sobre el test set: ambos modelos se evalúan sobre los mismos muestreos, lo que aísla la diferencia de calidad del simple ruido de muestreo. Veredicto por intervalo de confianza.

Requisitos

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")

Resultado

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

Snippets relacionados

Volver al Data Lab