Keras LSTM网络预测与输入一致

Keras LSTM网络预测与输入一致,keras,deep-learning,lstm,Keras,Deep Learning,Lstm,上面这句话听起来很理想,但我试图预测前面的一步,即向后看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)) # S

上面这句话听起来很理想,但我试图预测前面的一步,即向后看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()
输出图为:


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

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

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


我注意到的其他事情:

  • 辍学-在您能够过度适应之前,无需使用任何标准化。这只会使调试复杂化
  • 仅仅是回到过去的一步——很可能你正在丢失大量必需的信息,因此事实上迫使你的网络不知道该做什么,从而猜测相同的值。如果你在过去给它一个单一的值,它可以有一个很好的导数近似值。这听起来很重要(只有你知道)

  • 很可能你的LSTM已经知道了你还没有学到的东西:考虑到所有过去的数据,未来最好的预测指标只是最后一个数据项。例如,在股票市场上,这是一个非常好的假设。其他数据系列可能是可预测的,但这不是给定的。