Самое полное введение во временные ряды для машинного обучения, которое вы можете найти

Совершенно очевидно, что самый ценный ресурс, который у нас есть, — это время. - Стив Джобс

Введение

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

Знание того, как моделировать временные ряды, является важным навыком в науке о данных, поскольку существуют структуры, характерные для этого типа данных, которые можно исследовать в любых ситуациях.

Все, что я привожу в этом руководстве, можно использовать в любом временном масштабе. Имейте в виду, что: всякий раз, когда я говорю дни, недели, часы или любую единицу времени, вы можете понимать это как «периоды». Тогда давайте начнем.

Структура временного ряда

Как понять, что вы имеете дело с временным рядом? Временной ряд – это ряд точек данных, проиндексированных во времени. Самый простой временной ряд выглядит примерно так:

Где находятся элементы:

  • Отметка времени: отметка момента времени, когда событие было зарегистрировано. Его точность будет зависеть от измеряемого события.
  • Ценность: какова ценность этого явления в тот момент? Может
    быть только одним или несколькими значениями. Когда на отметку времени приходится более одного значения, у нас есть временной ряд с несколькими переменными.

Тип временного ряда

Кроме того, важно знать, что существует два типа временных рядов:

  • Обычные временные ряды: это те, которые имеют запись в каждый одинаковый период времени. Ежедневный ряд температур можно считать регулярным, поскольку мы ожидаем ровно одну запись в день, одну запись в единицу времени.
  • Нерегулярные временные ряды: собираются без определенной частоты. Примером может служить журнал посещений веб-сайта. Люди не получают доступ равномерно каждые N минут. В этом случае у нас будут записи с разными временными интервалами между ними.

Подготовка данных временных рядов

Разработка функций

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

  • Задержка. Функция запаздывания просто использует предыдущее целевое значение в качестве функции для прогнозирования текущего. Например, если вы хотите предсказать цену акций Apple на завтра, сегодняшняя цена — это действительно мощная функция, в данном случае это функция с запаздыванием 1. Или, если ваша проблема имеет еженедельную сезонность, возможно, будет очень полезна функция задержки семь.
  • Различия: эта функция очень похожа на отставание. Только здесь вместо конкретного значения мы будем использовать разницу между прошлым периодом и предыдущим. Например, вычисление разницы между количеством товаров, проданных вчера, и количеством товаров, проданных в тот же день недели, но на прошлой неделе. Наиболее распространенной операцией является разность (вычитание), но мы также можем использовать суммы, отношения и умножения.
  • Статистические функции. В дополнение к конкретным значениям и арифметическим операциям над ними мы можем вычислять такие статистические данные, как среднее значение, стандартное отклонение, максимум, минимум, квантили. В нашем примере с продажами мы можем рассчитать, какое максимальное количество продукта было продано за один день за последние семь дней. Идея проста: взять окно периодов и применить функцию к соответствующим значениям. Обычно эта функция должна возвращать только одно число для каждой метки времени.
  • Разложение временной метки: мы также можем извлечь соответствующие части нашей временной метки, обычно связанные с ее сезонностью. Некоторые периоды имеют дифференцированную картину, характерную для этого момента. Некоторые классические примеры: Рождество, Черная пятница, День матери, Родители, Валентина. В дни, предшествующие этим датам, наблюдается значительный рост продаж в торговле. Другими словами, в это время года всегда будет рост продаж, и модель должна это знать. Мы можем создавать такие функции, как день недели, день месяца, месяц года, время суток.

Моделирование

Традиционно модели для статистических временных рядов применяются по одному ряду за раз. То есть у вас есть только набор значений, и вы применяете нужный метод для моделирования процесса, который его генерирует. В Data Science мы также можем моделировать одну серию за раз, просто создавая функции, которые зависят только от значений серии, которую мы пытаемся предсказать. Однако мы также можем сложить временные ряды, чтобы создать сложенное моделирование. Таким образом, у нас могут быть индивидуальные модели и модели с накоплением, поскольку индивидуальные модели являются традиционным подходом, я просто подробно объясню подход стека.

