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 的事情
features_considered = ['TimePart', 'NmbrServices', 'LoggedInTimeMinutes','NmbrPersons', 'NmbrOfEmployees']
features = data[features_considered]
features.index = data.index
Run Code Online (Sandbox Code Playgroud)
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)
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)
问题:
为什么 val_accuracy 总是 1.0?大多数功能都会发生这种情况
我还尝试使用以下方法对 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 看起来更好,但对于我可以获得的其他功能:使用均值/标准:
当使用 feature / featureMax 时,我得到:
在这种情况下,哪个更好?精度较高的一种还是损失较低的一种?
如果我在大约 8 个时期得到一些好的 Val_loss 和 Train_loss 然后它上升,那么我可以训练模型直到 8 个时期并保存它吗?
最后我以 H5 格式保存模型并加载它,因为我想预测第二天的新值,使用最后 45 个值进行预测。我如何才能将这些新数据拟合到模型中。你只是调用model.fit(newDataX, newDataY) 吗?还是需要在新数据上重新编译?
4.1 如果您在 2016-2018 年运行该模型,而您目前在 2020 年,您应该重新运行该模型多少次,例如,您是否应该每年使用 2017-2019 年的数据重新编译一次?
是否可以预测第二天的多个特征,还是使用多个模型更好?
归档时间: |
|
查看次数: |
245 次 |
最近记录: |