繁体   English   中英

Keras多元时间序列预测模型返回NaN作为MAE和损失

[英]Keras multivariate time series forecasting model returns NaN as MAE and loss

我有多变量时间序列数据,几天内每 5 秒收集一次。 这包括标准化数据列,如下所示(几个示例值)。 "P1"是标签列。

|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|
|       | P1                    | P2                    | P3                   | AI_T_MOWA             | AI_T_OEL              | AI_T_KAT_EIN           | AI_T_KAT_AUS           | P-Oel                | P-Motorwasser        |
|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|
| 0     | 0.8631193380009695    | 0.8964414887167506    | 0.8840858759128901   | -0.523186057460264    | -0.6599697679790338   | 0.8195843978382326     | 0.6536355179773343     | 2.0167991331023862   | 1.966765280217274    |
|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|
| 1     | 2.375731412346451     | 2.416190921505275     | 2.3921080971495456   | 1.2838015319452019    | 0.6783070711474897    | 2.204838829646018      | 2.250184559609546      | 2.752702514412287    | 2.7863834647854797   |
|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|
| 2     | 2.375731412346451     | 2.416190921505275     | 2.3921080971495456   | 1.2838015319452019    | 1.2914092683827934    | 2.2484584825559955     | 2.2968465552769324     | 2.4571347629025726   | 2.743245665597679    |
|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|
| 3     | 2.3933199248388406    | 2.416190921505275     | 2.3753522946913606   | 1.2838015319452019    | 1.5485166414169536    | 2.2557284247076588     | 2.3039344533529906     | 2.31839887954087     | 2.7863834647854797   |
|-------|-----------------------|-----------------------|----------------------|-----------------------|-----------------------|------------------------|------------------------|----------------------|----------------------|

标准化数据的相应图表没有显示任何异常。

标准化数据的小提琴图

我已将这些数据分为训练集、验证集和测试集,因此我的训练数据是总体数据的前 70%,验证是接下来的 20%,测试是最后 10%。

train_df_st = df[0:int(self._n*0.7)]
val_df_st = df[int(self._n*0.7):int(self._n*0.9)]
test_df_st = df[int(self._n*0.9):]

然后我产生通过从tensorflows教程WindowGenerator类如Windows 这里

使用一个简单的基线模型来预测与输入相同的输出,我得到了实际的预测,所以我假设我生成的窗口很好。 我的批次的形状是

Input shape: (32, 24, 193)
Output shape: (32, 24, 1)

现在到了棘手的部分:我显然想使用另一个模型来进行更好的预测。 我已经尝试过仅使用一列使用 Conv1D 并且有效,所以我也想尝试一下。 我的窗户看起来像:

CONV_WIDTH = 3
LABEL_WIDTH = 24
INPUT_WIDTH = LABEL_WIDTH + (CONV_WIDTH - 1)
conv_window = WindowGenerator(
    input_width=INPUT_WIDTH,
    label_width=LABEL_WIDTH,
    shift=1,
    train_df=train_df_st, val_df=val_df_st, test_df=test_df_st, label_columns=["P1"])
Total window size: 25
Input indices: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
Label indices: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
Label column name(s): ['P1']

然后我定义我的模型并使用这里使用的compile_and_fit()方法。

conv_model = tf.keras.Sequential([
    tf.keras.layers.Conv1D(filters=32,
                           kernel_size=(CONV_WIDTH,),
                           activation='relu'),
    tf.keras.layers.Dense(units=32, activation='relu'),
    tf.keras.layers.Dense(units=1),
])

MAX_EPOCHS = 20

def compile_and_fit(model, window, patience=2):
  early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss',
                                                    patience=patience,
                                                    mode='min')

  model.compile(loss=tf.losses.MeanSquaredError(),
                optimizer=tf.optimizers.Adam(),
                metrics=[tf.metrics.MeanAbsoluteError()])

  history = model.fit(window.train, epochs=MAX_EPOCHS,
                      validation_data=window.val,
                      callbacks=[early_stopping])
  return history

history = compile_and_fit(window=conv_window, model=conv_model)

输入和输出形状是:

Input shape: (32, 26, 193)
Output shape: (32, 24, 1)

然而,我的最终输出只有两个时期,将 nan 显示为平均绝对误差和损失:

Epoch 1/20
382/382 [==============================] - 2s 4ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan
Epoch 2/20
382/382 [==============================] - 1s 3ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan

如果我绘制一些示例窗口,我会看到我得到标签,但没有预测:

示例窗口上的 conv 模型预测

我已经尝试使用稍微不同的窗口实现另一个模型(LSTM),但是使用了类似的方法,但是我得到了相同的 NaN,所以我相信这不是我的模型问题,而是我的数据中的问题?

事实证明我的数据标准化是错误的,将其标准化,我得到的是实际值而不是 NaN。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM