59 · Proyecto final: un proyecto sklearn de extremo a extremo
Ensambla la API de estimadores, el preprocesamiento, los pipelines, la búsqueda y la persistencia en un solo proyecto de extremo a extremo — la forma entregable de una solución de ML real.
Todo en este capítulo se ensambla en un proyecto de extremo a extremo: un `ColumnTransformer` para preprocesamiento de tipos mixtos, envuelto en un `Pipeline` con un clasificador, ajustado por `GridSearchCV`, evaluado en un conjunto reservado y persistido con `joblib`. Ese único objeto guardado — preprocesamiento y modelo juntos — es la forma entregable de una solución de ML real.
Sin esto:
Conocer cada pieza por separado no basta; el valor está en conectarlas en un solo artefacto reproducible que puedes entrenar una vez, evaluar honestamente, guardar y recargar para servir predicciones — sin reimplementar el preprocesamiento a mano.
El proyecto final: un proyecto de extremo a extremo
Esta lección no introduce ningún concepto nuevo. En cambio integra todo lo de este capítulo — la API de estimadores fit/predict/transform, el escalado y la codificación, el ColumnTransformer, el Pipeline, la búsqueda con validación cruzada y la persistencia con joblib — en un único artefacto desplegable.
Ese artefacto es la forma en que se entrega toda solución de ML real:
- Construir los datos — una tabla de tipos mixtos con variables numéricas y categóricas y un objetivo.
- Definir el preprocesamiento — un
ColumnTransformerque enruta las columnas numéricas a unStandardScalery las categóricas a unOneHotEncoder. - Envolver en un Pipeline — preprocesamiento + un clasificador como un solo estimador.
- Dividir honestamente —
train_test_split(..., stratify=y, random_state=42). - Ajustar —
GridSearchCVsobre una rejilla pequeña, ajustando en train. - Evaluar — exactitud + un
classification_reporten el conjunto de test reservado. - Persistir —
joblib.dumpdel pipeline ajustado completo, recargarlo y predecir sobre filas nuevas para probar que el objeto guardado lleva su propio preprocesamiento.
La recompensa: el archivo guardado es un motor de inferencia autónomo. Quien lo cargue puede llamar a .predict() sobre filas crudas, sin preprocesar, y obtener resultados correctos, porque las medias aprendidas del escalador y las categorías aprendidas del codificador viajan dentro del pipeline.
Python (in browser)
Pasos 1-4: una tabla de 200 filas construida a mano con dos columnas numéricas y dos categóricas más un objetivo binario aprendible. Un `ColumnTransformer` escala las numéricas y codifica one-hot las categóricas, envuelto con un clasificador en un solo `Pipeline`, y luego dividido con `stratify=y`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Pasos 5-6: `GridSearchCV` ajusta el `model__C` del pipeline con CV de 5-fold en los datos de entrenamiento, y luego evaluamos el pipeline ganador en el conjunto de test reservado con `accuracy_score` y un `classification_report` completo (precisión, recall, f1 por clase).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Paso 7: `joblib.dump` guarda el pipeline ajustado completo en un archivo; `joblib.load` lo recupera. Predecir sobre dos filas crudas nuevas funciona sin preprocesamiento manual — las medias del escalador y las categorías del codificador viajan dentro del objeto guardado. (Replica el round-trip de joblib por ruta de archivo probado en `bc-mls-28`.)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
El mismo flujo de extremo a extremo como un esqueleto ejecutable `train.py`: `load_data` → `build_pipeline` → dividir → `GridSearchCV` → evaluar → `joblib.dump`. Cambia `load_data` por un `pd.read_csv` y tienes la columna vertebral de un proyecto real.
Cuando haces `joblib.dump` de un Pipeline ajustado, ¿qué se guarda?
- Un entregable de ML real es un solo objeto: `ColumnTransformer` → `Pipeline` → ajustado por búsqueda → evaluado en un conjunto reservado → persistido con `joblib`.
- `joblib.dump(pipe)` guarda el pipeline ajustado COMPLETO — medias aprendidas del escalador, categorías del codificador y el modelo — para que el objeto recargado preprocese y prediga sobre filas crudas por sí mismo.
- Evalúa el pipeline ajustado en el conjunto de test reservado exactamente una vez, con `accuracy_score` más un `classification_report` para precisión/recall/f1 por clase.
Así es literalmente como se entrega el ML tabular en producción: un único pipeline persistido sirviendo predicciones detrás de una API. Las pistas de ML-Supervisado y NLP reutilizan este mismo andamiaje, cambiando por modelos más potentes y rejillas de búsqueda más ricas.
Si lo quitas: Sin el patrón de extremo a extremo entregarías scripts sueltos que reimplementan el preprocesamiento en cada punto de predicción — frágiles, propensos a fugas e imposibles de reproducir de forma confiable.