Машинное обучение - особенности проектирования из данных даты / времени

45

Каковы общие / лучшие практики для обработки данных о времени для приложения машинного обучения?

Например, если в наборе данных есть столбец с отметкой времени события, например «2014-05-05», как вы можете извлечь полезные функции из этого столбца, если таковые имеются?

Заранее спасибо!

Игорь Бобряков
источник

Ответы:

44

Я бы начал с графика временной переменной по сравнению с другими переменными и поиска тенденций.

Например

введите описание изображения здесь

В этом случае наблюдается периодический недельный тренд и долгосрочный восходящий тренд. Таким образом, вы хотели бы закодировать две переменные времени:

  • day_of_week
  • absolute_time

В общем

Есть несколько общих периодов времени, в течение которых наблюдаются тенденции:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Ищите тенденции во всем этом.

Странные тенденции

Ищите странные тенденции тоже. Например, вы можете увидеть редкие, но устойчивые тренды, основанные на времени:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

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

Почему график?

Есть две причины, по которым я считаю графики очень важными.

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

  • Ошибки данных.
    Слишком часто данные содержат серьезные ошибки. Например, вы можете обнаружить, что даты были закодированы в двух форматах, и только один из них был правильно загружен в вашу программу. Есть множество таких проблем, и они удивительно распространены. Это еще одна причина, по которой я считаю, что графики важны не только для временных рядов, но и для любых данных.

Бен Хейли
источник
7

Разделите данные на окна и найдите функции для этих окон, такие как коэффициенты автокорреляции, вейвлеты и т. Д., И используйте эти функции для обучения.

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

Гурприт Мохар
источник
7

Помимо всего, что сказал Бен Хейли, нужно учесть еще и переход на местное время пользователя . Например, если вы пытаетесь предсказать что-то, что происходит около 8 вечера для всех пользователей, если вы посмотрите на время UTC, будет труднее предсказать.

эмир
источник
6

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

Надеюсь, что это ответ на ваш вопрос. Если не любезно, будьте немного конкретнее о том, что именно вы пытаетесь достичь

show_stopper
источник
4

Как хорошо объяснили Бен и Нар , разбиение объекта даты и времени на сегменты частей даты и времени поможет обнаружить сезонные тренды, когда полный (и обычно еще хуже - уникальный) объект даты и времени будет пропускать его

Вы не упомянули какой-либо конкретный алгоритм машинного обучения, который вас интересует, но в случае, если вас также интересует кластеризация на основе расстояния, например, k-means, я бы обобщил объект date-time в формат unix-time. , Это позволило бы провести простое числовое сравнение расстояний для алгоритма, просто указав, как далеко находятся 2 значения даты.

В вашем примере я бы обобщил значение только для даты 2014-05-05 на 1399248000 (время Unix, представляющее начало 5 мая 2014 года, UTC).

[Можно утверждать, что вы можете достичь этого, объединяя дату и время в каждую возможную часть времени и даты ... но это значительно увеличит размеры вашего набора данных. Итак, я бы предложил объединить unix-time, для измерения расстояния и некоторые интервалы даты и времени.]

Mork
источник
3

Бен говорит о статических функциях и использует функции меток времени.

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

Самая мистическая часть в том, что будущая ценность для нас невидима, как мы можем использовать эти совокупные функции в данных обучения?

Небольшой пример: имеются данные о годовом потреблении электроэнергии за период с 1991 по 2015 год. Я хочу предсказать потребление электроэнергии в ближайшие 5 лет, с 2016 по 2020 год. Я рассчитываю скользящее среднее значение потребления электроэнергии за последние 5 лет как значения характеристик 2020 года, но 2016–2020 гг. для нас неизвестны, поэтому мы ведем (напротив запаздывающего) временной ряд 5 лет, давайте сделаем скользящее среднее с 2010 по 2015 г., а затем используем это значение в качестве значений признаков 2020 г. Таким образом, мы можем построить характеристику будущих 5 лет.

Следующим шагом будет просто использовать функцию перемещения (count \ mean \ median \ min \ max.etc) и попробовать разные окна, тогда вы создадите множество функций!

Вулф
источник
2

В зависимости от того, что вас интересует информация о дате / времени, вы можете просто добавить ее в корзину. Например, если вас интересует расстояние от начальной точки (например, 1 января 2015 г.), и вы хотите измерить его в месяцах, я бы просто кодировал его как месяц 1 (для 1-31 января 2015 г.), 2 (1-2 февраля 2015 г.), 3, 4, 5, 6 и т. Д. Поскольку расстояние между датами начала приблизительно одинаково, это представляет собой временное расстояние в прямом непрерывном формате. И я говорю «непрерывно», потому что вы можете сказать «месяц 6,5» и знать, что он находится на полпути до июня 2015 года. Тогда вам не нужно беспокоиться о фактическом кодировании даты, и вы можете использовать все свои типичные методы классификации.

