Найкращі практики кодування категоричних ознак для дерев рішень?


13

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

Чи існує подібне правило для дерев рішень (мішковане, підсилене)? Я запитую це тому, що стандартною практикою в Python, здається, є розширення nрівнів на nманекени (sklearns ' OneHotEncoderабо Pandas' pd.get_dummies), що здається мені неоптимальним.

Що б ви запропонували як найкращі практики кодування категоричних ознак для дерев рішень?

Відповіді:


12

Схоже, ви розумієте, що ви здатні мати nрівні на відміну від n-1, тому що на відміну від лінійної регресії вам не потрібно турбуватися про ідеальну узгодженість.

(Я підходжу до цього з точки зору R, але я припускаю, що це так само в Python.) Це залежить від пари речей, таких як 1) який пакунок ви використовуєте та 2) скільки факторів у вас є.

1) Якщо ви використовуєте randomForestпакет R , то, якщо у вас є <33 коефіцієнт, тоді ви можете продовжити і залишити їх в одній функції, якщо хочете. Це тому, що у випадковій реалізації лісу R він перевірить, які рівні факторів повинні бути на одній стороні розколу, а на іншій (наприклад, 5 ваших рівнів можуть бути згруповані разом з лівого боку, а 7 може бути згруповано разом праворуч). Якщо ви розділите категоричну особливість на nманекени, то алгоритм не мав би цієї опції у своєму розпорядженні.

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

2) Як я вже нагадав вище, випадкова реалізація лісу R може обробляти лише 32 рівні фактора - якщо у вас є більше, то вам потрібно або розділити фактори на менші підмножини, або створити фіктивну змінну для кожного рівня.


1
Дякую! Я правильно розумію: якщо я не моделюю R, де категоричні ознаки в randomForestкодуються автоматично, я повинен піти з nманекенами, оскільки колінеарність не є проблемою для РФ?
Сергій Бушманов

3
Маючи більше дворівневі категорії, кодовані двома рівнями, буде мати дещо іншу поведінку в дереві, оскільки RF просто вибиратиме серед цих бінарних стовпців, а не вибирає єдиний стовпець множника з багатьма рівнями. Ця тонка різниця означає, що розкол на двійкові стовпці буде менш інформативним порівняно з розщепленням на стовпчик множників, оскільки існує лише один вибір (0/1) проти (1 / {2,3}, {2,1} / 3 ) і т. д.
Sycorax повідомляє про відновлення Моніки

@ user777 Це не те, що мати понад 32 змінних. Проблема полягає в тому, що в Python не є "згруповані" змінні категорії sklearn... Практично кажучи, чи є докази (практичний досвід, дослідження тощо), що "деміфіковані" змінні будуть працювати гірше, ніж "згруповані" категоріальні змінні [в R]
Сергій Бушманов

1
Теоретично, ми можемо очікувати, що негрупова група буде трохи гіршою, тому що ви надаєте моделі меншу гнучкість. У випадку згрупованого випадку, якби було справді краще ставитися до цієї ознаки як до негрупованої, то модель могла б це зробити (розмістивши одну групу на одній стороні, а потім всю решту на іншій). Однак на практиці я був би здивований, якби було великої різниці (особливо у випадку РФ, де ти
створюєш

2
Я вважаю, що реалізація randomForest використовує функції з багатьма рівнями факторів (> 15) повільними, як згадувалося, але також дає середню ефективність моделі. Думаю, дуже велика кількість можливих розщеплень зменшить передбачувану декорреляцію дерев в ансамблі. extraTrees та Rborist пробують лише піддіаметр катагоричних розщеплень у кожному вузлі. Це може допомогти декорреляції і, безумовно, швидкості. Таким чином, можливий діапазон рішень між "randomForest спробувати будь-який розділ" та "sklern фіктивна змінна лише спробувати розбиття 1-проти-решта". Також можуть бути корисними різні кластеризації багатьох рівнів на менші рівні.
Сорен Хавелунд Веллінг

4

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

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

Ось приємне пояснення теми:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

А ось посилання на папір, яка спочатку запропонувала кодування: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

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

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