添加功能后损耗增加

时间:2019-05-30 18:57:26

标签: tensorflow keras time-series python-3.6 lstm

我正在研究一个时间序列问题,试图根据化石褐煤发电以及其他能源(例如核电站,天然气)的历史数据来预测德国化石褐煤电厂的发电量发电厂,太阳能等)。我的分析数据是从https://transparency.entsoe.eu下载的。我使用从2016年1月1日至2017年12月31日的数据进行培训,并使用从1.1年1月1日至2018年9月30日的数据进行15分钟的记录。

此处提供了培训数据的前10天示例:https://drive.google.com/open?id=1OPUYzYel7M1dyQYFl8K3xJo9xdLt2epw

我将所有值缩放为0-1之间的范围。我创建了100个时间步长的样本,涵盖了大约一天的时间。目标基于100个时间步长的输入,以预测随后10个时间步长中每个步长的后续能量生成。

作为该问题的基准,我建立了一个幼稚的预测规则,该规则预测了未来时间步长的最后观测值。

LSTM模型是一个具有32个节点的单层模型,最后一个具有ReLU激活功能的致密层:

input_tensor = Input(shape=(train_data.shape[1:]), name="Input_tensor")
first  = layers.CuDNNLSTM(32, return_sequences=False, kernel_initializer='lecun_uniform', name='First_layer')(input_tensor) 
output_tensor = layers.Dense(10, activation="relu", name="Output_tensor")(first) 

model = Model(input_tensor, output_tensor)

model.summary()

使用Adam作为优化器,以0.001的学习率,对200个纪元(最小批量大小为512)进行了训练,这证明了在较高或较低的值下都能很好地工作。损失函数是简单的均方误差损失。

model.compile(
    optimizer=optimizers.Adam(lr=0.001, decay=0),
    loss="mse")

# Fit automatically shuffles data before each epoch
history = model.fit(
    train_data, train_target,
    epochs=train_epochs,
    batch_size=batch_size,
    validation_data=(test_data,test_target),
    callbacks=[tensorboard, model_checkpoint],
    verbose=1)

基线MSE为0.002576,这是我尝试在模型中击败的值(通过使mse低于基线)。

如果仅根据我喜欢预测的变量(化石褐煤发电)的过去数据进行训练,则网络可以在测试数据上实现0.001576的MSE(比基准提高39%)。火车MSE为0.00088。

此处提供了一个预测样本的图表:https://drive.google.com/file/d/11c5-7NEBW9JisfKU6VW-9FgAoUcKFHAJ/view?usp=sharing (输入值是前100个蓝点,目标值是黑点,预测值是红点,朴素方法是绿点)。

但是,当我尝试向输入数据添加其他功能(其他独立变量,例如太阳能发电或其他)时,相对于我只是训练的简单情况,我经常看到测试集上的损失函数增加了基于一种输入特征(化石褐煤)。

我正在尝试通过实际引入更多变量来提高整体网络性能,并让网络决定哪些数据有价值而哪些数据没有价值。我的理解是,网络将相应地设置权重,以便仅考虑有助于降低损失的数据。但是,情况恰恰相反,更多的输入功能会导致损耗增加。有人以前观察过这种行为吗?是否有人知道有什么补救措施来防止这种情况发生。

非常感谢您。

使用Python版本3.6.5,TensorFlow版本1.12.0完成工作。

0 个答案:

没有答案