Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Scikit-learn desde cero, Unidad 4 — Preprocesado de datos, 4.2 — Variables categóricas ·

OneHotEncoder

OneHotEncoder: Transformando variables categóricas para machine learning

Introducción

Cuando trabajamos con datos en machine learning, las variables categóricas pueden ser un desafío. Estas variables representan atributos que no tienen una orden natural o una escala numérica, como colores, géneros, o tipos de productos. La mayoría de los algoritmos de aprendizaje automático requieren que los datos estén en formato numérico para procesarlos. Por lo tanto, es necesario transformar estas variables categóricas a una forma que el modelo pueda entender.

El OneHotEncoder de scikit-learn es una herramienta útil para esta tarea. Esta transformación codifica cada categoría como un vector binario (0 o 1), donde solo uno de los valores se establece en 1 y los demás en 0. Esto permite que el modelo interprete las categorías sin asumir ninguna relación ordenada entre ellas.

Explicación principal

La transformación OneHotEncoder es especialmente útil cuando las variables categóricas tienen muchas posibles etiquetas (como estados de unión, tipos de productos, etc.). Es una forma efectiva de representar estas variables sin asumir que el orden de las categorías tiene algún significado numérico.

Ejemplo práctico

Supongamos que estamos trabajando con un conjunto de datos donde la variable color tiene tres posibles valores: "rojo", "azul" y "verde". Podemos transformar esta variable en una forma numérica utilizando OneHotEncoder.

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

# Ejemplo de DataFrame con datos categóricos
df = pd.DataFrame({
    'color': ['rojo', 'azul', 'verde', 'rojo', 'azul']
})

# Crear el encoder
encoder = OneHotEncoder()

# Ajustar y transformar los datos
encoded_data = encoder.fit_transform(df[['color']])

# Convertir a DataFrame para mejor visualización
df_encoded = pd.DataFrame(encoded_data.toarray(), columns=encoder.get_feature_names_out(['color']))

print(df_encoded)

La salida sería algo así:

   color_rojo  color_azul  color_verde
0          1           0            0
1          0           1            0
2          0           0            1
3          1           0            0
4          0           1            0

Cada columna ahora representa una de las posibles categorías, y solo la columna correspondiente a la categoría presente para cada fila se establecerá en 1.

Errores típicos / trampas

Trampa 1: Ignorar la cardinalidad alta

Las variables categóricas con muchas posibles etiquetas pueden generar un gran número de nuevas columnas, lo que puede llevar a la dimensionalidad excesiva. Es importante considerar si es necesario codificar todas las categorías o si una estrategia como OrdinalEncoder podría ser más adecuada.

Trampa 2: No ajustar el encoder

Es común cometer el error de aplicar el mismo OneHotEncoder a los datos de entrenamiento y prueba sin reajustarlo. Esto puede llevar a una fuga de datos, donde la transformación se basa en información del conjunto de pruebas.

# Ejemplo incorrecto
encoder = OneHotEncoder()
encoder.fit(df[['color']])
df_test_encoded = encoder.transform(df_test[['color']])

Trampa 3: Ignorar las etiquetas categóricas

Es crucial asegurarse de que todas las categorías en los datos de prueba estén presentes y codificadas correctamente. Si una categoría no está presente en el conjunto de entrenamiento, el OneHotEncoder generará un error.

# Ejemplo incorrecto
encoder = OneHotEncoder()
encoder.fit(df[['color']])
df_new_encoded = encoder.transform(pd.DataFrame({'color': ['rojo', 'azul', 'naranja']}))

Trampa 4: No utilizar fit_transform para datos de prueba

Es importante aplicar la misma transformación a los datos de prueba que se utilizó en el conjunto de entrenamiento. Utilizar transform en lugar de fit_transform asegura que se aplica la misma transformación.

# Ejemplo correcto
encoder = OneHotEncoder()
encoder.fit(df[['color']])
df_test_encoded = encoder.transform(df_test[['color']])

Checklist accionable

  1. Asegúrate de importar las bibliotecas necesarias: pandas y sklearn.preprocessing.
  2. Crear un DataFrame con los datos categóricos que desees transformar.
  3. Inicializar el OneHotEncoder.
  4. Usa fit_transform para ajustar y transformar los datos de entrenamiento.
  5. Utiliza transform en lugar de fit_transform para aplicar la misma transformación a los datos de prueba.
  6. Verifica que todas las categorías presentes en los datos de prueba estén codificadas correctamente.

Cierre

El OneHotEncoder es una herramienta poderosa y flexible para manejar variables categóricas en machine learning con scikit-learn. Sin embargo, es importante estar atento a algunas trampas comunes para evitar errores en el proceso de transformación.

Siguientes pasos

  1. Experimenta con diferentes métodos de codificación para ver qué funciona mejor en tu conjunto de datos.
  2. Aprende sobre otras técnicas de preprocesamiento como OrdinalEncoder y LabelEncoder.
  3. Específicamente, considera el uso de get_dummies de pandas si estás trabajando con pequeños conjuntos de datos.

Transformar variables categóricas es solo el primer paso en el camino hacia modelos de machine learning robustos y precisos. ¡Sigue aprendiendo y practicando para mejorar tus habilidades!

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).