python - Keras 多元时间序列预测模型返回 NaN 作为 MAE 和损失
问题描述
我有多元时间序列数据,每 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):]
然后我通过 TensorFlow 教程中的 WindowGenerator 类生成窗口,就像这里一样。
使用一个简单的基线模型来预测与我得到实际预测的输入相同的输出,所以我假设我生成的窗口很好。我批次的形状是
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
如果我绘制一些示例窗口,我会看到我得到标签,但没有预测:
我已经尝试用稍微不同的窗口实现另一个模型(LSTM),但方法相似,但我得到了相同的 NaN,所以我相信这不是我的模型问题,而是我的数据中的一些问题?
解决方案
原来我对数据的标准化是错误的,标准化它,我得到的是实际值而不是 NaN。
推荐阅读
- odoo - 使用 Odoo 外部 API 中的自定义字段更新数据
- c# - 在 c# 中使用 kernel32.dll 缩短长文件路径名
- c# - 我应该如何使用 IAM 角色在 C# 中访问 S3
- c# - Scriban - 列出已解析的表达式(变量)
- powershell - 在分配的动态变量不起作用时调用表达式
- python - 如何使用 python webcrawler 获取 HTML 子类的文本?输出似乎是一个空数组
- awk - AWK 将具有相同第一列的行合并到特定格式
- sql - 访问 - 对重复项进行排名
- wordpress - 当后端连接到 wordpress 时如何向设备发送通知?
- php - http_build_query() 可以处理的最大数据