【发布时间】:2019-02-14 13:44:22
【问题描述】:
我在 Keras 中使用 LSTM 实现了一个预测模型。数据集间隔 15 分钟,我预测 12 个未来步骤。
该模型在该问题上表现良好。但是做出的预测存在一个小问题。它显示了一个小的移位效果。要获得更清晰的图片,请参见下图。
如何处理这个问题。?必须如何转换数据才能处理此类问题。
我使用的模型如下所示
init_lstm = RandomUniform(minval=-.05, maxval=.05)
init_dense_1 = RandomUniform(minval=-.03, maxval=.06)
model = Sequential()
model.add(LSTM(15, input_shape=(X.shape[1], X.shape[2]), kernel_initializer=init_lstm, recurrent_dropout=0.33))
model.add(Dense(1, kernel_initializer=init_dense_1, activation='linear'))
model.compile(loss='mae', optimizer=Adam(lr=1e-4))
history = model.fit(X, y, epochs=1000, batch_size=16, validation_data=(X_valid, y_valid), verbose=1, shuffle=False)
我做了这样的预测
my_forecasts = model.predict(X_valid, batch_size=16)
使用此函数将时间序列数据转换为有监督的数据以馈送 LSTM
# convert time series into supervised learning problem
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
super_data = series_to_supervised(data, 12, 1)
我的时间序列是多变量的。 var2 是我需要预测的。我放弃了未来var1 喜欢
del super_data['var1(t)']
分开的火车和这样有效
features = super_data[feat_names]
values = super_data[val_name]
ntest = 3444
train_feats, test_feats = features[0:-n_test], features[-n_test:]
train_vals, test_vals = values [0:-n_test], values [-n_test:]
X, y = train_feats.values, train_vals.values
X = X.reshape(X.shape[0], 1, X.shape[1])
X_valid, y_valid = test_feats .values, test_vals .values
X_valid = X_valid.reshape(X_valid.shape[0], 1, X_valid.shape[1])
我没有为这个预测制作固定的数据。我也尝试过差异化,尽可能让模型保持静止,但问题仍然存在。
我还尝试了 min-max 缩放器的不同缩放范围,希望它可以帮助模型。但预测越来越差。
Other Things I have tried
=> Tried other optimizers
=> Tried mse loss and custom log-mae loss functions
=> Tried varying batch_size
=> Tried adding more past timesteps
=> Tried training with sliding window and TimeSeriesSplit
我知道模型正在向它复制最后一个已知值,从而尽可能地减少损失
验证和训练损失在整个训练过程中保持足够低。这让我思考是否需要为此设计一个新的损失函数。
有必要吗?如果是这样,我应该使用什么损失函数?
我已经尝试了所有我偶然发现的方法。我根本找不到任何指向此类问题的资源。这是数据的问题吗?这是因为 LSTM 很难学习这个问题吗?
【问题讨论】:
-
请出示您的代码,您可能使用了错误的 y_test 和 y_train 但不看您的代码很难知道。
-
@VegardKT 代码在某种意义上是模型的代码或我用于测试的代码。?
-
两者都最好
-
好的。给我一分钟
-
到目前为止一切都很好,你能说明你是如何定义你的 x 和 y 的吗?
标签: python machine-learning keras deep-learning forecasting