Что такое one-hot encoding и target encoding?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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-hot | Target 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
Практические рекомендации:
- Используй one-hot для категориальных переменных в древовидных моделях и когда категорий мало
- Используй target encoding для моделей, чувствительных к размерности, и когда категорий много
- Cross-validation обязателен при target encoding, чтобы избежать leakage
- Сравнивай оба метода на валидационном наборе и выбирай лучший
Выбор между ними зависит от типа модели, объёма данных и количества категорий. В практических задачах часто экспериментируют с обоими подходами для поиска оптимального решения.