5 · Label encoding y ordinal encoding
Usa Label Encoder para el objetivo y; usa Ordinal Encoder para columnas de features con un orden natural.
Usa Label Encoder para el OBJETIVO y; usa Ordinal Encoder para columnas de FEATURES con un orden natural.
Sin esto:
Sin la distinción, o inyectarás un orden falso en variables nominales (el error clásico de principiante) o usarás la herramienta incorrecta para el objetivo.
La lección anterior cubrió las variables nominales — categorías sin orden significativo. Esta lección cubre dos herramientas relacionadas pero distintas:
-
LabelEncoder— diseñado específicamente para la variable objetivoy. Mapea cada etiqueta de clase a un entero 0, 1, 2, ... en orden alfabético/ordenado. Es un transformer 1-D que opera sobre un vector, no una columna de DataFrame. -
OrdinalEncoder— diseñado para columnas de features que tienen una relación ordinal real: tallas (S < M < L < XL), niveles de educación (Secundaria < Licenciatura < Maestría < Doctorado), calificaciones de satisfacción (mala < regular < buena < excelente).
La diferencia clave con el one-hot encoding: el ordinal encoding preserva la señal de orden con una sola columna entera en lugar de expandir a N columnas. Esto es válido SOLO cuando el orden es significativo — no lo uses en variables nominales.
Regla crítica: LabelEncoder es solo para y. Llamarlo en una columna de features de un DataFrame técnicamente funciona (devuelve enteros) pero aplica orden alfabético sin forma de anularlo — lo cual es incorrecto para la mayoría de las variables ordinales.
Python (in browser)
`LabelEncoder` mapea etiquetas de clase a 0..N-1 en orden alfabético. `.classes_` almacena el mapeo; `.inverse_transform()` decodifica predicciones de vuelta a etiquetas.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Sin el argumento `categories`, `OrdinalEncoder` ordena alfabéticamente — L=0, M=1, S=2, XL=3 — colocando S por encima de L, lo cual está al revés. Siempre pasa `categories=[[lista_ordenada]]` explícitamente.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`df['col'].map({'S': 0, 'M': 1, 'L': 2, 'XL': 3})` es el enfoque más limpio para ordinales fijos pequeños en pandas puro — autodocumentado y NaN en errores tipográficos.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Tabla de decisión: LabelEncoder para y; OrdinalEncoder (con categorías explícitas) para variables ordenadas; OneHotEncoder para variables sin orden. Nunca los confundas.
Tienes una variable `education_level` con valores 'PhD', 'Masters', 'Bachelor', 'HighSchool'. ¿Cuál encoder y configuración es correcta?
- `LabelEncoder` es solo para el **objetivo `y`** — mapea etiquetas de clase a 0..N-1 alfabéticamente; usa `.classes_` para ver el mapeo e `.inverse_transform()` para decodificar predicciones.
- `OrdinalEncoder` es para **columnas de features con un orden ordinal real** — siempre pasa `categories=[[lista_ordenada]]` explícitamente; nunca confíes en el orden alfabético predeterminado.
- Para ordinales fijos pequeños, `df['col'].map({'S': 0, 'M': 1, 'L': 2, 'XL': 3})` es el enfoque pandas más limpio — autodocumentado y devuelve NaN para valores desconocidos.
- Cuando dudes si las categorías son ordinales, prefiere `OneHotEncoder` — inyectar un orden falso es el error más peligroso que la pérdida de eficiencia.
Los modelos de árbol (`RandomForestClassifier`, `XGBoost`) manejan variables ordinales de forma nativa — el modelo decide en cada división si el orden importa. Los modelos lineales necesitan la elección explícita ordinal-vs-OHE desde el principio porque calculan pesos globales para cada columna.
Si lo quitas: Le dirías accidentalmente a un modelo de regresión que 'S' es la mitad de 'M' (porque 1 / 2 = 0.5), lo cual no tiene sentido para una talla de ropa — o que 'Masters' equidista de 'HighSchool' y 'PhD', lo cual pierde completamente la señal de graduación.