Функции кодирования, такие как месяц и час, как категориальные или числовые?

23

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

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

Есть ли общее решение или соглашение для этого?

юлианский
источник
Я столкнулся с той же проблемой при определении переменной часа дня (от 1 до 24) в модели RF. Если я преобразую переменную в категориальную, функция VarImp показывает значение важности для каждого часа, и это выглядит очень неорганизованно. Мне просто интересно, нужно ли преобразовывать числовую переменную типа «час дня» в категориальную?
Махмудур Рахман

Ответы:

19

Рассматривали ли вы добавление (синус, косинус) преобразования времени суток? Это гарантирует, что 0 и 23 часа, например, близки друг к другу, что позволяет циклической природе переменной просвечивать.

( Подробнее )

Пабло О
источник
В некотором роде есть проблема с этим, потому что если я это сделаю: sin (pi * X / 24), где X в [0, 23], мы получим ту же оценку для 6 утра и 6 вечера, что и sin (pi * 6/24) == sin (пи * 18/24). но это совершенно разные часы
Эран Моше
Можно сделать цикл так: грех (пи * Х / 12). Спасибо Эран:]
Эран Моше
@EranMoshe fyi в посте по ссылке выше они используют коэффициент 2 * пи вместо этого, так что это будет грехом (2 * пи * X / 12) - они приводят некоторые причины этого в комментариях
tsando
И его (2 * pi X / 24), который является (pi X / 12):] Как вы видите, я боролся с точно такой же проблемой, автор blog.davidkaleko.com/feature-engineering-cyclical-features.html боролся с. И в комментариях вы можете увидеть, как «Мариэль Дж» исправляет его именно так, как я понял: pi * X / 12 будет циркулировать в течение часа дня. Я также пришел к выводу, что вы должны использовать компоненты cos и sin для определения истинного 24-часового периода! (вам нужен истинный круг, а не просто периодическая функция)
Эран Моше
@EranMoshe ах, да, если вы хотите сделать это в течение нескольких часов, тогда его можно уменьшить до piX / 12, но если вы хотите сделать месяцы, то это будет 2piX / 12, то есть pi / 6. Так что в целом это будет 2piX / period
tsando
9

Ответ зависит от вида отношений, которые вы хотите представить между временной характеристикой и целевой переменной.

Если вы кодируете время как числовое, то вы накладываете определенные ограничения на модель. Для модели линейной регрессии влияние времени теперь монотонно, либо цель будет увеличиваться или уменьшаться со временем. Для деревьев решений значения времени, близкие друг к другу, будут сгруппированы.

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

Некоторые примеры групп:

  • В течение месяца группируйте по кварталам или сезонам, в зависимости от варианта использования. Например: январь-март, апрель-июнь и т. Д.
  • Для часа дня, сгруппируйте в ведра времени дня: утро, вечер и т. Д.,
  • Для дня недели, группа в будний день, выходные.

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

Рагу
источник
4

Я рекомендую использовать числовые функции. Использование категориальных функций по существу означает, что вы не считаете расстояние между двумя категориями значимым (например, категория 1 так же близка к категории 2, как и к категории 3). Это определенно не относится к часам или месяцам.

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

Tanguy Coatalem
источник
3

Это зависит от того, какой алгоритм вы используете.

Если вы используете древовидные алгоритмы, такие как случайный лес, просто пропустите этот вопрос. Категориальное кодирование не обязательно для древовидных алгоритмов.

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

Icyblade
источник
Это зависит от реализации на основе дерева. Широко используемые пакеты, такие как scikit-learn и xgboost, не распознают категориальные переменные. От вас ожидается горячее их кодирование.
Рикардо Крус
Из этого поста: vs.datascience.com/… Вы не должны использовать один горячий метод для чего-либо, основанного на деревьях решений, и это довольно много, что я обнаружил на своем пути.
Эшли
1

Поскольку все ваши данные хорошо определены, я бы предложил вам категориальную кодировку, которую также легче применять.

simonepi
источник
1

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

CathyQian
источник