LSTM 时间序列 - 奇怪的 val_accuarcy,使用哪种归一化方法以及模型拟合后在生产中做什么

Tom*_*mek 6 python machine-learning lstm keras tensorflow

我正在做 LSTM 时间序列预测。我的数据看起来像这样

在此处输入图片说明 所以基本上我所拥有的是

IDTime : 每天的整数

时间部分:0 = 夜间,1 = 早上,2 = 下午

以及我试图预测的 4 列值

我有 2686 个值,每天 3 个值,所以总共有大约 900 个值 + 添加了新的缺失值

我阅读并做了类似https://www.tensorflow.org/tutorials/structured_data/time_series 的事情

  1. ReplacedMissingData - 添加了缺失的 IDTimes 0-Max,每个包含具有 0 个值的 TimePart 0-3(如果缺失)。并将所有 NULL 值替换为 0。我还删除了 Date 参数,因为我有 IDTime
  2. 将 Data (Pandas DataFrame) 索引设置为 IDTime 和 TimePart
  3. 复制我想要的功能
features_considered = ['TimePart', 'NmbrServices', 'LoggedInTimeMinutes','NmbrPersons', 'NmbrOfEmployees']
features = data[features_considered]
features.index = data.index
Run Code Online (Sandbox Code Playgroud)
  1. 在训练数据上使用平均值/标准差。我正在为我试图预测的每个特征创建 4 个不同的模型。我这个当前我设置的currentFeatureIndex= 1,即 NmbServices
    currentFeatureIndex = 1
    TRAIN_SPLIT = int(dataset[:,currentFeatureIndex].size * 80 / 100)
    tf.random.set_seed(13)
    dataset = features.values
    data_mean = dataset[:TRAIN_SPLIT].mean(axis=0)
    data_std = dataset[:TRAIN_SPLIT].std(axis=0)
Run Code Online (Sandbox Code Playgroud)
  1. 然后我创建了数据集。我想预测的前 X 值和接下来的 3 个未来值。我正在使用 tensorflow 示例中的 multivariate_data,并删除了步骤
    x_train_multi, y_train_multi = multivariate_data(dataset, dataset[:,currentFeatureIndex], 0,TRAIN_SPLIT, past_history,future_target)

    x_val_multi, y_val_multi = multivariate_data(dataset, dataset[:,currentFeatureIndex],TRAIN_SPLIT, None, past_history,future_target)


    print ('History shape : {}'.format(x_train_multi[0].shape))
    print ('\n Target shape: {}'.format(y_train_multi[0].shape))

    BATCH_SIZE = 1024
    BUFFER_SIZE = 8096

    train_data_multi = tf.data.Dataset.from_tensor_slices((x_train_multi, y_train_multi))

    train_data_multi =train_data_multi.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()

    val_data_multi = tf.data.Dataset.from_tensor_slices((x_val_multi, y_val_multi))
            val_data_multi = val_data_multi.batch(BATCH_SIZE).repeat()

    multi_step_model = tf.keras.models.Sequential()
    multi_step_model.add(tf.keras.layers.LSTM(32, activation='relu'))
    multi_step_model.add(tf.keras.layers.Dropout(0.1))
    multi_step_model.add(tf.keras.layers.Dense(future_target))

            multi_step_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae', metrics=['accuracy'])

    EVALUATION_INTERVAL = 200
    EPOCHS = 25

    currentName = 'test'
    csv_logger = tf.keras.callbacks.CSVLogger(currentName + '.log', separator=',', append=False)

    multi_step_history = multi_step_model.fit(train_data_multi, epochs=EPOCHS, steps_per_epoch=EVALUATION_INTERVAL, validation_data=val_data_multi, validation_steps=50, callbacks = [csv_logger])
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我还用 data[600:] 删除了前 800 个值,因为在替换缺失值后,数据不是它应该的样子。

我在 25 个 ecphoes 后得到这个最终值

 200/200 [==============================] - 12s 61ms/step - loss: 0.1540 - accuracy: 0.9505 - val_loss: 0.1599 - val_accuracy: 1.0000
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么 val_accuracy 总是 1.0?大多数功能都会发生这种情况

  2. 我还尝试使用以下方法对 0-1 的值进行标准化:

    features.loc[:,'NmbrServices'] / features.loc[:,'NmbrServices'].max() 我得到:

    200/200 [==============================] - 12 秒 60 毫秒/步 - 损失:0.0461 - 准确度:0.9538 - val_loss :0.0434 - val_accuracy:1.0000

    对于这个功能,我在这里使用,使用 feature/featureMax 看起来更好,但对于我可以获得的其他功能:使用均值/标准:

    • 损失:0.1461 - 准确度:0.9338 - val_loss:0.1634 - val_accuracy:1.0000

    当使用 feature / featureMax 时,我得到:

    • 损失:0.0323 - 准确度:0.8523 - val_loss:0.0463 - val_accuracy:1.0000

    在这种情况下,哪个更好?精度较高的一种还是损失较低的一种?

  3. 如果我在大约 8 个时期得到一些好的 Val_loss 和 Train_loss 然后它上升,那么我可以训练模型直到 8 个时期并保存它吗?

  4. 最后我以 H5 格式保存模型并加载它,因为我想预测第二天的新值,使用最后 45 个值进行预测。我如何才能将这些新数据拟合到模型中。你只是调用model.fit(newDataX, newDataY) 吗?还是需要在新数据上重新编译?

    4.1 如果您在 2016-2018 年运行该模型,而您目前在 2020 年,您应该重新运行该模型多少次,例如,您是否应该每年使用 2017-2019 年的数据重新编译一次?

  5. 是否可以预测第二天的多个特征,还是使用多个模型更好?

cha*_*ner 1

我建议您使用批量归一化 ,如果您想使用Vanilla LSTM还是Stacked LSTM ,这完全取决于您。

我建议你经历一下这个