¿Cómo codificar datos categóricos?

En este artículo veremos los métodos más usados en Ciencia de Datos y Machine Learning para codificar numéricamente los datos categóricos.

¡Así que listo, comencemos!

Video

Como siempre, en el canal de YouTube se encuentra el video de este post:

Introducción

En los proyectos de Ciencia de Datos y Machine Learning es muy común encontrar datos que no necesariamente son numéricos y que en su lugar representan categorías.

Este tipo de datos se conocen precisamente con el nombre de datos categóricos y usualmente tenemos que buscar una forma de representarlos numéricamente para que puedan ser procesados por un modelo de Machine Learning o en caso de que queramos realizar algún tipo de análisis estadístico.

Así que en este artículo veremos los principales métodos de codificación de los datos categóricos y que nos permiten obtener como resultado su representación numérica.

¿Qué son los datos categóricos?

Los datos categóricos son variables que, como su nombre lo indica, representan categorías a las que puede pertenecer el dato.

Por ejemplo, podemos tener datos que representan nombres de ciudades (Londres, París, New Moscú, etc.) o datos que indican el rango de edad al que puede pertenecer una persona (0-1 año, 1 a 18 años, 18 años o más) o por ejemplo la calificación dada por un cliente a un servicio ofrecido por un restaurante (bajo, medio o alto).

Tipos de datos categóricos

Y las variables categóricas se dividen en dos grandes grupos.

En primer lugar están las variables categóricas nominales que son aquellas donde las categorías no tienen un orden inherente. Por ejemplo los nombres de las ciudades: podemos nombrarlas en cualquier orden y dicho orden no afecta el hecho de que sigan siendo ciudades.

Y en segundo lugar están las variables categóricas ordinales las cuales, contrario a lo que sucede con las nominales, tienen tienen un orden inherente. Por ejemplo, en el caso de la calificación dada por un cliente el nivel más bajo es “malo” seguido por “medio” y por “alto” respectivamente.

¿Y porqué se deben codificar las variables categóricas?

El término codificar se refiere a que debemos representar numéricamente estas variables categóricas. Y la pregunta es ¿por qué?

Esto se debe esencialmente a dos razones. En primer lugar porque muchas veces las variables categóricas se usan para construir modelos de Machine Learning y usualmente estos modelos únicamente son capaces de procesar datos numéricos. Y en segundo lugar porque en ocasiones es necesario realizar algún tipo de análisis estadístico sobre los datos y estas técnicas estadísticas operan muchas veces con números.

Así que en ambos casos se requiere algún tipo de pre-procesamiento que permita convertir la variable categórica en una variable numérica. Y esto es precisamente la codificación.

Y esta codificación depende del tipo de variable categórica que tengamos (nominal u ordinal). Así que comencemos hablando de las técnicas de codificación más usadas para variables categóricas nominales.

Codificación de variables categóricas nominales

En este caso los dos métodos más usados son: la codificación one-hot y la codificación de etiquetas (en Inglés label encoding). Veamos en detalle cada uno de estos métodos.

Codificación one-hot

En la codificación one-hot simplemente representamos cada categoría con una secuencia de números binarios (ceros o unos).

Por ejemplo, si volvemos a la variable “ciudades”, en ese caso supongamos que tenemos 4 diferentes ciudades: Londres, París, Moscú y Atenas.

Esto quiere decir que usaremos 4 dígitos (ceros o unos) para representar cada ciudad. La idea es que de esos 4 dígitos, 3 serán iguales a 0 y sólo uno de ellos será igual a 1. Y lo que permite diferenciar una categoría de otra será precisamente la ubicación del 1.

Por ejemplo, para Londres podemos definir la secuencia 1-0-0-0 (el 1 en la primera posición), mientras que para París la secuencia 0-1-0-0 (el 1 en la segunda posición), para Moscú la secuencia 0-0-1-0 (el 1 en la tercera posición) y para Atenas la secuencia 0-0-0-1 (el 1 en la cuarta posición):

