LSTM / GRU RNN для анализа временных рядов с керами и тензорным потоком - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь сделать прогноз временных рядов с помощью экзогенных переменных, используя рекуррентные реализации нейронных сетей с нейронами LSTM и GRU в R с использованием пакетов keras и tensorflow.

Набор данных выглядитнапример:

Date | Y | X1 | X2 | X3 | ... | X19 |
-----|---|----|----|----|-----|-----|

, где Y - это реальное значение, а X1...X19 - экзогенные предикторы.

Набор данных имеет приблизительно 1200 точек данных (время от 0 до время = 1199).Я хотел бы обучить нейронную сеть для первой партии из 1000 точек данных (время = 0 до времени = 999), а затем спрогнозировать оставшиеся точки данных, используя переоценку прогноза на один шаг вперед.Т.е. прогноз Y' от времени = 1000 до времени = 1199, но переоценка весов каждый раз, когда я вычисляю новую точку данных.

Процесс обучения и тестирования будет выглядеть так:

  1. Пакетный поезд NN на 1000 наблюдений от времени = 0 до времени = 999 с использованием всех исторических значений Y, а также всех исторических значений экзогенных переменных.Обновляйте весовые коэффициенты только один раз после 1000-шагового эпизода обучения.
  2. Прогноз Y' в момент времени = 1000, основанный на весах из серии обучения, а также фактических экзогенных предикторов в момент времени = 1000. Сравните фактический Y во время = от 1000 до Y' во время = 1000 и обновление весов на основе потерь.
  3. Использование обновленных весов и фактических экзогенных предикторов во время = 1001 для прогноза Y' во время = 1001. Сравните фактическиеY во время = от 1001 до Y' во время = 1001 и обновите веса на основе потерь.
  4. Повторите.

Я уже рассмотрел следующие примеры, но ни одногоиз них, кажется, удовлетворяет моим требованиям, поскольку они не используют экзогенные переменные, пытаются предсказать экзогенные переменные (мне не нужно будет прогнозировать экзогенные переменные и буду предполагать, что они даются на каждый день), или не комбинировать пакетное обучениеблок с одношаговым прогнозированием и переоценкой.

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), который обновляет весовые коэффициенты после каждого контрольного наблюдения.Я не думаю, что это отражает мою предложенную структуру.

Любая помощь будет наиболее ценной.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...