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
值...虽然这似乎是一个问题,但我可以使用生成的模型来生成预测,它们看起来不错。
答案 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 激活功能,然后从那里开始工作。