Los modelos solo entienden números, pero muchas variables llegan como texto: el color de un producto, la ciudad de un cliente, un "sí/no". Codificar es convertir esas categorías en números, y hacerlo bien evita que el modelo aprenda relaciones falsas.
El problema: el texto no entra al modelo
Una columna como color ∈ {rojo, verde, azul} no puede multiplicarse por un peso. Hay que traducirla a números. Pero cómo la traducimos cambia lo que el modelo cree.
La trampa de numerar al azar
La tentación es asignar rojo = 1, verde = 2, azul = 3. El problema: el modelo interpretará que azul > verde > rojo y que "azul está el doble de lejos de rojo que verde". Inventamos un orden y una distancia que no existen. Para categorías sin orden (nominales), esto es un error clásico.
One-Hot Encoding
La solución para categorías sin orden: crear una columna por categoría, con un 1 en la que corresponde y 0 en el resto.
| color | → | es_rojo | es_verde | es_azul |
|---|---|---|---|---|
| rojo | → | 1 | 0 | 0 |
| verde | → | 0 | 1 | 0 |
| azul | → | 0 | 0 | 1 |
Ahora ninguna categoría es "mayor" que otra: todas están a la misma distancia. Es la opción por defecto para variables nominales.
Codificación ordinal
Cuando la categoría sí tiene un orden natural (bajo < medio < alto, primaria < secundaria < universitaria), asignar 1, 2, 3 es correcto y hasta útil: preserva ese orden con una sola columna. A esto se le llama codificación ordinal.
Alta cardinalidad
Si una variable tiene cientos de categorías (por ejemplo, comuna o código postal), el one-hot genera cientos de columnas. Ahí se usan alternativas como el target encoding (reemplazar cada categoría por el promedio del objetivo en ella) o agrupar categorías raras en una sola "otros".
En código
scikit-learn trae codificadores que se ajustan con el entrenamiento y se aplican al resto:
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
# Nominal (sin orden): una columna por categoría.
oh = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
oh.fit(X_train[["color"]])
oh.transform(X_test[["color"]])
# Ordinal (con orden): respetamos el orden que indicamos.
orden = OrdinalEncoder(categories=[["bajo", "medio", "alto"]])
orden.fit_transform(X_train[["nivel"]])
handle_unknown="ignore" evita que una categoría nueva en la prueba rompa el modelo. Para exploración rápida, pandas.get_dummies(df) hace one-hot en una línea.
Para llevar
Codificar traduce categorías a números sin inventar relaciones falsas. Para variables sin orden usa one-hot (una columna por categoría); para las que tienen orden, la codificación ordinal. Nunca numeres categorías nominales al azar: el modelo se creería un orden que no existe. Y con cientos de categorías, busca alternativas como el target encoding.
