Explicación de la codificación de datos categóricos: una guía visual con un ejemplo de código para principiantes | por Samy Baladram | Sep, 2024

PREPROCESAMIENTO DE DATOS

Seis formas de emparejar categorías y números

Ah, los datos categóricos: los coloridos caracteres de nuestros conjuntos de datos que las máquinas parecen no poder entender. Aquí es donde el “rojo” se convierte en 1, el “azul” en 2 y los científicos de datos se convierten en traductores de idiomas (¿o más bien en casamenteros?).

Ahora, sé lo que estás pensando: “¿Codificación? ¿No es eso simplemente asignar números a categorías?” ¡Oh, si fuera así de simple! Estamos a punto de explorar seis métodos de codificación diferentes, todos en (de nuevo) un único y pequeño conjunto de datos (¡con elementos visuales, por supuesto!). Desde etiquetas simples hasta transformaciones cíclicas alucinantes, verá por qué elegir la codificación correcta puede ser tan importante como elegir el algoritmo perfecto.

Ilustración de dibujos animados de dos figuras abrazándose, con las letras
Todas las imágenes fueron creadas por el autor con Canva Pro. Optimizadas para dispositivos móviles; pueden verse demasiado grandes en computadoras de escritorio.

Antes de analizar nuestro conjunto de datos y métodos de codificación, tomémonos un momento para comprender qué son los datos categóricos y por qué necesitan un tratamiento especial en el mundo del aprendizaje automático.

¿Qué son los datos categóricos?

Los datos categóricos son como las etiquetas descriptivas que utilizamos en la vida cotidiana. Representan características o cualidades que se pueden agrupar en categorías.

¿Por qué es necesario codificar los datos categóricos?

El problema es que la mayoría de los algoritmos de aprendizaje automático son como comedores selectivos: solo digieren números. No pueden entender directamente que “soleado” es diferente de “lluvioso”. Ahí es donde entra en juego la codificación. Es como traducir estas categorías a un lenguaje que las máquinas puedan entender y con el que puedan trabajar.

Tipos de datos categóricos

No todas las categorías son iguales. Generalmente, tenemos dos tipos:

  1. Nominal:Estas son categorías con Sin orden inherente.
    Ex: “La previsión meteorológica (soleado, nublado, lluvioso) es nominal. No existe una clasificación natural entre estas condiciones meteorológicas.
  2. Ordinal:Estas categorías tienen una orden significativa.
    Ex: La “temperatura” (muy baja, baja, alta, muy alta) es ordinal. Hay una progresión clara desde lo más frío hasta lo más caliente.
Dos paneles que comparan los tipos de datos nominales y ordinales. El panel nominal muestra una figura de dibujos animados con un paraguas bajo la lluvia, lo que ilustra el clima como una variable nominal con ejemplos como soleado, lluvioso o nublado. El panel ordinal muestra una figura sudando mientras come helado, lo que demuestra que la temperatura es una variable ordinal con ejemplos que van desde cálido a muy caluroso. Cada panel incluye una tabla con categorías de ejemplo.

¿Por qué preocuparse por la codificación adecuada?

  1. Conserva información importante en sus datos.
  2. Puede afectar significativamente el rendimiento de su modelo.
  3. Una codificación incorrecta puede introducir sesgos o relaciones no deseados.

Imagínese si codificáramos “soleado” como 1 y “lluvioso” como 2. ¡El modelo podría pensar que los días lluviosos son “mejores que” los días soleados, que no es lo que queremos!

Ahora que entendemos qué son los datos categóricos y por qué necesitan codificación, echemos un vistazo a nuestro conjunto de datos y veamos cómo podemos abordar sus variables categóricas utilizando seis métodos de codificación diferentes.

Utilicemos un conjunto de datos de golf simple para ilustrar nuestros métodos de codificación (que tiene principalmente columnas categóricas). Este conjunto de datos registra diversas condiciones climáticas y la concurrencia resultante en un campo de golf.

