ScikitLearn: Pipelines y despliegue

Aprende ScikitLearn GRATIS y certifícate

El desarrollo de pipelines en Scikit Learn unifica y automatiza los pasos de preprocesamiento, selección de características y entrenamiento en un mismo objeto, garantizando coherencia y reduciendo el riesgo de fugas de información. Además, su estructura modular facilita la experimentación y la aplicación de transformaciones tanto en entrenamiento como en inferencia.

Para configurar un pipeline, se emplea la clase Pipeline del submódulo sklearn.pipeline. Se definen etapas como tuplas con el nombre del paso y el objeto que lo ejecuta. El último paso suele ser un estimador (por ejemplo, un modelo de clasificación o regresión), mientras que los pasos anteriores corresponden a transformadores (por ejemplo, escalado, imputación o codificación de variables categóricas). Un ejemplo sencillo sería:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])

pipeline.fit(X_train, y_train)
preds = pipeline.predict(X_test)

Este patrón resulta útil porque el escalador se entrena con los datos de entrenamiento y luego se aplica de manera consistente al conjunto de prueba y a cualquier dato futuro. De este modo, se evita calcular estadísticas (como la media y desviación típica) con información del test, lo que podría llevar a sobreestimar el rendimiento real.

El pipeline también se integra con herramientas de búsqueda de hiperparámetros como GridSearchCV. Cada paso del pipeline puede incluir hiperparámetros que se optimizan de forma conjunta, empleando notaciones que especifican el nombre del paso y el parámetro. Por ejemplo:

from sklearn.model_selection import GridSearchCV

param_grid = {
    'scaler__with_mean': [True, False],
    'classifier__C': [0.1, 1, 10]
}

grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

print("Mejor configuración:", grid_search.best_params_)
print("Puntuación en validación:", grid_search.best_score_)

Mediante el prefijo scaler__ o classifier__, se hace referencia al paso del pipeline y a la propiedad que se desea ajustar. Esto permite sintonizar con precisión toda la cadena de transformadores y el estimador final.

Además de Pipeline, Scikit Learn incluye herramientas como ColumnTransformer o FeatureUnion para manejar datos con columnas heterogéneas o combinar transformaciones diferenciadas. ColumnTransformer facilita aplicar distintos transformadores en subconjuntos de columnas, mientras que FeatureUnion concatena varias transformaciones en paralelo y entrega un único array de características para el estimador posterior.

Una vez completado el entrenamiento, el pipeline se puede persistir en disco para su uso en producción. Scikit Learn recomienda la serialización con joblib, pues maneja objetos grandes y estructuras de numpy de forma más eficiente que otros métodos. Un ejemplo de guardado:

import joblib

joblib.dump(pipeline, 'modelo_entrenado.pkl')

Para recuperar el pipeline entrenado en un momento posterior, se utiliza:

modelo_cargado = joblib.load('modelo_entrenado.pkl')
predicciones = modelo_cargado.predict(X_nuevos)

Este proceso simplifica el despliegue de modelos, dado que con un solo objeto se encapsula todo el flujo: desde la limpieza y transformación de datos hasta la inferencia final.

En la práctica, el despliegue de un pipeline entrenado puede hacerse en múltiples entornos, por ejemplo:

  • Scripts o servicios de backend que cargan el pipeline y reciben peticiones de inferencia.
  • Servidores con marcos web (Flask, FastAPI, Django) que proveen endpoints de predicción.
  • Contenedores Docker que integran el pipeline y sus dependencias, listos para ejecutarse en la nube o en un clúster.

Para asegurar la consistencia entre el entorno de entrenamiento y el de despliegue, se recomienda anotar la versión de Python, de scikit learn y de librerías relacionadas en un fichero de requisitos, lo que evita problemas de incompatibilidad. Una vez que el pipeline está empaquetado y las dependencias definidas, se traslada a producción con relativa facilidad.

Al poner en marcha un pipeline en un entorno de producción, puede resultar necesario contar con un sistema de monitorización, capaz de detectar cambios en la distribución de los datos (data drift) o degradaciones en la precisión del modelo. Esto facilita el rediseño de la tubería de datos y el reentrenamiento del pipeline cuando se observa un deterioro significativo de su rendimiento.

Otra ventaja de los pipelines en Scikit Learn es su integración con herramientas externas que implementan prácticas de MLOps, manteniendo rastreables las versiones de datos, modelos y resultados de experimentos. Aunque la biblioteca no proporciona una solución nativa para la gestión de proyectos end-to-end, la posibilidad de persistir pipelines y de orquestar transformaciones con facilidad facilita la adopción de soluciones que organicen la operación y el ciclo de vida de los modelos.

En definitiva, los pipelines permiten agrupar cada fase del proceso de aprendizaje automático en un único objeto que se entrena, evalúa, persiste y despliega de forma integral. Gracias a la unificación del preprocesamiento y el modelo, las predicciones posteriores se realizan con seguridad y reproducibilidad, evitando inconsistencias en la aplicación de transformaciones. A su vez, el despliegue de estos pipelines puede llevarse a cabo en múltiples escenarios, siempre que se conserven las librerías y versiones adecuadas para su correcto funcionamiento.

Empezar curso de ScikitLearn

Lecciones de este módulo de ScikitLearn

Lecciones de programación del módulo Pipelines y despliegue del curso de ScikitLearn.

Ejercicios de programación en este módulo de ScikitLearn

Evalúa tus conocimientos en Pipelines y despliegue con ejercicios de programación Pipelines y despliegue de tipo Test, Puzzle, Código y Proyecto con VSCode.