Target Encoding

Escrito por

en

Codificación de Variables Categóricas Utilizando la Variable Objetivo

En Data Science y Machine Learning, las variables categóricas representan una parte importante de los datos utilizados para construir modelos predictivos. Aunque técnicas como One-Hot Encoding y Label Encoding permiten convertir categorías en valores numéricos, presentan limitaciones cuando una variable contiene un gran número de categorías distintas.

Por ejemplo, una variable como:

  • Código postal.
  • Ciudad.
  • Producto.
  • Cliente.
  • Categoría de anuncio.

Puede contener cientos o incluso miles de valores únicos. En estos casos, One-Hot Encoding puede generar un número excesivo de columnas, mientras que Label Encoding puede introducir relaciones artificiales entre categorías. Para resolver este problema se utiliza Target Encoding, una técnica que reemplaza cada categoría por una estadística calculada a partir de la variable objetivo (target variable).

Esta metodología permite capturar información predictiva de forma compacta y suele ofrecer excelentes resultados en problemas de clasificación y regresión.

¿Qué es Target Encoding?

Target Encoding es una técnica de codificación que transforma una variable categórica sustituyendo cada categoría por una medida estadística calculada sobre la variable objetivo. En problemas de clasificación binaria, la estadística más utilizada es la media de la variable objetivo para cada categoría.

Por ejemplo, si la variable objetivo indica si un cliente realiza una compra:

Compra
0 = No
1 = Sí

Cada categoría será reemplazada por la probabilidad media de compra asociada a dicha categoría. De esta forma, la variable categórica se convierte en una variable numérica que incorpora información directamente relacionada con el objetivo del modelo.

¿Cómo Funciona?

El procedimiento general consiste en:

  1. Agrupar los datos por categoría.
  2. Calcular una estadística de la variable objetivo para cada grupo.
  3. Sustituir cada categoría por el valor obtenido.

En clasificación binaria suele utilizarse:

$$TE(c)=\frac{\sum y_i}{n_c}$$

Donde:

  • TE(c) es el valor codificado de la categoría.
  • yi representa los valores de la variable objetivo.
  • nc representa el número de observaciones de la categoría.

El resultado corresponde a la media de la variable objetivo para cada categoría.

Ejemplo Práctico

Supongamos una variable denominada “Canal de Marketing”:

CanalCompra
Email1
Email1
Email0
Redes Sociales0
Redes Sociales0
Redes Sociales1
SEO1
SEO1

Calculamos la media de la variable objetivo para cada canal:

CanalTasa de Compra
Email0.67
Redes Sociales0.33
SEO1.00

Tras aplicar Target Encoding:

Canal Codificado
0.67
0.67
0.67
0.33
0.33
0.33
1.00
1.00

Ahora la variable contiene información predictiva relacionada con la probabilidad de compra.

Target Encoding en Problemas de Regresión

En problemas de regresión no existe una variable objetivo binaria. En este caso suele utilizarse la media de la variable objetivo.

Por ejemplo:

CiudadVentas
Madrid500
Madrid600
Barcelona300
Barcelona400

Las medias serían:

CiudadMedia Ventas
Madrid550
Barcelona350

Estas medias reemplazan las categorías originales.

Beneficios de Target Encoding

  • Reduce significativamente la dimensionalidad.
  • Captura información predictiva de la variable objetivo.
  • Funciona muy bien con variables de alta cardinalidad.
  • Evita la explosión de columnas generada por One-Hot Encoding.
  • Puede mejorar el rendimiento de numerosos modelos.
  • Produce variables numéricas compactas.
  • Resulta especialmente útil en conjuntos de datos tabulares.

¿Cuándo Utilizar Target Encoding?

  • Existen muchas categorías distintas.
  • One-Hot Encoding genera demasiadas columnas.
  • Se trabaja con variables de alta cardinalidad.
  • La variable categórica tiene relación con el objetivo.
  • Se utilizan modelos de Machine Learning supervisados.

