Labels suspects : détection par confiance croisée (style cleanlab)
Les prédictions out-of-fold donnent la probabilité que le modèle accorde au label observé : les lignes où cette confiance est minuscule sont des candidates au mauvais étiquetage, triées pour revue humaine.
Cas d'usage
Nettoyer un dataset labellisé manuellement : concentrer la re-vérification humaine sur les 2 % de labels les moins crédibles.
Prérequis
scikit-learn, pandas, numpy
Python
import numpy as np
import pandas as pd
from sklearn.model_selection import cross_val_predict, StratifiedKFold
cv = StratifiedKFold(5, shuffle=True, random_state=42)
oof = cross_val_predict(pipe, X, y, cv=cv,
method="predict_proba", n_jobs=-1)
# confiance accordée par le modèle au label OBSERVÉ
conf_label = oof[np.arange(len(y)), y.values]
seuil = float(np.quantile(conf_label, 0.02)) # 2 % les moins crédibles
masque = conf_label <= seuil
suspects = pd.DataFrame({
"label_observe": y.values[masque],
"proba_label": conf_label[masque],
"proba_classe_1": oof[masque, 1],
}, index=y.index[masque])
print(f"{int(masque.sum())} labels suspects détectés (seuil {seuil:.3f})")
print(suspects.sort_values("proba_label").head(5).round(3).to_string())Résultat
168 labels suspects détectés (seuil 0.094)
label_observe proba_label proba_classe_1
3812 0 0.012 0.988
9047 1 0.019 0.019
1266 0 0.024 0.976
5530 1 0.031 0.031
7012 0 0.038 0.962
Revue manuelle des 20 premiers : 14 étaient effectivement mal
étiquetés (70 % de précision du détecteur). Après correction et
refit : AUC 0.871 -> 0.884 — le plus gros gain du trimestre,
sans toucher au modèle.Qualité des labelscleanlabOut-of-foldNettoyage