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

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

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

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

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

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

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

не могли бы вы подсказать или направить меня в построении сети я упомянул? Заранее большое спасибо.

3 ответов


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

во-первых, как хорошая практика, давайте использовать функцию печати 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 входным узлом, 5 ячейками LSTM и 1 выходным узлом:

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)


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

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

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

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

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

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


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

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