- Анализ временных рядов многомерных данных в Tensorflow
- Получение данных из Kaggle:
- Компоненты временного ряда
- Сезонность
- Тренд
- Нерегулярность
- Цикличность
- Автокорреляция
- Стационарность:
- Использование LSTM в моделировании данных временных рядов
- Подготовка данных
- Создание и подгонка модели
- Прогнозируйте и сравните значения:
- Заключение:
Анализ временных рядов многомерных данных в Tensorflow
С точки зрения непрофессионала, анализ временных рядов имеет дело с данными временных рядов, которые в основном используются для прогнозирования будущих значений на основе их прошлых значений. Приложение может варьироваться от прогнозирования цен на акции, таких товаров, как сырая нефть, продаж таких товаров, как автомобиль, товаров повседневного спроса, таких как шампунь, до прогнозирования индекса качества воздуха для конкретного региона. Временные ряды можно разделить на одномерные и многомерные временные ряды. Данные одномерного временного ряда состоят только из одного наблюдения, записанного с течением времени, в то время как многомерный временной ряд состоит из более чем одного наблюдения, относящегося к интересующей нас теме. В этой статье основное внимание будет уделено многомерным данным.
Получение данных из Kaggle:
Для выполнения анализа временных рядов нам необходимы данные для построения нашей модели; для чего мы будем ссылаться на общедоступные наборы данных от kaggle. В этой статье мы будем использовать данные индекса качества воздуха за последние пять лет в крупных городах Индии, представленные по этой ссылке. Чтобы загрузить данные непосредственно в Google Colab, вы можете воспользоваться следующими ссылками:
Если вы выполнили необходимые шаги, вы должны увидеть следующие файлы в загруженных данных. Нас интересует файл city_day.csv.
Выберем необходимые данные для анализа. Мы выберем данные за последние два года, соответствующие городу Дели. Данные имеют 1948 строк и 15 столбцов, включая AQI, для которого мы хотим построить модель.
Изучая данные, мы видим, что наши данные содержат пропущенные значения. Следовательно, мы заполняем недостающие значения средним значением каждого столбца, отбрасываем ненужные столбцы перед началом анализа.
Теперь, когда у нас есть данные, перейдем к следующему разделу.
Компоненты временного ряда
Как следует из названия, данные временного ряда состоят из одного или нескольких наблюдений / переменных, которые записываются последовательно в определенный интервал времени. Есть различные аспекты данных временных рядов, которые мы поймем, выполнив некоторый исследовательский анализ данных:
Сезонность
В данных временных рядов сезонность относится к циклическим изменениям, которые происходят в данных с регулярным интервалом, обычно менее года. Вот некоторые примеры: пик розничных / электронных продаж во время Рождества, увеличение продаж теплой одежды зимой и т. Д. Сезонность можно узнать, посмотрев на сам график. Приведенный ниже код отображает график, глядя на который, мы можем сказать, что, несмотря на несколько пиков и впадин, они не возникают с регулярным интервалом, и, следовательно, данные не являются сезонными.
Тренд
В данных временных рядов тренд относится к общей тенденции данных, будь то увеличение или уменьшение с течением времени (долгосрочное направление). Глядя на приведенный выше график, мы можем сказать, что общая тенденция данных не увеличивается и не уменьшается, а является постоянной тенденцией.
Нерегулярность
Нерегулярные или случайные компоненты — это те компоненты, которые невозможно предсказать. В основном они непродолжительны, не повторяются и возникают из-за непредвиденных событий.
Цикличность
Когда модель подъема и спада существует, но не в фиксированном интервале, это называется цикличностью. Одним из примеров может быть рассмотрение числа ВВП страны, нанесенного на график в зависимости от времени, он увидит огромное падение во время рецессии, например 1929, 2000 и 2008 годов, но эти интервалы не являются фиксированными. Следовательно, из приведенного выше графика мы можем сказать, что наши данные цикличны.
Автокорреляция
Это означает соотношение нынешних ценностей с прошлыми ценностями. Функция автокорреляции измеряет степень сходства текущего ряда со сходством запаздывающего ряда (прошлые значения). График ACF для индекса AQI показывает всплеск над синей областью, что указывает на автокоррелированность ряда. Точно так же вы можете проверить автокорреляцию и для других серий набора данных.
Стационарность:
Временной ряд называется стационарным, если его соответствующие статистические свойства, такие как среднее значение, стандартное отклонение и автокорреляция, остаются постоянными на протяжении всего времени. Чтобы проверить стационарность многомерных временных рядов, мы выполняем коинтеграционный тест Йохансена для временных рядов, которые возвращают собственные значения в виде массива. Если собственные значения меньше единицы, то ряд называется стационарным.
Поскольку значения, которые мы получаем, меньше единицы, ряд является стационарным.
Использование LSTM в моделировании данных временных рядов
Рекуррентные нейронные сети (RNN) — это тип нейронных сетей, которые используются для моделирования последовательности данных, таких как временные ряды и естественный язык. Обычная нейронная сеть принимает некоторую информацию x в качестве входных данных и выводит значение y. Выходные данные одного слоя не передаются в другой слой.
RNN преодолевают этот недостаток, возвращая выходной сигнал одного уровня в другой.
Это означает, что RNN должны иметь возможность предсказывать, что будет дальше, на основе контекста предыдущих данных, но на практике RNN решают эту проблему только тогда, когда разрыв между этим контекстом и предсказанием небольшой, и плохо работают, если этот разрыв становится значительным. К счастью, долговременная память (LSTM) решает эту проблему, которая представляет собой особый тип RNN.
RNN, как упоминалось выше, запоминают каждую информацию в последовательности, которая приводит к проблеме исчезающего градиента. Во время обратного распространения градиент становится настолько маленьким, что скрытые слои при обновлении узнают очень мало. LSTM решают эту проблему, запоминая только релевантную информацию и отбрасывая другую информацию. У RNN есть только одна функция активации, в то время как у LSTM есть функция последовательной активации и шлюзы, через которые они выполняют эту задачу.
Теперь, когда у нас есть некоторое представление о LSTM и о том, где они используются, давайте перейдем к построению нашей модели.
Подготовка данных
Пока что мы загрузили данные в наши машины для моделирования. При некоторой проверке мы видим, что наши данные не содержат никаких значений NULL или NaN. Поскольку мы выполняем анализ временных рядов с помощью моделирования машинного обучения, нам необходимо преобразовать наши данные в форму зависимых (y) и независимых переменных (X). Здесь наша зависимая переменная — это AQI, а остальные переменные, такие как PM2.5, PM10, NO, NO2… .. и так далее, являются независимыми переменными.
Мы масштабируем данные, чтобы обрабатывать их быстрее и устранять предвзятость из-за диапазона данных. Теперь нам нужно разделить данные на обучающие и тестовые данные в соотношении 80:20. Обратите внимание: поскольку мы выполняем анализ временных рядов, мы не можем разделить данные на обучение и тестирование случайным образом, как мы это делаем при построении других моделей машинного обучения, в противном случае модель будет содержать самую важную сущность, то есть время.
Создание и подгонка модели
Мы будем использовать Keras API поверх библиотеки Tensorflow для построения нашей модели. Ниже приведен план нашей модельной архитектуры.
model.add(LSTM(hidden_nodes, input_shape=(timesteps, input_dim))) model.add(Dropout(dropout_value))
model.compile(loss, optimizer)
hidden_nodes: количество нейронов в скрытом слое. Берем 250 нейронов
Исключение: используется для уменьшения переобучения модели. Опытным путем он установлен на уровне 20%.
Компиляция: функция компиляции принимает такие параметры, как потеря и оптимизатор. Здесь мы возьмем Средняя абсолютная ошибка в качестве показателя ошибки и Адама в качестве алгоритма оптимизации.
Прогнозируйте и сравните значения:
После подбора модели мы проверим ее работоспособность на тестовых данных. Поскольку мы нормализовали наши данные в начале перед подгонкой модели, нам придется масштабировать ее в обратном порядке, чтобы вернуть значения в исходном масштабе.
Теперь, когда у нас есть предсказанные значения для набора тестовых данных и исходных тестовых данных, давайте сравним их, вычислив RMSE и построив их вместе.
Среднеквадратичное значение теста: 30,493
Для нашей модели это хороший показатель, что среднеквадратичная ошибка на тренировочных и тестовых данных не сильно различается. Обратите внимание, что вы можете получать разные значения RMSE каждый раз при построении и запуске модели.
Прогнозирование временных рядов может быть одношаговым или многоэтапным, в зависимости от количества временных шагов, которые он способен предсказать в будущем. На основе модели, обученной на основе данных нашего поезда, мы прогнозируем будущие значения для временного интервала, соответствующего тестовым данным, и, следовательно, это многоэтапное прогнозирование. Вспомните график AQI, который мы видели в начале статьи, с прогнозом от модели график выглядит так:
Заключение:
- В этой статье мы увидели, как мы можем использовать RNN-LSTM для построения многомерной модели временных рядов, поскольку они хороши для извлечения шаблонов из последовательных данных.
2. Данные временного ряда не следует разбивать на обучающую и тестовую выборки случайным образом, так как они потеряют самую важную его суть, то есть время.
3. Традиционные методы прогнозирования временных рядов, такие как ARIMA, имеют свои ограничения, поскольку их можно использовать только для одномерных данных и одношагового прогнозирования.
4. В различных исследованиях наблюдается, что модели глубокого обучения превосходят традиционные методы прогнозирования по многомерным данным временных рядов.
5. Поскольку предоставленные данные содержат сезонность, мы можем дополнительно десезонизировать данные, чтобы наша модель могла сосредоточиться на основном сигнале.
Вы можете найти полный код этой статьи здесь