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

Что такое one-hot encoding и target encoding?

1.2 Junior🔥 201 комментариев
#Pandas и обработка данных#Машинное обучение

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

One-hot encoding и Target encoding

One-hot encoding

One-hot encoding — это техника преобразования категориальных переменных в числовой формат, где каждая категория представляется отдельным столбцом с бинарными значениями (0 или 1). Каждая строка данных имеет ровно одну единицу в столбце, соответствующем её категории.

Когда использовать:

  • Деревья решений и ансамбли (XGBoost, Random Forest) — хорошо работают с one-hot
  • Линейные модели (логистическая регрессия) требуют one-hot для работы с категориями
  • Когда категорий немного (до 10-20)

Пример:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

data = pd.DataFrame({
    "color": ["red", "blue", "green", "red", "blue"],
    "price": [100, 200, 150, 110, 210]
})

# Способ 1: pandas get_dummies
encoded = pd.get_dummies(data, columns=["color"], drop_first=True)
print(encoded)
# color_green  color_red  price
#           0         1    100
#           0         0    200
#           1         0    150
#           0         1    110
#           0         0    210

# Способ 2: sklearn OneHotEncoder
encoder = OneHotEncoder(sparse_output=False, drop="first")
encoded = encoder.fit_transform(data[["color"]])
print(encoded)

Минусы:

  • Curse of dimensionality: если категорий много, количество столбцов растёт экспоненциально
  • Мультиколлинеарность: столбцы сильно коррелированы (если у всех категорий есть столбцы)
  • Требует больше памяти и увеличивает время обучения

Target encoding (Mean encoding)

Target encoding — это метод кодирования категорий на основе целевой переменной. Каждая категория заменяется на среднее значение целевой переменной для этой категории. Это особенно полезно для задач регрессии и классификации.

Когда использовать:

  • Когда категорий много (сотни или тысячи)
  • Для нейросетей и всех типов моделей
  • Когда есть связь между категорией и целевой переменной
  • Когда нужно избежать проклятия размерности

Пример:

import pandas as pd
import numpy as np

data = pd.DataFrame({
    "city": ["Moscow", "SPB", "Moscow", "Ekaterinburg", "SPB", "Moscow"],
    "target": [1, 0, 1, 1, 0, 1]
})

# Target encoding: заменяем город на средний target
target_mean = data.groupby("city")["target"].mean()
print(target_mean)
# city
# Ekaterinburg    1.0
# Moscow          0.666667
# SPB             0.0

data["city_encoded"] = data["city"].map(target_mean)
print(data)
#          city  target  city_encoded
#       Moscow       1       0.666667
#          SPB       0       0.000000
#       Moscow       1       0.666667
# Ekaterinburg       1       1.000000
#          SPB       0       0.000000
#       Moscow       1       0.666667

Важные отличия:

ПараметрOne-hotTarget encoding
РазмерРастёт с количеством категорийОстаётся 1 столбец
Информация о целевой переменнойНетДа, встроена в кодирование
ПереобучениеНетВозможно, если категорий мало
Для категорий с 1 примеромБезопасноНужно сглаживание (smoothing)

Сглаживание (Smoothing) для Target Encoding

Если категория встречается редко, её среднее значение может быть нестабильным. Используют сглаживание:

# Сглаживание: target_mean = (count * mean + smoothing * global_mean) / (count + smoothing)

global_mean = data["target"].mean()
counts = data.groupby("city")["target"].count()
target_mean = data.groupby("city")["target"].mean()

smoothness = 10  # гиперпараметр
smoothened = (counts * target_mean + smoothness * global_mean) / (counts + smoothness)

print(smoothened)
# city
# Ekaterinburg    0.636364
# Moscow          0.636364
# SPB             0.363636

Практические рекомендации:

  1. Используй one-hot для категориальных переменных в древовидных моделях и когда категорий мало
  2. Используй target encoding для моделей, чувствительных к размерности, и когда категорий много
  3. Cross-validation обязателен при target encoding, чтобы избежать leakage
  4. Сравнивай оба метода на валидационном наборе и выбирай лучший

Выбор между ними зависит от типа модели, объёма данных и количества категорий. В практических задачах часто экспериментируют с обоими подходами для поиска оптимального решения.