Все про категоріальне кодування змінних

Перетворити категоріальну змінну на число для побудови моделі машинного навчання

Байджаянта Рой

16 липня 2019 · 13 хв читання

Останнє оновлення: 12 лютого 2020 року

категоріальне

Більшість алгоритмів машинного навчання не можуть обробляти категоріальні змінні, якщо ми не перетворимо їх у числові значення. Багато характеристик алгоритму різняться залежно від того, як кодуються категоріальні змінні.

Категоричні змінні можна розділити на дві категорії: іменні (без певного порядку) та порядкові (деякі впорядковані).

Нижче наведено кілька прикладів для номінальної змінної:

  • Червоний, жовтий, рожевий, синій
  • Сінгапур, Японія, США, Індія, Корея
  • Корова, собака, кішка, змія

Приклад порядкових змінних:

  • Високий, Середній, Низький
  • "Дуже погоджуюсь", погоджуюсь, нейтрально, не погоджуюсь і "категорично не погоджуюсь".
  • Відмінно, добре, погано

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

1) Одне гаряче кодування
2) Кодування етикетки
3) Порядкове кодування
4) Кодування Гельмерта
5) Двійкове кодування
6) Кодування частоти
7) Середнє кодування
8) Вага кодування доказів
9) Кодування коефіцієнта ймовірності
10) Хешування кодування
11) Кодування зворотної різниці
12) Залиште одне кодування
13) Кодування Джеймса-Штейна
14) Кодування M-оцінювача

15) Кодер термометра (буде оновлено)

Для е-планування я буду використовувати цей фрейм даних, який має дві незалежні змінні або ознаки (Температура та Колір) та одну мітку (Ціль). Він також має Rec-No, що є порядковим номером запису. У цьому фреймі даних є загалом 10 записів. Код Python буде виглядати, як показано нижче.

Ми будемо використовувати Pandas та Scikit-learn та category_encoders (бібліотека внесків Scikit-learn), щоб показати різні методи кодування в Python.

У цьому методі ми відображаємо кожну категорію до вектора, який містить 1 і 0, що позначає наявність або відсутність ознаки. Кількість векторів залежить від кількості категорій для ознак. Цей метод створює багато стовпців, що значно уповільнює навчання, якщо кількість категорії дуже висока для даної функції. Панда має get_dummies функція, яка досить проста у використанні. Для зразка коду кадру даних буде таким:

Scikit-learn має OneHotEncoder для цієї мети, але він не створює додатковий стовпець об’єктів (потрібен інший код, як показано в прикладі коду нижче).

Одне гаряче кодування дуже популярне. Ми можемо представити всі категорії за допомогою N-1 (N = No of Category), оскільки цього достатньо для кодування тієї, яка не включена. Зазвичай для регресії ми використовуємо N-1 (опускаємо перший або останній стовпець нової функції One Hot Coded), але для класифікації рекомендується використовувати всі N стовпців без, оскільки більшість алгоритмів на основі дерева будує дерево на основі всі доступні змінні. У лінійній регресії слід використовувати одне гаряче кодування з двійковими змінними N-1, щоб забезпечити правильну кількість ступенів свободи (N-1). Лінійна регресія має доступ до всіх функцій, коли вона навчається, і тому вивчає весь набір фіктивних змінних у цілому. Це означає, що двійкові змінні N-1 дають повну інформацію про (представляють повністю) вихідну категоріальну змінну до лінійної регресії. Цей підхід може бути застосований до будь-якого алгоритму машинного навчання, який розглядає ALL функції одночасно під час навчання. Наприклад, підтримують векторні машини та нейронні мережі, а також алгоритми кластеризації.

У методах, заснованих на дереві, ми ніколи не будемо розглядати цю додаткову мітку, якщо ми відмовляємось. Таким чином, якщо ми використовуємо категоріальні змінні в алгоритмі навчання на основі дерева, це хороша практика кодувати його в N двійкових змінних і не скидати.

