Pipelines y prevención de leakage en preprocesamiento
El bug silencioso más común en ML es ajustar preprocesamiento sobre todo el dataset. Escalado, imputación, encoding y selección de features todos aprenden estadísticas; si aprenden de filas de test, tu evaluación queda contaminada. Un pipeline vuelve automático el comportamiento correcto.
El leak, concretamente
Supongamos que estandarizás features usando media y desviación estándar. Si las calculás sobre todo el dataset antes de dividir, la distribución del test set se filtró hacia training. Tu score de validación se ve mejor de lo que producción jamás verá. Esto es una forma de data leakage.
Otros pasos propensos a leak: imputar valores faltantes, target/mean encoding, vectorizers TF-IDF, selección de features, oversampling para imbalance (hacé resampling dentro de los folds de cross-validation, nunca antes).
El arreglo: fit en train, transform en el resto
Cada paso que aprende de datos debe ver solo el training fold, y después aplicar lo que aprendió a validación/test.
Un pipeline encadena preprocesamiento + modelo en un objeto para que:
fit()aprenda los parámetros de cada paso solo desde datos de entrenamiento.transform/predict()los reutilice sobre datos nuevos.- Cross-validation reajuste el pipeline entero por fold, así ninguna estadística cruza la frontera del fold.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
("scale", StandardScaler()),
("clf", LogisticRegression()),
])
pipe.fit(X_train, y_train) # scaler learns from train only
pipe.predict(X_test) # reuses train statistics
Bonus: paridad train/serve
Un pipeline también es el artifact que desplegás, así que el preprocesamiento exacto usado en entrenamiento corre en producción, eliminando "training/serving skew", una causa principal de modelos que testean bien y fallan en vivo.
Trampa
Llamar scaler.fit_transform(X) sobre todo el dataset en un notebook es el leak
canónico. Si el preprocesamiento pasa fuera del loop de cross-validation, asumí leakage.
Conecta con: leakage · cross-validation · paridad train/serve