首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间序列预测的Keras神经网络在模型拟合过程中显示出nan

时间序列预测的Keras神经网络在模型拟合过程中显示出nan
EN

Stack Overflow用户
提问于 2019-12-26 11:29:46
回答 1查看 1K关注 0票数 1

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

代码语言:javascript
复制
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的时代,其中使用的数据集具有以下形状,

代码语言:javascript
复制
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值在lossrmsemae的训练中.虽然这看起来是个问题,但我可以使用生成的模型来生成预测,它们看起来不错。

EN

回答 1

Stack Overflow用户

发布于 2019-12-26 16:44:31

首先要问的问题是,你是否试图根据将可用性解释为一种概率度量来预测时间序列?

softmax激活函数在这种情况下工作最好--但是当您实际上试图预测一个间隔时间序列时,您可能会错误地指定它--这就是为什么您要为您的结果获取NaN读数。

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

类似于您的示例,X_trainX_val被重新定义为示例、时间步骤和特性。

代码语言:javascript
复制
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网络的定义如下:

代码语言:javascript
复制
# 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进行时间序列预测是否有效,一个潜在的好主意是将发现与更简单的时间序列模型进行比较,例如ARIMA。

使用我们的例子,ARIMA在Hotel 1的预测中表现得更好,而在Hotel 2的预测中表现更好。

代码语言:javascript
复制
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天改进了模型。

代码语言:javascript
复制
# Number of previous
previous = 5
X_train, Y_train = create_dataset(train, previous)
X_val, Y_val = create_dataset(val, previous)

在您的情况下,我要检查的第一件事是使用softmax激活函数,并从那里开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59487800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档