PREPROCESAMIENTO DE DATOS
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.
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:
- 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. - 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.
¿Por qué preocuparse por la codificación adecuada?
- Conserva información importante en sus datos.
- Puede afectar significativamente el rendimiento de su modelo.
- 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.
import pandas as pd
import numpy as npdata = {
'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.
# 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.
# 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.
# 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.
# 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.
# 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.
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:
# 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:
- 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.
- Codificación One-Hot:Le dio a ‘Outlook’ sus propias columnas, permitiendo que ‘soleado’, ‘nublado’ y ‘lluvioso’ se mantengan independientemente.
- Codificación binaria:Comprimimos nuestra ‘Humedad’ en un código binario eficiente, ahorrando espacio sin perder información.
- Codificación de destino:Se reemplazaron las categorías “Ventoso” por “Hacinamiento” promedio, capturando relaciones ocultas.
- Codificación ordinal:Respeta el orden natural de ‘Temperatura’, de ‘Muy Baja’ a ‘Muy Alta’.
- 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.