Кодирование категориальных признаков – необходимый шаг для подачи данных в модель.
Категориальные признаки - это тип переменных в наборе данных, которые могут принимать значения из ограниченного набора категорий или меток. Категориальные признаки не могут быть подвержены математическим операциям напрямую в отличие от числовых данных. Обычно это качественные данные, не имеющие внутреннего порядка. Тем не менее, иногда категориальные признаки могут быть упорядоченными (военные звания, ученые степени и т.д.).
Примеры категориальных признаков
Цвет автомобиля: красный, зеленый, синий
Пол человека: мужской, женский
Вид животного: кошка, собака, попугай
Месяц года: январь, февраль, март...
Уровень образования: начальное, среднее, высшее
Почтовый индекс: 653035, 127000 (это очень похоже не числовой признак, однако, является категориальным)
Кодирование – это необходимый перевод категорий в числа, так как модель ожидает на вход числовой вектор. Существует несколько способов кодирования. Ниже представлены наиболее полезные методы кодирования.
Порядковое кодирование (ordinal encoding)
Каждой категории присваивается номер. Самые подходящие для этого варианта кодироавания данные – имеющие порядковый характер, постепенное повышение важности или значения. Например, воинские звания, титулы, ученые звания, профессиональные категории с учетом их повышения и т.д.
| Значение | Номер |
| Рядовой | 1 |
| Ефрейтор | 2 |
| Сержант | 3 |
| Лейтенант | 4 |
Данный вид кодирования не рекомендуется использовать к данным, не имеющим характера порядка, так как присвоенные числа могут давать модели ложное представление о соотношении признаков. Модель может посчитать, что программист важнее художника. Или что расстояние между писателем и менеджером меньше, чем расстояние между писателем и художником.
Частотное кодирование
Для каждой категории задается значение, равное частоте ее встречаемости в общем числе категорий. Пример:
| Категория | Значение |
| администратор | 1/7 |
| программист | 2/7 |
| директор | 1/7 |
| программист | 2/7 |
| тестировщик | 2/7 |
| дизайнер | 1/7 |
| тестировщик | 2/7 |
Однако, как видно из таблицы, такое кодирование может привести к неоднозначности – некоторые разные категории будут иметь одинаковые значения.
One-hot кодирование
Допустим, есть N категорий. Каждой категории назначается порядковый номер i.
Создается вектор из N нулей. Для каждой категории в i-том положении проставляется единица.
Таким образом каждое наблюдение получает свой вектор с соответствующим положением единицы в векторе.
| Категория | Вектор кодировки |
| Север | [0, 0, 0, 1] |
| Юг | [0, 0, 1, 0] |
| Запад | [0, 1, 0, 0] |
| Восток | [1, 0, 0, 0] |
Фактически при работе с табличными данными вектор кодировки представляет собой набор столбцов по числу категорий. В соответствующем столбце проставлена единица, в остальных столбцах – нули.
В Pandas one-hot encoding реализован через создание dummy-переменных.
pd.get_dummies(df)
Существенным недостатком данного метода кодирования является значительное увеличения числа признаков (столбцов). При их большом количестве это значительно усложняет модель. Поэтому такое кодирование лучше применять к данным с небольшим числом категорий.
Кодирование средним
Каждой категории присваивается численное среднее значение прогнозируемого отклика для всех наблюдений этой категории.
Пример для регрессии:
| Признак | Отклик (таргет) | Кодирование признака |
| Программист | 300 | 350 |
| Программист | 400 | 350 |
| Системный администратор | 250 | 200 |
| Системный администратор | 200 | 200 |
| Системный администратор | 150 | 200 |
| Дизайнер | 220 | 200 |
| Дизайнер | 180 | 200 |
| Художник | 150 | 150 |
Пример для классификации:
| Признак | Отклик (таргет) | Кодирование признака |
| Программист | 1 | 1 |
| Программист | 1 | 1 |
| Системный администратор | 1 | 2/3 |
| Системный администратор | 0 | 2/3 |
| Системный администратор | 1 | 2/3 |
| Дизайнер | 1 | 1/2 |
| Дизайнер | 0 | 1/2 |
| Художник | 0 | 0 |
У этого способа кодирования есть несколько недостатков:
- Происходит прямая передача данных о таргете (пусть и в усредненном виде).
- Если наблюдение всего одно, в закодированном значении происходит прямая передача значения таргета.
На практике эти недостатки обходят либо созданием тренировочной выборки, в которой свое среднее для каждой категории, и оно не известно для данных в тестовой выборке. Либо категория кодируется средним по другому признаку. Вместо среднего можно использовать медиану, стандартное отклонение, минимум, максимум.
Циклическое кодирование
Признаки, имеющие циклическую природу (время, различные периодические явления), можно закодировать тригонометрическими функциями, также имеющими периодическую природу. Можно посмотреть здесь – https://deepmachinelearning.ru/docs/Machine-learning/Data-preprocessing/Categorical-preprocessing
Какой вариант кодирования выбрать?
Это зависит от контекста задачи. На момент написания текста в индустрии принято подбирать вариант кодирования методом проб и ошибок, с дальнейшей оценкой качества модели.