Если вы хотите измерять в днях, я знаю, что MySql имеет функцию «to_days», если вам случится использовать ее для извлечения данных до классификации. Python, вероятно, имеет что-то похожее или использует формат unix-time, предложенный mork.

Надеюсь это поможет!

PMP
источник
1

Постройте графики с различными вариациями времени в зависимости от конечной переменной, чтобы увидеть ее влияние. Вы можете использовать месяц, день, год в качестве отдельных функций, а поскольку месяц является категориальной переменной, вы можете попробовать построить график типа «квадрат / усы» и посмотреть, есть ли какие-либо паттерны. Для числовых переменных вы можете использовать график рассеяния.

Баран
источник
1

Я не знаю, является ли это общей / лучшей практикой, но это другая точка зрения по этому вопросу.

Если у вас есть, скажем, дата, вы можете рассматривать каждое поле как «переменную категории» вместо «непрерывной переменной». День будет иметь значение в наборе {1, 2 ..., 31}, месяц будет иметь значение в {1, ..., 12}, а для года вы выбираете минимальное и максимальное значения. и построить набор.

Затем, поскольку конкретные числовые значения дней, месяцев и лет могут оказаться бесполезными для поиска трендов в данных, используйте двоичное представление для кодирования числовых значений, каждое из которых является функцией. Например, месяц 5 будет 0 0 0 0 1 0 0 0 0 0 0 0(11 0 - это 1 в 5-й позиции, каждый бит является признаком).

Таким образом, имея, например, 10 лет в «наборе года», дата будет преобразована в вектор из 43 признаков (= 31 + 12 + 10). Используя «разреженные векторы», количество функций не должно быть проблемой.

Нечто подобное можно сделать для временных данных, дня недели, дня месяца ...

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

Пако Бартер
источник
Это не в состоянии охватить отношения, которые, вероятно, существуют, например, что 14-е и 15-е числа месяца «похожи». Если вы верите, что каждый день буквально отличается, вы также верите, что предсказание о завтрашнем дне невозможно. Также необязательно однозначно кодировать категории, не обязательно.
Шон Оуэн,
Я не могу понять, почему это не в состоянии захватить "близость" ближайших дат. Например, если вы передадите двоичный вектор в NN, он сам это выяснит после надлежащей тренировки. Использование двоичных векторов - это только один из способов представления категорий.
Пако Бартер
В этом случае у вас фактически есть столбцы, такие как «is_12th» и «is_13th», которые во входном пространстве не связаны и не связаны с «is_1st» и т. Д. В качестве непрерывной функции правильно будет показано, что 12-й и 13-й в некотором смысле ближе, чем 1-й и 12-й. Вы апеллируете к тому, что может сделать модель, но я говорю о том, что кодируют входные функции.
Шон Оуэн
Хорошо, я вижу. Вы правы, функция непрерывного воспроизведения лучше отражает качество "близости" дат. Моя точка зрения заключается в том, что в данных могут быть тенденции, для которых числовые значения дат не имеют значения (например, определенная схема покупок клиентов только в субботу). Следовательно, предлагая другую точку зрения для работы с датами.
Пако Бартер
На самом деле, как сказал @PacoBarter, одноразовое кодирование игнорирует разное расстояние между категориями. Это не так легко решить, так как эти функции по сути являются информацией о фазе, в то время как большинство моделей машинного обучения не имеют ввода типа фазы. Некоторые DIY на метриках расстояния могли бы сделать все же.
plpopk
0

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

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

  1. Методы статистического и машинного обучения прогнозирования: проблемы и пути развития Spyros Makridakis et al. В статье указывается, что для многих временных рядов традиционный статистический анализ временных рядов превосходит модели машинного обучения (ML). По сути, ML имеет тенденцию к переобучению, и любые допущения модели ML, касающиеся независимых записей, нарушаются.
  2. Простое и сложное прогнозирование: данные Кестена С. Грина и соавт. В статье сравниваются и анализируются выходные данные временных рядов рецензируемой статьи в журнале, в которой сообщается об анализе временных рядов, с сопоставлением и без сопоставления с различными моделями. В заключение, исследователи усложняют свой анализ моделями, которые труднее интерпретировать и имеют худшие показатели. Обычно это происходит из-за плохих структур стимулирования.

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

Ура,

Ресурсы для изучения статистического прогнозирования . Я бы начал с обзора бесплатного учебника Роба Дж. Хиндмана здесь: https://otexts.org/fpp2/ . Текст основан на пакете R, который вы можете легко включить в свой анализ: https://otexts.org/fpp2/appendix-using-r.html . Наконец, обратите внимание на разницу между перекрестной проверкой поперечного сечения и перекрестной проверкой временных рядов, как описано здесь: https://robjhyndman.com/hyndsight/tscv/ .

jranisau
источник