Londres 1 0 0 0
París 0 1 0 0
Moscú 0 0 1 0
Atenas 0 0 0 1

A pesar de que es un método muy sencillo, la codificación one-hot tiene el problema de que no resulta adecuada cuando tenemos muchas categorías.

Supongamos que en lugar de ciudades estamos por ejemplo procesando texto en Español y que tendremos digamos 30.000 diferentes palabras a codificar.

En este caso el texto es una variable categórica y si hacemos la codificación one-hot cada palabra codificada sería un vector de 30.000 elementos donde 29.999 de ellos serán 0 y sólo uno de ellos sería igual a 1.

Además de ser una codificación ineficiente (pues la gran mayoría de los dígitos serían iguales a 0), el hecho de tener vectores de gran tamaño podría dificultar el entrenamiento de un modelo de Machine Learning.

Como alternativa se podrían usar técnicas más sofisticadas como por ejemplo el uso de embeddings, que consiste en entrenar una Red Neuronal para que aprenda a codificar las palabras en vectores de un tamaño relativamente pequeño (mucho menor que 30.000).

Codificación de etiquetas (label encoding)

En esta codificación simplemente se asigna un número entero a cada categoría.

Por ejemplo, volviendo al caso de las ciudades podríamos codificar Londres con el número 0, París con el 1, Moscú con el 2 y Atenas con el 3:

Londres 0
París 1
Moscú 2
Atenas 3

Como vemos se trata de un método de codificación bastante sencillo y que, a diferencia de la codificación one-hot, el número de categorías no afecta la codificación pues cada categoría seguirá estando representada con un número entero.

Sin embargo, el hecho de que los valores numéricos se incrementen progresivamente puede ser problemático para ciertos algoritmos de Machine Learning, pues es probable que el modelo que construyamos termine dándole más importancia a las categorías codificadas con valores numéricos más altos comparadas con aquellas codificadas con valores más pequeños.

Codificación de variables categóricas ordinales

Y ahora hablemos de las variables ordinales. En este caso la codificación más usada recibe precisamente el nombre de codificación ordinal.

Esta codificación asigna valores numéricos a las categorías pero teniendo en cuenta el ranking o el orden de las mismas.

Por ejemplo, volviendo al caso de calificación dada por un cliente a un restaurante, la codificación ordinal asignaría el valor numérico más bajo a la categoría “malo”, el siguiente valor numérico a la categoría “medio” y el valor numérico más grande a la categoría “alto”:

Bajo 0
Medio 1
Alto 2

Vemos que esta codificación es fácil de entender y resulta muy intuitiva.

Sin embargo tiene una desventaja y es que asume que los intervalos entre una y otra categoría son iguales, lo cual no siempre es cierto.

Por ejemplo, si estamos analizando a un grupo de personas con base en sus edades y definimos rangos de 0 a 1 año, 1 a 18 años y 18 años o más, resulta evidente que una codificación ordinal (codificando por ejemplo con valores de 0, 1 y 2, respectivamente) no resulta adecuada en este caso pues el intervalo de 0 a 1 año no es el comparable con los intervalos de 1 a 18 o de 18 años o más.

Conclusión

Muy bien, hemos visto las principales técnicas de codificación de variables categóricas tanto ordinales como nominales.

En todos los casos (codificación one-hot, codificación de etiquetas y codificación ordinal) vimos que se trata de técnicas sencillas pero que en ciertos casos pueden tener algunas desventajas que dependerán de las características que tengan nuestros datos.

En esos casos podríamos usar técnicas más sofisticadas como el uso de embeddings, el hashing o técnicas de codificación por frecuencia.

Sin embargo, las técnicas que revisamos en este artículo pueden ser usadas en una amplia variedad de problemas que usualmente encontramos en Ciencia de Datos y Machine Learning.