Python keras多层LSTM模型的股价预测收敛到一个常数
我制作了一个多层LSTM模型,它使用回归来预测下一帧数据的值。模型在20个时代后完成。然后我得到一些预测,并将它们与我的基本真值进行比较。正如你在上图中看到的,预测收敛到一个常量。我不知道为什么会这样。 以下是我目前的模型:Python keras多层LSTM模型的股价预测收敛到一个常数,python,tensorflow,keras,regression,lstm,Python,Tensorflow,Keras,Regression,Lstm,我制作了一个多层LSTM模型,它使用回归来预测下一帧数据的值。模型在20个时代后完成。然后我得到一些预测,并将它们与我的基本真值进行比较。正如你在上图中看到的,预测收敛到一个常量。我不知道为什么会这样。 以下是我目前的模型: from keras.models import Sequential from keras.layers.core import Dense, Activation, Dropout from keras.layers import LSTM, BatchNormaliz
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers import LSTM, BatchNormalization
from tensorflow.python.keras.initializers import RandomUniform
init = RandomUniform(minval=-0.05, maxval= 0.05)
model = Sequential()
model.add(LSTM(kernel_initializer=init, activation='relu', return_sequences=True, units=800, dropout=0.5, recurrent_dropout=0.2, input_shape=(x_train.shape[1], x_train.shape[2]) ))
model.add(LSTM(kernel_initializer=init, activation='relu', return_sequences=False, units=500, dropout=0.5, recurrent_dropout=0.2 ))
model.add(Dense(1024, activation='linear', kernel_initializer=init))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear', kernel_initializer= 'normal'))
model.compile(loss='mean_squared_error', optimizer='rmsprop' )
model.summary()
EDIT1:
我把纪元从20减少到3。结果如下:
通过比较两张图片,我可以得出结论,当纪元数量增加时,预测更可能收敛到-0.1左右的某个特定值。因此,在尝试不同数量的
LSTM
单元和不同类型的架构之后,我意识到当前的LSTM
单元数导致模型学习速度太慢,20个纪元对于如此庞大的模型是不够的。对于每一层,我将LSTM单元数更改为64,并删除了Dense(1024)
分层并将历元数从20个增加到400个,结果非常接近基本真值我应该提到,新模型中使用的数据集与前一个不同,因为我在该数据集上遇到了一些问题。以下是新型号:
from keras.optimizers import RMSprop
from keras.initializers import glorot_uniform, glorot_normal, RandomUniform
init = glorot_normal(seed=None)
init1 = RandomUniform(minval=-0.05, maxval=0.05)
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
model = Sequential()
model.add(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2,
input_shape=(x_train.shape[1], x_train.shape[2]),
return_sequences=True, kernel_initializer=init))
model.add(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2,
return_sequences=False, kernel_initializer=init))
model.add(Dense(1, activation='linear', kernel_initializer= init1))
model.compile(loss='mean_squared_error', optimizer=optimizer )
model.summary()
你可以在这里看到预测:
它仍然不是最好的车型,但至少比前一款好。
如果您对如何改进它有任何进一步的建议,我们将不胜感激 如果没有模式,LSTM无法找到模式。股票预测在很短的时间间隔内接近随机数据。每当我只使用一层LSTM而不是两层时,该模型工作得非常好,可以检测模式。这表明LSTM可以找到模式。但再添加一个LSTM层会导致奇怪的结果。也许权重更新得不好,或者LSTM单位无法保存权重。我不知道。好吧,你的梯度可能正在消失。你试过在tensorboard上看直方图和分布图吗?谢谢你的提示。还没有。但是,一旦我成功地创建了tensorboard结果,或者尝试实现了一些克服梯度消失的方法,我就会通知您。您获得的性能远远超出了价格预测模型的预期。它太好了,我认为你的模型有问题,或者你是如何评价它的。您可能已经将这些值移动了一个时间差?进行LSTM时间序列预测时,通常只输出先前的值,而不执行任何操作,然后在与结果进行比较时,错误地及时移动输出。这是我曾经发现的一个非常类似的案例:令人惊讶的是,我使用了这个链接作为基础,并基于它创建了我的模型。假设我的数据帧由4列数据的时间序列组成,即x1、x2、x3和y。我按照如下方式重新构建了数据集:我只将X_输入(在本例中为x1、x2、x3)移动了20个时间延迟。通过这样做,我创建了一个新的数据帧,它有3*20列(20列与x1:x1_t-20、x1_t-19、…、x1_t-1相关,20列与x2:x2_t-20、x2_t-19、…、x2_t-1相关,20列与x3:x3_t-20、x3_t-19、…、x3_t-1相关)。然后对X_输入执行整形操作:(n_样本,60)=>(n_样本,20,3),然后使用新的数据帧基于此整形数据预测y_t。我在年使用了相同的方法,mse变为0.5左右,与其他竞争对手相比不够准确(排名4500/4800)我认为我应该发布一个新的问题,因为我觉得我对我目前的建模框架有很大的误解。你也可以考虑在STATS.STACKExchange .com或DATSCONCESS.STACKExchange .com上发布。我认为他们将能够帮助你回答“为什么”,而不仅仅是“如何”。