Стековое моделирование

В этом случае вместо создания модели для каждой серии мы «складываем» их все вместе и создаем глобальную модель. Что я имею в виду под складыванием?

Представим, что у нас есть ряд цен акций 10 компаний за год, по одной записи в день. Соединим все эти серии в одну. Тогда у нас будет 10 компаний х 365 дней = 3650 строк. Каждая строка «новой серии» будет иметь временную метку, идентификатор компании и объем продаж на данный момент.

Почему мы хотим это сделать?

  • Больше данных. Модели машинного обучения лучше работают с большим объемом данных. Вместо того, чтобы создавать модели на основе нескольких записей (365 строк в нашем примере), мы будем создавать больше строк, что позволит модели более надежно фиксировать закономерности.
  • Сложность. Когда дело доходит до производства, мониторинга моделей и обеспечения их работы, гораздо проще поддерживать только одну модель, чем 10. Это снижает сложность нашего решения и позволяет избежать ошибок реализации.
  • Глобальные эффекты. Используя сразу несколько рядов, модель имеет возможность фиксировать общие события между ними. Глобальные эффекты, происходящие в нескольких сериях, будут более четкими и более легкими для захвата.

Проверка

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

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

Вы можете задаться вопросом: действительно ли весь процесс изменится со временем?

Даже классификатор изображений должен быть затронут, поскольку устройства, используемые для съемки, постоянно меняются.

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

Таким образом, самый простой, но уже достаточно надежный способ разделить временные данные между обучением и тестированием — это разделение по дате. Вы можете взять конкретную дату или часть ваших данных, обычно первые 70% для обучения и 30% для проверки. Или даже, можем ли мы сделать перекрестную проверку временных рядов?

Перекрестная проверка временных рядов

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

Обычно для модели важнее более свежие данные. Есть два типа «окон», которые мы можем использовать для проверки нашей модели:

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

  • Скользящее окно: в этом формате, а также при расчете функций мы будем скользить по фиксированному окну, определенному ранее, по данным. Скользящее окно дает вам больший контроль над данными, которые вы собираетесь использовать, делая конвейер более надежным при переобучении. Даже если у вас есть многолетние данные, это не значит, что вам нужно использовать все для обучения модели.

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

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

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

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

Модель

Некоторые модели машинного обучения лучше работают с данными временных рядов.

Ансамбли деревьев

Здесь речь идет о любой модели, которая объединяет несколько деревьев решений для составления прогноза. Наиболее популярными являются Random Forest и Gradient Boosted Decision Trees.

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

Нейронные сети

Нейронные сети многослойного персептрона (MLP) являются наиболее традиционными, которые можно использовать для создания моделей практически любой природы. Но есть некоторые типы, которые имеют дело со строками изначально.

Сверточная нейронная сеть (CNN)

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

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

Рекуррентная нейронная сеть (RNN)

Наиболее популярным сегодня является Long-Short-Time-Memory (LSTM), созданный специально для последовательных данных, как в случае с временными рядами. Идея в том, что не только текущий пример может повлиять на результат, но и «память» о прошлых примерах может помочь в прогнозе.

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

Распад времени

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

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

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

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

Вывод

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

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

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

Приятно читать книги о временных рядах:

Прогнозирование временных рядов (Франческа Лаццери): https://amzn.to/2R7qGko

Ускоренный курс Python (Эрик Маттес): https://amzn.to/38gJtPI

Python для анализа данных (Уэс МакКинни): https://amzn.to/2tpgevz

Совершенно очевидно, что самый ценный ресурс, который у нас есть, — это время. — Стив Джобс

Использованная литература:

Показатели CV временных рядов взяты из: https://hub.packtpub.com/cross-validation-strategies-for-time-series-forecasting-tutorial/