Категорійні дані: словник і пряме кодування

Термін вимір є синонімом до кількості об’єктів у векторі ознак. Деякі категоріальні ознаки є низьковимірними. Нижче наведено приклад.

Назва ознаки Кількість категорій Приклади категорій
snowed_today (сьогодні випав сніг) 2 правда, неправда
skill_level (рівень майстерності) 3 початківець, досвідчений спеціаліст, експерт
season (пора року) 4 зима, весна, літо, осінь
day_of_week (день тижня) 7 понеділок, вівторок, середа
planet (планета) 8 Меркурій, Венера, Земля

Якщо категоріальна ознака має низьку кількість можливих категорій, її можна кодувати як словник. У разі словникового кодування модель розглядає кожне можливе категоріальне значення як окрему ознаку. Під час навчання модель вивчає різні значення ваги для кожної категорії.

Припустімо, що ви створюєте модель для прогнозування ціни автомобіля, яка частково базується на категоріальній ознаці car_color (колір автомобіля). Можливо, червоні автомобілі дорожчі за зелені. Оскільки виробники пропонують обмежену кількість кольорів кузова, car_color – низьковимірна категоріальна ознака. На ілюстрації нижче пропонується словник (можливі значення) для ознаки car_color.

Рисунок 1. Кожен колір палітри представлено як окрему ознаку, тобто це окрема ознака у векторі ознак.
      Наприклад, окремими ознаками є "Red" (червоний), "Orange" (помаранчевий) тощо.
Рисунок 1. Унікальна ознака для кожної категорії.

Вправа. Перевірте свою інтуїцію

Правда чи неправда? Модель машинного навчання може навчатися безпосередньо на необроблених рядкових значеннях, таких як "Red" (червоний) і "Black" (чорний), не перетворюючи ці значення в числові вектори.
Правда
Під час навчання модель може оперувати лише числами з рухомою комою. Рядок "Red" не є таким числом. Потрібно конвертувати такі рядки, як "Red", у числа з рухомою комою.
Неправда
Модель машинного навчання може навчатися лише на ознаках, які мають значення з рухомою комою, тому перед навчанням буде потрібно перетворити рядки на такі значення.

Індекси

Моделі машинного навчання можуть оперувати лише числами з рухомою комою. Тому слід перетворити кожен рядок на унікальний індекс, як показано на ілюстрації нижче:

Рисунок 2. Кожен колір пов’язано з унікальним цілочисельним значенням. Наприклад, "Red" асоціюється із цілим числом 0, "Orange" – із цілим числом 1 і так далі.
Рисунок 2. Проіндексовані ознаки.

Вправа. Перевірте свою інтуїцію

Чи має ваша модель навчатися безпосередньо на індексах, показаних на рисунку 2?
Так
Якби модель навчалася на індексах, вона б неправильно розглядала кожен із них як числове значення й уважала "Black" (індекс 5) у 5 разів більш значущим, ніж "Orange" (індекс 1).
Ні
Ваша модель не має навчатися на індексах. Якби це було так, модель розглядала б кожен індекс як числове значення й уважала "Black" (індекс 5) у 5 разів більш значущим, ніж "Orange" (індекс 1).

Пряме кодування

Наступний крок у створенні словника – перетворення кожного індексу в його пряме кодування. У прямому кодуванні:

  • кожну категорію представляє вектор (масив) з кількістю об’єктів N, де N – кількість категорій (наприклад, якщо car_color має вісім можливих категорій, то векторне представлення за допомогою прямого кодування матиме вісім об’єктів);
  • рівно один з об’єктів вектора прямого кодування має значення 1,0; усі решта – 0,0.

Наприклад, у таблиці, наведеній нижче, показано пряме кодування для кожної ознаки car_color.

Ознака Червоний Помаранчевий Синій Жовтий Зелений Чорний Фіолетовий Коричневий
"Red" 1 0 0 0 0 0 0 0
"Orange" 0 1 0 0 0 0 0 0
"Blue" 0 0 1 0 0 0 0 0
"Yellow" 0 0 0 1 0 0 0 0
"Green" 0 0 0 0 1 0 0 0
"Black" 0 0 0 0 0 1 0 0
"Purple" 0 0 0 0 0 0 1 0
"Brown" 0 0 0 0 0 0 0 1

У вектор ознак передається вектор прямого кодування, а не рядок чи індекс. Модель вивчає окреме значення ваги для кожного об’єкта вектора ознак.

На ілюстрації нижче показано різні трансформації в представленні словника.

Рисунок 3. Діаграма наскрізного процесу зіставлення категорій із векторами ознак. На діаграмі вхідними ознаками є "Yellow" (жовтий), "Orange", "Blue" (синій) і ще раз "Blue".  Система використовує збережений словник ("Red" – це 0, "Orange" – 1, "Blue" – 2, "Yellow" – 3 тощо), щоб зіставити вхідне значення з ідентифікатором. Таким чином, система зіставляє "Yellow", "Orange", "Blue" й "Blue" із числами 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 (коли відлік починається з нуля), розріджене представлення для попереднього вектора прямого кодування виглядає так:

2

Зауважте, що розріджене представлення споживає набагато менше пам’яті, ніж восьмиоб’єктний вектор прямого кодування. Проте модель має навчатися на векторі прямого кодування, а не на розрідженому представленні.

Викиди в категорійних даних

Категорійні дані, як і числові, також містять викиди. Припустімо, що можливі значення ознаки car_color – це не лише популярні кольори, а й деякі з тих, що використовуються рідко (викиди), наприклад "Mauve" чи "Avocado". Щоб не створювати для кожного із цих кольорів-викидів окрему категорію, їх можна об’єднати в єдину збірну категорію під назвою несловникові слова (OOV). Інакше кажучи, усі такі кольори групують в один сегмент викидів. Система вивчає для нього одне значення ваги.

Кодування високовимірних категорійних ознак

Деякі категорійні ознаки мають велику кількість вимірів. У таблиці нижче наведено приклади.

Назва ознаки Кількість категорій Приклади категорій
words_in_english (слова англійською) ~500 000 "happy", "walking"
US_postal_codes (поштові індекси США) ~42 000 02114, 90301
last_names_in_Germany (прізвища в Німеччині) ~850 000 "Schmidt", "Schneider"

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

  • зазвичай модель швидше навчається;
  • побудована модель зазвичай швидше робить прогнози, тобто має меншу затримку.

Хешування (або хеш-трюк) – це не такий поширений спосіб зменшити кількість вимірів.