Keras LSTM预测时间序列被压扁并转移

cde*_*ker 13 python machine-learning time-series lstm keras

我想在节日期间亲身体验一下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])
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我创建了训练和测试序列,通过选择最后48小时,然后进入元组的下一步,然后提前1小时,重复该过程.该模型是一个非常简单的1 LSTM和1个密集层.

我原本预计各个预测点的图可以很好地重叠训练序列的图(毕竟这是他们训练过的相同集),以及测试序列的匹配.但是我在训练数据上得到以下结果:

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

在此输入图像描述

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

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

plot(pred*12-0.03)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如你所看到的那样,预测非常适合真实的数据,它只是被压扁和以某种方式偏移,我无法弄清楚为什么.

rvi*_*nas 8

我认为你过度拟合,因为你的数据的维数是1,而25个单位的LSTM对于这样的低维数据集来说似乎相当复杂.这是我要尝试的一系列事项:

  • 减少LSTM维度.
  • 添加某种形式的正规化来对抗过度拟合.例如,辍学可能是一个不错的选择.
  • 培训更多时代或改变学习率.该模型可能需要更多的纪元或更大的更新来找到适当的参数.

UPDATE.让我总结一下我们在评论部分讨论的内容.

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

如果仅仅过去的价格变化对未来的价格变化确实不是很有用,那么:

  • 您的模型将学会预测价格变化的平均值(可能是0左右),因为这是在没有信息特征的情况下产生最低损失的值.
  • 由于时间步长t + 1的价格变化与时间步长t的价格变化略微相关(但仍然预测接近0的东西是最安全的选择),预测可能会略微"转移".这确实是我作为一个不熟练的人能够观察到的唯一模式(即时间步t + 1的值有时类似于时间步t的那个).

如果时间步长t和t + 1的值碰巧在一般情况下更相关,那么我假设模型对这种相关性更有信心,并且预测的幅度会更大.