En este tutorial te explico cómo codificar variables categóricas con ejemplos en Python y cómo elegir el mejor método de codificación en tu dataset.
En un dataset, las variables categóricas son aquellas que indican que una observación pertenece a una categoría determinada.
Su valor representa la categoría a la que pertenecen y se suelen caracterizar por ser de tipo texto o estar representada por un caracter.
Por ejemplo, un dataset con información sobre el estado civil sería una variable categórica:
Estado civil
:Soltero
Casado
Viudo
Divorciado
Otra variable categórica sería una representando el color de algo en nuestro dataset:
Color
:Rojo
Verde
Amarillo
En un dataset con información sobre vehículos podríamos tener una variable categórica con el color del coche.
O la calificación en un examen si estuviéramos ante un dataset con información sobre estudiantes:
Calificación
:A
B
C
D
⚠️ Pero ojo, porque no siempre es el caso. A veces un número también puede estar representando una variable categórica si su principal función es indicar que la observación pertenece a una categoría determinada.
Por ejemplo, este podría ser el caso del código postal. El código postal puede estar representado como un número entero (como en el caso de España) y indicar que una dirección pertenece a una zona geográfica determinada.
Lo primero que podemos hacer para identificar las variables categóricas de nuestro dataset es fijarnos en el tipo de datos. Si es tipo string
o un caracter tenemos grandes posibilidades de que estemos ante una variable categórica.
Las variables con textos o etiquetas, como nombres de países, tipos de productos, o clasificaciones, suelen ser categóricas.
A veces, los números se usan para representar categorías (como códigos de género, donde 1 = Masculino y 2 = Femenino o los códigos postales que te decía antes). Estas características son categóricas aunque sean números.
Para detectar más variables categóricas fíjate en esto cuando estés haciendo un análisis de las distribuciones de tus características:
Además, a menudo, los datasets vienen con descripciones o documentación que define el tipo de cada variable. Revisar esta información puede aclararte la naturaleza categórica de algunas variables.
Sin olvidar que toda la información que puedas obtener sobre el dominio del problema que intentas resolver y el sentido común te ayudarán a discernir si una variable es o no categórica.
Una vez que tengamos fichadas las variables categóricas de nuestro dataset podremos diferenciarlas entre variables categóricas ordinales o nominales.
Esto es importante para elegir después el método de codificación óptimo para cada una de ellas.
Las variables ordinales implican un orden o jerarquía entre las diferentes categorías a las que puede pertenecer la variable.
Esto significa que puedes establecer cuál es mayor o menor, mejor o peor, etc., en algún sentido específico.
Un ejemplo típico de variable ordinal sería el nivel de educación (primaria, secundaria, universitaria), donde claramente hay un orden de progresión.
Las variables nominales representan categorías que no tienen un orden o jerarquía específico entre sí.
Su principal característica es que permiten clasificar elementos en grupos distintos, pero sin que puedas definir un orden entre estos grupos.
Un ejemplo claro de variable nominal es el color. Los colores (rojo, azul, verde, ...) simplemente nombran categorías sin indicar ningún tipo de orden o grado.
Las variables categóricas binarias son un tipo especial de variables categóricas nominales en las que sólo hay dos categorías posibles.
Algunos ejemplos comunes incluyen:
Tal vez te estés preguntando por qué es necesario codificar las variables categóricas.
Bien.
Es sencillamente porque muchos modelos de Machine Learning no soportan trabajar con datos no numéricos.
🎯 El objetivo es ser capaces de representar las variables categóricas de nuestro dataset mediante números.
Así que a continuación te presento algunas técnicas para poder codificar las variables categóricas en Python así como sus ventajas e inconvenientes y cuándo elegirlas.
Pero antes te presento el dataset sobre el que vamos a trabajar hoy.
Vamos a codificar las variables categóricas del dataset de aprobación de operaciones de crédito.
Este dataset es el mismo que utilizamos en el tutorial de tratamiento de valores faltantes.
Si no lo has hecho todavía te recomiendo que le eches un vistazo porque para empezar a codificar las variables categóricas tendremos que habernos asegurado primero de que nuestro dataset está completo y no le falta ningún valor.
Como recordarás, en este dataset todos los nombres de características y valores han sido cambiados a símbolos arbitrarios para proteger la confidencialidad de los datos.
Así que prepara un Notebook de Google Colab y vamos a ello. No es necesario que te instales nada, solo te hace falta una cuenta en Google 🙂
Para poder utilizar el dataset directamente en Google Colab sólo tienes que seguir este tutorial y sustituir el dataset que se descarga en ese tutorial por el que realmente queremos utilizar aquí.
!kaggle datasets download -d martaarroyo/credit-approval-dataset
Una vez descargado importamos las librerías que vamos a utilizar.
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split
Y lo primero que hacemos es un tratamiento de valores faltantes exprés.
(Recuerda que si quieres aprender en profundidad todo sobre cómo lidiar con los valores faltantes en tu dataset tienes un tutorial completo para hacerlo haciendo clic en el enlace).
Con este tipo de codificación creamos una columna para cada categoría y si la observación pertenece a esa categoría asignamos un 1.
Si no, un 0.
Lo que estamos haciendo es representar la variable categórica como un conjunto de características binarias.
Ten en cuenta que para codificar una variable categórica con k
valores posibles necesitaremos crear k
nuevas columnas.
En nuestro ejemplo tenemos 3 colores diferentes por lo que necesitamos tres columnas nuevas.
También podríamos crear únicamente dos columnas nuevas y cuando la variable categórica no pertenece a ninguna de esas dos categorías, significa que lo hace a la que falta.
Por ejemplo, si eliminamos la columna Rojo
(puedes taparla con la mano), la observación de la fila 3 no pertenece ni a la categoría Azul
, ni a la categoría Amarillo
(no hay un 1
en ninguna) por lo que sabremos el color es el Rojo
.
💡 Para codificar mediante One-Hot Encoding una variable categórica con k categorías posibles, necesitaremos crear un mínimo de k-1 columnas nuevas.
Sin embargo hay ocasiones en las que puede sernos útil crear las k columnas nuevas:
Para codificar variables categóricas en Pandas tenemos get_dummies()
.
Para aplicar la codificiación One-Hot en Scikit-learn tenemos OneHotEncoder()
.
Ahora que ya hemos visto qué hace get_dummies()
de Pandas y OneHotEncoder()
de Scikit learn vamos a ver las principales diferencias entre ambos.
El principal problema de aplicar One-Hot Encoding para codificar las variables categóricas es que si el número de categorías es muy alto crearemos muchas columnas nuevas.
La codificación binaria es un tipo de codificación de variables categóricas que utiliza código binario.
A cada categoría le asignamos un número que luego sustituimos por su código binario, es decir, por su representación con 0
y 1
.
Si te fijas, en el ejemplo tenemos un color más (Azul
) que en el ejemplo de One-Hot encoding y nos hace falta una columna menos.
💡 Utilizando codificación binaria necesitamos menos columnas (características) nuevas para codificar la variable categórica.
Si tenemos k categorías distintas necesitaremos log2(k) columnas nuevas.
La desventaja principal es que es las nuevas características son mucho más difíciles de interpretar que en el caso de One-Hot encoding.
Esta codificación asigna valores basados en la frecuencia de las categorías.
Esta técnica es súper sencilla porque lo único que tienes es sustituir las categorías por números del 1
a k
, dónde k
es el número de categorías que tienes en esa caracaterística.
Una manera de intentar incorporar información sobre el objetivo directamente en la codificación de las variables categóricas es utilizar la variable objetivo.
Una de las técnicas de este estilo más habituales es la codificación de la variable categórica con la media del objetivo (target mean encoding), que es el método que vamos a ver en este tutorial pero te puedes poner tan creativo como quieras 🚀
En este tutorial hemos visto distintos métodos para codificar variables categóricas y los hemos implementado en Python con Pandas y/o con Scikit-learn.
¿Es mejor la codificación binaria que One-Hot encoding? ¿Cuál es la que deberías usar?
Depende.
Depende de tus datos, del tipo de modelo que quieras utilizar, y de tus objetivos. No existe un método universalmente superior y la elección adecuada varía según el contexto.
Aquí te dejo algunas consideraciones y recomendaciones para ayudarte a decidir: