Keras LSTM网络预测与输入一致
上面这句话听起来很理想,但我试图预测前面的一步,即向后看1。我的代码如下: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
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已经知道了你还没有学到的东西:考虑到所有过去的数据,未来最好的预测指标只是最后一个数据项。例如,在股票市场上,这是一个非常好的假设。其他数据系列可能是可预测的,但这不是给定的。