Коли використовувати One Hot Encoding vs LabelEncoder vs DictVectorizor?


95

Я вже деякий час будую моделі з категоричними даними, і коли в цій ситуації я за замовчуванням використовую функцію LabelEncoder scikit-learn для перетворення цих даних перед побудовою моделі.

Я розумію різницю між OHE, LabelEncoderі DictVectorizorз точки зору того, що вони роблять , щоб дані, але то , що мені не ясно, коли ви можете вибрати використовувати одну техніку над іншою.

Чи існують певні алгоритми чи ситуації, в яких один має переваги / недоліки стосовно інших?


2
Посилаючись на відповідь AN6U5 в , і ця заява:> Тим НЕ менше існують алгоритми , такі як дерева рішень і випадкових лісів , які можуть працювати з категоріальним змінними просто відмінно і LabelEncoder можуть бути використані для зберігання значень , використовуючи менше дискового простору. Чи не використовуючи LabelEncoder перетворити категорію на числову характеристику, тим самим змушуючи дерево рішень виконувати розщеплення за деяким значенням, яке насправді не має сенсу, оскільки відображення довільне?
Ніко

1
Ніко, я думаю, що AN6U5 говорить спеціально для дерев рішень, це добре працює, тому що дерево розділиться на собаку, кішку, мишку або 1,2,3, і значення "кішка" проти "2" не має значення для дерево (подумайте про те, як воно розпадається). У випадку щось подібне до логістичної регресії, значення є частиною рівняння, оскільки ви помножуєте значення ваги *, щоб це могло спричинити проблеми з навчанням та проблеми з вагою, враховуючи, що собака: 1 та кішка: 2 не має числових відносин 1 * 2 (хоча вона все ще може працювати з достатньо навчальних прикладів та епох).
Doug F

Відповіді:


124

Є деякі випадки, коли LabelEncoder або DictVectorizor є корисними, але вони, на мій погляд, досить обмежені через звичайність.

LabelEncoder може перетворити [собаку, кішку, собаку, мишку, кішку] у [1,2,1,3,2], але тоді нав'язана звичайність означає, що середня собака та миша - кішка. Проте існують такі алгоритми, як дерева рішень та випадкові ліси, які можуть добре працювати з категоричними змінними, і LabelEncoder можна використовувати для зберігання значень, використовуючи менше місця на диску.

Перевага One-Hot-Encoding має перевагу в тому, що результат є бінарним, а не порядковим і що все сидить в ортогональному векторному просторі. Недоліком є ​​те, що за високої кардинальності простір можливостей дійсно швидко підірветься, і ви почнете боротися з прокляттям розмірності. У цих випадках я зазвичай використовую однокольорове кодування з подальшим PCA для зменшення розмірності. Я вважаю, що розумну комбінацію «гарячого плюс PCA» рідко можна обіграти іншими схемами кодування. PCA знаходить лінійне перекриття, тому, природно, буде схильне групувати подібні ознаки в одну і ту ж особливість.


1
Дуже дякую - це дуже корисно і має багато сенсу. Чи існують інші схеми кодування, які ви використовуєте для конкретних / крайніх випадків? Ви коли-небудь виявляєте, що опиняєтесь у ситуації, коли ви використовуєте різні схеми кодування для різних функцій?
квітня

20

Хоча AN6U5 дав дуже хорошу відповідь, я хотів додати кілька пунктів для подальшої довідки. Розглядаючи One Hot Encoding (OHE) та Encoding Label , ми повинні спробувати зрозуміти, яку модель ви намагаєтеся побудувати. А саме дві категорії моделі, яку ми будемо розглядати:

  1. Моделі, що базуються на деревах: Дерева прийняття рішення градієнтом та випадкові ліси.
  2. Моделі на основі дерев : лінійні, kNN або нейронні мережі.

Розглянемо, коли застосовувати OHE та коли застосовувати кодування міток під час створення моделей на основі дерева.

Ми застосовуємо OHE, коли:

  1. Коли значення, близькі один до одного в кодуванні міток, відповідають цільовим значенням, які не є близькими (нелінійні дані).
  2. Коли категорична ознака не є порядковою (собака, кішка, миша).

Ми застосовуємо кодування міток, коли:

  1. Категоричною ознакою є порядковий (молодший кг, старший кг, початкова школа, середня школа тощо).
  2. Коли ми можемо придумати кодер мітки, який присвоює близькі мітки подібним категоріям : Це призводить до меншої кількості проливів у трасі, що означає скорочення часу виконання.
  3. Коли кількість категоричних особливостей у наборі даних величезна: Одночасне кодування категоріальної особливості з величезною кількістю значень може призвести до (1) високого споживання пам’яті та (2) випадку, коли не категоричні характеристики рідко використовуються моделлю. Ви можете розібратися з першим випадком, якщо використовуєте малі матриці. Другий випадок може статися, якщо ви будуєте дерево, використовуючи лише підмножину функцій. Наприклад, якщо у вас є 9 числових ознак і 1 категорія зі 100 унікальними значеннями, і ви запечатали цю категоричну функцію однозначно, ви отримаєте 109 ознак. Якщо дерево побудовано лише з підмножиною функцій, початкові 9 числових ознак рідко будуть використовуватися. У цьому випадку ви можете збільшити розмір контролю цього параметра. У xgboost це називається colsample_bytree, у sklearn's Random Forest max_features.

Якщо ви хочете продовжувати роботу з OHE, як @ AN6U5 запропонував, ви можете комбінувати PCA з OHE.

Розглянемо, коли застосовувати OHE та кодування міток під час побудови недеревних моделей.

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

Аналогічно, якщо залежність нелінійна, ви можете використовувати OHE для того ж.

Примітка. Деякі пояснення посилаються на тему " Як перемогти у змаганнях з наукових даних" від Coursera.


Дуже інтуїтивне пояснення. Чи не повинні бути це "розколи", а не "розливи"?
dzieciou

0

LabelEncoder призначений для порядкових даних, тоді як OHE - для номінальних даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.