Обработка категориальных признаков
Категориальные признаки (categorical features) - это признаки, принимающие дискретные значения, такие как профессия человека или город, в котором он родился. Такие признаки очень часто встречаются на практике. Частным случаем категориальных признаков являются бинарные признаки (binary features), принимающие всего два значения, такие как семейное положение человека или индикатор, были ли у человека просрочки по кредитам.
Модель машинного обучения ожидает на входе вектор, состоящий только из вещественных признаков. Если бинарный признак мы можем представить в вещественном виде, закодировав категории цифрами 0 и 1, то в случае признака, описывающего несколько категорий, возможны различные варианты кодировок.
Порядковое кодирование
В порядковом кодировании (ordinal encoding) категория заменяется её номером. Рассмотрим кодировку признака [профессия]. Пусть, для простоты она принимает всего 4 возможных значения: программист, художник, дизайнер и системный администратор. В порядковом кодировании мы заменяем профессии их номерами:
значение | номер |
---|---|
программист | 0 |
художник | 1 |
дизайнер | 2 |
системный администратор | 3 |
Этот вид кодирования не рекомендуется на практике, поскольку метод машинного обучения впоследствии будет считать, что движение в направлении 0,1,2,3 будет соответствовать возрастанию какой-то реально существующей характеристики, которой в действительности нет, поскольку нумерация была произвольной. Также в нашем примере метод машинного обучения, на основе близости численных значений будет считать, что программист ближе по смыслу к художнику, чем к системному администратору, что в действительности не так.
Кодирование частотами
При частотном кодировании (frequency encoding) значение каждой категории заменяется на частоту встречаемости этой категории. Если, например, у нас 7 человек, среди которых программист встре тился 2 раза, системный администратор - 3 раза, дизайнер и художник - по одному разу, то частотное кодирование будет выглядеть так:
значение | кодировка |
---|---|
программист | 2/7 |
системный администратор | 3/7 |
системный администратор | 3/7 |
дизайнер | 1/7 |
художник | 1/7 |
системный администратор | 3/7 |
программист | 2/7 |
Обратим внимание, что кодирование неоднозначное для дизайнера и художника, которые встретились одинаковое число раз. Полезность кодировки определяется тем, насколько частота встречаемости категорий связана с целевой переменной.
One-hot кодирование
One-hot кодирование (one-hot encoding, dummy encoding). Вначале все категории нумеруются (произвольным образом). Каждый категориальный признак, принимающий значение i-й категории среди K возможных, кодируется K-мерным вектором из нулей, где на одной только i-й позиции стоит единица.
Пример соответствия категорий кодировкам:
направление | кодировка |
---|---|
север | [0,0,0,1] |
юг | [0,0,1,0] |
восток | [0,1,0,0] |
запад | [1,0,0,0] |
Пример применения кодировки к данным:
направление | кодировка |
---|---|
север | [0,0,0,1] |
север | [0,0,0,1] |
запад | [1,0,0,0] |
восток | [0,1,0,0] |
север | [0,0,0,1] |
Метод однозначно кодирует категорию и, в отличие от предыдущих методов, производит сопоставление одному категориальному признаку сразу набор бинарных признаков (по числу категорий). Категории, независимо от порядка кодирования, все получаются равнозначными - попарное расстояние между кодировками любой пары категорий получается одним и тем же.
One-hot кодирование - самый популярный способ представления категориальных признаков, однако у него есть недостаток, что при слишком большом числе категорий он приводит к сильному разрастанию числа признаков. Например, если категория - это город, то поскольку городов очень много, число признаков значительно увеличивается, что приводит к слишком сильному увеличению параметров модели машинного обучения, ухудшая её настройку. Одним из способов борьбы с этим является объединение различных родственных категорий в одну. Например, вместо указания города можно указывать область, в которой этот город находится.
Представление определённой дискретной сущности (например, категории в категориальном признаке) вектором вещественных чисел называется эмбеддингом (embedding). One-hot кодирование приводит к слишком длинному вектору, если число категорий велико. Вместе с этим понятно, что если использовать не только значения 0/1, а весь спектр вещественных чисел, то можно даже большое число категорий однозначно закодировать компактным вектором эмбеддинга. Эмбеддинги можно сэмплировать случайно, при этом желательно при этом обеспечивать одинаковое попарное расстояние между эмбеддингами разных категорий. Или генерировать эмбеддинги так, чтобы расстояние между эмбеддингами оказывалось более близким для более близких категорий по смыслу (например, работа программиста более близка к работе системного администратора, а работа художника - к работе дизайнера, поэтому и соответствующие эмбеддинги должны быть ближе). Существуют продвинутые методы автоматической генерации эмбеддингов, о которых можно прочитать, например, в статье А.Г.Дьяконова "Методы решения задач классификации с категориальными признаками".
Кодирование средним
Кодирование средним (mean encoding, target encoding) - компактный и максимально информативный способ кодирования категориального признака путём замены каждой категории на среднее прогнозируемого отклика при условии этой категории.
Пример для регрессии (например, когда по профессии и другим признакам пытаемся предсказать зарплату):
признак (профессия) | отклик | кодирование признака |
---|---|---|
программист | 300 | 350 |
системный администратор | 250 | 200 |
системный администратор | 200 | 200 |
дизайнер | 220 | 200 |
художник | 150 | 150 |
дизайнер | 180 | 200 |
программист | 400 | 350 |
системный администратор | 150 | 200 |