【发布时间】:2018-06-10 14:29:55
【问题描述】:
我正试图在假期中获得一些使用 Keras 的经验,我想我会从教科书的股票数据时间序列预测示例开始。所以我要做的是给定过去 48 小时的平均价格变化(自上一小时以来的百分比),预测未来一小时的平均价格变化是多少。
但是,在针对测试集(甚至是训练集)进行验证时,预测序列的幅度相差甚远,有时会转移为始终为正或始终为负,即偏离 0% 的变化,我认为这对于这种事情是正确的。
我想出了以下最小示例来说明问题:
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])
正如您所看到的,预测与真实数据非常吻合,只是以某种方式被挤压和偏移,我不知道为什么。
【问题讨论】:
-
它仍在训练数据上,因此我期望“非常合适”。我完全理解,如果对新数据执行预测,那么它可能会发散,但在训练集上,我希望模型能够返回一个很好的近似值,而无需重新缩放和移动。
-
可以分享一下 test-data-01.csv 吗?
-
@cdecker 你能解决这个问题吗?特别是转移到总是积极或总是消极的部分?因为我当前的 lstm 遇到了完全相同的问题。
标签: python machine-learning time-series keras lstm