Я пытаюсь сделать прогноз временных рядов с помощью экзогенных переменных, используя рекуррентные реализации нейронных сетей с нейронами LSTM и GRU в R
с использованием пакетов keras
и tensorflow
.
Набор данных выглядитнапример:
Date | Y | X1 | X2 | X3 | ... | X19 |
-----|---|----|----|----|-----|-----|
, где Y
- это реальное значение, а X1...X19
- экзогенные предикторы.
Набор данных имеет приблизительно 1200 точек данных (время от 0 до время = 1199).Я хотел бы обучить нейронную сеть для первой партии из 1000 точек данных (время = 0 до времени = 999), а затем спрогнозировать оставшиеся точки данных, используя переоценку прогноза на один шаг вперед.Т.е. прогноз Y'
от времени = 1000 до времени = 1199, но переоценка весов каждый раз, когда я вычисляю новую точку данных.
Процесс обучения и тестирования будет выглядеть так:
- Пакетный поезд NN на 1000 наблюдений от времени = 0 до времени = 999 с использованием всех исторических значений
Y
, а также всех исторических значений экзогенных переменных.Обновляйте весовые коэффициенты только один раз после 1000-шагового эпизода обучения. - Прогноз
Y'
в момент времени = 1000, основанный на весах из серии обучения, а также фактических экзогенных предикторов в момент времени = 1000. Сравните фактический Y
во время = от 1000 до Y'
во время = 1000 и обновление весов на основе потерь. - Использование обновленных весов и фактических экзогенных предикторов во время = 1001 для прогноза
Y'
во время = 1001. Сравните фактическиеY
во время = от 1001 до Y'
во время = 1001 и обновите веса на основе потерь. - Повторите.
Я уже рассмотрел следующие примеры, но ни одногоиз них, кажется, удовлетворяет моим требованиям, поскольку они не используют экзогенные переменные, пытаются предсказать экзогенные переменные (мне не нужно будет прогнозировать экзогенные переменные и буду предполагать, что они даются на каждый день), или не комбинировать пакетное обучениеблок с одношаговым прогнозированием и переоценкой.
https://blogs.rstudio.com/tensorflow/posts/2017-12-20-time-series-forecasting-with-recurrent-neural-networks/
https://blogs.rstudio.com/tensorflow/posts/2018-06-25-sunspots-lstm/
https://blogs.rstudio.com/tensorflow/posts/2018-01-11-keras-customer-churn/
Моей первоначальной мыслью было попробовать что-то вроде следующего: что я пробовал до сих пор:
dim(data)
[1] 1128 20
training_pcg = 0.7
test_pcg = 1 - training_pcg
train_data = data[1:floor(training_pcg * nrow(data) - 1),]
test_data = data[floor(training_pcg * nrow(data)):nrow(data),]
mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
# scale only training data, then scale each test example as it is received
# by the network (i.e. streaming / on-line normalization)
train_data = scale(train_data, center = mean, scale = std)
model = keras_model_sequential() %>%
layer_flatten(input_shape = c(1, dim(data)[-1])) %>%
layer_dense(units = nrow(train_data), activation = "relu") %>%
layer_dense(units = 1)
model %>% compile(
optimizer = optimizer_rmsprop(),
loss = "mae"
)
Но я боюсь, что это не таксовершенно правильно.
Я бы хотел, чтобы нейронная сеть представляла собой один нейрон LSTM или GRU с 20 входами (Y
и X1...X19
), который последовательно обрабатывает каждое из 1000 обучающих наблюдений, а затем обновляет веса после обработкивсе эти 1000 тренировочных наблюдений.
Наконец, на этапе тестирования я бы хотел, чтобы нейронная сеть представляла собой один нейрон LSTM или GRU с 20 входами (Y
и X1...X19
), который обновляет весовые коэффициенты после каждого контрольного наблюдения.Я не думаю, что это отражает мою предложенную структуру.
Любая помощь будет наиболее ценной.Спасибо!