Fuga corregida: selección de features sobre todo el dataset
Seleccionar las features correlacionadas con el target ANTES de la cross-validation produce AUC disparatadas sobre puro ruido — demostración con cifras y luego corrección mediante un pipeline.
Requisitos
scikit-learn, numpy
Python
import numpy as np
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
rng = np.random.default_rng(0)
X_bruit = rng.normal(size=(200, 5000)) # bruit pur, AUCUN signal
y_bruit = rng.integers(0, 2, 200)
# INCORRECT : sélection sur TOUT le dataset, puis CV
X_sel = SelectKBest(f_classif, k=20).fit_transform(X_bruit, y_bruit)
auc_triche = cross_val_score(LogisticRegression(), X_sel, y_bruit,
cv=5, scoring="roc_auc").mean()
# CORRECT : la sélection vit dans le pipeline, refittée par fold
pipe = make_pipeline(SelectKBest(f_classif, k=20), LogisticRegression())
auc_vraie = cross_val_score(pipe, X_bruit, y_bruit,
cv=5, scoring="roc_auc").mean()
print(f"AUC avec fuite : {auc_triche:.3f} <- signal fantôme")
print(f"AUC corrigée : {auc_vraie:.3f} <- ~0.5, comme attendu")Resultado
AUC avec fuite : 0.852 <- signal fantôme AUC corrigée : 0.497 <- ~0.5, comme attendu >>> X_bruit.shape, float(y_bruit.mean()) ((200, 5000), 0.515)
Fuite de donnéesFeature selectionAnti-patternDémonstration