Labels sospechosos: detección por confianza cruzada (estilo cleanlab)
Las predicciones out-of-fold dan la probabilidad que el modelo asigna al label observado: las filas donde esta confianza es ínfima son candidatas a estar mal etiquetadas, ordenadas para revisión humana.
Requisitos
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())Resultado
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