【问题标题】:Keras LSTM network predictions align with inputKeras LSTM 网络预测与输入一致
【发布时间】:2021-08-13 20:49:44
【问题描述】:

上面可能听起来很理想,但我试图预测前面的一步 - 即look_back 为 1。我的代码如下:

def create_scaled_datasets(data, scaler_transform, train_perc = 0.9):
    # Set training size
    train_size = int(len(data)*train_perc)
    # Reshape for scaler transform
    data = data.reshape((-1, 1))
    # Scale data to range (-1,1)
    data_scaled = scaler_transform.fit_transform(data)
    # Reshape again
    data_scaled = data_scaled.reshape((-1, 1))
    # Split into train and test data keeping time order
    train, test = data_scaled[0:train_size + 1, :], data_scaled[train_size:len(data), :]

    return train, test

# Instantiate scaler transform
scaler = MinMaxScaler(feature_range=(0, 1))

model.add(LSTM(5, input_shape=(1, 1), activation='tanh', return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(12, input_shape=(1, 1), activation='tanh', return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(2, input_shape=(1, 1), activation='tanh', return_sequences=False))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Create train/test data sets
train, test = create_scaled_datasets(data, scaler)

trainY = []
for i in range(len(train) - 1):
    trainY = np.append(trainY, train[i + 1])

train = np.reshape(train, (train.shape[0], 1, train.shape[1]))
plotting_test = test
test = np.reshape(test, (test.shape[0], 1, test.shape[1]))

model.fit(train[:-1], trainY, epochs=150, verbose=0)
testPredict = model.predict(test)

plt.plot(testPredict, 'g')
plt.plot(plotting_test, 'r')
plt.show()

输出图为:

本质上,我想要实现的是让模型预测下一个值,我尝试通过将实际值作为特征进行训练,并且标签是沿一个移动的实际值(look_back of 1)。然后我根据测试数据进行预测。正如您从情节中看到的那样,该模型做得很好,除了它似乎没有预测未来,而是似乎在预测现在......我希望情节看起来相似,除了绿线(预测)向左移动一点。我尝试增加look_back 值,但它似乎总是做同样的事情,这让我觉得我训练模型错误,或者试图预测不正确。如果我读错了,并且模型确实在做我想要的,但我解释错了(也很有可能),那么我该如何预测未来呢?

【问题讨论】:

  • 你的 LSTM 绝对有可能学到了你还没有学到的东西:给定所有过去的数据,对未来的最佳预测器只是最后一个数据项。例如,在股市中,这是一个非常好的假设。其他数据系列可能是可预测的,但这不是给定的。

标签: keras deep-learning lstm


【解决方案1】:

要添加@MSalters 的评论,并在某种程度上基于this,这是可能的,尽管不能保证你可以“帮助”你的模型学习比身份更好的东西,如果你强迫它学习而不是 下一步的实际值,而是让它学习从当前步骤到下一步的差异
为了更进一步,您还可以保持指数移动平均线并从中学习差异,有点像 here 所做的那样。

简而言之,预测相同的值具有统计意义,因为这是一种低风险的猜测。 也许学习差异不会收敛到零。


我注意到的其他事情:

  1. Dropout - 在过度拟合之前无需使用任何归一化。这只会使调试复杂化。
  2. 只是过去的一步 - 您可能会丢失很多必需的信息,因此实际上迫使您的网络不知道该做什么,从而猜测相同的值。如果你甚至在过去给它一个单一的值,它可能有一个很好的导数近似值。这听起来很重要(只有你知道)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 2019-07-03
    • 2018-04-15
    • 2017-12-30
    • 2018-02-16
    • 1970-01-01
    • 2021-12-13
    • 2019-01-04
    相关资源
    最近更新 更多