Codificación de variables categóricas y cómo no morir en el intento.

Diana Ballesteros
MCD-UNISON
Published in
6 min readDec 2, 2022

Al trabajar con conjuntos de datos, la mayoría del tiempo nos encontramos con información no numérica o también llamada “categorica”, como por ejemplo tener categorías dentro de los datos como “pequeño”, “mediano” y “grande”, es decir, las variables categóricas adquieren valores de un número limitado de clases o categorías.

Asimismo, las variables categóricas pueden ser de dos tipos:

  • Variables ordinales: sus valores pueden ser ordenados jerárquicamente por rango o escala. Un ejemplo es el nivel de educación de una persona: sin estudios, primaria, secundaria, etc.
  • Variables nominales: no se puede establecer un orden en sus categorías. Un ejemplo es el país de nacimiento de una persona, puede tomar ciertos valores: México, España, Italia, Francia, etc).

Cuando nuestra finalidad es trabajar con algoritmos de aprendizaje automático (machine learning), el algoritmo necesita ser capaz de entender los datos que recibe, y ciertos algoritmos no entienden cuando reciben valores categóricos, como “pequeño”, “mediano” y “grande” ya que aprenden con entradas numéricas puesto que que hacen uso de diversas operaciones matemáticas y allí es cuando la codificación de variables categóricas entra a escena.

En la presente publicación, veremos dos de las técnicas más conocidas: Label encoding y one-hot encoding, y entrenaremos un algoritmo de predicción de productivad para ver los resultados que nos arroja cada codificador.

La codificación de variables categóricas es a menudo una parte clave del proceso de ciencia de datos y puede hacerse de múltiples maneras que conducen a diferentes resultados y una comprensión diferente de los datos de entrada.

Caso de uso

Veamos un ejemplo de lo que sería una codificación de variables categóricas con el ejemplo del principio:

Para resolver que nuestro algoritmo no comprende cuando le damos entradas en texto (solo entiende numéricas) le asignaremos (agarrando el ejemplo del principio) 1 a “pequeño”, 2 a “mediano” y 3 a “grande”.

Imagen para conceptualizar

Ahora, cada vez que nuestros datos digan 1 es porque se refiere a pequeño, cuando digan 2 es porque se refiere a mediano y así sucesivamente, con las demás categorías.

Básicamente, ésto, es la codificación de variables categóricas…suena mucho más complejo de lo que en realidad es, ¿no?

Lo complejo es que existen distintas técnicas y cada una de ella te conduce a diferentes resultados; con la técnica de codificación adecuada podríamos tener un muy buen modelo, así como con elegir la equivocada nos puede llevar a obtener pésimos resultados para un problema en específico.

Técnicas de codificación

  • Ordinal Encoding o Label Encoding

Esta es probablemente la forma más sencilla de codificar variables. La estrategia en esta técnica es asignarle a cada valor categórico único un valor numérico de 1 a N (donde N es el número de categorías para la característica) . Y esta técnica fue la que usamos en el ejemplo del principio.

Para algunas variables en nuestros conjuntos de datos, esto puede ser suficiente. Los valores enteros tienen una relación natural ordenada entre sí y los algoritmos de machine learning pueden ser capaces de entender y aprovechar esta relación.

Pero para las variables categóricas en las que no existe una relación ordinal, la codificación de números enteros no es suficiente.

De hecho, utilizar esta codificación y permitir que el modelo asuma una ordenación natural entre las categorías puede dar lugar a un rendimiento pobre o a resultados inesperados. Los valores numéricos pueden ser malinterpretados por algunos algoritmos: si hemos codificado varias ciudades con los valores 0, 1 y 2 ¿significa que la ciudad que correspondiente al valor 2 es el doble que la que recibió el valor 1 (basado en algun criterio)? Y la respuesta en muchos caso es no, por supuesto.

En este caso, otra técnica viene a salvarnos.

  • One-hot encoding

La estrategia que implementa la si no más famosa técnica para codificar, una de las más conocidas es crear una columna para cada valor distinto que exista en la variable que estamos codificando y, para cada registro, marca con un 1 la columna a la que pertenezca dicho registro y dejar las demás con 0. Veamos un ejemplo.

En este ejemplo de la variable “tamaño”, hay 3 categorías (pequeño, mediano y grande), por tanto, se necesitan 3 variables binarias. Se coloca un valor “1” en la variable binaria para el tamaño y valores “0” para los otros tamaños que no correspondan en cada renglón.

Esta técnica a pesar de ser muy utilizada, puede resultar en un problema por la cantidad de columnas (tambien llamadas dimensionalidad) que agrega; y entre mas dimensionalidad tengamos, mas complejo se vuelve nuestro problema (podria llevarnos a ser víctimas de la maldición de la dimensionalidad). Esto se agrava cuando la característica tiene demasiadas categorías, la mayoría de ellas inútiles para la predicción.

Implementación

El conjunto de datos usado para la implementación de las tecnicas asi como el entrenamiento los podemos encontrar en: kaggle

Al importar los datos, estos lucen algo asi:

Después de hacer una limpieza pequeña a los datos (eliminar los vacíos, etc) con la ayuda de MultiLabelEncoder, convertiremos nuestras columnas categóricas a numéricas, para ello, ejecutaremos el siguiente código:

import MultiColumnLabelEncoder
Mcle = MultiColumnLabelEncoder.MultiColumnLabelEncoder()
df = Mcle.fit_transform(df)#df es nuestro conjunto de datos

No aplicaremos nada de procesamiento a nuestros datos (como algún escalamiento), para comparar solamente a nuestros codificadores, por lo que, lo siguiente que haremos será preparar nuestros datos para entrenamiento.

Me saltare esa parte, pero todo el código lo podrás encontrar en el repositorio de github al final de este post.

Entrenaremos nuestra predicción con Decision Tree Regressor y graficamos nuestro rendimiento y parametros para ver que tan bien entrenó.

Label encoding:

test_MSE: 0.011317916378360982

test_MAE: 0.05597359799280577

R2_score:0.5850189764281413

One-hot encoding

test_MSE: 0.009601070779774791

test_MAE: 0.04910785153237411

R2_score:0.647968579517479

Incluso si no entendemos de machine learning y de los parametros para medir que tan bueno es nuestro algoritmo, vemos que los resultados salieron diferentes (unos ligeramente), ya con eso nos damos una idea de que dependiendo nuestro codificador, obtendremos diferentes resultados.

Quise hacer esta comparación ya que se tiene la idea errónea de que la técnica que tomemos no hace la diferencia en nuestros resultados, haciendo que se tome esta parte del proceso del tratamiento de los datos como algo sin importancia.

Conclusión

Es importante entender las distintas opciones de codificación que existen porque cada enfoque tiene sus propios pros y contras; en este post solo vimos dos para entender que de verdad existen diferencias de resultados dependiendo de la técnica,pero existen muchas más que probablemente se adapten mejor a nuestros datos que las más conocidas.

En este caso vemos que con one hot encoding funcionó mejor y nos dio mejores resultados.

En la ciencia de los datos, la codificación es un paso muy importante, te animo a que tengas estas ideas en mente cuando trates con variables categóricas.

Enlace a repositorio

--

--