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

Ответ

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

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 с контролем переобучения.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь такой, данные в руках, а там колонка с городами или размерами, и думаешь: "Ну и какого хуя с этим делать?". Рассказываю, как я обычно разбираюсь с этой катавасией, чтобы модель потом не охуела от кривых цифр.

1. Порядковое кодирование (Label Encoding) Тут всё просто, как три копейки. Берёшь значения и присваиваешь им циферки. Использую только когда порядок есть, реально есть! Например, размеры: S, M, L, XL. Логично же, что XL больше S. А вот если закодировать так цвета или города — это уже пиздец, модель решит, что Москва больше Казани, а синий "тяжелее" красного. Полная хуйня получится.

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

С этим осторожно, а то наделаешь делов.

2. One-Hot Encoding (OHE) — Горячее кодирование Мой любимчик для всяких номинальных штук, где порядка нет. Берёшь колонку "город" и делаешь из неё овердохуища новых колонок: city_Москва, city_Казань, где стоит 1, если город тот самый, и 0, если нет.

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

Но предупреждаю сразу: если у тебя категорий, как говна за баней, например, 100500 разных товаров, то колонок станет столько, что комп начнёт бздеть и гудеть, как старый холодильник. Тут уже надо 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. Если колонок становится, как говна в проруби, перехожу на Target Encoding, но смотрю в оба, чтобы не переобучить. Главное — думай, что кодируешь и зачем, а не тыкай методы, как слепой в прятки.