Какие плюсы и минусы target encoding?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Target Encoding: плюсы и минусы
Определение
Target Encoding (Mean Encoding) — способ кодирования категориальных переменных путём замены их на среднее значение целевой переменной.
City | Mean Target
Paris | 0.8
London | 0.5
Berlin | 0.2
Как работает
target_mean = df.groupby('city')['target'].mean()
df['city_encoded'] = df['city'].map(target_mean)
Плюсы Target Encoding
1. Высокая информативность
Target encoding напрямую использует информацию о целевой переменной, в отличие от one-hot encoding.
2. Уменьшение размерности
Оne-hot encoding: 100 категорий → 100 новых признаков
Target encoding: 100 категорий → 1 признак
3. Быстрое обучение модели
Меньше признаков → быстрее обучаются деревья (XGBoost, LightGBM)
One-hot: ~5 сек
Target: ~0.5 сек (в 10 раз быстрее)
4. Хорошо с высокой cardinality
User ID: 1,000,000 уникальных значений
One-hot: 1,000,000 новых признаков → crash памяти
Target encoding: 1 признак → работает отлично
5. Не предполагает порядок
в отличие от ordinal encoding, target encoding использует фактическую связь с целевой переменной.
Минусы Target Encoding
1. Утечка данных (Leakage) — ГЛАВНАЯ ПРОБЛЕМА
ПЛОХО: кодируем на всех данных
df['city_encoded'] = df['city'].map(df.groupby('city')['target'].mean())
ХОРОШО: кодируем раздельно на train и test
train_mapping = train_df.groupby('city')['target'].mean()
train_df['city_encoded'] = train_df['city'].map(train_mapping)
test_df['city_encoded'] = test_df['city'].map(train_mapping)
2. Утечка при кросс-валидации
ПЛОХО: target encoding на всех данных перед CV
ХОРОШО: кодируем ВНУТРИ каждого fold кросс-валидации
Используем category_encoders.TargetEncoder
3. Переобучение на редких категориях
Примеры кодирования:
Paris: 100 примеров → среднее = 0.6 (надёжно)
Berlin: 2 примера → среднее = 1.0 (случайность?)
Решение: Smoothing (сглаживание)
target_mean_smoothed = (count * target_mean + global_mean) / (count + smoothing)
4. Проблемы с интерпретируемостью
Feature importance показывает что city_encoded важен, но сложно объяснить почему.
5. Категории в train могут отличаться от test
Train: города = [Paris, London, Berlin]
Test: города = [Paris, Rome] ← Rome не было в train!
Что делать с Rome?
Вариант 1: глобальное среднее
Вариант 2: NaN или ошибка
Правильное использование
from category_encoders import TargetEncoder
from sklearn.model_selection import KFold
encoder = TargetEncoder(cols=['city'])
kf = KFold(n_splits=5)
for train_idx, val_idx in kf.split(df):
X_train, X_val = df.iloc[train_idx], df.iloc[val_idx]
y_train, y_val = ...
encoder.fit(X_train, y_train)
X_train_encoded = encoder.transform(X_train)
X_val_encoded = encoder.transform(X_val)
model.fit(X_train_encoded, y_train)
Target Encoding vs One-Hot
One-hot:
- Нет утечки данных
- Легко обработать новые категории
- Интерпретируемо
- Много признаков для высокой cardinality
- Медленное обучение
Target encoding:
- Мало признаков
- Информативно
- Быстрое обучение
- Утечка данных (если неправильно)
- Переобучение на редких категориях
- Сложная интерпретируемость
Когда использовать
Target encoding ЕСЛИ:
- Много категорий (>50)
- Используешь XGBoost/LightGBM
- Внимательно обработаешь leakage
One-hot IF:
- Мало категорий (<50)
- Нужна интерпретируемость
- Используешь линейную модель