Удосконалити класифікацію за допомогою багатьох категоричних змінних


37

Я працюю над набором даних з 200 000+ зразків і приблизно 50 особливостей на вибірку: 10 безперервних змінних, а інші ~ 40 - категоричні змінні (країни, мови, наукові галузі тощо). Для цих категоричних змінних у вас є, наприклад, 150 різних країн, 50 мов, 50 наукових галузей тощо ...

Поки мій підхід:

  1. Для кожної категоріальної змінної з багатьма можливими значеннями візьміть лише ту, що має більше 10000 вибірки, яка приймає це значення. Це зменшує до 5-10 категорій замість 150.

  2. Побудуйте змінну манекена для кожної категоріальної (якщо 10 країн, то для кожного зразка додайте бінарний вектор розміром 10).

  3. Подайте випадкові класифікатори лісу (перехресне підтвердження параметрів тощо ...) цими даними.

В даний час при такому підході мені вдається лише отримати 65% точності, і я відчуваю, що можна зробити більше. Особливо мене не влаштовує 1), оскільки я відчуваю, що не повинен довільно видаляти "найменш відповідні значення" відповідно до кількості вибірки, оскільки вони мають менш дискримінаційні значення. З іншого боку, моя оперативна пам'ять не може дозволити додати до даних 500 стовпців * 200000 рядків, зберігаючи всі можливі значення.

Чи хотіли б ви порадитись із цією категоричною змінною?


2
Якщо ви все ще зацікавлені, ви можете перевірити мою відповідь щодо зменшення розмірності та мою відповідь щодо ієрархічної класифікації .
Олександр Блех

1
Коли ви говорите "побудувати змінну манекена для кожної категоріальної" , здається, що ви використовуєте Python не R? R випадковий ліс може споконвічно обробляти категоричні категорії, а також наслідком зменшення пам'яті. Спробуйте R.
smci

Відповіді:


20

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

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

3) Я пропоную розібратися у випадковому виборі особливостей лісу за допомогою запропонованого Брімана методу чи штучних контрастів . Метод штучних контрастів (ACE) цікавий тим, що він порівнює важливість функції з важливістю перетасованої версії себе, яка бореться з деякими проблемами високої кардинальності. Існує новий документ "Модульні керовані випадкові ліси", який може бути цікавим, якби у вас було набагато більше функцій, оскільки він використовує метод вибору функцій, який відомий групам сильно корельованих особливостей.

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

Існує майже повна реалізація асі тут і у мене є effichent більше пам'яті / швидке впровадження вч , що ручки категоріальні змінні спочатку тут ... -evaloob опція увімкне підтримку 4 Я працюю на додавання підтримки для ACE і пару інших ВЧ на основі методів вибору функцій, але це ще не зроблено.


4
Усі ці пропозиції цікаві, я погоджуюсь, що випадковий ліс повинен обробляти місцеві категоричні змінні, але scikit-learn не ... Я думаю, що це один з головних недоліків scikit btw. Я спробую ваш код на моїх даних, щоб побачити, що відбувається, і я побачу про ваші інші пропозиції!
Бертран R

1
Спробуйте реалізацію R. Запуск - це один вкладиш. Читання даних надзвичайно просте, і є нова реалізація паралельної програми, яка швидко розвивається та ефективно працює з пам'яттю: r-bloggers.com/… З іншого боку. Ваші заняття незбалансовані? у г реалізації ви можете виростити кожне дерево з збалансованого завантажувального зразка sampsize = c (x, x). Це дало кращі бінарні класифікації для мене. Ви можете пограти з розмірами та налаштувати класифікацію дуже легко, використовуючи виходи матриці плутанини матриці R OOB.
JEquihua

2
Випадкове впровадження RForest дозволяє використовувати фактори з максимальним рівнем 32 рівня. scikit-learn є менш обмежуючим, забезпечуючи спочатку створити фіктивні змінні (див. pandas.get_dummiesфункцію). Реалізація випадкових лісів H2O для мене справді добре (див. 0xdata.com/docs/master/model/rf ).
Алекс Вулфорд

1
є новіша і швидша реалізація випадкових лісів, пакет називається рейнджером. Справді чудові речі. Замовлення на швидкість швидше і не мають обмеження на 32 рівні.
марбель

6

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


1
Це добре для категоричних функцій з n <= 3, оскільки ви можете генерувати всі ті ж розщеплення, що і ви, вважаючи цю функцію як категоричну. Для більшого n можна досягти наборів розщеплень, еквівалентних категорійному розщепленню, але алгоритм може або не може їх знайти так ефективно ... однак, якщо ви розділите функцію на n числових ознак, ви також знижуєте ефективність, з якою алгоритм може знайти розщеплення. Хтось повинен додати підтримку категоричної змінної у впровадження scikit-learn, як це чудово інакше.
Райан Бресслер

