python - 您如何使用我在下面构建的 LSTM-RNN 模型预测未来值?
问题描述
我已经成功创建了模型,并且在测试数据上效果很好。我不知道如何让它预测未来的价值,有人可以帮我吗?我尝试将时间步长更改为负值,以便模型预测未来值,但我无法执行它,因为我遇到了导致我绕圈子的错误。任何帮助,将不胜感激!这是代码:
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)
解决方案
在这里,我在我的代码中使用了类似的东西首先你需要提到你想要预测多少个值(我使用了 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 的输入
推荐阅读
- mysql - 根据目标数据库中的 where 条件将表数据从一个数据库复制到另一个数据库
- python-3.x - 如何将 excel/csv 文件作为函数参数传递?
- php - 按产品名称获取产品 ID(转义特殊字符)
- c# - 运行 Scaffold DBContext 而不覆盖实体框架核心中的自定义代码
- android - 如何解决 Kotlin 的膨胀类错误?
- javascript - 更新 mobx 存储值后,组件的 render() 没有被调用
- angular - 类构造函数 AnimationEngine 不能在没有 new 的情况下被调用
- kibana - 在 Elastalert 计划间隔选项中丢失
- ionic-framework - 离子标头,如何使用整个屏幕
- python - 通过按索引省略值来过滤列表