In [1]:
import pandas as pd
from random import random
%matplotlib inline
%load_ext autoreload
%autoreload 2

flow = (list(range(1,10,1)) + list(range(10,1,-1)))*100
pdata = pd.DataFrame({"a":flow, "b":flow})
pdata.b = pdata.b.shift(9)
data = pdata.iloc[10:] * random()  # some noise
data[0:50].plot()


Out[1]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f1347e60dd8>

In [2]:
import numpy as np

def _load_data(data, n_prev = 100):
    """
    data should be pd.DataFrame()
    """

    docX, docY = [], []
    for i in range(len(data)-n_prev):
        docX.append(data.iloc[i:i+n_prev].as_matrix())
        docY.append(data.iloc[i+n_prev].as_matrix())
    alsX = np.array(docX)
    alsY = np.array(docY)

    return alsX, alsY

def train_test_split(df, test_size=0.1):
    """
    This just splits data to training and testing parts
    """
    ntrn = round(len(df) * (1 - test_size))

    X_train, y_train = _load_data(df.iloc[0:ntrn])
    X_test, y_test = _load_data(df.iloc[ntrn:])

    return (X_train, y_train), (X_test, y_test)

In [3]:
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM

in_out_neurons = 2
hidden_neurons = 50

model = Sequential()
model.add(LSTM(hidden_neurons, input_dim=in_out_neurons, return_sequences=False))
model.add(Dense(in_out_neurons, input_dim=hidden_neurons))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")


Using Theano backend.
Using gpu device 0: Quadro 2000

In [10]:
(X_train, y_train), (X_test, y_test) = train_test_split(data)  # retrieve data
model.fit(X_train, y_train, batch_size=700, nb_epoch=20, validation_split=0.05)

predicted = model.predict(X_test)
rmse = np.sqrt(((predicted - y_test) ** 2).mean(axis=0))

# and maybe plot it


Train on 1435 samples, validate on 76 samples
Epoch 1/20
1435/1435 [==============================] - 2s - loss: 1.7642 - val_loss: 1.7395
Epoch 2/20
1435/1435 [==============================] - 2s - loss: 1.6233 - val_loss: 1.5585
Epoch 3/20
1435/1435 [==============================] - 2s - loss: 1.5302 - val_loss: 1.3887
Epoch 4/20
1435/1435 [==============================] - 2s - loss: 1.2929 - val_loss: 1.2336
Epoch 5/20
1435/1435 [==============================] - 2s - loss: 1.1615 - val_loss: 1.1312
Epoch 6/20
1435/1435 [==============================] - 2s - loss: 1.0679 - val_loss: 1.0864
Epoch 7/20
1435/1435 [==============================] - 2s - loss: 1.0806 - val_loss: 0.9724
Epoch 8/20
1435/1435 [==============================] - 2s - loss: 0.9162 - val_loss: 0.8996
Epoch 9/20
1435/1435 [==============================] - 2s - loss: 0.8633 - val_loss: 1.2478
Epoch 10/20
1435/1435 [==============================] - 2s - loss: 1.1303 - val_loss: 0.8010
Epoch 11/20
1435/1435 [==============================] - 2s - loss: 0.7577 - val_loss: 0.8515
Epoch 12/20
1435/1435 [==============================] - 2s - loss: 0.8599 - val_loss: 0.7050
Epoch 13/20
1435/1435 [==============================] - 2s - loss: 0.6702 - val_loss: 0.7591
Epoch 14/20
1435/1435 [==============================] - 2s - loss: 0.7030 - val_loss: 0.6097
Epoch 15/20
1435/1435 [==============================] - 2s - loss: 0.5743 - val_loss: 0.5547
Epoch 16/20
1435/1435 [==============================] - 2s - loss: 0.5229 - val_loss: 0.5104
Epoch 17/20
1435/1435 [==============================] - 2s - loss: 0.5074 - val_loss: 0.6932
Epoch 18/20
1435/1435 [==============================] - 2s - loss: 0.7294 - val_loss: 0.4612
Epoch 19/20
1435/1435 [==============================] - 2s - loss: 0.4401 - val_loss: 0.4192
Epoch 20/20
1435/1435 [==============================] - 2s - loss: 0.3943 - val_loss: 0.3928

In [11]:
pd.DataFrame(predicted).plot()


Out[11]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f12e4d31ef0>

In [12]:
pd.DataFrame(y_test).plot()


Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f12e4cae198>

In [ ]: