Sobes.tech
Back to questions
Middle
10

Какие способы работы с категориальными признаками существуют?

Companies where asked
1221 Systems
Автомакон

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 помогает при очень высокой кардинальности, но ухудшает интерпретируемость и может давать коллизии.
  • Для деревьев, бустинга и нейросетей выбор кодирования тоже важен, но не всегда одинаков: универсального метода нет.