Ventajas

  • Reduce la dimensionalidad.
  • Conserva información relevante para la predicción.
  • Escala bien con miles de categorías.
  • Genera variables numéricas fáciles de utilizar.
  • Suele mejorar el rendimiento de modelos tabulares.
  • Compatible con numerosos algoritmos.
  • Requiere menos memoria que One-Hot Encoding.

Desventajas

  • Puede provocar sobreajuste (overfitting).
  • Utiliza información de la variable objetivo.
  • Requiere una implementación cuidadosa.
  • Es más complejo que One-Hot Encoding.
  • Puede producir codificaciones inestables en categorías poco frecuentes.

Data Leakage y Riesgo de Sobreajuste en Target Encoding

Aunque Target Encoding puede ofrecer un gran poder predictivo, también introduce un riesgo importante: el uso indebido de información de la variable objetivo durante el proceso de codificación.

Si las medias de cada categoría se calculan utilizando todas las observaciones disponibles, cada registro puede terminar incorporando información procedente de sí mismo. Este fenómeno se conoce como Data Leakage o fuga de información.

Por ejemplo, supongamos la siguiente categoría:

CiudadCompra
A1

Si la media de compra para Valencia se calcula utilizando este único registro, la codificación resultante será:

Valencia → 1.00

En este caso, el modelo podría memorizar directamente el resultado en lugar de aprender patrones generalizables, aumentando el riesgo de sobreajuste (overfitting). Para minimizar este problema se utilizan técnicas como la validación cruzada y el suavizado estadístico.

Validación Cruzada para Target Encoding

La validación cruzada (Cross Validation Encoding) es una estrategia que permite calcular las codificaciones evitando que una observación participe en el cálculo de su propio valor transformado.

El procedimiento consiste en:

  1. Dividir el conjunto de datos en varios subconjuntos o folds.
  2. Calcular las medias de cada categoría utilizando únicamente los folds de entrenamiento.
  3. Aplicar dichas medias sobre el fold de validación correspondiente.
  4. Repetir el proceso para todos los folds.

De esta forma, cada observación recibe una codificación generada a partir de datos que no incluyen su propio valor objetivo. Entre sus principales beneficios destacan:

  • Reduce significativamente el riesgo de data leakage.
  • Disminuye el sobreajuste.
  • Genera codificaciones más realistas.
  • Mejora la capacidad de generalización del modelo.

Esta técnica es considerada una buena práctica cuando se utiliza Target Encoding en proyectos reales de Machine Learning.

Suavizado Estadístico (Smoothing)

Otro problema habitual aparece cuando una categoría posee muy pocas observaciones. Supongamos el siguiente ejemplo:

CiudadCompra
Madrid1
Madrid1
Madrid0
Valencia1

Las medias serían:

CiudadMedia
Madrid0.67
Valencia1.00

Aunque Valencia presenta una tasa de compra del 100%, esta conclusión se basa únicamente en un único registro, por lo que resulta poco fiable. Para evitar este problema, se utiliza el Suavizado Estadístico (Smoothing), que combina la media de la categoría con la media global del conjunto de datos. La fórmula más habitual es:

TE=nyˉc+myˉn+mTE=\frac{n\cdot\bar{y}_c+m\cdot\bar{y}}{n+m}

Donde:

  • n es el número de observaciones de la categoría.
  • ȳc es la media de la categoría.
  • ȳ es la media global del conjunto de datos.
  • m es el parámetro de suavizado.

El efecto es el siguiente:

  • Las categorías con muchos registros mantienen una codificación cercana a su media real.
  • Las categorías con pocos registros se acercan a la media global.
  • Se reducen los valores extremos poco fiables.
  • Se mejora la estabilidad de la transformación.

Implementación en Python de la Validación Cruzada para Target Encoding

Una forma sencilla de evitar data leakage consiste en generar las codificaciones utilizando únicamente información procedente de otros subconjuntos de entrenamiento.

Ejemplo con K-Fold Cross Validation

import pandas as pd
from sklearn.model_selection import KFold

