Python TF LSTM多步预测似乎是错误的

Python TF LSTM多步预测似乎是错误的,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,你可以在这里看到完整的源代码 x_检验的原始数据具有非线性随机游动特性 但最新预测的20个数值呈线性 很明显,我做了错误的预测吗?如果我理解正确,您是在尝试操作迭代预测。所以在输入一个完整的序列时,我们用它来预测下一个值。我们在最后添加预测并重复该过程 计算此操作的代码有点混乱。我试着重写它 plist = x_test[-2] for i in range(20): temp = model.predict(plist.reshape(-1,20,1)) plist = np

你可以在这里看到完整的源代码

x_检验
的原始数据具有非线性随机游动特性

但最新预测的20个数值呈线性


很明显,我做了错误的预测吗?

如果我理解正确,您是在尝试操作迭代预测。所以在输入一个完整的序列时,我们用它来预测下一个值。我们在最后添加预测并重复该过程

计算此操作的代码有点混乱。我试着重写它

plist = x_test[-2]
for i in range(20):
    temp = model.predict(plist.reshape(-1,20,1))
    plist = np.append(plist[1:],temp[0])
我们从x_检验[-2]开始,因为我们的目标是预测x_检验[-1]。最后,结果如下所示

plt.plot(x_test[-1], label='true')
plt.plot(plist, label='pred')
plt.legend()


这个过程现在是正确的(也没有反向缩放)

我继续读了一下您的数据。对您的培训和模型的一些评论:

1) 您专门训练了一个LSTM,以便从20个过去的值预测一个未来的值。为什么您希望该模型能够从第一个值推断出另外19个值?你的模特没有受过这样的训练,也不知道这很重要

2) 你的型号非常小。您的模型有491个变量(model.summary()),非常小。你认为有多少特征会影响股市?您认为有多少变量可以模拟每个功能?最深入的学习需要数百万个变量来学习一些复杂的东西,比如股票市场。此外,这是一个高度复杂的领域,需要全世界数百万人进行研究

3) 您几乎没有对数据的复杂性进行过任何培训。您在GPU上运行了100个纪元,或大约250秒的训练

4) 你的型号太过合适了。我认为你犯了一个错误,认为“低损失”=“好的预测模型”,这根本不是真的。这是一个我在谷歌上搜索的例子,说明了我的意思

在这个例子中,经过训练的模型基本上是零损失的,并且能够完美地预测输入数据。但该模型显然对驱动输入数据的底层特征曲线一无所知。因此,如果您试图用模型预测下一个值,它将非常不准确

5) 我认为你误解了培训模特的作用。当你训练一个模型时,你正在收敛到一个“通用”的答案,这个答案会产生一个低损耗。一个模型永远也找不到能很好地预测权重的极端例子;它只会找到并慢慢收敛到一个产生低损耗的公共解决方案。例如,如果稍微将体重调整到零,使损失更小,那么在训练过程中会反复强调这一点。如果预测一个统一的线性答案在一组看似随机的数据中产生的损失最小,那么在训练过程中,这一点将被反复强化。一般来说(就像我上面评论的那样),当一个模型面对一致的随机信息时,它倾向于使用信息的平均值(因为这会减少批次之间的损失)

我相信你提供的代码和你得到的结果是可以期待的


编辑:

以下是一些时间序列数据模型的示例(它们好吗,谁知道,这取决于您的数据):

也许再加上一些激活,relu可能会有用(有点像给层一个垃圾桶来移除无用的值)。或者一些sigmoid(保持值较小)或softmax(将值视为概率)。您还可以加入一些退出层,以防止过度拟合(保持模型处于最佳状态,不要让它很快稳定下来)。此外,规范化数据也很有用。如果发现权重增长很快,请添加一些正则化,以强制模型在尝试学习数据时使用较小的权重

model = tf.keras.Sequential([
    tf.keras.layers.LSTM(5,return_sequences=True,activation='relu'), 
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(50,return_sequences=True,activation='relu'),
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(20),
])
如果您认为学习不好,请从“adam”切换到其他学习算法。也许你的“均方误差”损失函数对大误差太苛刻,可能会减慢学习速度;试试“logcosh”。连续运行24小时,最好使用GPU

如果LSTM层太慢。也许可以改为使用一些关注层或剩余层(这是谷歌的定制想法)


您可以尝试使用GRU层而不是LSTM。性能大致相同,但训练速度稍快

我不太明白。你期望模型预测非线性随机游动吗?因为这(根据随机的定义)是不可能的。你最希望的是模型尝试平均随机性;试图从随机数据中找到最低损失。这通常会导致找到一个平均答案。我期望的是学习非线性数据,并希望预测非线性数据。我认为,在预测20个数据时,采用几乎完全线性的形状是错误的。为了减少损失,人们通过修改模型进行了无休止的尝试。
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(5,return_sequences=True,activation='relu'), 
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(50,return_sequences=True,activation='relu'),
    tf.keras.layers.Dropout(0.10),
    tf.keras.layers.LSTM(20),
])