Какие плюсы и минусы у Target Encoding?

«Какие плюсы и минусы у Target Encoding?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Плюсы:

  • Сохранение связи с целью: Кодирует категориальный признак числовым значением, напрямую отражающим среднее значение целевой переменной для каждой категории. Это мощный сигнал для моделей.
  • Эффективность при многих категориях: Не увеличивает размерность данных, в отличие от One-Hot Encoding, что критично для признаков с сотнями уникальных значений.
  • Хорошая совместимость: Особенно эффективен для алгоритмов на основе деревьев (например, Gradient Boosting).

Минусы:

  • Риск утечки данных (переобучение): Если кодировать на всей выборке, информация о целевой переменной из обучающих данных «просачивается» в признаки. Это нужно предотвращать с помощью кодирования внутри цикла кросс-валидации.
  • Проблема редких категорий: Для категорий с малым числом примеров оценка среднего будет зашумленной. Решается сглаживанием (smoothing), которое смешивает среднее по категории с глобальным средним.
  • Обработка новых данных: Для категорий, не встреченных при обучении (OOV), требуется стратегия замены, например, на глобальное среднее.

Пример с использованием кросс-валидации и сглаживания:

import pandas as pd
from sklearn.model_selection import KFold
from category_encoders import TargetEncoder

# Имитация данных
df = pd.DataFrame({'city': ['A', 'B', 'A', 'C', 'B', 'C'], 'target': [10, 20, 12, 5, 22, 3]})

# Важно: кодируем внутри цикла CV для избежания утечки
df['city_encoded'] = 0
kf = KFold(n_splits=5, shuffle=True, random_state=42)

for train_idx, val_idx in kf.split(df):
    encoder = TargetEncoder(smoothing=2.0)
    df.loc[val_idx, 'city_encoded'] = encoder.fit_transform(
        df.loc[val_idx, 'city'],
        df.loc[train_idx, 'target']
    )

print(df)