tutorial - recurrent neural network time series prediction python
Solicitud de ejemplo: red neuronal recurrente para predecir el siguiente valor en una secuencia (2)
¿Alguien puede darme un ejemplo práctico de una red neuronal recurrente en (pybrain) python para predecir el siguiente valor de una secuencia? (He leído la documentación de pybrain y no hay un claro ejemplo de ello, creo). También encontré esta question . Pero no veo cómo funciona en un caso más general. Por lo tanto, estoy preguntando si alguien aquí podría encontrar un claro ejemplo de cómo predecir el siguiente valor de una secuencia en el cerebro, con una red neuronal recurrente .
Para dar un ejemplo.
Digamos, por ejemplo, que tenemos una secuencia de números en el rango [1,7].
First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
and so on.
Ahora dado, por ejemplo, el comienzo de una nueva secuencia: 1 3 5 7 2 4 6 7 1 3
cuál es / es el siguiente valor (es)
Esta pregunta puede parecer floja, pero creo que falta un buen y decente ejemplo de cómo hacer esto con Pybrain.
Además: ¿Cómo se puede hacer esto si hay más de 1 característica presente?
Ejemplo:
Digamos, por ejemplo, que tenemos varias secuencias (cada secuencia tiene 2 funciones) en el rango [1,7].
First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6
Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
and so on.
Ahora dado, por ejemplo, el comienzo de una nueva secuencia:
feature 1: 1 3 5 7 2 4 6 7 1 3
feature 2: 1 2 3 7 2 3 4 6 2 4
cuál es / es el siguiente valor (es)
Siéntase libre de usar su propio ejemplo siempre que sea similar a estos ejemplos y tenga alguna explicación detallada.
Estos pasos están destinados a realizar lo que usted solicita en la primera parte de la pregunta.
1) Crear un conjunto de datos supervisado que espera una muestra y un objetivo en sus argumentos,
ds = SupervisedDataSet(21, 21)
#add samples (this can be done automatically)
ds.addSample(map(int,''1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6''.split()),map(int,''1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6''.split()))
ds.addSample(map(int,''1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6''.split()),map(int,''1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7''.split()))
Una muestra siguiente es el objetivo o la etiqueta y
de su predecesor x
. Ponemos el número 21
porque cada muestra tiene 21
números o características.
Tenga en cuenta que para las notaciones estándar en la segunda mitad de su pregunta, es mejor llamar a feature1 y feature2 como sample1 y sample2 para una secuencia, y dejar que las características denoten los números en una muestra.
2) Crea una red, inicia el entrenador y ejecuta durante 100 épocas
net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
Asegúrese de establecer el argumento recurrent
como True
3) Crea los datos de prueba
ts = UnsupervisedDataSet(21, 21)
#add the sample to be predicted
ts.addSample(map(int,''1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7''.split()))
Creamos un conjunto de datos no supervisado debido a la suposición de que no tenemos las etiquetas o los objetivos.
4) Predecir la muestra de prueba usando la red entrenada
net.activateOnDataset(ts)
Esto debería mostrar los valores de la fourth run
esperada.
Para el segundo caso, cuando una secuencia puede tener más de muestra, en lugar de crear un conjunto de datos supervisado, cree uno secuencial ds = SequentialDataSet(21,21)
. Luego, cada vez que obtenga una nueva secuencia, llame a ds.newSequence()
y agregue las muestras -que llama funciones- en esa secuencia usando ds.addSample()
.
Espero que esto sea claro :)
Si desea tener el código completo para evitar el problema de importar las bibliotecas, hágamelo saber.
Issam Laradji trabajó para mí para predecir la secuencia de secuencias, excepto que mi versión de pybrain requería una tupla para el objeto UnserpervisedDataSet:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(21, 21)
ds.addSample(map(int,''1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6''.split()),map(int,''1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6''.split()))
ds.addSample(map(int,''1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6''.split()),map(int,''1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7''.split()))
net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(21,)
ts.addSample(map(int,''1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7''.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]
da:
=> [1, 2, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6, 7, 1, 4, 6, 1, 2, 2, 3, 6]
Para predecir secuencias más pequeñas, simplemente entrena como tal, ya sea como sub secuencias o como secuencias superpuestas (superposición que se muestra aquí):
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(10, 11)
z = map(int,''1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7''.split())
obsLen = 10
predLen = 11
for i in xrange(len(z)):
if i+(obsLen-1)+predLen < len(z):
ds.addSample([z[d] for d in range(i,i+obsLen)],[z[d] for d in range(i+1,i+1+predLen)])
net = buildNetwork(10, 20, 11, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(10,)
ts.addSample(map(int,''1 3 5 7 2 4 6 7 1 3''.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]
da:
=> [3, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6]
No muy bien...