首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Keras LSTM预测时间序列被压缩和偏移

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

Stack Overflow用户
提问于 2017-12-30 22:01:19
回答 3查看 5.6K关注 0票数 14

我正在尝试在假期中亲身体验Keras,我想我应该从基于股票数据的时间序列预测的教科书示例开始。因此,我要做的是给定过去48小时的平均价格变化(自上一次以来的百分比),预测未来一小时的平均价格变化。

我想出了以下最小的例子来说明这个问题:

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小时,下一步进入一个元组,然后前进一个小时,重复这个过程。该模型是一个非常简单的1LSTM和1致密层。

我原本期望单个预测点的曲线图与训练序列的曲线图非常好地重叠(毕竟这是他们接受训练的同一集合),并与测试序列进行某种匹配。然而,我在training data上得到了以下结果

蓝色

  • 橙色: true data

  • :predicted data

知道可能发生了什么吗?我是不是误解了什么?

更新:为了更好地显示我所说的移位和挤压的意思,我还绘制了预测值,方法是将其移位以与实际数据匹配,并乘以以匹配振幅。

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

正如你所看到的,预测与真实数据很好地吻合,它只是以某种方式被挤压和抵消,我不知道为什么。

EN

回答 3

Stack Overflow用户

发布于 2018-01-02 18:20:54

  1. 会增加纪元数。您可以使用EarlyStopping来避免overfitting.
  2. How's您的数据缩放?时间序列对数据中的异常值非常敏感。例如尝试MinMax((0.1,0.9)),然后RobustScaler也是一个很好的选择。
  3. 我不确定LSTM(seq_len)是不是真的有必要,直到你有了大量的数据。为什么不试试小尺寸的呢?

尝试所有这些,并尝试过拟合(在真实数据集上,mse应该在零左右)。然后应用正则化。

更新

让我来解释一下你为什么能勉强过活。

plot(pred*12-0.03)

很适合你。

好了,让我们把LSTM层看作是黑盒,忘了它吧。它会返回25个值--仅此而已。该值将前进到密集层,在该层中,我们将应用于25值的向量函数:

y = w * x + b

在这里,由NN定义的wb - vectors通常接近于零。x -在LSTM layer和y之后的值(单值)。

虽然你只有一个时期:w和b根本不适合你的数据(它们实际上接近于零)。但是如果你申请

plot(pred*12-0.03)

到你的预测值?您(以某种方式)应用于目标变量wb。现在wb是单值,而不是向量,它们应用于单值。但它们的作用(几乎)与致密层相同。

因此,增加时期的数量以获得更好的拟合。

UPDATE2顺便说一下,我在数据中看到了一些异常值。您还可以尝试使用MAE作为损失/准确度指标。

票数 3
EN

Stack Overflow用户

发布于 2019-03-20 04:31:52

这周我也遇到了同样的问题,我找到了解决方案。唯一对我有效的方法是使用窗口规范化方法,如下所述:

https://www.altumintelligence.com/articles/a/Time-Series-Prediction-Using-LSTM-Deep-Neural-Networks

(查看有关sp500预测的部分)

祝您愉快:)

票数 1
EN

Stack Overflow用户

发布于 2021-04-10 19:00:55

因为在这一点上,batch_size增加也帮助SimpleRNN完全修复了LSTM问题,relu,elu作为激活,学习率必须从默认情况下增加,并尝试为更多过去的数据配置一些SmoteRNN解决方案,或者更改行之间的时间段以获取更多数据,以便模型找到模式,似乎对我有效,ATM机仍在尝试推动80%以上的准确率,准确率= (mean_abosule_error / test.mean()) * 100

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48034625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档