Sklearn Pipeline
En proyectos de aprendizaje automático, pasos como el procesamiento de datos, la ingeniería de características, el entrenamiento del modelo y la evaluación suelen ser interdependientes. El orden y la coordinación de estos pasos son cruciales para el rendimiento del modelo final.
Pipeline es una herramienta importante en scikit-learn para organizar y simplificar estos pasos.
Mediante Pipeline, podemos integrar el preprocesamiento de datos con el entrenamiento del modelo, simplificando así el flujo de trabajo y mejorando la reutilización del código.
¿Qué es Pipeline?
Pipeline es una herramienta que puede ejecutar varios pasos de procesamiento de datos y pasos de entrenamiento de modelo en secuencia.
En Pipeline, cada paso es una tupla que contiene un nombre y un objeto.
Cada objeto suele ser un transformador (Transformer) o un estimador (Estimator), donde:
- Transformador (Transformer)Es un objeto que realiza transformaciones de datos, como el preprocesamiento de datos (por ejemplo, normalización, estandarización, selección de características, etc.).
- Estimador (Estimator)Es un objeto utilizado para entrenar modelos, como clasificadores o regresores.
PipelinePermite integrar fácilmente varios pasos en un flujo de trabajo reutilizable, y puede garantizar la coherencia del procesamiento de datos, evitando errores causados por la duplicación de código o el procesamiento manual.
¿Por qué usar Pipeline?
- Simplificar el código: combina múltiples pasos en un todo, simplificando la estructura y la gestión del código.
- Evitar la fuga de datos: durante el preprocesamiento de datos, asegúrese de que el procesamiento de los conjuntos de entrenamiento y prueba esté aislado para evitar fugas de datos. Por ejemplo, al estandarizar, no se pueden calcular la media y la desviación estándar en el conjunto de prueba.
- Reducir el trabajo repetitivo: Mediante
Pipelinese pueden conectar el preprocesamiento de datos con el proceso de entrenamiento del modelo, evitando reescribir el código de preprocesamiento en cada entrenamiento. - Mejorar la reutilización: encapsular el procesamiento de datos y el entrenamiento del modelo en un
Pipelineobjeto, que puede reutilizarse en diferentes proyectos y conjuntos de datos. - Facilitar el ajuste: Mediante
Pipelinese pueden aplicar directamente la optimización de hiperparámetros, la validación cruzada, etc., durante el ajuste, simplificando todo el proceso.
Componentes de Pipeline
Pipeline consta de múltiples pasos, cada paso es una tupla que contiene dos elementos:
- Nombre del paso(tipo cadena): se utiliza para identificar cada paso.
- Transformador o estimador: objeto utilizado para el procesamiento de datos o el modelado.
Los pasos comunes incluyen:
- Pasos de preprocesamiento de datos: como limpieza de datos, estandarización, codificación, etc.
- Pasos de entrenamiento del modelo: como clasificadores, regresores, etc.
Crear un Pipeline simple
Supongamos que tenemos un conjunto de datos y necesitamos estandarizar los datos y luego entrenar un clasificador de máquina de vectores de soporte (SVM). Podemos combinar los pasos de estandarización y entrenamiento del modelo en un pipeline.
Ejemplo
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# Cargar datos
data = load_iris()
X, y = data.data, data.target
# Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crear Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()), # Estandarización de datos
('svc', SVC()) # Clasificador de máquina de vectores de soporte
])
# Entrenar modelo
pipeline.fit(X_train, y_train)
# Predecir resultados
y_pred = pipeline.predict(X_test)
# Imprimir la precisión del modelo
print(f"Model accuracy: {pipeline.score(X_test, y_test)}")
Ejecute el código anterior, la salida es la siguiente:
Model accuracy: 1.0
Cómo funciona Pipeline
En el ejemplo anterior, Pipeline ejecutó dos pasos:
- Estandarización de datos(mediante
StandardScaler()): estandarizar los datos para que cada característica tenga media 0 y varianza 1. - Entrenamiento del modelo(mediante
SVC()): entrenar un clasificador de máquina de vectores de soporte con los datos estandarizados.
PipelineEl flujo de trabajo es: primero ejecutar los pasos de preprocesamiento de datos (como la estandarización), luego pasar los datos procesados al modelo para entrenamiento. Este proceso se puede realizar mediantepipeline.fit()completarse en un solo paso,pipeline.predict()Al hacer predicciones, los datos también pasan por cada paso del pipeline en el mismo orden.
Ventajas de Pipeline
Simplificar código y flujo de trabajo
Mediante Pipeline, podemos integrar varios pasos en un solo objeto, reduciendo así el código para ejecutar manualmente varios pasos.
Sin usarlo, se necesita ejecutar el preprocesamiento varias veces:
Ejemplo
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
model = SVC()
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
Usando Pipeline, se completa en un solo paso:
Ejemplo
pipeline = Pipeline([
('scaler', StandardScaler()),
('svc', SVC())
])
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
Garantizar la consistencia del procesamiento de datos de entrenamiento y prueba
Sin Pipeline, si realizamos manualmente el procesamiento y el entrenamiento de datos, podemos usar accidentalmente diferentes métodos de procesamiento para los conjuntos de entrenamiento y prueba, lo que provoca fugas de datos.
Por ejemplo, calculamos la media y la varianza para la estandarización en el conjunto de entrenamiento, pero si se calculan diferentes medias y varianzas en el conjunto de prueba, la evaluación del modelo será inexacta. El uso de Pipeline garantiza la coherencia de estos métodos de procesamiento.
Automatizar todo el proceso
Pipeline nos permite encapsular varios pasos en un objeto, automatizando todo el proceso de preprocesamiento de datos, entrenamiento de modelos y predicción. Mediante este proceso automatizado, se pueden reducir los errores humanos y mejorar la reutilización del código.
Ajuste de parámetros y optimización de Pipeline
Cuando usamos Pipeline, podemos realizar directamente el ajuste de hiperparámetros.
Combinando GridSearchCV o RandomizedSearchCV, se pueden optimizar los hiperparámetros de cada paso del pipeline.
Usar GridSearchCV para ajustar los hiperparámetros en Pipeline:
Ejemplo
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV
# Cargar datos
data = load_iris()
X, y = data.data, data.target
# Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crear Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()), # Estandarización de datos
('svc', SVC()) # Clasificador de máquina de vectores de soporte
])
# Entrenar modelo
pipeline.fit(X_train, y_train)
# Definir la cuadrícula de hiperparámetros
param_grid = {
'svc__C': [0.1, 1, 10], # Ajustar el parámetro C en SVC
'svc__kernel': ['linear', 'rbf'] # Ajustar el parámetro kernel
}
# Crear objeto GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
# Realizar el ajuste de hiperparámetros
grid_search.fit(X_train, y_train)
# Mostrar los mejores parámetros y la puntuación
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")
Nota:
svc__Cysvc__kernelSíPipelineMedioSVChiperparámetros de los pasos. AlGridSearchCVespecificar estos parámetros, podemos directamentePipelineajustar los hiperparámetros del modelo encv=5Indica una validación cruzada de 5 pliegues.
El resultado es el siguiente:
Best parameters: {'svc__C': 0.1, 'svc__kernel': 'linear'}
Best score: 0.9583333333333334
Usar Pipeline para validación cruzada
Se puede combinar Pipeline con la validación cruzada para garantizar que todo el proceso de evaluación del modelo sea consistente. En la validación cruzada, cada iteración preprocesa los datos de entrenamiento y luego entrena el modelo para la validación.
Ejemplo
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
# Cargar datos
data = load_iris()
X, y = data.data, data.target
# Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crear Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()), # Estandarización de datos
('svc', SVC()) # Clasificador de máquina de vectores de soporte
])
# Entrenar modelo
pipeline.fit(X_train, y_train)
# Realizar validación cruzada de 5 pliegues
cv_scores = cross_val_score(pipeline, X, y, cv=5)
# Mostrar las puntuaciones de validación cruzada
print(f"Cross-validation scores: {cv_scores}")
print(f"Mean cross-validation score: {cv_scores.mean()}")
En este ejemplo, cross_val_score realiza automáticamente la validación cruzada de los datos, estandarizando los datos antes de cada entrenamiento.
El resultado es el siguiente:
Cross-validation scores: [0.96666667 0.96666667 0.96666667 0.93333333 1. ] Mean cross-validation score: 0.9666666666666666Otras extensiones