Estimador Final
Desliza para mostrar el menú
Pipeline se utilizó anteriormente para el preprocesamiento, pero su propósito real es encadenar el preprocesamiento con un predictor final. El último paso en una pipeline puede ser cualquier estimador (normalmente un modelo) que genere predicciones.
Al llamar a .fit(), cada transformador ejecuta .fit_transform().
Al llamar a .predict(), la pipeline utiliza .transform() antes de enviar los datos al estimador final.
Esto es necesario porque los nuevos datos deben transformarse exactamente igual que los datos de entrenamiento.
¿Por qué .transform()?
Usar .fit_transform() en nuevos datos podría cambiar las codificaciones (por ejemplo, en OneHotEncoder), creando columnas desajustadas y predicciones poco fiables.
.transform() garantiza preprocesamiento consistente, ignorando categorías no vistas y manteniendo el mismo orden de columnas.
Aquí está el conjunto de datos original antes de cualquier transformación. Estos datos sin procesar son el punto de partida para el proceso de transformación. Aún no se ha aplicado codificación ni preprocesamiento—cada fila muestra una instancia con su característica de color como una cadena. Estos son los datos que se transformarán utilizando los pasos de preprocesamiento en el pipeline.
Esta tabla muestra el conjunto de datos antes de la codificación one-hot. La columna Color es categórica—contiene valores de texto en lugar de números. Transformarás esta columna en columnas binarias separadas en el siguiente paso utilizando la codificación one-hot, lo cual es esencial para que la mayoría de los modelos de aprendizaje automático procesen correctamente los datos categóricos.
Así es como se ve el conjunto de datos de entrenamiento después de aplicar la codificación one-hot:
La siguiente tabla muestra el conjunto de datos después de aplicar la codificación one-hot. La columna original Color ha sido reemplazada por columnas binarias separadas—Color_Red, Color_Blue y Color_Green. Cada columna indica si la instancia tiene ese color específico (1) o no (0).
Observa cómo la columna original Color ha sido reemplazada por tres columnas separadas: Color_Red, Color_Blue y Color_Green. Cada columna representa si un color específico está presente para esa instancia, utilizando 1 para sí y 0 para no. Esta transformación se denomina codificación one-hot.
Este cambio es fundamental para los modelos de aprendizaje automático porque la mayoría de los algoritmos no pueden trabajar directamente con datos de texto o categóricos. Al convertir las categorías en columnas binarias separadas, se proporciona al modelo características numéricas claras que puede utilizar para aprender patrones y hacer predicciones. Este enfoque también evita que el modelo asuma cualquier relación ordinal entre las categorías originales, lo que podría llevar a conclusiones incorrectas.
Estas son las nuevas instancias a predecir:
Aquí están los nuevos datos sobre los que se desea predecir. Esta es la entrada sin procesar—el estado 'antes'—tal como aparece antes de cualquier transformación o preprocesamiento. El pipeline transformará estos datos para que coincidan con el formato utilizado durante el entrenamiento antes de realizar predicciones.
El siguiente paso es transformar estas nuevas instancias utilizando el codificador ajustado previamente. Esto garantiza que los nuevos datos se procesen de la misma manera que los datos de entrenamiento, asegurando coherencia y predicciones fiables del modelo.
Si se aplicara .fit_transform() a nuevas instancias, el OneHotEncoder podría generar columnas en un orden diferente o incluso introducir nuevas. Esto provocaría que los nuevos datos se transformaran de manera inconsistente con el conjunto de entrenamiento, haciendo que las predicciones sean no confiables.
Si utilizas .fit_transform() en datos nuevos en lugar de .transform(), el codificador tratará los datos nuevos como si los viera por primera vez. Esto provoca que:
- Vuelva a aprender las categorías a partir de los datos nuevos;
- Cambie el orden de las columnas según el nuevo conjunto de categorías;
- Añada una nueva columna para cualquier categoría no vista, como
'Color_Yellow'en este caso.
Esto crea una discrepancia entre los datos de entrenamiento y los de predicción, haciendo que las predicciones sean poco confiables y potencialmente causando errores en tu pipeline.
Observa la diferencia entre la transformación incorrecta y la correcta. La tabla con la transformación incorrecta incluye una nueva columna (Color_Yellow) y cambia el orden de las columnas en comparación con los datos de entrenamiento. Esto rompe la consistencia entre el entrenamiento y la predicción:
- El modelo espera las mismas columnas y el mismo orden que durante el entrenamiento;
- Las columnas nuevas o reordenadas confunden al modelo, haciendo que utilice las características incorrectas;
- Las predicciones se vuelven poco confiables porque la estructura de entrada ya no coincide con lo que el modelo aprendió.
Siempre asegúrate de que los nuevos datos se transformen con .transform() después de ajustar, para que las columnas y el orden permanezcan consistentes. Esto es esencial para obtener predicciones precisas y confiables.
Sin embargo, usar .transform() garantiza que los nuevos datos se codifiquen exactamente como los datos de entrenamiento, ignorando las categorías que no se vieron durante el entrenamiento:
Cuando se utiliza .transform() en nuevos datos, solo se incluyen en la salida las columnas del entrenamiento. Cualquier categoría no vista durante el entrenamiento—como 'Yellow'—se ignora. Esto garantiza que los nuevos datos coincidan con la estructura que espera el modelo, sin columnas adicionales ni faltantes.
Comparación de las tres tablas:
- Los datos de entrenamiento originales (después de la codificación one-hot) tienen columnas para
Color_Red,Color_BlueyColor_Green; - Los nuevos datos transformados incorrectamente (usando
.fit_transform()) agregan una columnaColor_Yellowy eliminanColor_Green, cambiando el orden y la estructura de las columnas; - Los nuevos datos transformados correctamente (usando
.transform()) mantienen las mismas columnas y el mismo orden que el conjunto de entrenamiento, con ceros para categorías no vistas comoYellow.
El uso de .transform() es el enfoque correcto porque garantiza que los nuevos datos se procesen exactamente de la misma manera que los datos de entrenamiento. Esto asegura que el modelo reciba los datos en el formato esperado, previniendo errores y haciendo que las predicciones sean confiables.
Añadiendo el estimador final
Simplemente añadir el modelo como el último paso del pipeline:
pipe = make_pipeline(
ct,
SimpleImputer(strategy='most_frequent'),
StandardScaler(),
KNeighborsClassifier()
)
pipe.fit(X, y)
pipe.predict(X_new)
Esto permite que todo el flujo de trabajo—preprocesamiento + predicción—se ejecute con una sola llamada.
12345678910111213141516171819202122232425262728293031323334353637from sklearn.pipeline import make_pipeline from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import pandas as pd # Example data data = pd.DataFrame({ 'color': ['red', 'blue', 'green'], 'value': [1, 2, 3] }) labels = [0, 1, 0] # Define a simple column transformer (placeholder for real preprocessing) ct = ColumnTransformer([ ('imputer', SimpleImputer(strategy='most_frequent'), ['color']) ]) # --- Before: Pipeline with only preprocessing steps --- # This pipeline only transforms the data; it cannot make predictions. pipeline_preprocessing = make_pipeline( ct, StandardScaler() ) # pipeline_preprocessing.fit(data) # Only fits transformers, no estimator at the end # --- After: Pipeline with a final estimator --- # Now the pipeline ends with a model, so it can fit and predict. pipeline_full = make_pipeline( ct, StandardScaler(), KNeighborsClassifier() ) pipeline_full.fit(data, labels) predictions = pipeline_full.predict(data) print("Predictions:", predictions)
Agregar el estimador final como el último paso convierte tu pipeline en un flujo de trabajo completo de extremo a extremo. En lugar de solo preparar los datos, el pipeline ahora gestiona tanto el preprocesamiento como la predicción en un solo objeto. Esto significa que puedes llamar a fit() y predict() directamente sobre el pipeline, y aplicará automáticamente todos los pasos de preprocesamiento antes de realizar las predicciones.
Este enfoque es importante porque:
- Garantiza que todos los datos se procesan exactamente de la misma manera tanto durante el entrenamiento como en la predicción;
- Reduce el riesgo de errores, como olvidar un paso de preprocesamiento al predecir con nuevos datos;
- Hace que tu código sea más limpio y fácil de mantener, ya que todo el flujo de trabajo se gestiona en un solo lugar.
Al encadenar el preprocesamiento y el modelado, aseguras consistencia, fiabilidad y simplicidad en tus proyectos de aprendizaje automático.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla