以下是一个设置时间序列数据来训练LSTM的示例。模型输出是无意义的,因为我只是设置它来演示如何构建模型。
import pandas as pd
import numpy as np
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
df.head()
时间序列数据框:
Date A B C D E F G
0 2008-03-18 24.68 164.93 114.73 26.27 19.21 28.87 63.44
1 2008-03-19 24.18 164.89 114.75 26.22 19.07 27.76 59.98
2 2008-03-20 23.99 164.63 115.04 25.78 19.01 27.04 59.61
3 2008-03-25 24.14 163.92 114.85 27.41 19.61 27.84 59.41
4 2008-03-26 24.44 163.45 114.84 26.86 19.53 28.02 60.09
您可以将输入放入向量中,然后使用Pandas的
.cumsum()
功能构建时间序列的序列。
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)
df['single_input_vector'] = df.single_input_vector.apply(lambda x: [list(x)])
df['cumulative_input_vectors'] = df.single_input_vector.cumsum()
输出可以用类似的方式设置,但它将是一个单一的向量而不是一个序列:
df['output_vector'] = df[output_cols].apply(tuple, axis=1).apply(list)
为了将输入序列输入模型,它们需要具有相同的长度,因此您需要将它们填充到累积向量的最大长度:
from keras.preprocessing.sequence import pad_sequences
max_sequence_length = df.cumulative_input_vectors.apply(len).max()
padded_sequences = pad_sequences(df.cumulative_input_vectors.tolist(), max_sequence_length).tolist()
df['padded_input_vectors'] = pd.Series(padded_sequences).apply(np.asarray)
可以从数据框中提取训练数据并放入numpy数组中。请注意,从数据帧中得到的输入数据将不会生成一个3D数组,它生成的是一个数组的数组,这两者不同。
您可以使用hstack和reshape来构建一个3D输入数组。
X_train_init = np.asarray(df.padded_input_vectors)
X_train = np.hstack(X_train_init).reshape(len(df),max_sequence_length,len(input_cols))
y_train = np.hstack(np.asarray(df.output_vector)).reshape(len(df),len(output_cols))
为了证明它:
>>> print(X_train_init.shape)
(11,)
>>> print(X_train.shape)
(11, 11, 6)
>>> print(X_train == X_train_init)
False
一旦你有了训练数据,你就可以定义输入层和输出层的维度。
input_length = X_train.shape[1]
input_dim = X_train.shape[2]
output_dim = len(y_train[0])
构建模型:
from keras.models import Model, Sequential
from keras.layers import LSTM, Dense
model = Sequential()
model.add(LSTM(4, input_dim = input_dim, input_length = input_length))
model.add(Dense(output_dim, activation='relu'))
model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['accuracy'])
最后,您可以训练模型并将训练日志保存为历史记录:
history = model.fit(X_train, y_train,
batch_size=7, nb_epoch=3,
verbose = 1)
输出:
Epoch 1/3
11/11 [==============================] - 0s - loss: 3498.5756 - acc: 0.0000e+00
Epoch 2/3
11/11 [==============================] - 0s - loss: 3498.5755 - acc: 0.0000e+00
Epoch 3/3
11/11 [==============================] - 0s - loss: 3498.5757 - acc: 0.0000e+00
就是这样。使用model.predict(X)
来进行预测,其中X
的格式(除了样本数量)与X_train
相同。