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

В этой статье мы демонстрируем и реализуем последовательное моделирование с использованием LSTM для последовательных данных временных рядов (прогнозирование курса акций Reliance Industries Ltd.) с помощью кода.

Последовательные данные

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

Вот некоторые примеры последовательных данных:

  1. Данные временных рядов, такие как курсы акций, данные о погоде и показания датчиков. Эти точки данных обычно собираются через равные промежутки времени, и порядок, в котором они были собраны, важен для понимания тенденций и закономерностей.
  2. Текст на естественном языке, например книга, статья или предложение. Порядок слов и предложений важен для понимания смысла и контекста текста.
  3. Речь, например аудиозапись разговора или лекции. Порядок произносимых слов и их интонация важны для понимания смысла и контекста речи.
  4. Видео, например фильм или кадры наблюдения. Порядок кадров важен для понимания движения и действий объектов в видео.
  5. Последовательности изображений, такие как последовательность компьютерных томографов, изображений МРТ или спутниковых изображений. Порядок изображений важен для понимания изменений изображений с течением времени.

Последовательное моделирование

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

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

Несколько популярных методов последовательного моделирования:

  1. РНН
  2. ЛСТМ
  3. ГРУ
  4. Трансформеры

Сеть долговременной кратковременной памяти (LSTM).

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

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

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

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

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

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

Прогноз фондового рынка

Данные о ценах на акции являются одними из самых популярных данных последовательных временных рядов для последовательного моделирования. Давайте рассмотрим реализацию кода прогнозирования цен на акции компании Reliance Industries Ltd. (RIL), зарегистрированной на индийском фондовом рынке (NSE). Код и набор данных также предоставлены в GitHub

(Отказ от ответственности: код для прогнозирования фондового рынка предназначен только для демонстрации. Не рекомендуется использовать для реальной торговли.)

Набор данных

Доступ к набору данных по акциям, зарегистрированным на NSE или BSE, можно легко получить с веб-сайта NSE или Yahoo Finance и загрузить в виде файла .csv. Я рекомендую использовать Yahoo. Содержит меньше ошибок, чем NSE, а интерфейс более удобен для пользователя.

Набор данных разделен между набором данных проверки и обучения. Следовательно, два файла .csv.

Импорт зависимостей:

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

Следующий блок кода используется только при работе в Google Colab. Размер набора training_set уменьшен, чтобы содержать только столбец «Открыть» набора данных.

train = pd.read_csv('RELIANCE.csv')
#keras only takes numpy array
training_set = train.iloc[:, 1: 2].values

Масштабирование данных до значения в диапазоне от 0 до 1

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)

Создание тренировочного набора и целевого набора.

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

X_train = []
y_train = []
for i in range(60, len(training_set_scaled)):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

Определение модели

regressor = Sequential()

regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 80, batch_size = 32)

Загрузка тестовых данных

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

Шаг для загрузки тестовых данных в Google Colab:

uploadd = files.upload()
dataset_test = pd.read_csv('test.csv')
real_stock_price = dataset_test.iloc[:, 1:2].values

Прогноз на тестовых данных

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

В конце был добавлен дополнительный день для перекрестной проверки со значением в день проведения этого эксперимента (22 декабря 2022 г.).

dataset_total = pd.concat((train['Open'], dataset_test['Open']), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60,len(inputs)+1):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)

Сравнение с фактическими данными

import matplotlib.pyplot as plt
plt.plot(real_stock_price, color = 'black', label = 'Reliance Industries stock price')
plt.plot(predicted_stock_price, color = 'red', label = 'Predicted RIL Stock Price')
plt.title('RIL Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('RIL Stock Price')
plt.grid('True')
plt.legend()
plt.show()

Прогноз на текущую дату (22 декабря 2022 г.)

predicted_stock_price[-1]
array([2608.993], dtype=float32)
Actual Value :RIL Rs 2598 (9:15 AM IST 22nd December 2022)

Predicted Value : Rs 2609

Error : 0.42%

Вывод:

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

[1]CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=647831

[2] https://www.researchgate.net/publication/328761192_EVALUATION_OF_RECURRENT_NEURAL_NETWORKS_FOR_CROP_RECOGNITION_FROM_MULTITEMPORAL_REMOTE_SENSING_IMAGES