我正在尝试在假期中亲身体验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上得到了以下结果
蓝色
知道可能发生了什么吗?我是不是误解了什么?
更新:为了更好地显示我所说的移位和挤压的意思,我还绘制了预测值,方法是将其移位以与实际数据匹配,并乘以以匹配振幅。
plot(pred*12-0.03)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])
正如你所看到的,预测与真实数据很好地吻合,它只是以某种方式被挤压和抵消,我不知道为什么。
发布于 2018-01-02 18:20:54
尝试所有这些,并尝试过拟合(在真实数据集上,mse应该在零左右)。然后应用正则化。
更新
让我来解释一下你为什么能勉强过活。
plot(pred*12-0.03)
很适合你。
好了,让我们把LSTM层看作是黑盒,忘了它吧。它会返回25个值--仅此而已。该值将前进到密集层,在该层中,我们将应用于25值的向量函数:
y = w * x + b
在这里,由NN定义的w和b - vectors通常接近于零。x -在LSTM layer和y之后的值(单值)。
虽然你只有一个时期:w和b根本不适合你的数据(它们实际上接近于零)。但是如果你申请
plot(pred*12-0.03)
到你的预测值?您(以某种方式)应用于目标变量w和b。现在w和b是单值,而不是向量,它们应用于单值。但它们的作用(几乎)与致密层相同。
因此,增加时期的数量以获得更好的拟合。
UPDATE2顺便说一下,我在数据中看到了一些异常值。您还可以尝试使用MAE作为损失/准确度指标。
发布于 2019-03-20 04:31:52
这周我也遇到了同样的问题,我找到了解决方案。唯一对我有效的方法是使用窗口规范化方法,如下所述:
https://www.altumintelligence.com/articles/a/Time-Series-Prediction-Using-LSTM-Deep-Neural-Networks
(查看有关sp500预测的部分)
祝您愉快:)
发布于 2021-04-10 19:00:55
因为在这一点上,batch_size增加也帮助SimpleRNN完全修复了LSTM问题,relu,elu作为激活,学习率必须从默认情况下增加,并尝试为更多过去的数据配置一些SmoteRNN解决方案,或者更改行之间的时间段以获取更多数据,以便模型找到模式,似乎对我有效,ATM机仍在尝试推动80%以上的准确率,准确率= (mean_abosule_error / test.mean()) * 100
https://stackoverflow.com/questions/48034625
复制相似问题