Cycli c преобразование дат - PullRequest
0 голосов
/ 28 марта 2020

Я бы хотел использовать день года в модели машинного обучения. Поскольку день года не является непрерывным (за днем ​​365 из 2019 следует день 1 в 2020 году), я думаю о выполнении циклического преобразования c (синус или косинус) после этой ссылки .

Однако в каждом году нет уникальных значений новой преобразованной переменной; например, два значения для 0,5 в том же году, см. цифры ниже. Мне нужно уметь использовать день года в обучении модели, а также в прогнозировании. Для значения 0,5 в синусоидальном преобразовании это может быть либо 31.01.2019, либо 31.05.2019, тогда использование значения 0,5 может привести к путанице для модели.

Можно ли сделать модель для дифференциации между два значения 0,5 в течение одного года?

Я моделирую распространение вида с помощью программного обеспечения Maxent. Данные о видах непрерывны каждый день в течение 20 лет. Мне нужна модель для захвата сигнала дня или сезона, без явного использования одного из них в качестве категориальной переменной.

Спасибо

Sine transformation Cosine transformation

РЕДАКТИРОВАТЬ1 На основе комментария Фурцифера ниже. Однако я считаю, что подход к инкрементному моделированию не подходит для моего приложения. Это решает проблему последовательной разницы между последующими днями; например, 30.12.2018, 31.12.2018 и 01.01.2019. Но это не отличается от подсчета количества дней от определенного базового дня (вес = 1). Наличие гораздо более высоких значений в одну и ту же дату в 2019 году, чем в 2014 году, не имеет экологического смысла. Я надеюсь, что межгодовые изменения будут отражены в ежедневных условиях окружающей среды (объяснительные переменные). Причина, по которой мне нужно использовать день в модели, заключается в том, чтобы уловить сезонную тенденцию распространения мигрирующих видов без явного использования месяца или сезона в качестве категориальной переменной. Чтобы предсказать подходящие места обитания на сегодня, мне нужно сделать так, чтобы этот прогноз зависел не только от условий окружающей среды сегодня, но и от дня года.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

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

  • Сезонные эффекты
  • Не зависящие от сезона тренды и автокорреляция

Для сезонных эффектов преобразование cycli c иногда используется для линейных моделей, но я не вижу смысла для моделей ML - при наличии достаточного количества данных можно ожидать хорошего соединения по краям, так что проблема? Я думаю, что посты, на которые вы ссылаетесь, отвлекают, или, по крайней мере, они не объясняют должным образом, почему и когда полезно преобразование cycli c. Я бы просто использовал dYear для моделирования сезонного эффекта.

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

y = dYear + dAbsolute + otherPredictors

Хорошо настроенная модель ML должна делать все остальное, с обычными предостережениями, и если у вас достаточно данных ,

0 голосов
/ 28 марта 2020

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

  1. Инкрементальное моделирование

В этом случае даты смоделированы линейным образом, например, 12 De c, 2018 <12, De c, 2019. </p>

Для этого вам просто необходима функция преобразования, которая преобразует даты в цифры c значения.

Поскольку существует много дат, которые необходимо преобразовать в представление чисел c, первое, что нужно убедиться, это то, что список вывода также имеет тот же порядок, что и упомянутый Лукас. Самый простой способ сделать это - прибавить вес к каждой единице (weight_year> weight_month> weight_day).

def date2num(date_time):
  d, m, y = date_time.split('-')
  num = int(d)*10 + int(m)*100 + int(y)*1000 # these weights can be anything as long as 
                                             # they are ordered
  return num

Теперь важно нормализовать числовые значения c.

import numpy as np
date_features = []
for d in list(df['date_time']):
  date_features.append(date2num(d))
date_features = np.array(date_features)
date_features_normalized = (date_features - np.min(date_features))/(np.max(date_features) - np.min(date_features))
Использование дня, месяца, года в качестве отдельных функций. Таким образом, вместо рассмотрения даты в целом, мы разделяем. Мотивация заключается в том, что, возможно, будут какие-то отношения между выходными данными и конкретной c датой, месяцем и т. Д. c. Например, может быть, внезапно увеличивается объем производства в летний сезон (например, c месяцев) или, возможно, в выходные дни (например, c дней) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...