Tabla de datos meteorológicos que abarca del 25 de marzo al 5 de abril. Las columnas incluyen fecha, día, mes, temperatura (baja/alta/extrema), humedad (seca/húmeda), viento (sí/no), previsión (soleado/lluvioso/nublado) y un recuento. Los íconos de arriba representan tipos de datos. La tabla muestra diversas condiciones meteorológicas y la cantidad de visitantes correspondiente a lo largo de 12 días.
import pandas as pd
import numpy as np

data = {
'Date': ['03-25', '03-26', '03-27', '03-28', '03-29', '03-30', '03-31', '04-01', '04-02', '04-03', '04-04', '04-05'],
'Weekday': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri'],
'Month': ['Mar', 'Mar', 'Mar', 'Mar', 'Mar', 'Mar', 'Mar', 'Apr', 'Apr', 'Apr', 'Apr', 'Apr'],
'Temperature': ['High', 'Low', 'High', 'Extreme', 'Low', 'High', 'High', 'Low', 'High', 'Extreme', 'High', 'Low'],
'Humidity': ['Dry', 'Humid', 'Dry', 'Dry', 'Humid', 'Humid', 'Dry', 'Humid', 'Dry', 'Dry', 'Humid', 'Dry'],
'Wind': ['No', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes'],
'Outlook': ['sunny', 'rainy', 'overcast', 'sunny', 'rainy', 'overcast', 'sunny', 'rainy', 'sunny', 'overcast', 'sunny', 'rainy'],
'Crowdedness': [85, 30, 65, 45, 25, 90, 95, 35, 70, 50, 80, 45]
}
# Create a DataFrame from the dictionary
df = pd.DataFrame(data)

Como podemos ver, tenemos muchas variables categóricas. Nuestra tarea es codificar estas variables para que un modelo de aprendizaje automático pueda usarlas para predecir, por ejemplo, la afluencia de público en el campo de golf.

Vamos a entrar en materia.

La codificación de etiquetas asigna un entero único a cada categoría en una variable categórica.

Uso común 👍:Se utiliza a menudo para variables ordinales donde hay un orden claro para las categorías, como los niveles de educación (por ejemplo, primaria, secundaria, terciaria) o las calificaciones de productos (por ejemplo, 1 estrella, 2 estrellas, 3 estrellas).

En nuestro caso:Podríamos utilizar la codificación de etiquetas para la columna “Día de la semana” en nuestro conjunto de datos de golf. A cada día de la semana se le asignaría un número único (por ejemplo, lunes = 0, martes = 1, etc.). Sin embargo, debemos tener cuidado, ya que esto podría implicar que el domingo (6) es “mayor que” el sábado (5), lo que puede no ser significativo para nuestro análisis.

Dos columnas que muestran la codificación de los días de la semana. La columna de la izquierda muestra los días de lunes a viernes con los números correspondientes del 0 al 11. La columna de la derecha muestra los valores codificados del 0 al 6 que se repiten, donde 0 representa el lunes y 6 el domingo. Un icono de calendario arriba indica que se relacionan con los días de la semana.
# 1. Label Encoding for Weekday
df['Weekday_label'] = pd.factorize(df['Weekday'])[0]

La codificación One-Hot crea una nueva columna binaria para cada categoría en una variable categórica.

Uso común 👍:Se utiliza normalmente para variables nominales en las que no existe un orden inherente para las categorías. Es especialmente útil cuando se trabaja con variables que tienen una cantidad relativamente pequeña de categorías.

En nuestro caso:La codificación One-Hot sería ideal para nuestra columna “Perspectivas”. Crearíamos tres columnas nuevas: “Perspectivas_soleadas”, “Perspectivas_nubladas” y “Perspectivas_lluviosas”. Cada fila tendría un 1 en una de estas columnas y un 0 en las otras, lo que representaría las condiciones meteorológicas de ese día.

Dos columnas que muestran la codificación meteorológica. La columna de la izquierda muestra las condiciones meteorológicas (soleado, lluvioso, nublado) durante 12 días. La columna de la derecha muestra valores codificados one-hot: 3 subcolumnas para soleado, nublado y lluvioso, donde 1 indica la condición y 0 en caso contrario. Los íconos meteorológicos de arriba representan las tres condiciones.
# 2. One-Hot Encoding for Outlook
df = pd.get_dummies(df, columns=['Outlook'], prefix='Outlook', dtype=int)

La codificación binaria representa cada categoría como un número binario (0 y 1).

Uso común 👍:Se utiliza a menudo cuando solo hay dos categorías, principalmente en situaciones de sí o no.

En nuestro caso:Si bien nuestra columna “Viento” solo tiene dos categorías (Sí y No), podríamos usar la codificación binaria para demostrar la técnica. El resultado sería una sola columna binaria, donde una categoría (por ejemplo, No) se representa como 0 y la otra (Sí) como 1.

Dos columnas que muestran la codificación binaria. La columna de la izquierda muestra los valores “Sí” o “No” para 12 entradas. La columna de la derecha muestra los valores codificados: 1 para “Sí” y 0 para “No”. Un icono de viento arriba indica que es probable que esto represente la presencia de viento.
# 3. Binary Encoding for Wind
df['Wind_binary'] = (df['Wind'] == 'Yes').astype(int)

La codificación de destino reemplaza cada categoría con la media de la variable de destino para esa categoría.

Uso común 👍: Se utiliza cuando es probable que exista una relación entre la variable categórica y la variable de destino. Es especialmente útil para características de alta cardinalidad en conjuntos de datos con una cantidad razonable de filas.

En nuestro caso: Podríamos aplicar la codificación de destino a nuestra columna “Humedad”, utilizando “Concentración” como objetivo. Cada “Seco” o “Húmedo” en la columna “Ventoso” se reemplazaría con la concentración promedio observada para los días húmedos y secos respectivamente.

La imagen muestra la codificación de destino para la humedad. La columna de la izquierda indica “Seco” o “Húmedo” con la cantidad de visitantes correspondiente. La columna de la derecha reemplaza “Seco” con 65 (promedio de visitantes en días secos) y “Húmedo” con 52 (promedio en días húmedos). Los íconos de arriba indican la humedad y la cantidad de visitantes.
# 4. Target Encoding for Humidity
df['Humidity_target'] = df.groupby('Humidity')['Crowdedness'].transform('mean')

La codificación ordinal asigna números enteros ordenados a categorías ordinales en función de su orden inherente.

Uso común 👍: Somos nosotrosed para variables ordinales donde el orden de las categorías es significativo y desea preservar esta información de orden.

En nuestro caso:La codificación ordinal es perfecta para nuestra columna “Temperatura”. Podríamos asignar números enteros para representar el orden: Bajo = 1, Alto = 2, Extremo = 3. Esto preserva el orden natural de las categorías de temperatura.

La imagen muestra la codificación ordinal de la temperatura. La columna de la izquierda muestra las temperaturas como “Baja”, “Alta” o “Extrema” para 12 entradas. La columna de la derecha muestra los valores codificados: 1 para “Baja”, 2 para “Alta” y 3 para “Extrema”. Un icono de sol arriba indica que esto representa los niveles de temperatura.
# 5. Ordinal Encoding for Temperature
temp_order = {'Low': 1, 'High': 2, 'Extreme': 3}
df['Temperature_ordinal'] = df['Temperature'].map(temp_order)

La codificación cíclica transforma una variable categórica cíclica en dos características numéricas que preservan la naturaleza cíclica de la variable. Normalmente, utiliza transformaciones de seno y coseno para representar el patrón cíclico. Por ejemplo, para la columna “Mes”, primero la convertiríamos en numérica (1–12) y luego crearíamos dos nuevas características:

  • Mes_cos = cos(2 π (metro — 1) / 12)
  • Mes_sin = sin(2 π (metro — 1) / 12)

dónde metro Es un número del 1 al 12 que representa de enero a diciembre.

Diagrama circular que representa la codificación cíclica del tiempo. Un círculo con 12 puntos etiquetados del 1 al 12 en el sentido de las agujas del reloj, similar a la esfera de un reloj. El punto 3 está resaltado, con sus coordenadas (0,5, 0,866) calculadas mediante las funciones coseno y seno. La fórmula (cos(2π(3–1)/12), sin(2π(3–1)/12)) se muestra arriba, demostrando cómo se deriva la posición a partir del número de la hora.
Imaginemos que la codificación es la coordenada (x,y) de este extraño reloj, comenzando del 1 al 12. Para preservar el orden cíclico, necesitamos representarlas usando dos columnas en lugar de una.

Uso común:Se utiliza para variables categóricas que tienen un orden cíclico natural, como los días de la semana, los meses del año o las horas del día. La codificación cíclica es particularmente útil cuando la “distancia” entre categorías es importante y se repite (por ejemplo, la distancia entre diciembre y enero debe ser pequeña, al igual que la distancia entre cualquier otro mes consecutivo).

En nuestro caso:En nuestro conjunto de datos de golf, la mejor columna para la codificación cíclica sería la columna “Mes”. Los meses tienen un patrón cíclico claro que se repite todos los años. Esto podría ser particularmente útil para nuestro conjunto de datos de golf, ya que capturaría patrones estacionales en la actividad de golf que podrían repetirse anualmente. Así es como podríamos aplicarlo:

La imagen muestra la codificación cíclica de los meses. La columna de la izquierda enumera los meses (marzo, abril) para 12 entradas. La columna del medio asigna números (3 para marzo, 4 para abril). Las columnas de la derecha muestran los valores de seno y coseno calculados con las fórmulas seno(2π(m-1)/12) y cosno(2π(m-1)/12), donde m es el número del mes. Esto crea una representación cíclica de los meses, con los valores de marzo en (0,866, 0,5) y abril en (1, 0).
# 6. Cyclic Encoding for Month
month_order = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
df['Month_num'] = df['Month'].map(month_order)
df['Month_sin'] = np.sin(2 * np.pi * (df['Month_num']-1) / 12)
df['Month_cos'] = np.cos(2 * np.pi * (df['Month_num']-1) / 12)

¡Y ahí lo tienes! Seis formas diferentes de codificar datos categóricos, todas aplicadas a nuestro conjunto de datos de campos de golf. ¡Ahora, todas las categorías se transforman en números!

Recapitulemos cómo cada método abordó nuestros datos:

  1. Codificación de etiquetas:Convertimos nuestro “día de la semana” en números, haciendo que el lunes sea 0 y el domingo 6: simple pero potencialmente engañoso.
  2. Codificación One-Hot:Le dio a ‘Outlook’ sus propias columnas, permitiendo que ‘soleado’, ‘nublado’ y ‘lluvioso’ se mantengan independientemente.
  3. Codificación binaria:Comprimimos nuestra ‘Humedad’ en un código binario eficiente, ahorrando espacio sin perder información.
  4. Codificación de destino:Se reemplazaron las categorías “Ventoso” por “Hacinamiento” promedio, capturando relaciones ocultas.
  5. Codificación ordinal:Respeta el orden natural de ‘Temperatura’, de ‘Muy Baja’ a ‘Muy Alta’.
  6. Codificación cíclica:Se transformó ‘Mes’ en componentes seno y coseno, conservando su naturaleza circular.

No existe una solución única para la codificación categórica. El mejor método depende de los datos específicos, la naturaleza de las categorías y los requisitos del modelo de aprendizaje automático.

La codificación de datos categóricos puede parecer un pequeño paso en el gran esquema de un proyecto de aprendizaje automático, pero a menudo son estos detalles aparentemente menores los que pueden determinar el rendimiento de un modelo.