Все про категоріальне кодування змінних від Baijayanta Roy Towards Data Science
Перетворити категоріальну змінну на число для побудови моделі машинного навчання
Байджаянта Рой
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 - кількість категорій для ознаки. Однією з головних проблем цього підходу є відсутність зв'язку або порядку між цими класами, але алгоритм може розглядати їх як якийсь порядок, або є якісь стосунки. У наведеному нижче прикладі це може виглядати (холод
Панди розкладають на факторії також виконують ту саму функцію.
Ми робимо звичайне кодування, щоб забезпечити збереження кодування змінних порядкового характеру змінної. Це розумно лише для порядкових змінних, як я вже згадував на початку цієї статті. Це кодування виглядає майже подібним до кодування етикетки, але дещо відрізняється, оскільки кодування етикетки не враховує, є змінна порядковим чи ні, і воно буде призначати послідовність цілих чисел