Категориальные данные: словарь и горячее кодирование.

Термин «размерность» является синонимом количества элементов в векторе признаков . Некоторые категориальные признаки имеют низкую размерность. Например:

Название функции # категорий Примеры категорий
сегодня выпал снег 2 Правда, Ложь
уровень_умения 3 Новичок, Практик, Эксперт
сезон 4 Зима, Весна, Лето, Осень
день_недели 7 Понедельник, вторник, среда
планета 8 Меркурий, Венера, Земля

Если категориальный признак имеет небольшое количество возможных категорий, его можно закодировать как словарь . При кодировании с помощью словаря модель обрабатывает каждое возможное категориальное значение как отдельный признак . В процессе обучения модель усваивает различные веса для каждой категории.

Например, предположим, что вы создаёте модель для прогнозирования цены автомобиля, частично основанную на категориальном признаке car_color . Возможно, красные автомобили стоят дороже зелёных. Поскольку производители предлагают ограниченное количество цветов кузова, car_color является категориальным признаком с низкой размерностью. На следующем рисунке представлен словарь (возможные значения) для car_color :

Рисунок 1. Каждый цвет в палитре представлен как отдельный признак. То есть, каждый цвет — это отдельный признак в векторе признаков. Например, «Красный» — это признак, «Оранжевый» — отдельный признак, и так далее.
Рисунок 1. Уникальная функция для каждой категории.

Упражнение: проверьте свое понимание

Правда или ложь: модель машинного обучения может обучаться непосредственно на необработанных строковых значениях, таких как «Красный» и «Черный» , без преобразования этих значений в числовые векторы.
Истинный
Во время обучения модель может оперировать только числами с плавающей точкой. Строка "Red" не является числом с плавающей точкой. Вам необходимо преобразовать строки типа "Red" в числа с плавающей точкой.
ЛОЖЬ
Модель машинного обучения может обучаться только на признаках со значениями с плавающей точкой, поэтому перед обучением вам потребуется преобразовать эти строки в значения с плавающей точкой.

Индексные номера

Модели машинного обучения могут оперировать только числами с плавающей запятой. Поэтому необходимо преобразовать каждую строку в уникальный индекс, как показано на следующем рисунке:

Рисунок 2. Каждому цвету соответствует уникальное целочисленное значение. Например, «Красный» соответствует целому числу 0, «Оранжевый» — целому числу 1 и так далее.
Рисунок 2. Индексированные объекты.

После преобразования строк в уникальные индексы необходимо дополнительно обработать данные, чтобы представить их таким образом, чтобы модель могла выявить значимые взаимосвязи между значениями. Если данные категориальных признаков оставить в виде индексированных целых чисел и загрузить в модель, модель будет обрабатывать индексированные значения как непрерывные числа с плавающей запятой. В этом случае модель будет считать значение «фиолетовый» в шесть раз более вероятным, чем «оранжевый».

Однократное кодирование

Следующий шаг в построении словаря — преобразование каждого индексного числа в его прямое кодирование . В прямом кодировании:

  • Каждая категория представлена вектором (массивом) из N элементов, где N — количество категорий. Например, если у car_color восемь возможных категорий, то вектор-представление будет состоять из восьми элементов.
  • Ровно один из элементов унитарного вектора имеет значение 1,0; все остальные элементы имеют значение 0,0.

Например, в следующей таблице показано прямое кодирование для каждого цвета в car_color :

Особенность Красный Апельсин Синий Желтый Зеленый Черный Фиолетовый Коричневый
"Красный" 1 0 0 0 0 0 0 0
"Апельсин" 0 1 0 0 0 0 0 0
"Синий" 0 0 1 0 0 0 0 0
"Желтый" 0 0 0 1 0 0 0 0
"Зеленый" 0 0 0 0 1 0 0 0
"Черный" 0 0 0 0 0 1 0 0
"Фиолетовый" 0 0 0 0 0 0 1 0
"Коричневый" 0 0 0 0 0 0 0 1

В вектор признаков передаётся именно вектор «one-hot», а не строка или индекс. Модель присваивает каждому элементу вектора признаков отдельный вес.

Следующая иллюстрация демонстрирует различные преобразования в репрезентации лексики:

Рисунок 3. Схема сквозного процесса сопоставления категорий с векторами признаков. На схеме входные признаки — «Жёлтый», «Оранжевый», «Синий» и «Синий» (второй раз). Система использует сохранённый словарь («Красный» — 0, «Оранжевый» — 1, «Синий» — 2, «Жёлтый» — 3 и так далее) для сопоставления входного значения с идентификатором. Таким образом, система сопоставляет «Жёлтый», «Оранжевый», «Синий» и «Синий» с 3, 1, 2, 2. Затем система преобразует эти значения в вектор признаков с одним прямым значением. Например, для системы с восемью возможными цветами 3 становится 0, 0, 0, 1, 0, 0, 0, 0.
Рисунок 3. Сквозной процесс сопоставления категорий с векторами признаков.

Редкое представительство

Признак, значения которого преимущественно равны нулю (или пусты), называется разреженным признаком . Многие категориальные признаки, такие как car_color , как правило, являются разреженными признаками. Разреженное представление означает сохранение позиции 1.0 в разреженном векторе. Например, унитарный вектор для "Blue" имеет вид:

[0, 0, 1, 0, 0, 0, 0, 0]

Поскольку 1 находится в позиции 2 (при начале отсчета с 0), разреженное представление для предыдущего унитарного вектора будет:

2

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

Выбросы в категориальных данных

Как и числовые данные, категориальные данные также содержат выбросы. Предположим, что car_color содержит не только популярные цвета, но и некоторые редко используемые выбросы, например, "Mauve" или "Avocado" . Вместо того, чтобы относить каждый из этих выбросов к отдельной категории, можно объединить их в одну «универсальную» категорию, называемую «вне словаря» (OOV) . Другими словами, все выбросы помещаются в одну группу выбросов. Система присваивает каждому выбросу один весовой коэффициент.

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

Некоторые категориальные признаки имеют большое количество измерений, например, представленные в следующей таблице:

Название функции # категорий Примеры категорий
слова_на_английском ~500,000 "счастливый", "гуляющий"
почтовые_коды_США ~42,000 "02114", "90301"
фамилии_в_Германии ~850,000 «Шмидт», «Шнайдер»

При большом количестве категорий прямое кодирование обычно не является подходящим вариантом. Встраивание , подробно описанное в отдельном модуле «Встраивание» , обычно является гораздо лучшим выбором. Встраивание существенно сокращает количество измерений, что обеспечивает два важных преимущества для моделей:

  • Модель обычно обучается быстрее.
  • Построенная модель обычно делает прогнозы быстрее. То есть, у модели меньше задержка.

Хеширование (также называемое трюком с хешированием ) — менее распространенный способ сокращения количества измерений.