Я работаю над проблемой временных рядов, пытаясь спрогнозировать выработку энергии электростанциями, работающими на ископаемом буром угле в Германии, на основе исторических данных для выработки электроэнергии из ископаемых бурых углей, а также других источников энергии (например, атомные электростанции, газэлектростанции, солнечные и другие).Данные для моего анализа были загружены с https://transparency.entsoe.eu. Я работаю с данными с 1.1.2016 по 31.12.2017 для обучения и с 1.1.2018 по 30.09.2018 для тестирования, записанного с 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()
Обучение проводится для 200 эпох (с размером мини-пакета 512), используя Адама в качестве оптимизатора со скоростью обучения 0,001, что доказывает свою эффективностьпротив более высоких или более низких значений.Функция потерь - это простая среднеквадратичная ошибка.
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 ниже, чем базовая линия),
Если я потренируюсь только на прошлых данных переменной, которую я хотел бы прогнозировать (выработка электроэнергии из ископаемого бурого угля), сеть может достичь MSE 0,001576 по данным испытаний (улучшение на 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.