当前位置: 首页 > 面试题库 >

Keras LSTM预测时间序列被压缩和偏移

孙渝
2023-03-14
问题内容

我想在假期中获得有关Keras的经验,我想我将从股票数据时间序列预测的教科书示例开始。因此,根据过去48小时的平均价格变化(自上次以来的百分比),我想做的是,预测接下来一小时的平均价格变化是多少。

但是,当根据测试集(甚至训练集)进行验证时,预测序列的振幅会逐渐减小,有时会偏移为始终为正或始终为负,即偏离0%变化,即I认为这种事情是正确的。

我提出了以下最小示例来说明问题:

df = pandas.DataFrame.from_csv('test-data-01.csv', header=0)
df['pct'] = df.value.pct_change(periods=1)

seq_len=48
vals = df.pct.values[1:] # First pct change is NaN, skip it
sequences = []
for i in range(0, len(vals) - seq_len):
    sx = vals[i:i+seq_len].reshape(seq_len, 1)
    sy = vals[i+seq_len]
    sequences.append((sx, sy))

row = -24
trainSeqs = sequences[:row]
testSeqs = sequences[row:]

trainX = np.array([i[0] for i in trainSeqs])
trainy = np.array([i[1] for i in trainSeqs])

model = Sequential()
model.add(LSTM(25, batch_input_shape=(1, seq_len, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
model.fit(trainX, trainy, epochs=1, batch_size=1, verbose=1, shuffle=True)

pred = []
for s in trainSeqs:
    pred.append(model.predict(s[0].reshape(1, seq_len, 1)))
pred = np.array(pred).flatten()

plot(pred)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

如您所见,我选择了最后48小时,然后下一步进入元组,然后前进1小时,重复此过程,从而创建了训练和测试序列。该模型是一个非常简单的1 LSTM和1个致密层。

我本来希望各个预测点的图与训练序列的图非常好地重叠(毕竟这是它们在其上训练的相同集合),并且测试序列的匹配程度也很高。但是我在 训练数据
上得到以下结果:

  • 橙色:真实数据
  • 蓝色:预测数据

知道会发生什么吗?我误会了吗?

更新 :为了更好地显示移位和压缩的含义,我还通过将预测值移回以匹配实际数据并乘以匹配振幅来绘制预测值。

plot(pred*12-0.03)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

如您所见,预测非常适合真实数据,只是以某种方式被压缩和偏移,我不知道为什么。


问题答案:

我认为您是过拟合的 ,因为数据的维数为1,而对于这样的低维数据集,具有25个单位的LSTM似乎相当复杂。这是我会尝试的事情列表:

  • 减小LSTM尺寸。
  • 添加某种形式的正则化以对抗过度拟合。例如,辍学可能是一个不错的选择。
  • 训练更多的时代或改变学习率。该模型可能需要更多的时期或更大的更新才能找到适当的参数。

更新。 让我总结一下我们在评论部分中讨论的内容。

只是为了澄清起见,第一个图未显示验证集的预测序列,而是训练集。因此,我的第一个 过拟合
解释可能是不准确的。我认为应该问一个适当的问题:实际上有可能从这样一个低维数据集中预测未来价格的变化吗?机器学习算法并不是神奇的:只有存在的情况下,它们才会在数据中找到模式。

如果仅 过去的 价格变化确实不能充分说明 未来的 价格变化,则:

  • 您的模型将学习预测价格变化的平均值(可能约为0),因为在没有信息功能的情况下,该值会产生最低的损失。
  • 由于时间步t + 1的价格变化与时间步t的价格变化略相关,所以预测可能看起来有些“偏移”(但是,最接近0的预测是最安全的选择)。作为专家,我确​​实可以观察到唯一的模式(即,时间步t + 1的值有时类似于时间步t的值)。

如果通常在时间步t和t + 1处的值恰好具有更高的相关性,那么我认为该模型将对此相关性更有信心,并且预测幅度将更大。



 类似资料:
  • 我正在阅读Keras中关于使用LSTM进行多元时间序列预测的教程https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/#comment-442845 我已经看完了整个教程,遇到了一个如下的问题- 在本教程中,在步骤“t-1”中,列车和测试拆分有8个功能,即“污染”、“露水”、“温度”、

  • 问题内容: 有没有一种方法可以使用Oracle分析功能为数据集生成时间序列预测?我们如何在SQL / ORACLE中执行外推。 下面是我的需要 我有如下数据集,我想预测/推断明年 问题答案: 您可以使用REGR线性回归函数创建简单的预测。 下面是示例架构。或者,您可以使用此SQLFiddle。 该函数处理数字对,它不理解诸如“收入不能低于0”之类的业务规则。如果您希望将预测限制为始终保持在0或之上

  • 本文向大家介绍有损压缩和无损压缩之间的区别,包括了有损压缩和无损压缩之间的区别的使用技巧和注意事项,需要的朋友参考一下 数据压缩是指将大文件缩小为较小大小的文件并可以再次将其解压缩为大文件的技术。有损压缩会将大文件恢复为原始格式,但会丢失一些数据,这是不明显的,而无损压缩会将大文件恢复为原始格式而不会丢失任何数据。 以下是有损压缩和无损压缩之间的一些重要区别。 序号 键 有损压缩 无损压缩 1 数

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • Ziplist 是由一系列特殊编码的内存块构成的列表, 一个 ziplist 可以包含多个节点(entry), 每个节点可以保存一个长度受限的字符数组(不以 \0 结尾的 char 数组)或者整数, 包括: 字符数组 长度小于等于 63 ()字节的字符数组 长度小于等于 16383 () 字节的字符数组 长度小于等于 4294967295 ()字节的字符数组 整数 4 位长,介于 0 至 12 之

  • 问题内容: 我有一个较大的数据集,出于这个问题的目的,它具有3个字段: 组标识符 从日期 迄今为止 在任何给定的行上,该时间将始终小于,但在每个组中,日期对表示的时间段(无特定顺序)可能会重叠,包含在另一个对象中,甚至是相同的。 我要结束的是一个查询,该查询将每个组的结果压缩为连续的时间段。例如,如下所示的组: 会导致以下结果: 我已经阅读了许多有关日期打包的文章,但是我不太清楚如何将其应用于数据