df = pd.DataFrame({
    "ciudad": [
        "Madrid", "Madrid", "Barcelona",
        "Valencia", "Madrid", "Barcelona",
        "Valencia", "Sevilla"
    ],
    "compra": [1, 0, 1, 0, 1, 1, 1, 0]
})

kf = KFold(
    n_splits=5,
    shuffle=True,
    random_state=42
)

df["ciudad_te_cv"] = 0.0

for train_idx, valid_idx in kf.split(df):

    train_fold = df.iloc[train_idx]
    valid_fold = df.iloc[valid_idx]

    target_mean = train_fold.groupby(
        "ciudad"
    )["compra"].mean()

    df.loc[valid_idx, "ciudad_te_cv"] = (
        valid_fold["ciudad"]
        .map(target_mean)
    )

# Rellenar categorías no vistas
global_mean = df["compra"].mean()

df["ciudad_te_cv"] = (
    df["ciudad_te_cv"]
    .fillna(global_mean)
)

print(df)

Utilizando Category Encoders

La librería category_encoders permite implementar estrategias más avanzadas.

from category_encoders import TargetEncoder
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

encoder = TargetEncoder()

X_encoded = encoder.fit_transform(X, y)

Sin embargo, para evitar fugas de información, lo ideal es integrar la codificación dentro de un Pipeline y aplicar validación cruzada durante el entrenamiento.

Implementación en Python del Suavizado Estadístico (Smoothing)

Implementación Manual

Supongamos una variable categórica llamada “ciudad”.

import pandas as pd

df = pd.DataFrame({
    "ciudad": [
        "Madrid", "Madrid", "Madrid",
        "Valencia", "Sevilla"
    ],
    "compra": [1, 0, 1, 1, 0]
})

global_mean = df["compra"].mean()

m = 5

stats = df.groupby("ciudad")["compra"].agg(
    ["mean", "count"]
)

stats["target_encoded"] = (
    (
        stats["count"] * stats["mean"]
    )
    +
    (
        m * global_mean
    )
) / (
    stats["count"] + m
)

print(stats)

Resultado Conceptual

CiudadMedia OriginalMedia Suavizada
Madrid0.670.63
Valencia1.000.57
Sevilla0.000.43

Observa que:

  • Madrid mantiene una codificación cercana a su media real.
  • Valencia y Sevilla se acercan a la media global porque tienen muy pocos registros.

Aplicación del Suavizado al Dataset

import pandas as pd

global_mean = df["compra"].mean()

m = 5

stats = df.groupby("ciudad")["compra"].agg(
    ["mean", "count"]
)

stats["encoded"] = (
    (
        stats["count"] * stats["mean"]
    )
    +
    (
        m * global_mean
    )
) / (
    stats["count"] + m
)

encoding_map = stats["encoded"]

df["ciudad_te"] = df["ciudad"].map(
    encoding_map
)

print(df)

Utilizando Smoothing con Category Encoders

La librería category_encoders incorpora suavizado automáticamente.

from category_encoders import TargetEncoder

encoder = TargetEncoder(
    smoothing=10
)

X_encoded = encoder.fit_transform(
    X,
    y
)

Ajustando el Nivel de Suavizado

from category_encoders import TargetEncoder

encoder = TargetEncoder(
    min_samples_leaf=20,
    smoothing=10
)

Donde:

  • min_samples_leaf controla el número mínimo de observaciones necesarias para confiar en una categoría.
  • smoothing controla cuánto se acerca la codificación a la media global.

Implementación Recomendada en Producción

La práctica recomendada consiste en combinar:

  • Validación cruzada.
  • Suavizado estadístico.
  • Pipeline de Machine Learning.
from category_encoders import TargetEncoder
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

pipeline = Pipeline([
    (
        "target_encoding",
        TargetEncoder(
            smoothing=10
        )
    ),
    (
        "model",
        RandomForestClassifier()
    )
])

pipeline.fit(X_train, y_train)

Esta estrategia reduce el riesgo de data leakage, mejora la generalización y genera codificaciones más estables para categorías poco frecuentes.

Buenas prácticas al utilizar target encoding

