- Прогнозирование временных рядов с помощью рекуррентных нейронных сетей LSTM в Python с использованием Keras
- Обновленные сообщения о прогнозировании временных рядов LSTM:
- описание проблемы
- Длинная сеть краткосрочной памяти
- Сеть LSTM для регрессии
- LSTM для регрессии с использованием метода окна
- LSTM для регрессии с временными шагами
- LSTM с памятью между партиями
- Сложенные LSTM с памятью между партиями
- Резюме
- Обновленные сообщения о прогнозировании временных рядов LSTM:
Прогнозирование временных рядов с помощью рекуррентных нейронных сетей LSTM в Python с использованием Keras
Дата публикации 2016-07-21
Проблемы прогнозирования временных рядов являются сложным типом задачи прогнозного моделирования.
В отличие от прогнозного регрессионного моделирования, временной ряд также добавляет сложность зависимости последовательности между входными переменными.
Мощный тип нейронной сети, предназначенной для обработки зависимости от последовательности, называетсярекуррентные нейронные сети, Сеть с длинной кратковременной памятью или сеть LSTM — это тип периодической нейронной сети, используемой в глубоком обучении, потому что очень большие архитектуры могут быть успешно обучены.
В этом посте вы узнаете, как разрабатывать сети LSTM на Python с использованием библиотеки глубокого обучения Keras для решения задачи прогнозирования временных рядов.
После прочтения этого руководства вы узнаете, как внедрять и развивать сети LSTM для ваших собственных задач прогнозирования временных рядов и других более общих проблем последовательности. Ты узнаешь:
- О проблеме прогнозирования временных рядов международных пассажиров.
- Как разработать сети LSTM для регрессионного, оконного и временного построения задач прогнозирования временных рядов.
- Как разрабатывать и делать прогнозы, используя сети LSTM, которые поддерживают состояние (память) в очень длинных последовательностях.
В этом уроке мы разработаем ряд LSTM для стандартной задачи прогнозирования временных рядов. Проблема и выбранная конфигурация для сетей LSTM только для демонстрационных целей и не оптимизированы.
Эти примеры покажут вам, как именно вы можете разработать свои собственные сети LSTM с различной структурой для задач прогнозного моделирования временных рядов.
- Обновление октябрь 2016: Произошла ошибка в способе вычисления RMSE в каждом примере. Сообщенные RMSE были просто ошибочными. Теперь RMSE рассчитывается непосредственно из прогнозов, а RMSE и графики прогнозов представлены в единицах исходного набора данных. Модели оценивались с использованием Keras 1.1.0, TensorFlow 0.10.0 и scikit-learn v0.18. Спасибо всем, кто указал на проблему, и Филиппу О’Брайену за помощь, чтобы указать на исправление.
- Обновление март / 2017: Обновлен пример для Keras 2.0.2, TensorFlow 1.0.1 и Theano 0.9.0.
- Обновление апрель / 2017: Для более полного и лучшего объяснения учебника по LSTM для прогнозирования временных рядов смотрите постПрогнозирование временных рядов с помощью сети кратковременной памяти в Python,
Обновленные сообщения о прогнозировании временных рядов LSTM:
Пример в этом посте довольно устарел, у меня есть лучшие примеры использования LSTM для временных рядов, см .:
описание проблемы
Проблема, которую мы собираемся рассмотреть в этом посте, — это проблема прогнозирования Международных Пассажиров Авиалиний.
Это проблема, когда, учитывая год и месяц, задача состоит в том, чтобы предсказать количество пассажиров международных авиакомпаний в единицах 1000. Данные варьируются с января 1949 года по декабрь 1960 года, или 12 лет, с 144 наблюдениями.
Набор данных доступен бесплатно изВеб-страница DataMarket для загрузки в формате CSVс именем файла «Международно-авиакомпания-passengers.csv«.
Ниже приведен пример первых нескольких строк файла.
Мы можем легко загрузить этот набор данных, используя библиотеку Pandas. Нас не интересует дата, учитывая, что каждое наблюдение отделено одним и тем же интервалом в один месяц. Поэтому, когда мы загружаем набор данных, мы можем исключить первый столбец.
Загруженный набор данных также содержит информацию нижнего колонтитула, которую мы можем исключить с помощьюskipfooterаргументpandas.read_csv ()установите 3 для 3 нижних колонтитулов. После загрузки мы можем легко построить весь набор данных. Код для загрузки и построения набора данных приведен ниже.
Вы можете увидеть восходящий тренд в наборе данных с течением времени.
Вы также можете увидеть некоторую периодичность в наборе данных, которая, вероятно, соответствует периоду отпуска Северного полушария.
Мы собираемся сделать вещи простыми и работать с данными как есть.
Обычно хорошей идеей является изучение различных методов подготовки данных, чтобы изменить их масштаб и сделать их стационарными.
Длинная сеть краткосрочной памяти
Сеть с долговременной кратковременной памятью, или сеть LSTM, представляет собой рекуррентную нейронную сеть, которая обучается с использованием обратного распространения через время и преодолевает проблему исчезающего градиента.
Как таковой, он может использоваться для создания больших рекуррентных сетей, которые, в свою очередь, могут использоваться для решения сложных проблем последовательности в машинном обучении и достижения современных результатов.
Вместо нейронов в сетях LSTM есть блоки памяти, которые связаны через слои.
Блок имеет компоненты, которые делают его умнее, чем классический нейрон, и память для последних последовательностей. Блок содержит ворота, которые управляют состоянием и выходом блока Блок работает с входной последовательностью, и каждый логический элемент в блоке использует блоки активации сигмоида для управления, инициированы ли они или нет, что делает изменение состояния и добавление информации, протекающей через блок, условным.
В подразделении есть три типа ворот:
- Забыть ворота: условно решает, какую информацию выбросить из блока.
- Входные ворота: условно решает, какие значения из входных данных обновлять состояние памяти.
- Выходные ворота: условно решает, что выводить на основе ввода и памяти блока.
Каждый юнит похож на миниатюрный автомат, в котором ворота юнитов имеют веса, которые изучаются во время процедуры обучения.
Вы можете увидеть, как вы можете достичь сложного обучения и памяти из слоя LSTM, и нетрудно представить, как абстракции высшего порядка могут быть наслоены несколькими такими слоями.
Сеть LSTM для регрессии
Мы можем сформулировать проблему как проблему регрессии.
То есть, учитывая количество пассажиров (в тысячах единиц) в этом месяце, каково количество пассажиров в следующем месяце?
Мы можем написать простую функцию для преобразования нашего единственного столбца данных в набор данных из двух столбцов: первый столбец, содержащий количество пассажиров в этом месяце (t), и второй столбец, содержащий количество пассажиров в следующем месяце (t + 1), для прогнозирования.
Прежде чем мы начнем, давайте сначала импортируем все функции и классы, которые мы собираемся использовать. Это предполагает рабочую среду SciPy с установленной библиотекой глубокого обучения Keras.
Прежде чем что-либо делать, рекомендуется исправить случайное число, чтобы обеспечить воспроизводимость наших результатов.
Мы также можем использовать код из предыдущего раздела, чтобы загрузить набор данных как фрейм данных Pandas. Затем мы можем извлечь массив NumPy из фрейма данных и преобразовать целочисленные значения в значения с плавающей запятой, которые больше подходят для моделирования с нейронной сетью.
LSTM чувствительны к масштабу входных данных, особенно когда используются функции активации сигмоида (по умолчанию) или tanh. Хорошей практикой может быть изменение масштаба данных до диапазона от 0 до 1, также называемого нормализацией. Мы можем легко нормализовать набор данных, используяMinMaxScalerкласс предварительной обработки из библиотеки scikit-learn.
После того, как мы смоделируем наши данные и оценим мастерство нашей модели на наборе обучающих данных, нам необходимо получить представление об умении модели на новых невидимых данных. Для нормальной задачи классификации или регрессии мы бы сделали это с помощью перекрестной проверки.
С данными временных рядов важна последовательность значений. Простой метод, который мы можем использовать, состоит в том, чтобы разделить упорядоченный набор данных на обучающие и тестовые наборы данных. Приведенный ниже код вычисляет индекс точки разделения и разделяет данные на обучающие наборы данных с 67% наблюдений, которые мы можем использовать для обучения нашей модели, оставляя 33% для тестирования модели.
Теперь мы можем определить функцию для создания нового набора данных, как описано выше.
Функция принимает два аргумента:Набор данных, который является массивом NumPy, который мы хотим преобразовать в набор данных, иоглядываться, которое является числом предыдущих временных шагов для использования в качестве входных переменных для прогнозирования следующего периода времени — в этом случае по умолчанию 1.
Это значение по умолчанию создаст набор данных, где X — количество пассажиров в данный момент времени (t), а Y — количество пассажиров в следующий раз (t + 1).
Его можно настроить, и мы построим набор данных другой формы в следующем разделе.
Давайте рассмотрим влияние этой функции на первые строки набора данных (для ясности показаны в ненормализованной форме).
Если вы сравните эти первые 5 строк с исходным образцом набора данных, перечисленным в предыдущем разделе, вы увидите шаблон X = t и Y = t + 1 в числах.
Давайте использовать эту функцию, чтобы подготовить наборы данных для обучения и тестирования для моделирования.
Сеть LSTM ожидает, что входные данные (X) будут снабжены определенной структурой массива в виде:[образцы, временные шаги, особенности],
В настоящее время наши данные находятся в форме: [образцы, особенности] и мы формулируем проблему как один временной шаг для каждого образца. Мы можем преобразовать подготовленный поезд и проверить входные данные в ожидаемую структуру, используяnumpy.reshape ()следующее:
Теперь мы готовы спроектировать и приспособить нашу сеть LSTM для этой проблемы.
Сеть имеет видимый слой с 1 входом, скрытый слой с 4 блоками или нейронами LSTM и выходной слой, который делает прогноз одного значения. Функция активации сигмоида по умолчанию используется для блоков LSTM. Сеть обучена для 100 эпох, и используется размер партии 1.
После того, как модель подобрана, мы можем оценить производительность модели в поездах и тестовых наборах данных. Это даст нам точку сравнения для новых моделей
Обратите внимание, что мы инвертируем прогнозы перед вычислением баллов ошибок, чтобы обеспечить представление производительности в тех же единицах, что и исходные данные (тысячи пассажиров в месяц).
Наконец, мы можем генерировать прогнозы, используя модель как для поезда, так и для тестового набора данных, чтобы получить визуальное представление о навыке модели.
Из-за того, как был подготовлен набор данных, мы должны сместить прогнозы так, чтобы они совпали по оси X с исходным набором данных. После подготовки данные наносятся на график, показывая исходный набор данных синим цветом, прогнозы для обучающего набора данных зеленым цветом и прогнозы для невидимого тестового набора данных красным цветом.
Мы видим, что модель отлично справилась с подбором как обучающих, так и тестовых наборов данных.
Для полноты ниже приведен пример кода.
Выполнение примера приводит к следующему выводу.
Мы видим, что средняя ошибка модели составляет около 23 пассажиров (в тысячах) в наборе учебных данных и около 52 пассажиров (в тысячах) в тестовом наборе данных. Не так уж плохо.
LSTM для регрессии с использованием метода окна
Мы также можем сформулировать проблему так, чтобы можно было использовать несколько недавних временных шагов, чтобы сделать прогноз для следующего временного шага.
Это называется окном, а размер окна — это параметр, который можно настроить для каждой проблемы.
Например, учитывая текущее время (t), которое мы хотим предсказать в следующий раз в последовательности (t + 1), мы можем использовать текущее время (t), а также два предыдущих времени (t-1). и т-2) в качестве входных переменных.
Если сформулировать как проблему регрессии, входными переменными являются t-2, t-1, t, а выходной переменной — t + 1.
create_dataset ()Функция, которую мы создали в предыдущем разделе, позволяет нам создать эту формулировку проблемы временных рядов путем увеличенияоглядыватьсяаргумент от 1 до 3.
Образец набора данных с этой формулировкой выглядит следующим образом:
Мы можем повторно запустить пример в предыдущем разделе с большим размером окна. Полный список кода с изменением размера окна приведен ниже для полноты.
Выполнение примера дает следующий вывод:
Мы можем видеть, что ошибка была немного увеличена по сравнению с предыдущим разделом. Размер окна и сетевая архитектура не были настроены: это всего лишь демонстрация того, как сформулировать проблему прогнозирования.
LSTM для регрессии с временными шагами
Возможно, вы заметили, что подготовка данных для сети LSTM включает временные шаги.
Некоторые проблемы последовательности могут иметь различное количество временных шагов на выборку. Например, у вас могут быть измерения физической машины, приводящей к точке отказа или точке помпажа. Каждый инцидент будет выборкой, а наблюдения, которые приведут к событию, будут временными шагами, а наблюдаемые переменные будут характеристиками.
Временные шаги дают еще один способ сформулировать нашу проблему временных рядов. Как и в примере с окном выше, мы можем использовать предыдущие временные шаги в нашем временном ряду в качестве входных данных для прогнозирования выходных данных на следующем временном шаге.
Вместо того, чтобы формулировать прошлые наблюдения как отдельные входные объекты, мы можем использовать их как временные шаги для одного входного объекта, что действительно является более точным формулированием проблемы.
Мы можем сделать это, используя то же представление данных, что и в предыдущем примере на основе окна, за исключением того, что, когда мы изменяем форму данных, мы устанавливаем столбцы в качестве измерения временных шагов и изменяем измерение характеристик обратно на 1. Например:
Полный список кодов приведен ниже для полноты.
Выполнение примера дает следующий вывод:
Мы можем видеть, что результаты немного лучше, чем в предыдущем примере, хотя структура входных данных имеет гораздо больше смысла.
LSTM с памятью между партиями
Сеть LSTM имеет память, способную запоминать длинные последовательности.
Обычно состояние в сети сбрасывается после каждой обучающей партии при подгонке модели, а также при каждом обращении кmodel.predict ()или жеmodel.evaluate (),
Мы можем получить более точный контроль, когда внутреннее состояние сети LSTM очищается в Keras, сделав слой LSTM «состоящим из состояний». Это означает, что он может строить состояние во всей обучающей последовательности и даже поддерживать это состояние, если это необходимо для прогнозирования.
Это требует, чтобы данные обучения не перемешивались при настройке сети. Это также требует явного сброса состояния сети после каждого воздействия обучающих данных (эпох) с помощью обращений кmodel.reset_states (), Это означает, что мы должны создать наш собственный внешний цикл эпох и в каждом вызове эпохmodel.fit ()а такжеmodel.reset_states (), Например:
Наконец, когда слой LSTM построен,Statefulпараметр должен быть установленПравдаи вместо того, чтобы указывать входные измерения, мы должны жестко закодировать число выборок в пакете, количество временных шагов в выборке и количество объектов в временном шаге, установивbatch_input_shapeпараметр Например:
Этот же размер партии необходимо использовать позже при оценке модели и прогнозировании. Например:
Мы можем адаптировать предыдущий пример временного шага, чтобы использовать LSTM с отслеживанием состояния. Полный список кодов приведен ниже.
Выполнение примера дает следующий вывод:
Мы видим, что результаты хуже. Модель может нуждаться в большем количестве модулей и может нуждаться в обучении для большего количества эпох, чтобы усвоить структуру проблемы.
Сложенные LSTM с памятью между партиями
Наконец, мы рассмотрим одно из больших преимуществ LSTM: тот факт, что их можно успешно обучать, когда они объединены в глубокие сетевые архитектуры.
Сети LSTM могут быть сложены в Keras так же, как и другие типы слоев. Одним из необходимых дополнений к конфигурации является то, что уровень LSTM перед каждым последующим уровнем LSTM должен возвращать последовательность. Это можно сделать, установивreturn_sequencesпараметр на слоеПравда,
Мы можем расширить LSTM с сохранением состояния в предыдущем разделе, чтобы иметь два уровня, как показано ниже:
Полный список кодов приведен ниже для полноты.
Выполнение примера приводит к следующему выводу.
Прогнозы на тестовом наборе данных снова хуже. Это еще одно свидетельство, указывающее на необходимость дополнительных тренировочных эпох.
Резюме
В этой статье вы узнали, как разрабатывать рекуррентные нейронные сети LSTM для прогнозирования временных рядов в Python с помощью сети глубокого обучения Keras.
В частности, вы узнали:
- О проблеме прогнозирования временных рядов пассажиров международной авиакомпании.
- Как создать LSTM для регрессии и оконной формулировки проблемы временных рядов.
- Как создать LSTM с формулировкой задачи временного ряда с временным шагом.
- Как создать LSTM с состоянием и составные LSTM с состоянием для изучения длинных последовательностей.
У вас есть вопросы о LSTM для прогнозирования временных рядов или об этом посте?
Задайте свои вопросы в комментариях ниже, и я сделаю все возможное, чтобы ответить.
Обновленные сообщения о прогнозировании временных рядов LSTM:
Пример в этом посте довольно устарел, у меня есть лучшие примеры использования LSTM для временных рядов, см .:
Источник