6 · Target encoding y frequency encoding
Cuando una variable categórica es de alta cardinalidad Y tu objetivo lleva señal, codifica por la media del objetivo por categoría — pero solo después de dividir train/test o filtrarás la etiqueta.
Cuando una variable categórica es de alta cardinalidad Y tu objetivo lleva señal, codifica por la media del objetivo por categoría — pero solo después de dividir train/test o filtrarás la etiqueta.
Sin esto:
Sin target encoding, o explotas la dimensionalidad con OHE en 10,000 códigos postales o pierdes completamente la señal al codificar ordinalmente una variable nominal.
El one-hot encoding en una variable con 10,000 códigos postales únicos produce 10,000 columnas — la mayoría con casi exclusivamente ceros. Este es el problema de alta cardinalidad: OHE se vuelve intratable, y el ordinal encoding no tiene sentido para datos nominales.
El target (mean) encoding ofrece una alternativa poderosa: reemplaza cada categoría con el valor medio del objetivo dentro de ese grupo.
Para un problema de regresión con una variable ciudad y un objetivo ingresos:
- Los ingresos medios de Seattle = 82,000 → codifica Seattle como 82,000
- Los ingresos medios de Miami = 54,000 → codifica Miami como 54,000
Esto comprime toda la variable nominal en una única columna numérica rica en información — y la señal que captura (cómo cada grupo se relaciona con el objetivo) es exactamente lo que un modelo necesita.
Tres técnicas relacionadas:
- Mean (target) encoding: reemplaza la categoría con el valor medio del objetivo.
- Target-guided ordinal encoding: clasifica las categorías por la media del objetivo → asigna rango entero 0, 1, 2, … Es una versión más suave que evita usar las medias crudas como variables.
- Frequency encoding: reemplaza la categoría con la frecuencia con que aparece. Útil cuando la popularidad en sí es predictiva (un código postal raro puede ser ruidoso; uno popular puede ser el centro de una ciudad).
El truco: si calculas las medias usando el dataset COMPLETO incluyendo el conjunto de test, tienes data leakage — el modelo ve indirectamente las etiquetas de test durante el entrenamiento.
Python (in browser)
Mean target encoding: calcula la media del objetivo por grupo, luego `.map()` de vuelta. Una línea de pandas reemplaza una columna nominal de alta cardinalidad con una variable numérica densa y rica en información.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Ordinal guiado por objetivo: clasifica las categorías por la media ascendente del objetivo → rango entero 0, 1, 2, … Escala acotada, sin magnitud de media cruda — más robusto para objetivos sesgados.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`df['city'].map(df['city'].value_counts())` — frequency encoding en una línea. Agnóstico al objetivo (sin riesgo de leakage), captura la señal de popularidad. Funciona para tareas supervisadas y no supervisadas.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Media suavizada = (n × media_cat + α × media_global) / (n + α). Las categorías raras (n pequeño) se acercan a la media global; las frecuentes mantienen su media de grupo. Mayor α = mayor regularización.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La receta correcta de target encoding: codificación out-of-fold en K folds durante el entrenamiento; media del conjunto de entrenamiento completo para test. `sklearn.TargetEncoder` (≥ 1.3) implementa esto automáticamente.
Aplicas target encoding a una columna con 5 categorías raras que aparecen exactamente una vez cada una. Sin suavizado, ¿qué ocurre en tiempo de predicción con una fila nueva no vista?
- **Mean (target) encoding** reemplaza una categoría con su valor medio del objetivo — comprime categóricas de alta cardinalidad en una sola columna densa que captura directamente la señal a nivel de grupo.
- **Ordinal encoding guiado por objetivo** clasifica las categorías por la media del objetivo y asigna rangos enteros — una alternativa acotada y robusta que evita usar las medias crudas como variables.
- **Frequency encoding** reemplaza con el conteo de categoría — agnóstico al objetivo (sin riesgo de leakage), útil cuando la popularidad lleva señal, también funciona para tareas no supervisadas.
- **El suavizado** acerca las medias de categorías raras a la media global: (n × media_cat + α × media_global) / (n + α). Siempre suaviza cuando existen categorías de una sola observación.
- El target encoding ingenuo en el dataset completo es **data leakage**. Usa codificación out-of-fold con K folds durante el entrenamiento; `sklearn.preprocessing.TargetEncoder` (≥ 1.3) implementa esto de forma segura.
Las soluciones ganadoras de Kaggle en datos categóricos de alta cardinalidad (IDs de artículos, códigos postales, IDs de usuario) casi siempre involucran target o mean encoding. Los modelos de click-through rate en publicidad usan frecuentemente el frequency encoding porque la popularidad del anuncio (con qué frecuencia aparece un creativo) es en sí mismo un fuerte predictor del CTR futuro.
Si lo quitas: Los modelos de árbol en una columna de 10,000 categorías o explotan en memoria (con OHE) o nunca se dividen útilmente en las etiquetas de string crudas. El target encoding es el puente estándar entre datos nominales de alta cardinalidad y cualquier modelo de árbol o lineal.