Какие способы работы с категориальными признаками существуют?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно понимать, что модели обычно работают с числами, поэтому категориальные признаки надо преобразовывать в числовой вид. Важно уметь выбрать способ кодирования в зависимости от типа признака, размера кардинальности и модели. Также полезно знать риски: рост размерности, утечка таргета и потеря информации.
Определение:
Категориальные признаки — это признаки, принимающие значения из конечного набора категорий, например, город, тип товара, цвет. Для подачи в ML-модель их преобразуют в числовое представление разными способами. Выбор метода зависит от того, есть ли у категорий порядок, сколько их и какая модель используется.
Основные способы обработки:
- One-hot encoding — создаёт отдельный бинарный столбец на каждую категорию.
- Ordinal encoding — заменяет категории целыми числами, подходит для упорядоченных категорий.
- Label encoding — похоже на ordinal, но чаще используется для целевой переменной или простых случаев.
- Target encoding — заменяет категорию статистикой по таргету, например средним значением.
- Frequency / count encoding — заменяет категорию частотой или количеством её встреч.
- Binary / hashing encoding — уменьшают размерность при большом числе категорий.
Пример использования:
Если есть признак цвет со значениями красный, синий, зелёный, то для линейной модели часто используют one-hot encoding. Если есть признак уровень: junior, middle, senior, то лучше ordinal encoding, потому что между значениями есть порядок.
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
df = pd.DataFrame({
"color": ["red", "blue", "green"],
"level": ["junior", "middle", "senior"]
})
# One-hot для номинального признака
ohe = OneHotEncoder(sparse_output=False)
color_encoded = ohe.fit_transform(df[["color"]])
# Ordinal для упорядоченного признака
ord_enc = OrdinalEncoder(categories=[["junior", "middle", "senior"]])
level_encoded = ord_enc.fit_transform(df[["level"]])
print(color_encoded)
print(level_encoded)
Пояснение кода:
В этом примере color кодируется через one-hot: каждая категория превращается в отдельный бинарный столбец. Это удобно, когда у значений нет естественного порядка и нельзя навязывать модели искусственную иерархию.
level кодируется через OrdinalEncoder с явно заданным порядком категорий. Это важно, потому что без указания порядка кодировщик может назначить числа произвольно, а для упорядоченного признака это уже влияет на смысл данных.
Ключевые моменты:
- One-hot подходит для номинальных категорий и часто хорошо работает с линейными моделями.
- Ordinal / label encoding уместны только если между категориями есть порядок или модель умеет корректно работать с такими кодами.
- Target encoding может сильно улучшить качество на высококардинальных признаках, но требует осторожности из-за риска утечки таргета.
- Frequency/count encoding прост и полезен, когда категорий много, а данных мало.
- Hashing encoding помогает при очень высокой кардинальности, но ухудшает интерпретируемость и может давать коллизии.
- Для деревьев, бустинга и нейросетей выбор кодирования тоже важен, но не всегда одинаков: универсального метода нет.