Как вы прогнозируете будущие значения с помощью этой модели LSTM-RNN, которую я построил ниже? - PullRequest
0 голосов
/ 07 мая 2020

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

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

dataset_train = pd.read_csv(r'C:\Users\Vincent\Desktop\file_train.csv', error_bad_lines = False)
training_set = dataset_train.iloc[:, 1:2].values

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

X_train = []
y_train = []
for i in range (1, 389):
    X_train.append(sc_training_set[i-1:i, 0])
    y_train.append(sc_training_set[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))

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

regressor = Sequential()

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

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

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

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

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

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

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

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics = ['accuracy'])

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

dataset_test = pd.read_csv(r'C:\Users\Vincent\Desktop\file_test.csv', error_bad_lines = False)
stock_values = dataset_test.iloc[:, 1:2].values

total_dt = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0)
inputs = total_dt[len(total_dt) - len(dataset_test) - 1:].values
inputs = inputs.reshape(-1, 1)
inputs = sc.transform(inputs)
X_test = []

for i in range(1, 364):
    X_test.append(sc_training_set[i-1:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

pred_stock = regressor.predict(X_test)
pred_stock = sc.inverse_transform(pred_stock)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

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

0 голосов
/ 08 мая 2020

Здесь я использую что-то подобное в своем коде. Сначала вам нужно указать, сколько значений вы хотите предсказать (я использовал 168)

n_ahead=input("How many values do you want to predict ?");
n_ahead=int(n_ahead)
# Making the prediction list 
def predict_ahead(n_ahead):
   yhat = []
   for _ in range(n_ahead):
   # Making the prediction
       fc = regressor.predict(X_train)
       yhat.append(fc)

   # Creating a new input matrix for forecasting
       X_train = np.append(X_train, fc)

   # Ommitting the first variable
       X_train = np.delete(X_train, 0)

   # Reshaping for the next iteration
       X_train = np.reshape(X_train, (1, len(X_train), 1))

   return yhat 
p=predict_ahead(n_ahead)
print(p)

Помните, что X_train - это массив и вам нужно изменить его во время каждой итерации в качестве входных данных для LSTM

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