neural-network - LSTM RNN 的有趣结果:训练和验证数据的滞后结果
问题描述
作为 RNN/LSTM(无状态)的介绍,我正在训练一个包含 200 天先前数据(X)序列的模型,包括每日价格变化、每日交易量变化等,并且对于标签/YI 有 % 价格4个月后从当前价格变为当前价格。基本上我想估计市场方向,而不是 100% 准确。但我得到了一些奇怪的结果......
然后,当我使用训练数据测试我的模型时,我注意到模型的输出与实际数据相比非常合适,它恰好滞后了4个月:
当我将数据移动 4 个月时,您会发现它非常适合。
我显然可以理解为什么训练数据会非常吻合,因为它在训练期间已经看到了这一切——但为什么会滞后 4 个月?
它对验证数据做同样的事情(注意我用红色框突出显示的区域以供将来参考):
时移:
它不像您期望的那样像训练数据那样紧密,但仍然太接近我的喜好 - 我只是不认为它可以如此准确(以红色矩形中的小光点为例)。我认为该模型充当了一个幼稚的预测器,我只是无法弄清楚它是如何/为什么会这样做的。
为了从验证数据中生成这个输出,我输入了一个包含 200 个时间步长的序列,但是数据序列中没有任何内容可以说明 4 个月内的 %price 变化 - 它完全断开连接,那么它是如何准确的呢?4 个月的滞后显然是另一个指标,表明这里有问题,我不知道如何解释,但我怀疑这两者是相关的。
解决方案
我试图根据一些一般的基本概念来解释观察结果:
如果您不提供时间滞后的 X 输入数据集(滞后 tk,其中 k 是时间步长),那么基本上您将向 LSTM 提供与今天的收盘价类似的数据,以预测相同的今天收盘价......在训练阶段. 该模型将(过度拟合)并且行为与已知答案完全相同(数据泄漏)
如果 Y 是预测的百分比变化(即 X * (1 + Y%) = 4 个月的未来价格),则预测的现值 Yvalue 实际上只是被 Y% 折现的未来,因此预测值将有 4 个月的偏移
推荐阅读
- ios - 通过 iOS Outlook 发送带附件的电子邮件
- java - Collectors.toMap 在对象的不同属性上编写合并函数,而不是不用作值的属性
- node.js - 如果数据库中不存在数组字段值,如何推送数组字段值?
- angular - component.ts 文件中的错误限制了角度渲染
- angular - Angular 无法分配给“名称”,因为它是常量或只读属性
- css - 悬停时子 div 大于父 div
- spring - 在触发石英作业时出现异常
- r - 如何按顺序测量比例?
- html - 使用 python 将文本翻译成 html 文本
- sql - SQL 错误 ORA-00979 'not a group by expression' 但我无法弄清楚我的 group-by 语句有什么问题