Какие методы кодирования категориальных признаков вы знаете?

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

Ответ

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

1. Label Encoding (Порядковое кодирование) Присваивает каждому уникальному значению целое число. Использую для порядковых признаков (например, размер одежды: S, M, L).

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['size_encoded'] = le.fit_transform(df['size'])

Почему осторожно: Для номинальных признаков без порядка (цвет, город) может внести ложную порядковую зависимость.

2. One-Hot Encoding (OHE) Создает отдельные бинарные колонки для каждой категории. Мой стандартный выбор для номинальных признаков.

import pandas as pd
df_encoded = pd.get_dummies(df, columns=['city'], prefix='city')

Проблема: При большом количестве категорий приводит к "проклятию размерности". В таких случаях применяю drop_first=True или альтернативные методы.

3. Target Encoding (Mean Encoding) Заменяет категорию средним значением целевой переменной для этой категории. Эффективен для задач классификации и регрессии, но требует аккуратной валидации.

# Важно: расчет среднего только на тренировочной части, чтобы избежать утечки данных
train_mean = df_train.groupby('category')['target'].mean()
df_val['category_encoded'] = df_val['category'].map(train_mean)

4. Frequency Encoding Заменяет категории их частотой встречаемости в датасете. Полезен, когда важна распространенность категории.

freq = df['category'].value_counts(normalize=True)
df['category_freq'] = df['category'].map(freq)

5. Hashing Trick Преобразует категории в хеш-значения фиксированной длины. Применяю при работе с текстовыми признаками с огромным словарем (например, хеширование слов).

from sklearn.feature_extraction import FeatureHasher
hasher = FeatureHasher(n_features=10, input_type='string')
hashed_features = hasher.transform(df['category'].astype(str))

На практике для номинальных данных чаще всего начинаю с One-Hot Encoding, а если категорий много — перехожу к Target Encoding с контролем переобучения.