🧩 MÓDULO 2: "Traduciendo el Mundo Real: Codificación de Variables Categóricas"

Objetivo:

Aprender a convertir texto, etiquetas y categorías en números que los modelos pueden entender—sin introducir sesgos o distorsiones.


2.1 ¿Por qué Codificar?

Los algoritmos de ML (regresión, SVM, redes neuronales) solo entienden números. No pueden procesar "Visa", "Mastercard" o "España" directamente.

¡Pero cuidado! No se trata solo de asignar números arbitrarios. La forma en que codifiques afecta el rendimiento y la interpretación del modelo.


2.2 Codificación de Etiquetas (Label Encoding)

Asigna un entero único a cada categoría.

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['tipo_tarjeta_encoded'] = le.fit_transform(df['tipo_tarjeta'])

# Ejemplo: ["Visa", "Mastercard", "Amex"] → [0, 1, 2]

⚠️ Problema grave: Introduce un orden artificial. El modelo puede interpretar "2" > "1" > "0", como si "Amex" fuera "mejor" que "Visa". Esto es incorrecto si no existe un orden real.

Cuándo usar: Solo para variables ORDINALES (ej., "Bajo", "Medio", "Alto") o árboles de decisión (que no asumen orden lineal).


2.3 Codificación One-Hot

Crea una columna binaria (0/1) para cada categoría.

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

ohe = OneHotEncoder(sparse_output=False, drop='first')  # drop='first' evita la multicolinealidad
categorias_encoded = ohe.fit_transform(df[['tipo_tarjeta']])

# Convertir a DataFrame con nombres
df_ohe = pd.DataFrame(categorias_encoded, columns=ohe.get_feature_names_out(['tipo_tarjeta']))
df = pd.concat([df.reset_index(drop=True), df_ohe], axis=1)

Ventajas:

  • No introduce un orden falso.
  • Ideal para modelos lineales, SVM, redes neuronales.

⚠️ Desventajas:

  • Aumenta enormemente la dimensionalidad (50 países → 50 columnas).
  • Puede causar la "maldición de la dimensionalidad".

2.4 Codificación de Objetivo (Target Encoding)

Reemplaza cada categoría con la media de la variable objetivo para esa categoría.

# Ejemplo: tipo_tarjeta → media de "es_fraude" para ese tipo de tarjeta
target_mean = df.groupby('tipo_tarjeta')['es_fraude'].mean()
df['tipo_tarjeta_target_encoded'] = df['tipo_tarjeta'].map(target_mean)

Ventajas:

  • Captura información predictiva directamente.
  • No aumenta la dimensionalidad.

⚠️ Riesgos:

  • Filtración de datos si se calcula antes de dividir train/test.
  • Sobreajuste si una categoría tiene pocos ejemplos.

Solución: Usar validación cruzada o agregar ruido.


📊 Visualización: Comparando Codificaciones

fig, ax = plt.subplots(1, 3, figsize=(15, 5))

# Original
sns.countplot(data=df, x='tipo_tarjeta', ax=ax[0])
ax[0].set_title("Original")

# Codificación de Etiquetas
sns.histplot(df['tipo_tarjeta_encoded'], bins=3, ax=ax[1])
ax[1].set_title("Codificación de Etiquetas")

# One-Hot (mostrar una columna)
sns.histplot(df['tipo_tarjeta_Mastercard'], bins=2, ax=ax[2])
ax[2].set_title("One-Hot (ej., Mastercard)")

plt.tight_layout()
plt.show()

📝 Ejercicio 2.1: Codificación Inteligente

Conjunto de datos: fraud_clean.csv (del módulo anterior)

Tareas:

  1. Aplicar Codificación de Etiquetas a la columna nivel_riesgo (asume que es ordinal: "Bajo", "Medio", "Alto").
  2. Aplicar Codificación One-Hot a tipo_tarjeta y pais. Usar drop='first'.
  3. Aplicar Codificación de Objetivo a ciudad (usar solo el conjunto de entrenamiento para calcular medias—¡evitar filtración de datos!).
  4. Comparar la forma del DataFrame antes y después. ¿Cuántas columnas nuevas se crearon?
  5. Eliminar las columnas de texto originales (mantener solo las codificadas).

💡 Notas Adicionales:

  • Siempre codifica DESPUÉS de dividir train/test para evitar filtración de datos.
  • One-Hot es estándar para la mayoría de los modelos.
  • La Codificación de Objetivo es poderosa pero peligrosa. Úsala con precaución y validación cruzada.
  • Scikit-learn tiene OrdinalEncoder para variables ordinales (mejor que LabelEncoder para múltiples columnas).


Course Info

Course: AI-course1

Language: ES

Lesson: Module2