← Назад к вопросам

Какие плюсы и минусы target encoding?

2.0 Middle🔥 141 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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)
  • Нужна интерпретируемость
  • Используешь линейную модель
Какие плюсы и минусы target encoding? | PrepBro