Ответ
Выбор кодирования категориальных признаков напрямую зависит от алгоритма.
One-Hot Encoding (OHE) предпочтителен для:
- Линейных моделей (линейная/логистическая регрессия, SVM с линейным ядром). Им необходимо, чтобы каждая категория была независимым признаком, иначе модель может ошибочно приписать порядковый смысл числам (например, считав
red=1,green=2,blue=3). - Моделей, основанных на метриках расстояния (k-NN, SVM с RBF-ядром). OHE корректно представляет категории в векторном пространстве, где расстояние между разными категориями одинаково.
One-Hot Encoding обычно НЕ рекомендуется для:
- Древовидных ансамблей (Random Forest, Gradient Boosting — XGBoost, LightGBM, CatBoost). Для них OHE создает избыточную разреженность и увеличивает пространство поиска без реальной пользы. Эти алгоритмы могут эффективно разбивать данные по одному целочисленному признаку (Label Encoding). Более того, CatBoost имеет встроенную эффективную обработку категорий.
- Признаков с высокой кардинальностью (например,
user_id). Это приводит к "проклятию размерности" и чрезвычайно разреженным данным.
Практический пример и альтернативы:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
from sklearn.ensemble import RandomForestClassifier
# Исходные данные
df = pd.DataFrame({'color': ['red', 'blue', 'green', 'blue', 'red']})
# 1. OHE для линейной модели
ohe = OneHotEncoder(sparse_output=False, drop='first')
df_ohe = ohe.fit_transform(df[['color']]) # Матрица для линейных моделей
# 2. Ordinal Encoding для деревьев (если порядок не важен)
ord_enc = OrdinalEncoder()
df_ordinal = ord_enc.fit_transform(df[['color']])
model_rf = RandomForestClassifier()
model_rf.fit(df_ordinal, y) # Деревьям подходит
# 3. Для высокой кардинальности лучше Target/Mean Encoding
# (требует аккуратной реализации, чтобы избежать утечки данных)
Вывод: Нет универсального решения. Выбор между OHE, Label Encoding, Target Encoding или встроенными методами (как в CatBoost) зависит от модели, кардинальности признака и риска переобучения.