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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Каждая категория представлена ​​вектором (массивом) из 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 «Шмидт», «Шнайдер»

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

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

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

Короче говоря, хеширование сопоставляет категорию (например, цвет) с небольшим целым числом — номером «корзины», в которой будет храниться эта категория.

Подробно вы реализуете алгоритм хеширования следующим образом:

  1. Установите количество интервалов в векторе категорий равным N, где N меньше общего количества оставшихся категорий. В качестве произвольного примера скажем N = 100.
  2. Выберите хеш-функцию. (Часто вы также выбираете диапазон значений хеш-функции.)
  3. Передайте каждую категорию (например, определенный цвет) через эту хэш-функцию, генерируя хеш-значение, скажем, 89237.
  4. Присвойте каждому интервалу порядковый номер выходного хэш-значения по модулю N. В этом случае, когда N равно 100, а хеш-значение равно 89237, результат по модулю равен 37, поскольку 89237 % 100 равно 37.
  5. Создайте горячую кодировку для каждого интервала с этими новыми индексными номерами.

Подробнее о хешировании данных см. в разделе «Рандомизация» модуля «Производственные системы машинного обучения» .