Технология | Как генерировать состояния LSTM для прогнозирования временных рядов в Python

машинное обучение искусственный интеллект Python модульный тест

Сеть с долговременной кратковременной памятью (LSTM) — это мощная рекуррентная нейронная сеть, способная запоминать длинные последовательности наблюдений.

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

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

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

После прохождения этого урока вы будете знать:

  • Открытый вопрос о том, как предустановить состояния для подходящей модели прогнозирования LSTM.

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

  • Как определить, уместно ли инициализировать начальное состояние LSTM перед прогнозированием при решении задачи прогнозирования временных рядов.

Давайте начнем.

Как инициализировать состояние для LSTM для прогнозирования временных рядов в Python

Обзор учебника

Учебник разделен на 5 частей, это:

  1. Инициализация начального состояния LSTM

  2. Набор данных о продажах шампуней

  3. Модели LSTM и инструменты тестирования

  4. написание кода

  5. результаты теста

окрестности

В этом руководстве предполагается, что вы установили среду Python SciPy. Вы можете использовать Python 2 или 3 для этого примера.

У вас должен быть установлен Keras (2.0 или более поздней версии) с бэкэндом TensorFlow или Theano.

В этом руководстве также предполагается, что у вас установлены scikit-learn, Pandas, NumPy и Matplotlib.

Если вам нужна помощь в установке вашей среды, ознакомьтесь с этой статьей:

Как установить среду Python, необходимую для машинного обучения и глубокого обучения с помощью Anaconda

http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/


1. Инициализация начального состояния LSTM

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

Это достигается с помощью функции model.reset_states().

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

Предполагая, что мы можем достичь этого точного контроля, возникает вопрос о том, следует ли и как предварительно установить состояние LSTM перед тем, как делать прогнозы.

Возможные варианты:

  • Сбросить состояние перед предсказанием.

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

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

Кроме того, существует много способов инициализировать состояние, например:

  • Завершите тренировочную эпоху, включая обновления веса. Например, состояние не сбрасывается после последней эпохи обучения.

  • Завершите прогноз на обучающих данных.

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

В этом уроке мы рассмотрим различия между двумя подходами:

  • Используйте подходящий LSTM без сохранения состояния для прогнозирования набора тестовых данных (например, после сброса).

  • Используйте соответствующий LSTM с отслеживанием состояния для прогнозирования набора тестовых данных после прогнозирования набора обучающих данных.

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

Набор данных о продажах шампуней

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

Единицей данных являются продажи, и имеется 36 наблюдений. Исходный набор данных был предоставлен Макридакисом, Уилрайтом и Хайндманом (1998).

Вы можете скачать и узнать больше о наборе данных по этой ссылке:

https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period

Приведенный ниже пример кода загружает и создает представление загруженного набора данных.

Выполнение примера загружает набор данных в виде последовательности Pandas и распечатывает первые 5 строк.

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

Диаграмма продаж шампуня

Далее мы рассмотрим инструменты настройки и тестирования LSTM, используемые в этом эксперименте.


3. Модель LSTM и инструменты тестирования

раздел данных

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

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

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

Оценка модели

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

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

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

Структура обучающих и тестовых наборов данных будет имитировать это. Мы создадим все прогнозы за один шаг.

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

подготовка данных

Прежде чем подгонять модель LSTM к набору данных, мы должны преобразовать данные.

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

  • Преобразуйте данные последовательности, чтобы сделать их статическими.В частности, использование разницы lag=1 для устранения растущих тенденций в данных.

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

  • Преобразуйте наблюдения так, чтобы они попадали в определенный интервал.В частности, данные масштабируются в интервале от -1 до 1, чтобы соответствовать функции активации гиперболического тангенса по умолчанию модели LSTM.

LSTM-модель

Используемая модель LSTM будет эффективно делать прогнозы, но не корректироваться.

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

Топология сети состоит из одного выхода, скрытого слоя из 4 блоков и выходного слоя из 1 выходного значения.

Модель будет соответствовать набору данных с размером пакета 4 и эпохой 3000. Набор обучающих данных будет сокращен до 20 наблюдений после завершения подготовки данных. Таким образом, размер пакета может быть равномерно разделен между наборами данных для обучения и тестирования (как требование).

тестовый забег

Для каждого протокола будет проведено тридцать испытаний.

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

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

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

Давайте рассмотрим эти результаты.


4. Написание кода

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

Функция Experiment() описывает параметры каждой схемы.

Полный код записывается следующим образом:


5. Результаты испытаний

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

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

В конце каждого испытания рассчитывались и распечатывались сводные данные для каждого протокола, включая среднее значение и стандартное отклонение.

Полный вывод выглядит следующим образом:

Кроме того, создайте график типа «ящик с усами» и сохраните его в папку следующим образом:

Диаграммы коробок и усов инициализированных и неинициализированных LSTM

Результаты были удивительными.

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

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

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

продлевать

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

  • Оцените влияние состояний опорожнения и отсутствия опорожнения после каждой эпохи обучения.

  • Оцените влияние прогнозирования обучающего набора и тестового набора за раз по сравнению с прогнозированием одного временного шага за раз.

  • Оцените влияние сброса и невыполнения сброса состояния LSTM после каждой эпохи.

Вы пробовали эти расширенные пробные версии?

Суммировать

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

В частности, вы узнали:

  • Относительно проблемы инициализации начальных значений состояния LSTM перед прогнозированием и способов ее решения.

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

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


автор этой статьиJason Brownlee

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