4 · One-hot encoding para variables nominales
Las categorías nominales (sin orden) se convierten en vectores one-hot — N categorías ⇒ N (o N−1) columnas binarias.
Las categorías nominales (sin orden) se convierten en vectores one-hot — N categorías ⇒ N (o N−1) columnas binarias.
Sin esto:
Sin esto, los modelos reciben códigos enteros arbitrarios que pretenden que 'apple=1' está más cerca de 'banana=2' que de 'mango=5' — lo cual no tiene sentido.
Antes de que un modelo pueda aprender de una variable categórica como color, necesita números. La idea clave es si las categorías tienen un orden natural.
- Las variables nominales NO tienen orden:
color = {red, green, blue},país = {US, MX, CA}. No tiene sentido que "rojo < verde < azul". - Las variables ordinales SÍ tienen orden:
talla = {S, M, L, XL},calificación = {baja, media, alta}.
Para variables nominales, la transformación estándar es el one-hot encoding (OHE): crear una columna binaria por categoría, donde la columna es 1 si la fila pertenece a esa categoría y 0 en otro caso.
Una fila con color = "red" se convierte en:
| color_red | color_green | color_blue | |-----------|-------------|------------| | 1 | 0 | 0 |
Esto preserva la igualdad entre categorías — "rojo" no está ni más cerca ni más lejos de "verde" que de "azul" — son direcciones ortogonales en el espacio de features.
Python (in browser)
`pd.get_dummies` crea una columna binaria por categoría única, nombradas `{prefijo}_{categoría}` en orden alfabético. Cada fila tiene exactamente un 1.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`drop_first=True` elimina una columna — la tercera está implícita cuando las otras dos son 0. Importante para modelos lineales (evita multicolinealidad); irrelevante para modelos de árbol.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`OneHotEncoder` de sklearn ajusta en datos de entrenamiento y aplica el MISMO esquema a los datos de test. `handle_unknown='ignore'` mapea silenciosamente categorías no vistas a todo-ceros — crítico para sistemas en producción.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La trampa de las variables dummy: N columnas one-hot suman 1 ≡ el intercepto. Elimina una para romper la colinealidad perfecta. Solo importa para modelos lineales (regresión logística, lineal, SVM con kernel lineal).
Si una columna tiene categorías {A, B, C, D} y usas `pd.get_dummies(drop_first=True)`, ¿cuántas columnas se producen?
- Las variables nominales no tienen orden natural — el one-hot encoding mapea cada categoría a su propia columna binaria, preservando la igualdad entre categorías.
- `pd.get_dummies` está bien para EDA; `sklearn.preprocessing.OneHotEncoder` es necesario para producción — tiene `.fit()` / `.transform()` y maneja categorías no vistas con `handle_unknown='ignore'`.
- Usa `drop_first=True` (o `drop='first'` en sklearn) para modelos lineales para evitar la trampa de las variables dummy (multicolinealidad). No es necesario para modelos de árbol.
- Las categóricas de alta cardinalidad (1000+ categorías) explotan la dimensionalidad con OHE — usa target encoding o embeddings en su lugar.
Toda clasificación o regresión con una variable categórica comienza con la codificación. `ColumnTransformer` en sklearn aplica OHE a columnas nominales y otro transformer a columnas numéricas — la columna vertebral estándar de cualquier Pipeline de sklearn.
Si lo quitas: Los modelos lineales no pueden ingerir strings; los modelos de árbol pueden pero la mayoría de las APIs (XGBoost, LightGBM en algunas configuraciones) aún requieren entrada numérica. Omitir la codificación significa que `model.fit(X, y)` lanza un TypeError antes de que ocurra cualquier aprendizaje.