56 · Transformadores y preprocesamiento
Los modelos necesitan entradas numéricas, escaladas de forma comparable y categorías codificadas — los transformadores aprenden las estadísticas con `fit` y las aplican con `transform`.
La mayoría de los modelos necesitan entradas numéricas, escaladas de forma comparable y variables categóricas codificadas. Los transformadores resuelven esto con el mismo ritmo de dos pasos: `fit` aprende las estadísticas (medias, desviaciones estándar, el conjunto de categorías) y `transform` las aplica — y el orden importa enormemente para evitar fugas.
Sin esto:
Alimenta datos crudos, sin escalar y de tipos mixtos a la mayoría de los modelos y se rompen o rinden pésimamente: los métodos basados en distancia o gradiente quedan dominados por la variable que casualmente tenga los números más grandes, y no pueden procesar categorías de texto en absoluto.
Por qué los datos crudos rara vez están listos para el modelo
Un modelo solo ve números, y los trata literalmente. De ahí surgen dos problemas:
- Escala. Si
ingresova de 0 a 100.000 yedadva de 18 a 90, un modelo basado en distancia o gradiente quedará dominado abrumadoramente poringresosolo porque sus números son más grandes — no porque importe más. El escalado pone cada variable en igualdad de condiciones. - Categóricas. Una columna como
ciudad = ["Madrid", "Lima", "Bogotá"]es texto. El modelo no puede multiplicar texto por un peso. Debemos codificar las categorías en números — y, crucialmente, hacerlo sin inventar un orden falso.
Los transformadores resuelven ambos. Siguen el mismo contrato que viste en la lección anterior:
fit(X)— aprender las estadísticas de los datos (las medias y desviaciones estándar de cada columna para un escalador; el conjunto de categorías distintas para un codificador). Los valores aprendidos quedan en atributos con guion bajo final comomean_,scale_,categories_.transform(X)— aplicar esas estadísticas aprendidas para producir una nueva matriz de variables.
El mismo escalador, una vez ajustado, puede transformar cualquier dato de la misma forma — que es justo lo que te permite aplicar las estadísticas del conjunto de entrenamiento a filas nuevas de test o producción.
Python (in browser)
`StandardScaler` aprende la media (`mean_`) y la desviación estándar (`scale_`) de cada columna durante `fit`, y luego `transform` produce z-scores: media ≈ 0, std ≈ 1. `MinMaxScaler` es la alternativa que reescala a [0, 1] en su lugar.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El `mean_` del escalador coincide exactamente con las medias de las columnas de entrenamiento — prueba de que solo aprendió de train. El conjunto de test, escalado con esas estadísticas de train congeladas, termina con medias ligeramente distintas de cero, lo cual es correcto y honesto.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`OneHotEncoder` crea una columna binaria por categoría y no inventa ningún orden — el valor por defecto seguro para datos nominales. `OrdinalEncoder` mapea a enteros y solo es apropiado cuando las categorías tienen un orden real. `handle_unknown="ignore"` evita que las categorías no vistas rompan en tiempo de predicción.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`ColumnTransformer` aplica `StandardScaler` a las columnas numéricas y `OneHotEncoder` a la categórica, y luego concatena los resultados. Dos columnas numéricas + tres one-hot producen una salida de 5 columnas — todo en un solo `fit_transform`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Por qué debes ajustar un escalador solo en el conjunto de entrenamiento, y no en el dataset completo?
- `StandardScaler` centra las variables a media 0 / std 1; `MinMaxScaler` reescala a [0, 1]. Ambos aprenden estadísticas en `fit` y las aplican en `transform`.
- Siempre ajusta solo en train, y luego transforma tanto train como test. Ajustar en test/datos completos filtra la distribución de test e infla los puntajes.
- Codifica categorías con `OneHotEncoder` (sin orden falso) u `OrdinalEncoder` (solo cuando hay orden real); `ColumnTransformer` enruta cada grupo de columnas a su propio transformador.
Casi todo pipeline real de ML tabular comienza escalando variables numéricas y codificando categóricas mediante un `ColumnTransformer`. Los modelos basados en distancia (KNN, SVM) y en gradiente (lineales, neuronales) son especialmente sensibles a entradas sin escalar.
Si lo quitas: Omite el preprocesamiento y tus variables llegan en escalas incompatibles (una domina al resto) y tus columnas categóricas no pueden consumirse en absoluto — muchos modelos simplemente fallan o colapsan a un rendimiento casi aleatorio.