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

Python 用于时间序列预测的Keras LSTM神经网络在模型拟合期间显示nan,python,keras,neural-network,time-series,lstm,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]

我正在训练一个神经网络,通过传递昨天的可用性(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)

所有这些都会在培训期间产生
nan
值,用于
loss
rmse
mae
。。。虽然这看起来是个问题,但我可以使用生成的模型生成预测,它们看起来不错。

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

softmax激活功能在以下情况下工作得最好-但是,当您实际尝试预测间隔时间序列时,您可能会错误指定它-因此,您为什么要获取结果的NaN读数

此示例可能对您有用-此示例使用LSTM来预测酒店取消的每周波动

与您的示例类似,X_trainX_val被重塑为样本、时间步长和特征:

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定义为不合适的激活函数,则可能会出错-我怀疑是这样,因为您也使用均方误差作为损失度量

在上述示例中,致密层本身并不指定激活函数

就如何选择验证使用LSTM进行的时间序列预测是否有效而言,一个潜在的好主意是将结果与更简单的时间序列模型的结果进行比较;e、 g.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
最后,在使用训练集和验证集创建数据集时,还必须确保使用了正确的previous参数,即选择与时间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激活功能,并从那里开始工作。

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

softmax激活功能在以下情况下工作得最好-但是,当您实际尝试预测间隔时间序列时,您可能会错误指定它-因此,您为什么要获取结果的NaN读数

此示例可能对您有用-此示例使用LSTM来预测酒店取消的每周波动

与您的示例类似,X_trainX_val被重塑为样本、时间步长和特征:

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定义为不合适的激活函数,则可能会出错-我怀疑是这样,因为您也使用均方误差作为损失度量

在上述示例中,致密层本身并不指定激活函数

就如何选择验证使用LSTM进行的时间序列预测是否有效而言,一个潜在的好主意是将结果与更简单的时间序列模型的结果进行比较;e、 g.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
最后,在使用训练集和验证集创建数据集时,还必须确保使用了正确的previous参数,即选择与时间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激活功能,并从那里开始工作。

您是否规范化了数据?如果没有,这可能有助于解决您的问题。请看这篇关于如何规范化LSTM-RNN数据的帖子,以及关于LSTM-RNN数据规范化的讨论。应该注意的是,虽然规范化是过程的关键部分,但OP应该意识到,这仍然会返回读数——只是读数非常虚假,即,与使用缩放数据相比,损耗读数将非常大。因此,虽然未能正常化可能会返回nan值,但并非所有情况下都是如此。您是否对数据进行了正常化?如果不是这样的话,这可能有助于解决你的问题