← Volver a Aprende con CDIA

Procesamiento de datosCodificación de variables categóricas

IntermedioProcesamiento de datos7 min de lectura

Codificación de variables categóricas

Convertir texto (color, ciudad, sí/no) en números que el modelo entienda, sin inventar órdenes falsos: one-hot para lo nominal, codificación ordinal para lo que sí tiene orden.

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.

colores_rojoes_verdees_azul
rojo100
verde010
azul001

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.