Прогнозирование временных рядов, что именно это означает?

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

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

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

Как построить набор данных? Какой метод предварительной обработки мы использовали?

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

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

Необработанные наборы данных отформатированы таким образом, что каждая строка представляет 60-секундное временное окно, содержащее:

  • Время начала временного окна во времени Unix.
  • Цена открытия в долларах США в начале временного окна
  • Максимальная цена в долларах США во временном окне
  • Минимальная цена в долларах США во временном окне
  • Цена закрытия в долларах США в конце временного окна
  • Количество транзакций BTC во временном окне
  • Сумма валюты (доллары США), транзакция во временном окне
  • Средневзвешенная цена в долларах США за временное окно

Мы действовали по шагам, которые заключаются в следующем:

  • Сначала мы очистили необработанные данные, нам нужна была только цена закрытия в долларах США в конце временного окна, поэтому мы извлекли только этот столбец.
  • После этого мы приступили к этапу курирования, который состоит в преобразовании формата наших данных, мы переключаемся с минут на часы, чтобы построить правильные временные окна.
  • Третьим шагом было разделение набора данных на набор данных для обучения и набор данных для тестирования, мы разделили данные на 80% данных на данные обучения и 20% на данные тестирования.
  • Поскольку у нас был наш набор данных для обучения и набор данных для тестирования, нам нужно было предварительно обработать его, прежде чем передать его в нашу модель. Мы применили метод стандартизации (следующая формула), используя среднее значение и стандартное отклонение данных, чтобы масштабировать наши данные между 0 и 1 соответственно.

  • После этого мы строим наши временные окна, чтобы хранить только последние 24 часа, и вызываем метод tf.keras.preprocessing.timeseries_dataset_from_array(), который создает набор данных скользящих окон по предоставленный временной ряд.
  • И теперь у нас есть набор данных для функционального обучения и набор данных для тестирования, которые можно использовать с нашими моделями!

Как настроить набор данных как набор данных тензорного потока?

При использовании tensorflow для создания набора данных вы можете вызвать API tf.data. Это «позволяет вам создавать сложные конвейеры ввода из простых, повторно используемых частей» и будет использоваться, например, tf.data.Dataset() для создания набора данных, который может использоваться в наших архитектурах.

В нашем случае мы могли бы использовать функцию tf.data.Dataset.range(), она довольно проста в использовании и создаст набор данных тензорного потока с желаемым количеством временных окон, которые вы указали. . Но мы решили использовать другую функцию (как было сказано ранее):

tf.keras.preprocessing.timeseries_dataset_from_array()

Эта функция «создает набор данных скользящих окон по временному ряду, представленному в виде массива». Она возвращает экземпляр tf.data.Dataset, аналогичный приведенной выше функции. Мы использовали его, поскольку он имеет другой параметр, такой как batch_size и shuffle, с которым мы можем немного поиграть, и это более динамичный способ построения нашего набора данных тензорного потока временных рядов.

Выбранная архитектура: архитектура с долговременной кратковременной памятью (LTSM).

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

Сначала мы построили простую LSTM-архитектуру, чтобы получить первое представление о прогнозах, и попытались улучшить ее, создав более глубокие версии. Вот наши архитектуры, использующие tensorflow-keras.

Простая LTSM-версия

В нашей первой версии мы построили простую архитектуру, состоящую из простого слоя LSTM с 32 модулями и простого выходного слоя с 1 модулем.

Глубокая LTSM-версия

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

Более глубокая LTSM-версия

Последняя версия — это глубокий LSTM с использованием параметров tf.keras.layers.LSTM(), у нас все еще есть 2 слоя LSTM, на этот раз первый со 128 единицами, а второй — с 256 единицами. Мы установили повторяющийся показатель отсева на уровне 0,03 и добавили функцию активации RELU на первый слой LSTM.

Моделирование производительности и результатов

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

Простая LTSM-версия

Здесь у нас есть показатели потерь нашей простой архитектуры LSTM и прогнозы, данные после 5 эпох обучения. Мы видим, что прогнозы №1 и №2 лучше, так как расстояние между красной и зеленой точками меньше, чем в прогнозах №3 и №4. . Чем ближе точки, тем точнее прогноз.

Глубокая LTSM-версия

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

Более глубокая LTSM-версия

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

Заключение

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

У нас были некоторые идеи, чтобы увидеть, как модели будут работать, если мы изменим временной ряд, взяв больше, чем последние 24 часа, или попытаемся предсказать больше, чем только следующий час. Изменение нашей нормализации Z-показателя на пакетную нормализацию и настройка нашего гиперпараметра, чтобы проверить, можем ли мы получить лучшие результаты и действительно ли наши текущие результаты точны.

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

Источники

Tensorflow — tf.data: сборка входных конвейеров TensorFlow

Tensorflow — tf.keras.layers.LSTM

Tensorflow — tf.keras.utils.timeseries_dataset_from_array

Tensorflow — прогнозирование временных рядов

Прогнозирование временных рядов: определение, приложения и примеры

Понимание архитектуры LSTM

Википедия — временные ряды

Соавтор

Адриен Милло (Github, Medium)

Натан Лапейр (Github, Medium)