用于时间序列预测的Keras LSTM神经网络显示了模型拟合期间的nan

时间:2019-12-26 11:29:46

标签: python keras neural-network time-series lstm

我正在训练一个神经网络,通过传递昨天的可用性(144个样本)来预测一整天的可用性(144个样本,6个功能)。我在寻找好的资源或如何定义神经网络来预测回归问题中的时间序列方面遇到困难。培训被定义为监督学习问题。我对神经网络的定义是

lstm_neurons = 30

model = Sequential()
model.add(LSTM(lstm_neurons * 2, input_shape=(self.train_x.shape[1], sel    f.train_x.shape[2]), return_sequences=True))
model.add(LSTM(lstm_neurons * 2))
model.add(Dense(len_day, activation='softmax'))

model.compile(loss='mean_squared_error', optimizer='adam', metrics = [rm    se, 'mae', 'mape'])

我正在训练20个时期,批处理大小为200,其中使用的数据集具有以下形状,

Train X (9631, 144, 6)
Train Y (9631, 144)
Test X (137, 144, 6)
Test Y (137, 144)
Validation X (3990, 144, 6)
Validation Y (3990, 144)

在训练nanlossrmse的过程中,所有这些都会产生mae值...虽然这似乎是一个问题,但我可以使用生成的模型来生成预测,它们看起来不错。

1 个答案:

答案 0 :(得分:0)

第一个要问的问题-您是否试图通过将可用性解释为概率度量来预测时间序列?

softmax 激活功能在this scenario下最有效-但是,当您实际上试图预测间隔时间序列时,可能会误指定它-因此为什么要获取NaN读数为了您的结果。

此示例可能对您有用-LSTM用于此示例来预测hotel cancellations的每周波动。

类似于您的示例, X_train X_val 被重塑为样本,时间步长,特征

X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_val = np.reshape(X_val, (X_val.shape[0], 1, X_val.shape[1]))

LSTM网络定义如下:

# Generate LSTM network
model = tf.keras.Sequential()
model.add(LSTM(4, input_shape=(1, previous)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, Y_train, epochs=20, batch_size=1, verbose=2)

如您所见,均方误差被用作损失函数,因为所涉及的抵消变量是区间(即,可以取大范围的值,不一定受任何限制)特定比例)。

我只能推测,因为我还没有看到您的数据或结果,但是在不合适的情况下,将 softmax 定义为您的激活函数可能会出错-我怀疑情况是这样的您还使用均方误差作为损耗度量。

在上面的示例中,Dense层本身并未指定激活功能。

就如何选择验证LSTM的时间序列预测是否有效而言,一个潜在的好主意是将调查结果与更简单的时间序列模型进行比较。例如ARIMA。

在我们的示例中,ARIMA在预测酒店1 时表现更好,但是LSTM在预测酒店2 时表现更好:

H1 Results

Reading     ARIMA   LSTM
MDA     0.86    0.8
RMSE    57.95   63.89
MFE     -12.72  -54.25

H2 Results

Reading     ARIMA   LSTM
MDA     0.86    0.8
RMSE    274.07  95.28
MFE     156.32  38.65

最后,在使用训练集和验证集创建数据集时,还必须确保使用正确的上一个参数,即选择回归的时间段数相对于时间 t 的观察结果。

例如,您使用的是昨天的可用性-但是您可能会发现,例如,在过去的5或10天中,该模型得到了改进。

# Number of previous
previous = 5
X_train, Y_train = create_dataset(train, previous)
X_val, Y_val = create_dataset(val, previous)

根据您的情况,我要检查的第一件事是使用 softmax 激活功能,然后从那里开始工作。