Python машинное обучение предсказание

Прогнозирование временных рядов с LSTM в Python

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

Автор: Usman Malik
Дата записи

Прогнозирование временных рядов с LSTM в Python

Данные временных рядов, как следует из названия, – это тип данных, который изменяется со временем. Например, температура в течение 24-часового периода времени, цена различных продуктов в течение месяца, цены акций конкретной компании в течение года. Продвинутые модели глубокого обучения, такие как Long Short Term Memory Networks (LSTM), способны улавливать закономерности в данных временных рядов и поэтому могут быть использованы для прогнозирования будущего тренда данных. В этой статье вы увидите, как использовать алгоритм LSTM для прогнозирования будущего с использованием данных временных рядов.

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

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

Набор данных и определение проблемы

Набор данных, который мы будем использовать, встроен в библиотеку Python Seaborn . Давайте сначала импортируем необходимые библиотеки, а затем импортируем набор данных:

Давайте распечатаем список всех наборов данных, встроенных в библиотеку Seaborn:

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

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

Вы можете видеть, что в наборе данных есть 144 строки и 3 столбца, что означает, что набор данных содержит 12-летнюю историю путешествий пассажиров.

Задача состоит в том, чтобы предсказать количество пассажиров, путешествовавших за последние 12 месяцев, исходя из первых 132 месяцев. Помните, что у нас есть запись 144 месяцев, а это означает, что данные за первые 132 месяца будут использоваться для обучения нашей модели LSTM, в то время как производительность модели будет оцениваться с использованием значений за последние 12 месяцев.

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

И этот следующий сценарий строит ежемесячную частоту числа пассажиров:

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

Предварительная обработка данных

Типы столбцов в нашем наборе данных-это object , как показано в следующем коде:

Первым шагом предварительной обработки является изменение типа столбца passengers на float .

Теперь, если вы распечатаете массив all_data numpy, вы увидите следующие значения плавающего типа:

Далее мы разделим наш набор данных на обучающие и тестовые наборы. Алгоритм LSTM будет обучаться на обучающем наборе. Затем модель будет использоваться для составления прогнозов на тестовом наборе. Прогнозы будут сравниваться с фактическими значениями в тестовом наборе для оценки производительности обученной модели.

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

Читайте также:  Анализ стихотворения предсказание лермонтова кратко

Теперь давайте напечатаем длину тестовых и тренировочных наборов:

Если вы сейчас распечатаете тестовые данные, то увидите, что они содержат последние 12 записей из массива all_data numpy:

Наш набор данных на данный момент не нормализован. Общее число пассажиров в первые годы значительно меньше по сравнению с общим числом пассажиров в последующие годы. Очень важно нормализовать данные для предсказаний временных рядов. Мы выполним минимальное/максимальное масштабирование набора данных, которое нормализует данные в определенном диапазоне минимальных и максимальных значений. Мы будем использовать класс MinMaxScaler из модуля sklearn.preprocessing для масштабирования наших данных. Для получения более подробной информации о реализации шкалы min/max посетите эту ссылку .

Следующий код нормализует наши данные с помощью скалера min/max с минимальными и максимальными значениями -1 и 1 соответственно.

Теперь давайте напечатаем первые 5 и последние 5 записей наших нормализованных данных о поездах.

Вы можете видеть, что значения набора данных теперь находятся в диапазоне от -1 до 1.

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

Следующим шагом является преобразование нашего набора данных в тензоры, поскольку модели PyTorch обучаются с использованием тензоров. Чтобы преобразовать набор данных в тензоры, мы можем просто передать наш набор данных конструктору объекта FloatTensor , как показано ниже:

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

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

Далее мы определим функцию с именем create_input_sequences . Функция примет необработанные входные данные и вернет список кортежей. В каждом кортеже первый элемент будет содержать список из 12 пунктов, соответствующих количеству пассажиров, путешествующих за 12 месяцев, второй элемент кортежа будет содержать один пункт, т. е. количество пассажиров за 12+1-й месяц.

Выполните следующий сценарий для создания последовательностей и соответствующих меток для обучения:

Если вы распечатаете длину списка train_in out_seq , то увидите, что он содержит 120 элементов. Это происходит потому, что, хотя обучающий набор содержит 132 элемента, длина последовательности равна 12, что означает, что первая последовательность состоит из первых 12 элементов, а 13-й элемент является меткой для первой последовательности. Аналогично, вторая последовательность начинается со второго элемента и заканчивается на 13-м элементе, тогда как 14-й элемент является меткой для второй последовательности и так далее.

Теперь давайте напечатаем первые 5 элементов списка train_in out_seq :

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

Создание модели LSTM

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

Позвольте мне кратко изложить то, что происходит в приведенном выше коде. Конструктор класса LSTM принимает три параметра:

  1. input_size : Соответствует количеству объектов во входных данных. Хотя длина нашей последовательности равна 12, для каждого месяца у нас есть только 1 значение, то есть общее количество пассажиров, поэтому входной размер будет равен 1.
  2. hidden_layer_size : Определяет количество скрытых слоев вместе с количеством нейронов в каждом слое. У нас будет один слой из 100 нейронов.
  3. output_size : Количество элементов в выводе, так как мы хотим предсказать количество пассажиров на 1 месяц в будущем, размер вывода будет равен 1.

