首页 > 解决方案 > Keras NN 模型无法预测未来值

问题描述

我正在尝试预测股票的未来价格(大声笑为游戏停止练习),但我最终预测了我数据中已有的值。(模型无法预测未来的值)。我已经尝试创建一个未来列,它是价格,但向后移动了我想要预测的天数 - 希望预测未来一个月(days_ahead = 31)。可能缺少一些依赖项。

import numpy as np
from numpy import loadtxt
import matplotlib.pyplot as plt
from sklearn.preprocessing import scale
#from TFANN import ANNR
#import pandas as pd
from google.colab import files
import tensorflow as tf

import random
#import yahoo_fin


df2 = web.DataReader('KO', data_source = 'yahoo', start = '1/27/2020', end = '1/29/2021')

days_ahead = 31

df2['Future'] = df2['Close'].shift(-days_ahead)



# get them before droping NaNs
last_sequence = np.array(df2['Future'].tail(days_ahead))
# drop NaNs
df2.dropna(inplace=True)





train_data = scaled_data[0:training_data_len , :]

#Split the data into x_train and y_train data sets
step = 100


x_train = []
y_train = []

for i in range(step, len(train_data)):
  x_train.append(train_data[i- step: i, 0])
  y_train.append(train_data[i, 0])


print(x_train)
print(y_train)


from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense

    # np.random.seed(314)
    # tf.random.set_seed(314)

model = Sequential()
model.add(LSTM(100, return_sequences=True, input_shape= (x_train.shape[1], 1), ))
model.add(LSTM(100, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(25))
model.add(Dropout(0.2))
model.add(Dense(1, kernel_initializer='normal'))

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

model.fit(x_train, y_train, batch_size=32, epochs=10)


Epoch 1/10
3/3 [==============================] - 0s 120ms/step - loss: 0.0198
Epoch 2/10
3/3 [==============================] - 0s 126ms/step - loss: 0.0164
Epoch 3/10
3/3 [==============================] - 0s 124ms/step - loss: 0.0280
Epoch 4/10
3/3 [==============================] - 0s 121ms/step - loss: 0.0181
Epoch 5/10
3/3 [==============================] - 0s 121ms/step - loss: 0.0217
Epoch 6/10
3/3 [==============================] - 0s 123ms/step - loss: 0.0212
Epoch 7/10
3/3 [==============================] - 0s 119ms/step - loss: 0.0240
Epoch 8/10
3/3 [==============================] - 0s 130ms/step - loss: 0.0232
Epoch 9/10
3/3 [==============================] - 0s 124ms/step - loss: 0.0202
Epoch 10/10
3/3 [==============================] - 0s 121ms/step - loss: 0.0136
<tensorflow.python.keras.callbacks.History at 0x7fc4c15d07f0>


# make testing data set
# make new array with scaled values 
test_data = scaled_data[training_data_len - step: , :]
#Create  x_test and y_test
x_test = []
y_test = stock_data[training_data_len:, :]
for i in range(step, len(test_data)):
  x_test.append(test_data[i-step:i, 0])

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

pricePredict = model.predict(x_test)
pricePredict = scaler.inverse_transform(pricePredict)

sum_square_error = 0.0
for i in range(len(pricePredict)):
    sum_square_error += (pricePredict[i] - y_test[i])**2.0
mean_square_error = 1.0 / len(pricePredict) * sum_square_error
print(mean_square_error)

train = data[:training_data_len]
valid = data[training_data_len:]
valid['Prediction'] = pricePredict

plt.figure(figsize =(16,8))
plt.title('Stock Price History vs Model Prediction')
plt.plot(train['Future'])
plt.plot(valid[['Future', 'Prediction']])

plt.plot()
plt.xlabel('Date', fontsize=16)
plt.ylabel('Close Price USD ($)', fontsize=16)
plt.legend()
plt.show()

如果您查看该图,您会发现预测线没有超过实际价格,这意味着没有预测新值。有没有可能解决这个问题?抱歉,如果答案真的很明显,我是 ml 的初学者。

标签: pythontensorflowkerasprediction

解决方案


推荐阅读