Прогнозирование временных рядов Pybrain с использованием рекуррентных сетей LSTM

У меня есть вопрос, который относится к использованию pybrain для регрессии временного ряда. Я планирую использовать слой LSTM в pybrain для обучения и прогнозирования временного ряда.

Я нашел пример кода здесь по ссылке ниже

Например, запрос: повторяющаяся нейронная сеть для прогнозирования следующего значения в последовательности

В приведенном выше примере сеть может предсказать последовательность после обучения. Но проблема заключается в том, что сеть берет все последовательные данные, подавая их в один проход на входной уровень. Например, если данные обучения имеют 10 функций каждый, 10 функций будут одновременно подаваться на 10 входных узлов за один раз.

Насколько я понимаю, это уже не предсказание временных рядов, я прав? Поскольку нет разницы в отношении времени, которое каждая функция подается в сеть? Поправьте меня, если я ошибаюсь.

Таким образом, я пытаюсь достичь, это рекуррентная сеть, которая имеет только один вход node и один выход node. Вход node - это то, где все данные временных рядов будут последовательно подаваться на разных временных шагах. Сеть будет обучена воспроизведению ввода на выходе node.

Не могли бы вы предложить или направить меня на создание сети, о которой я говорил? Большое вам спасибо заранее.

Ответы

Ответ 1

Вы можете обучить сеть LSTM одним входом node и одним выходом node для прогнозирования временных рядов следующим образом:

Во-первых, как хорошая практика, используйте функцию печати Python3:

from __future__ import print_function

Затем сделайте простой временной ряд:

data = [1] * 3 + [2] * 3
data *= 3
print(data)

[1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2]

Теперь поместите эти временные ряды в контролируемый набор данных, где целью для каждого образца является следующий образец:

from pybrain.datasets import SequentialDataSet
from itertools import cycle

ds = SequentialDataSet(1, 1)
for sample, next_sample in zip(data, cycle(data[1:])):
    ds.addSample(sample, next_sample)

Создайте простую сеть LSTM с 1 входным node, 5 ячейками LSTM и 1 выходом node:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import LSTMLayer

net = buildNetwork(1, 5, 1, 
                   hiddenclass=LSTMLayer, outputbias=False, recurrent=True)

Настройте сеть:

from pybrain.supervised import RPropMinusTrainer
from sys import stdout

trainer = RPropMinusTrainer(net, dataset=ds)
train_errors = [] # save errors for plotting later
EPOCHS_PER_CYCLE = 5
CYCLES = 100
EPOCHS = EPOCHS_PER_CYCLE * CYCLES
for i in xrange(CYCLES):
    trainer.trainEpochs(EPOCHS_PER_CYCLE)
    train_errors.append(trainer.testOnData())
    epoch = (i+1) * EPOCHS_PER_CYCLE
    print("\r epoch {}/{}".format(epoch, EPOCHS), end="")
    stdout.flush()

print()
print("final error =", train_errors[-1])

Заплатите ошибки (обратите внимание, что в этом простом примере игрушек мы тестируем и обучаем на одном наборе данных, что, конечно же, не то, что вы сделали бы для реального проекта!):

import matplotlib.pyplot as plt

plt.plot(range(0, EPOCHS, EPOCHS_PER_CYCLE), train_errors)
plt.xlabel('epoch')
plt.ylabel('error')
plt.show()

Теперь попросите сеть предсказать следующий образец:

for sample, target in ds.getSequenceIterator(0):
    print("               sample = %4.1f" % sample)
    print("predicted next sample = %4.1f" % net.activate(sample))
    print("   actual next sample = %4.1f" % target)
    print()

(приведенный выше код основан на example_rnn.py и примерах из документации PyBrain)

Ответ 2

Я думаю, что лучший (более простой/понятный) пример, чтобы узнать, будет здесь, в нижней части страницы:

http://pybrain.org/docs/tutorial/netmodcon.html

По существу, после настройки, как показано, он автоматически отслеживает историю прошлых событий (до тех пор, пока вы не нажмете reset). Из документов:

http://pybrain.org/docs/api/structure/networks.html?highlight=recurrentnetwork#pybrain.structure.networks.RecurrentNetwork

"Пока не вызывается .reset(), сеть отслеживает все предыдущие входы и, таким образом, позволяет использовать повторяющиеся соединения и слои, которые оглядываются назад."

Итак, нет необходимости повторно представлять все прошлые входы в сеть каждый раз.

Ответ 3

Я тестировал LSTM, предсказывающий некоторую временную последовательность с Theano. Я обнаружил, что для некоторой гладкой кривой это можно предсказать правильно. Однако для некоторой зигзагообразной кривой. Трудно предсказать. Подробная статья: Предсказывать временную последовательность с LSTM

Прогнозируемый результат можно показать следующим образом: http://www.fuzihao.org/blog/images/LSTM_predict.png