Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras多层LSTM模型的股价预测收敛到一个常数_Python_Tensorflow_Keras_Regression_Lstm - Fatal编程技术网

Python keras多层LSTM模型的股价预测收敛到一个常数

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

我制作了一个多层LSTM模型,它使用回归来预测下一帧数据的值。模型在20个时代后完成。然后我得到一些预测,并将它们与我的基本真值进行比较。正如你在上图中看到的,预测收敛到一个常量。我不知道为什么会这样。 以下是我目前的模型:

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上发布。我认为他们将能够帮助你回答“为什么”,而不仅仅是“如何”。