LSTM в машинном обучении
Модель сети LSTM расшифровывается как сети с долговременной краткосрочной памятью (Long Short Term Memory). Это особый вид нейронных сетей, которые обычно способны различать долгосрочные зависимости. Модель LSTM, была разработана для предотвращения проблем с долгосрочными зависимостями, и с этим они обычно справляются очень хорошо. В этой статье я расскажу, как мы можем использовать LSTM в прогнозировании временных рядов.
Модели сети LSTM обычно имеют потенциал для тщательного удаления или добавления данных, что регулируется специальной структурой, известной как ворота. Первый шаг в обработке LSTM – определить, какую информацию нам нужно выбросить из ячейки.
Следующий шаг – решить, какую новую информацию мы должны хранить в ячейке. И наконец мы решаем, что хотим получить на выходе. Вывод обычно основан на состоянии ячеек. Давайте разберемся в процессе LSTM на примере прогнозирования временных рядов для прогнозирования цен на акции.
Прогноз цен на акции с использованием LSTM
Давайте посмотрим, как мы можем использовать модель LSTM для прогнозирования цен на акции с помощью прогнозирования временных рядов. Для этой задачи я очищу данные из Yahoo Finance с помощью библиотеки pandas_datareader. Итак, перед этим давайте начнем с импорта всех пакетов, которые нам нужны для этой задачи:
import math import matplotlib.pyplot as plt import keras 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 keras.layers import * from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error from sklearn.model_selection import train_test_split from keras.callbacks import EarlyStopping import pandas_datareader as web
Чтобы получить данные:
data = web.DataReader("", data_source="yahoo", start=None, end=None) data.reset_index(inplace=True) data.head()
Следующим шагом является разделение данных на наборы для обучения и тестирования, чтобы избежать переобучения и получить возможность изучить возможность обобщения нашей модели:
training_set = data.iloc[:800, 1:2].values test_set = data.iloc[800:, 1:2].values
Прогнозируемое целевое значение будет значением «закрытой» цены акции. Перед подгонкой модели рекомендуется нормализовать данные. Это повысит общую производительность. Давайте создадим входные объекты с задержкой в 1 день:
# Feature Scaling sc = MinMaxScaler(feature_range = (0, 1)) training_set_scaled = sc.fit_transform(training_set) # Creating a data structure with 60 time-steps and 1 output X_train = [] y_train = [] for i in range(60, 800): 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))
Построение модели LSTM
Пришло время построить модель долгосрочной краткосрочной памяти. Итак, я построю нейронную сеть с 50 нейронами и четырьмя скрытыми слоями:
model = Sequential() #Adding the first LSTM layer and some Dropout regularisation model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1))) model.add(Dropout(0.2)) # Adding a second LSTM layer and some Dropout regularisation model.add(LSTM(units = 50, return_sequences = True)) model.add(Dropout(0.2)) # Adding a third LSTM layer and some Dropout regularisation model.add(LSTM(units = 50, return_sequences = True)) model.add(Dropout(0.2)) # Adding a fourth LSTM layer and some Dropout regularisation model.add(LSTM(units = 50)) model.add(Dropout(0.2)) # Adding the output layer model.add(Dense(units = 1)) # Compiling the RNN model.compile(optimizer = 'adam', loss = 'mean_squared_error') # Fitting the RNN to the Training set model.fit(X_train, y_train, epochs = 100, batch_size = 32)
Для запуска модели потребуется некоторое время, после выполнения вы увидите следующий результат:
Epoch 1/100 24/24 [==============================] - 2s 99ms/step - loss: 0.0496 Epoch 2/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0085 Epoch 3/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0057 Epoch 4/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0057 Epoch 5/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0054 Epoch 6/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0062 Epoch 7/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0055 Epoch 8/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0050 Epoch 9/100 24/24 [==============================] - 3s 113ms/step - loss: 0.0044 Epoch 10/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0053 Epoch 11/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0048 Epoch 12/100 24/24 [==============================] - 3s 118ms/step - loss: 0.0051 Epoch 13/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0054 Epoch 14/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0046 Epoch 15/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0046 Epoch 16/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0045 Epoch 17/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0044 Epoch 18/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0042 Epoch 19/100 24/24 [==============================] - 3s 112ms/step - loss: 0.0039 Epoch 20/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0042 Epoch 21/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0043 Epoch 22/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0038 Epoch 23/100 24/24 [==============================] - 3s 113ms/step - loss: 0.0037 Epoch 24/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0039 Epoch 25/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0038 Epoch 26/100 24/24 [==============================] - 3s 114ms/step - loss: 0.0040 Epoch 27/100 24/24 [==============================] - 3s 117ms/step - loss: 0.0034 Epoch 28/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0039 Epoch 29/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0035 Epoch 30/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0055 Epoch 31/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0038 Epoch 32/100 24/24 [==============================] - 3s 113ms/step - loss: 0.0033 Epoch 33/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0035 Epoch 34/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0033 Epoch 35/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0035 Epoch 36/100 24/24 [==============================] - 3s 114ms/step - loss: 0.0036 Epoch 37/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0033 Epoch 38/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0039 Epoch 39/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0033 Epoch 40/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0032 Epoch 41/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0031 Epoch 42/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0028 Epoch 43/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0038 Epoch 44/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0034 Epoch 45/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0034 Epoch 46/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0032 Epoch 47/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0033 Epoch 48/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0046 Epoch 49/100 24/24 [==============================] - 3s 115ms/step - loss: 0.0032 Epoch 50/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0028 Epoch 51/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0028 Epoch 52/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0025 Epoch 53/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0025 Epoch 54/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0027 Epoch 55/100 24/24 [==============================] - 3s 116ms/step - loss: 0.0033 Epoch 56/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0029 Epoch 57/100 24/24 [==============================] - 3s 112ms/step - loss: 0.0026 Epoch 58/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0026 Epoch 59/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0029 Epoch 60/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0028 Epoch 61/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0026 Epoch 62/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0030 Epoch 63/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0027 Epoch 64/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0030 Epoch 65/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0024 Epoch 66/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0028 Epoch 67/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0024 Epoch 68/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0022 Epoch 69/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0023 Epoch 70/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0024 Epoch 71/100 24/24 [==============================] - 3s 115ms/step - loss: 0.0022 Epoch 72/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0022 Epoch 73/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0025 Epoch 74/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0020 Epoch 75/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0021 Epoch 76/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0022 Epoch 77/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0021 Epoch 78/100 24/24 [==============================] - 3s 112ms/step - loss: 0.0022 Epoch 79/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0020 Epoch 80/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0020 Epoch 81/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0021 Epoch 82/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0021 Epoch 83/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0019 Epoch 84/100 24/24 [==============================] - 3s 110ms/step - loss: 0.0020 Epoch 85/100 24/24 [==============================] - 3s 105ms/step - loss: 0.0019 Epoch 86/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0018 Epoch 87/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0018 Epoch 88/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0020 Epoch 89/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0027 Epoch 90/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0024 Epoch 91/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0021 Epoch 92/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0016 Epoch 93/100 24/24 [==============================] - 3s 106ms/step - loss: 0.0017 Epoch 94/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0018 Epoch 95/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0019 Epoch 96/100 24/24 [==============================] - 3s 109ms/step - loss: 0.0018 Epoch 97/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0020 Epoch 98/100 24/24 [==============================] - 3s 107ms/step - loss: 0.0017 Epoch 99/100 24/24 [==============================] - 3s 108ms/step - loss: 0.0019 Epoch 100/100 24/24 [==============================] - 3s 111ms/step - loss: 0.0018 <tensorflow.python.keras.callbacks.History at 0x7ffa67b17b00>
Теперь давайте изменим тестовые данные:
dataset_train = data.iloc[:800, 1:2] dataset_test = data.iloc[800:, 1:2] dataset_total = pd.concat((dataset_train, dataset_test), 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, 519): 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))
А сейчас давайте сделаем прогнозы, используя модель LSTM на тестовом наборе:
predicted_stock_price = model.predict(X_test) predicted_stock_price = sc.inverse_transform(predicted_stock_price)
Теперь давайте посмотрим на наши прогнозы:
plt.plot(df.loc[800:, 'Date'],dataset_test.values, color = 'red', label = 'Real TESLA Stock Price') plt.plot(df.loc[800:, 'Date'],predicted_stock_price, color = 'blue', label = 'Predicted TESLA Stock Price') plt.xticks(np.arange(0,459,50)) plt.title('TESLA Stock Price Prediction') plt.xlabel('Time') plt.ylabel('TESLA Stock Price') plt.legend() plt.show()
Мы видим, что наша модель работает очень хорошо. Она может точно отслеживать самые неожиданные скачки и падения; однако для самых последних отметок времени мы можем видеть, что модель ожидает более низкие (прогнозируемые) значения по сравнению с фактическими ценовыми значениями действия.
Надеюсь, вам понравилась эта статья о LSTM в машинном обучении.