Далее в конструкторе мы создаем переменные hidden_layer_size , lstm , linear и hidden_cell . Алгоритм LSTM принимает три входа: предыдущее скрытое состояние, предыдущее состояние ячейки и текущий вход. Переменная hidden_cell содержит предыдущее скрытое состояние и состояние ячейки. Переменные lstm и linear layer используются для создания слоев LSTM и linear.

Читайте также:  Предсказание ванги про ленина

Внутри метода forward в качестве параметра передается input_seq , который сначала передается через слой lstm . Выход слоя lstm – это скрытое состояние и состояние ячейки на текущем временном шаге, а также выход. Выходные данные из слоя lstm передаются в слой linear . Прогнозируемое количество пассажиров сохраняется в последнем элементе списка predictions , который возвращается вызывающей функции.

Следующим шагом является создание объекта класса LSTM () , определение функции потерь и оптимизатора. Поскольку мы решаем задачу классификации, мы будем использовать кросс-энтропийные потери . Для функции оптимизатора мы будем использовать adam optimizer .

Источник

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

Дата публикации 2016-12-26

Установление базового уровня необходимо для любой проблемы прогнозирования временных рядов.

Базовый уровень производительности дает представление о том, насколько хорошо все остальные модели будут эффективно работать в вашей проблеме.

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

После завершения этого урока вы узнаете:

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

Прогноз Базовой производительности

Базовая линия в прогнозировании обеспечивает точку сравнения.

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

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

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

  1. Набор данныхВы собираетесь использовать для обучения и оценки моделей.
  2. передискретизациитехника, которую вы намереваетесь использовать для оценки производительности техники (например, разделение поезда / теста).
  3. показатель эффективностивы собираетесь использовать для оценки прогнозов (например, среднеквадратическая ошибка).

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

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

Три свойства хорошего метода для создания базового прогноза:

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

Распространенным алгоритмом, используемым при установлении базовой производительности, является алгоритм постоянства.

Алгоритм постоянства («наивный» прогноз)

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

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

Эквивалентным методом для использования с набором данных временных рядов является алгоритм постоянства.

Алгоритм постоянства использует значение на предыдущем временном шаге (t-1) для прогнозирования ожидаемого результата на следующем временном шаге (t + 1).

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

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

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

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

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

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

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

Читайте также:  Показать все предсказания ванги

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

Загрузите набор данных и поместите его в текущий рабочий каталог с именем файла «Шампунь-sales.csv«.

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

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

Алгоритм постоянства

Модель персистентности может быть легко реализована в Python.

Мы разделим этот раздел на 4 этапа:

  1. Превратите одномерный набор данных в контролируемую задачу обучения.
  2. Установите поезд и тестовые наборы данных для тестового жгута.
  3. Определите модель постоянства.
  4. Сделайте прогноз и установите базовые показатели.
  5. Просмотрите полный пример и подготовьте вывод.

Давайте погрузимся в.

Шаг 1: Определите контролируемую проблему обучения

Первым шагом является загрузка набора данных и создание отложенного представления. То есть, учитывая наблюдение в момент времени t-1, можно предсказать наблюдение в момент времени t + 1.

Этот фрагмент создает набор данных и печатает первые 5 строк нового набора данных.

Мы можем видеть, что первую строку (индекс 0) придется отбросить, так как до первого наблюдения не было наблюдения, которое можно было бы использовать для прогнозирования.

С точки зрения контролируемого обучения столбец t-1 является входной переменной, или X, а столбец t + 1 является выходной переменной, или y.

Шаг 2: Поезд и тестовые наборы

Следующим шагом является разделение набора данных на наборы поездов и тестов.

Мы оставим первые 66% наблюдений для «обучения» и оставшиеся 34% для оценки. Во время разделения мы стараемся исключить первую строку данных со значением NaN.

В этом случае обучение не требуется; это просто привычка. Каждый из наборов поездов и тестов затем разделяется на входные и выходные переменные.

Шаг 3: Алгоритм постоянства

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

Например, если было предоставлено значение t-1 266,0, тогда оно возвращается в качестве прогноза, тогда как фактическое действительное или ожидаемое значение оказывается равным 145,9 (взято из первой пригодной для использования строки в нашем отсроченном наборе данных).

Шаг 4: Составьте и оцените прогноз

Теперь мы можем оценить эту модель на тестовом наборе данных.

Мы делаем это, используя метод валидации.

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

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

В этом случае ошибка превышает 17 730 по тестовому набору данных.

Шаг 5: Завершите пример

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

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

Полный пример приведен ниже.

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

Алгоритм персистентности наивен. Это часто называютнаивный прогноз,

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

Как практикующий машинное обучение, он также может вызвать большое количество улучшений.

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

Резюме

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

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

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

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

Источник

Оцените статью