Для каких моделей машинного обучения предпочтителен One-Hot Encoding, а для каких — нет?

«Для каких моделей машинного обучения предпочтителен One-Hot Encoding, а для каких — нет?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор кодирования категориальных признаков напрямую зависит от алгоритма.

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) зависит от модели, кардинальности признака и риска переобучения.