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

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

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

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

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

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

Упражнение: проверьте свою интуицию

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

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

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

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

Проверьте свою интуицию

Должна ли ваша модель обучаться непосредственно на индексных числах, показанных на рисунке 2?
Да
Если бы модель обучалась на индексных числах, она бы неправильно интерпретировала каждое из них как числовое значение и считала бы, что "Black" (номер индекса 5) в 5 раз более значим для модели, чем "Orange" (номер индекса 1).
Нет
Ваша модель не должна обучаться на индексных числах. Если бы это было так, ваша модель рассматривала бы каждый номер индекса как числовое значение и считала бы "Black" (номер индекса 5) в 5 раз более значимым для модели, чем "Orange" (номер индекса 1).

Горячее кодирование

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

  • Каждая категория представлена ​​вектором (массивом) из N элементов, где N — количество категорий. Например, если car_color имеет восемь возможных категорий, то векторное представление one-hot будет состоять из восьми элементов.
  • Ровно один из элементов горячего вектора имеет значение 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

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

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

Рисунок 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 «счастливый», «гуляющий»
US_postal_codes ~42 000 «02114», «90301»
фамилии_в_Германии ~850 000 «Шмидт», «Шнайдер»

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

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

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