Para obtener resultados robustos es recomendable:

  • Aplicar Target Encoding únicamente sobre variables relevantes.
  • Utilizar validación cruzada para evitar fugas de información.
  • Incorporar suavizado estadístico para categorías poco frecuentes.
  • Ajustar la codificación únicamente con los datos de entrenamiento.
  • Evaluar el riesgo de sobreajuste durante la validación del modelo.
  • Comparar el rendimiento frente a otras técnicas como One-Hot Encoding o Frequency Encoding.

La combinación de Cross Validation Encoding y Smoothing se considera actualmente el enfoque más seguro y eficaz para aplicar Target Encoding en proyectos de Machine Learning reales.

Humanize 456 words

Comparación con Otras Técnicas de Codificación

CaracterísticaLabel EncodingOne-Hot EncodingTarget Encoding
Aumenta dimensionalidadNoNo
Utiliza la variable objetivoNoNo
Adecuado para alta cardinalidadNo
Riesgo de overfittingBajoBajoAlto
Captura información predictivaNoNo
ComplejidadBajaBajaMedia

Aplicaciones en Data Science y Machine Learning

Target Encoding se utiliza frecuentemente en:

  • Modelos de clasificación.
  • Modelos de regresión.
  • Predicción de abandono de clientes.
  • Sistemas de recomendación.
  • Marketing digital.
  • Scoring crediticio.
  • Detección de fraude.
  • Competiciones de Machine Learning.
  • Modelos tabulares de alto rendimiento.

Ha sido ampliamente utilizado en competiciones de Kaggle debido a su capacidad para mejorar el rendimiento predictivo en variables de alta cardinalidad.

Implementación en Python

Implementación Manual con Pandas

import pandas as pd

df = pd.DataFrame({
    "canal": [
        "Email",
        "Email",
        "SEO",
        "SEO",
        "Redes"
    ],
    "compra": [1, 0, 1, 1, 0]
})

media_target = df.groupby(
    "canal"
)["compra"].mean()

df["canal_encoded"] = df["canal"].map(
    media_target
)

print(df)
   canal  compra  canal_encoded
0  Email       1            0.5
1  Email       0            0.5
2    SEO       1            1.0
3    SEO       1            1.0
4  Redes       0            0.0

Utilizando Category Encoders

from category_encoders import TargetEncoder

encoder = TargetEncoder()

X_encoded = encoder.fit_transform(
    X,
    y
)

Aplicación sobre Varias Variables

from category_encoders import TargetEncoder

encoder = TargetEncoder(
    cols=["ciudad", "producto"]
)

X_encoded = encoder.fit_transform(
    X,
    y
)

Uso dentro de un Pipeline

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from category_encoders import TargetEncoder

pipeline = Pipeline([
    (
        "encoding",
        TargetEncoder()
    ),
    (
        "model",
        RandomForestClassifier()
    )
])

pipeline.fit(X_train, y_train)

Buenas Prácticas

  • Aplicarlo principalmente a variables de alta cardinalidad.
  • Utilizar técnicas de suavizado.
  • Evitar calcular las codificaciones utilizando datos de prueba.
  • Implementar validación cruzada para reducir el riesgo de sobreajuste.
  • Comparar los resultados con One-Hot Encoding.
  • Monitorizar posibles problemas de data leakage.

Conclusión

Target Encoding es una técnica avanzada de codificación que transforma variables categóricas utilizando información procedente de la variable objetivo. Gracias a su capacidad para capturar relaciones predictivas y reducir la dimensionalidad, se ha convertido en una herramienta muy valiosa para trabajar con variables de alta cardinalidad en problemas de clasificación y regresión.

Aunque requiere una implementación cuidadosa para evitar problemas de sobreajuste y fuga de información, puede ofrecer mejoras significativas respecto a técnicas tradicionales como One-Hot Encoding o Label Encoding. Por ello, forma parte del conjunto de transformaciones más utilizadas en proyectos modernos de Data Science y Machine Learning orientados al máximo rendimiento predictivo.