Кодування таких функцій, як місяць і година, як категоріальна чи числова?


23

Чи краще в моделі машинного навчання кодувати такі функції, як місяць і година як фактор або число?

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

Чи є для цього загальне рішення чи конвенція?


Я зіткнувся з тим же питанням, визначаючи змінну години (від 1 до 24) у моделі РФ. Якщо я перетворюю змінну як категоричну, функція VarImp показує значення важливості для кожної години, і це виглядає дуже неорганізовано. Мені просто цікаво, чи потрібно перетворювати числову змінну типу "година дня" в категоричну?
Махмудур Рахман

Відповіді:


19

Чи розглядали ви додавання (синусоїдальну, косинусну) ​​трансформації змінної часу доби? Це забезпечить, наприклад, 0 і 23 години, близькі один до одного, тим самим дозволяючи циклічному характеру змінної просвічувати.

( Детальніше )


у мене є проблеми з цим, тому що якщо я роблю: sin (pi * X / 24), де X в [0, 23], ми маємо таку ж оцінку за 6 ранку та 18:00, як гріх (pi * 6/24) == sin (пі * 18/24). але це абсолютно різні години
Еран Моше

Можна зробити цикл так: sin (pi * X / 12). Спасибі Еран:]
Еран Моше

@EranMoshe fyi у пості за посиланням вище, вони використовують коефіцієнт 2 * pi замість цього, то це було б гріхом (2 * pi * X / 12) - вони дають певні міркування для цього в коментарях
tsando

І його (2 * pi X / 24), який є (pi X / 12):] Як ви бачите, я боровся з точно такою ж проблемою, автор blog.davidkaleko.com/feature-engineering-cyclical-features.html боролася з. І в коментарях ви можете побачити "Маріель G" виправляючи його саме так, як я зрозумів: pi * X / 12 буде циркулювати протягом години дня. Що я також довідався, це те, що ви повинні взяти cos і sin компоненти цього, щоб визначити справжній період 24 години! (потрібне справжнє коло, а не просто періодична функція)
Еран Моше

@EranMoshe Ага так, якщо ви хочете робити протягом кількох годин, то це може бути зменшено до piX / 12, але якщо ви хочете робити місяці, то це буде 2piX / 12, тобто pi / 6. Так загалом це було б 2piX / період
tsando

9

Відповідь залежить від типу зв’язків, які ви хочете представити між часовою ознакою та цільовою змінною.

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

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

Деякі приклади групувань:

  • Щомісяця групуйте на квартали чи пори року, залежно від випадку використання. Наприклад: січень-березень, квітень-червень тощо.
  • За годину дня групуйте у відра часу: вранці, ввечері тощо,
  • Для дня на тиждень, групуйтесь на будній день, вихідні дні.

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


4

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

Однак проблема, яку ви піднімаєте, полягає в тому, що ви хочете представляти години і місяці таким чином, коли 12 дорівнює 11, ніж до 1. Для цього я рекомендую перейти до запропонованого в коментарях і використовувати функція синус / косинус перед використанням годин / місяців як числових ознак.


3

Це залежить від того, який алгоритм ви використовуєте.

Якщо ви використовуєте алгоритми на основі дерев, як-от випадковий ліс, просто переведіть це питання. Категоричне кодування не потрібне для алгоритмів на основі дерева.

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


Це залежить від реалізації на основі дерева. Широко використовувані пакети, такі як scikit-learn та xgboost, не розпізнають категоричні змінні. Від вас очікується одноразове кодування.
Рікардо Крус

З цього повідомлення: premadatascience.com/… ви не повинні використовувати один гарячий для нічого, що базується на деревах рішень, що майже все, що я знаходжу важко.
Ешлі

1

Через всі ваші дані чітко визначені, я б запропонував вам категоричне кодування, яке також простіше застосувати.


1

Перефразовуючи відповідь, надану @raghu . Одна з головних відмінностей між категоричними та числовими ознаками полягає в тому, чи величина чисел порівнянна, тобто чи 2019 рік більший за 2018 рік, чи грудень (12) більший, ніж березень (3)? Не зовсім. Хоча в цих числах є послідовний порядок, їх величина не порівнянна. Таким чином, перетворення на категоріальне значення може мати більше сенсу.

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