Aprender a convertir texto, etiquetas y categorías en números que los modelos pueden entender—sin introducir sesgos o distorsiones.
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.
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).
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:
⚠️ Desventajas:
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:
⚠️ Riesgos:
✅ Solución: Usar validación cruzada o agregar ruido.
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()
Conjunto de datos: fraud_clean.csv (del módulo anterior)
Tareas:
nivel_riesgo (asume que es ordinal: "Bajo", "Medio", "Alto").tipo_tarjeta y pais. Usar drop='first'.ciudad (usar solo el conjunto de entrenamiento para calcular medias—¡evitar filtración de datos!).OrdinalEncoder para variables ordinales (mejor que LabelEncoder para múltiples columnas).