Ответ
Плюсы:
- Сохранение связи с целью: Кодирует категориальный признак числовым значением, напрямую отражающим среднее значение целевой переменной для каждой категории. Это мощный сигнал для моделей.
- Эффективность при многих категориях: Не увеличивает размерность данных, в отличие от 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)