У цьому кодуванні кожній категорії присвоюється значення від 1 до N (тут N - кількість категорій для ознаки. Однією з головних проблем цього підходу є відсутність зв'язку або порядку між цими класами, але алгоритм може розглядати їх як якийсь порядок, або є якісь стосунки. У наведеному нижче прикладі це може виглядати (холод

Панди розкладають на факторії також виконують ту саму функцію.

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

  • відповідно до порядку даних (Пандам присвоєно Гаряче (0), Холодне (1), “Дуже гаряче” (2) та Тепле (3)) або
  • відповідно до алфавітного відсортованого порядку (scikit-learn призначено Холодний (0), Гарячий (1), “Дуже гарячий” (2) та Теплий (3)).

Якщо ми розглядаємо в температурній шкалі порядок, то порядкове значення має бути від холодного до “Дуже жарко. “Звичайне кодування буде присвоювати значення як (холодне (1)

Хоча це дуже прямо, воно вимагає кодування, щоб визначити порядкові значення та те, що є фактичним відображенням від тексту до цілого числа відповідно до замовлення.

У цьому кодуванні середнє значення залежної змінної для рівня порівнюється із середнім значенням залежної змінної для всіх попередніх рівнів.

Версію в category_encoders іноді називають зворотним кодуванням Гельмерта. Середнє значення залежної змінної для рівня порівнюється із середнім значенням залежної змінної для всіх попередніх рівнів. Отже, назва "зворотний" використовується для диференціації від прямого кодування Гельмерта.

Двійкове кодування перетворює категорію в двійкові цифри. Кожна двійкова цифра створює один стовпець об’єктів. Якщо є n унікальних категорій, тоді двійкове кодування призводить до єдиних функцій журналу (основа 2) ⁿ. У цьому прикладі ми маємо чотири особливості; таким чином, загальна кількість кодованих двійкових ознак становитиме три ознаки. Порівняно з одним гарячим кодуванням, для цього потрібно буде менше стовпців об’єктів (для 100 категорій одне гаряче кодування матиме 100 об’єктів, тоді як для двійкового кодування нам знадобиться лише сім об’єктів).

Для двійкового кодування потрібно виконати наступні кроки:

  • Категорії спочатку перетворюються в числовий порядок, починаючи з 1 (порядок створюється в міру появи категорій у наборі даних і не означає будь-якого порядкового характеру)
  • Потім ці цілі числа перетворюються у двійковий код, так, наприклад, 3 стає 011, 4 стає 100
  • Потім цифри двійкового числа утворюють окремі стовпці.

Зверніться до наведеної нижче схеми для кращої інтуїції.

Для цього ми використаємо пакет category_encoders, а ім’я функції - BinaryEncoder.

Це спосіб використовувати частоту категорій як мітки. У випадках, коли частота дещо пов’язана з цільовою змінною, це допомагає моделі зрозуміти та призначити вагу прямою та зворотною пропорцією, залежно від природи даних. Три кроки для цього:

  • Виберіть категоріальну змінну, яку ви хочете перетворити
  • Згрупуйте за категоріальною змінною та отримайте підрахунки для кожної категорії
  • Приєднайте його до навчального набору даних

Код Pandas можна побудувати, як показано нижче:

Середнє кодування або цільове кодування - це один із підходів вірусного кодування, яким дотримуються Кагглери. Існує багато варіантів цього. Тут я розгляну базову версію та згладжувальну версію. Середнє кодування подібне до кодування міток, за винятком того, що тут мітки безпосередньо співвідносяться з цільовим кодом. Наприклад, у середньому цільовому кодуванні для кожної категорії в мітці об’єкта визначається середнє значення цільової змінної на навчальних даних. Цей метод кодування виявляє взаємозв'язок між подібними категоріями, але зв'язки обмежені всередині категорій і спрямовані на саму. Переваги середнього цільового кодування полягають у тому, що воно не впливає на обсяг даних і допомагає в швидшому навчанні. Зазвичай середнє кодування сумно відомо за надмірне пристосування; таким чином, регуляризація з перехресною валідацією чи іншим підходом є необхідною в більшості випадків. Середній підхід до кодування такий:

  1. Виберіть категоріальну змінну, яку ви хочете перетворити

2. Групуйте за категоріальною змінною та отримуйте сукупну суму за змінною “Ціль”. (загальна кількість одиниць для кожної категорії в розділі "Температура")

3. Групуйте за категоріальною змінною та отримайте агрегований підрахунок над змінною “Ціль”

4. Розділіть результати кроку 2/кроку 3 і приєднайте його назад до поїзда.

Зразок коду для фрейму даних:

Середнє кодування може втілювати ціль у мітку, тоді як кодування мітки не корелює з ціллю. У випадку великої кількості функцій середнє кодування може виявитись набагато простішою альтернативою. Середнє кодування має тенденцію до групування класів, тоді як групування є випадковим у випадку кодування міток.

На практиці існує багато варіантів цього цільового кодування, наприклад, згладжування. Згладжування можна реалізувати, як показано нижче:

Вага доказів (WoE) є мірою “сили” техніки групування для розділення хороших та поганих. Цей метод був розроблений насамперед для побудови прогнозної моделі для оцінки ризику неповернення позики в кредитно-фінансовій галузі. Вага доказів (WOE) - це показник кількості доказів підтримує або підриває гіпотезу.

Це обчислюється, як показано нижче:

WoE буде 0, якщо P (Товари)/P (Бади) = 1. Тобто, якщо результат є випадковим для цієї групи. Якщо P (Bads)> P (Товари), коефіцієнт шансів буде P (Bads) у групі, то WoE> 0.

WoE добре підходить для логістичної регресії, оскільки перетворення Logit - це просто журнал шансів, тобто ln (P (Товари)/P (Bads)). Отже, за допомогою використання предикторів, кодованих WoE, у логістичній регресії всі попередники готуються та кодуються з однаковим масштабом. Параметри в рівнянні лінійної логістичної регресії можна безпосередньо порівняти.

Трансформація WoE має (принаймні) три переваги:
1) Він може перетворити незалежну змінну так, щоб встановити монотонне відношення до залежної змінної. Це робить більше, ніж це - для забезпечення монотонних відносин було б достатньо «перекодувати» їх на будь-який впорядкований захід (наприклад, 1,2,3,4…), але перетворення WoE впорядковує категорії за «логістичним» масштабом, який є природним для логістичної регресії
2) Для змінних із занадто великою кількістю (рідко заповнених) дискретних значень їх можна згрупувати за категоріями (щільно заповненими), а WoE можна використовувати для вираження інформації для всієї категорії
3) (одновимірний) ефект кожної категорії на залежну змінну можна порівняти між категоріями та змінними, оскільки WoE є стандартизованою величиною (наприклад, ви можете порівняти WoE одружених та WoE фізичних працівників)

Він також має (принаймні) три недоліки:
1) Втрата інформації (варіація) через поєднання кількох категорій
2) Це “одноваріантна” міра, тому він не враховує кореляцію між незалежними змінними
3) Легко маніпулювати ефектом змінних залежно від того, як створюються категорії

Під кодом фрагменти пояснюють, як можна побудувати код для обчислення WoE.

Після того, як ми розрахуємо WoE для кожної групи, ми можемо повернути це в Data-frame.