Bloque 4: Arquitectura de Pipelines y Prevención del Data Leakage
Se produce Data Leakage (fuga de datos) cuando el modelo accede durante su construcción a información que no estará disponible en producción. Sus dos formas principales son:
- Fuga de preprocesamiento: los parámetros aprendidos (medias, desviaciones, categorías, componentes) se calculan incluyendo datos de validación o de prueba.
- Fuga del objetivo: alguna variable predictora contiene información posterior a la variable objetivo o derivada de ella.
Ambas producen métricas optimistas que no se reproducen en producción. Es el error de mayor impacto en un proyecto de Machine Learning, porque no genera ningún fallo visible durante el desarrollo.
En los Bloques 2 y 3, el preprocesado se aplicó manualmente. Con validación cruzada, ese preprocesado debe recalcularse en cada pliegue, lo que hace inviable y propenso a errores el enfoque manual. Pipeline y ColumnTransformer encapsulan el preprocesado y el modelo en un único estimador: cada llamada a fit() aprende todos los parámetros exclusivamente a partir de los datos que recibe. Además, el Pipeline ajustado es el artefacto que se despliega en producción, lo que garantiza que los datos nuevos reciben exactamente las mismas transformaciones que los datos de entrenamiento.
Prerrequisitos
- Bloque 3 integrado en
main.
Material de Referencia
- Arquitectura predictiva: Complete los módulos 1, 2 y 7 del Scikit-learn MOOC (Inria). Se exige el dominio de
Pipeline,ColumnTransformery validación cruzada. - Taxonomía de fugas: Revise la lección de Data Leakage de Intermediate Machine Learning (Kaggle Learn), que distingue entre fuga del objetivo y contaminación entre entrenamiento y validación.
- Buenas prácticas: Consulte Common pitfalls and recommended practices de la documentación de scikit-learn, en particular las secciones sobre fuga de datos y control de la aleatoriedad.
Actividad Práctica
- Cree la rama
feat/b04-pipelinedesdemainactualizada. - Implemente el script
B04_Pipelines_y_DataLeakage/pipeline.py, ejecutable conuv run python -m B04_Pipelines_y_DataLeakage.pipeline. - Cargue
data/processed/dataset_limpio.parquety aplique la misma partición entrenamiento/prueba del Bloque 2. Hasta el paso 8, todas las operaciones utilizan exclusivamenteX_trainey_train. - Construya un
ColumnTransformercon dos ramas:- Variables numéricas:
SimpleImputer(con la estrategia definida en el Bloque 1) seguido deStandardScaler. - Variables categóricas:
SimpleImputer(strategy="most_frequent")seguido deOneHotEncoder(handle_unknown="ignore").
- Variables numéricas:
El escalado no altera los resultados de un Random Forest, pero se incluye porque es obligatorio para los métodos del Bloque 5 y para cualquier modelo sensible a la escala de las variables.
- Construya el Pipeline completo:
Pipeline([("preprocesado", column_transformer), ("modelo", RandomForest...(random_state=42))]). El script no puede contener ninguna llamada afit()ofit_transform()fuera de este objeto. - Evalúe el Pipeline con
cross_validatesobreX_train, usandoStratifiedKFold(clasificación) oKFold(regresión) conn_splits=5,shuffle=Trueyrandom_state=42, la métrica priorizada en el Bloque 3 comoscoringyreturn_train_score=True. Reporte la media y la desviación típica en los pliegues de entrenamiento y de validación. - Optimice los hiperparámetros del modelo con
GridSearchCVoRandomizedSearchCVsobre el Pipeline completo (p. ej.,modelo__max_depth,modelo__min_samples_leaf), con la misma estrategia de validación y la misma métrica. En clasificación, seleccione de nuevo el umbral de decisión mediante validación cruzada (TunedThresholdClassifierCV, ocross_val_predictconmethod="predict_proba"). - Ajuste la configuración final sobre
X_traincompleto y evalúela una única vez sobreX_test. Compare el resultado con los obtenidos en los Bloques 2 y 3. - Serialice el Pipeline ajustado con
joblibenmodels/pipeline_b04.joblib. Demuestre en el script que el artefacto, una vez cargado, genera predicciones directamente sobre filas deX_testsin preprocesado previo. - Publique la rama y abra un Pull Request hacia
main.
Contenido Obligatorio del Pull Request
- Tabla de resultados: validación cruzada (media ± desviación típica) y prueba, frente a los resultados de los Bloques 2 y 3.
- Auditoría de fugas:
- Preprocesamiento: declaración explícita de que todas las llamadas a
fit()se ejecutan dentro del Pipeline y, por tanto, exclusivamente sobre los pliegues de entrenamiento de cada iteración de la validación cruzada, indicando la búsqueda realizada en el código para verificarlo. - Objetivo: tabla con cada variable predictora, el momento en que su valor está disponible en un escenario real y la decisión adoptada (se mantiene o se excluye).
- Coherencia de resultados: análisis de la diferencia entre el rendimiento en validación cruzada y en prueba. Una diferencia grande, o un rendimiento anormalmente alto, debe investigarse como posible indicio de fuga.
- Preprocesamiento: declaración explícita de que todas las llamadas a
Criterios de Aceptación
- No existe ninguna transformación con parámetros aprendidos fuera del Pipeline.
- El artefacto serializado genera predicciones sobre datos sin procesar.
- El conjunto de prueba no ha intervenido en la selección de hiperparámetros ni del umbral.
Transición al Bloque 5
El Pipeline es ahora el marco en el que se integra cualquier transformación adicional. El Bloque 5 introduce transformaciones no supervisadas (PCA y K-Means), que también aprenden parámetros de los datos y, por tanto, deben ajustarse dentro de este mismo Pipeline y evaluarse con el mismo protocolo de validación cruzada.