Я погоджуюся з вами, коли ви говорите, що вводити звичайність у категоричні дані звучить підозріло ... Я б краще цього не робив, але можу принаймні спробувати і побачити, що відбувається!
Бертран R

4
У мене було тривале обговорення цього питання у списку розсилки sklearn (частини його можна прочитати тут: mail-archive.com/scikit-learn-general@lists.sourceforge.net/… ). Думка одного з виконавців полягала в тому, що при досить глибоких деревах категоричні функції, кодовані порядковим порядком, можуть працювати досить добре (крім того, щоб бути більш обчислювально ефективними). У будь-якому випадку, якщо ви спробуєте це, мені було б дуже цікаво почути про ваші результати / висновки, оскільки це питання, на яке я постійно натрапляю.
cjauvin

1
Тому я спробував зберегти єдину числову змінну для категоричних, і це насправді працює напрочуд добре, і набагато краще, ніж додавання великої кількості двійкових записів ... Я також намагався сортувати значення відповідно до їх середнього wrt до цільового . І це теж чудово працює
Бертран R

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

5

Я думаю, ви повинні врахувати / більше методи зменшення змінних . Це позбавляється від не настільки впливових прогнозів.

Я багато читав про попередню обробку даних, і це чудове рішення зменшити n ° ваших змінних.

Мої пропозиції такі:

  • для якісних змінних замініть пропущені значення категорією "відсутні". Це може внести упередженість, якщо дані не пропущені випадковим чином, але принаймні у вас будуть всі ці спостереження недоторканими, а відсутність може виявити іншу поведінку.
  • усунути передбачувачі нульової дисперсії або передбачувачі майже нульової дисперсії (будьте обережні, щоб не усунути фіктивні змінні з високими незбалансованими категоріями, які можуть ефективно розділити ваш Y. Складіть кілька графіків для змінних, які, на вашу думку, можуть бути важливими). У R ви можете використовувати 'nzv'функцію з 'caret'пакета. Це значно зменшить розмір ваших даних.
  • усунути корельовані прогнози . Використовуйте кореляційну матрицю Кендалла, оскільки вона більше підходить будувати за наявності категоричних змінних. Мінус полягає в тому, що ви повинні перетворити всі свої номінальні значення на категоричні.
  • є методи вибору функцій, які ще більше зменшать їх кількість (кластеризація - ви вибираєте одного представника кожного кластеру, регресію LASSO тощо). У мене ще не було можливості протестувати їх, оскільки інші кроки зменшили мої змінні до менше 100.

Також я б запропонував використовувати алгоритм AdaBoost замість RF. Особисто дослідження, які я проводив, дали мені дуже схожі коефіцієнти Джині для обох цих методів. Хороша частина AdaBoost полягає в тому, що в R він обробляє відсутні спостереження. Таким чином, ви можете пропустити 1-й крок цього списку

Я сподіваюся, що це мало допомогло. Удачі


4

Ви можете розглянути моделі змішаних ефектів. Вони користуються популярністю у суспільствознавстві завдяки своїй роботі за категоричними даними з високою кардинальністю, і я використовував їх для створення чудових моделей прогнозування, що перевершують популярні підходи машинного навчання, такі як дерева, що підсилюють градієнт, випадкові ліси та регламентований логічний регрес з еластичною сіткою. Найвідомішою реалізацією є пакет lme4 R; функцією, яку ви використовуєте для класифікації, є glmer, який реалізує логістичну регресію зі змішаними ефектами. У вас можуть виникнути проблеми зі масштабуванням вашого набору даних, але я зробив 80-ти рядок з 15 функціями без особливих труднощів.


2
  1. Коли ви говорите "побудувати змінну манекена для кожної категоріальної" , здається, що ви використовуєте Python не R? R випадковий ліс може споконвічно обробляти категоричні категорії, а також наслідком зменшення пам'яті. Спробуйте Р.

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

  3. Корисний мінливий вибір. @lorelai дає хороші рекомендації. Постарайтеся усунути марні (маловажливі або дуже корельовані) функції. Побудова дерева є квадратичною за кількістю особливостей, тож якщо ви навіть ліквідуєте третину, ви виплатите дивіденди.


0

Слід переглянути пакет H2O.ai. Він обробляє категоричні змінні поза полем без необхідності робити кодування (переконайтесь, що змінні є чинниками).

Особливо мені подобається їх реалізація Gradient Boosted Machine (GBM), тому що ви можете переглянути змінне значення після побудови моделі. GBM також мають приємну особливість стійкості до переобладнання.

Якщо ви хочете вивчити інші моделі, вони мають: GLM, Random Forest, Naive Bayes, Deep Learning тощо.

Дивіться: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

Він також простий в установці (Windows, Linux, Mac) і легко працювати з API, використовуючи R, Python, Java та Scala.

Він може використовувати кілька ядер для прискорення речей.

Найближчим часом вони підтримуватимуть GPU.

Це також відкритий і безкоштовний (Є підтримка Enterprise).

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