lstm训练时间序列
在本系列的第3部分中,我将完成在数据准备过程的第2部分中开始的描述,以在时间序列预测中训练和评估LSTM模型。 使用的数据集与第1部分和第2部分相同。与本系列所有文章相同,我指的是Python 3。
在第2部分中,我们学习了如何将时间序列转换为监督模型。 这还不足以提供我们的LSTM模型:还需要另外两个转换。 首先要做的是变换时间序列数据以使其稳定。 这些帖子使用的输入时间序列显示的值取决于时间。 查看其在第1部分中的绘图,我们可以看到直到2006年1月的上升趋势,然后到2010年2月的下降趋势,最后是迄今为止的第二个上升趋势。 将这些数据转换为平稳数据可以使工作变得更轻松:我们可以在训练之前从观测值中删除趋势,最后将其添加回预测中,以使预测返回到原始比例。 可以通过对数据进行差分来消除趋势:我们从当前值(在时间t )减去在时间t-1的值。 为此,pandas DataFrame提供了一个函数diff() 。 我们需要实现两个函数,一个函数返回时差序列:
def difference(timeseries, interval=1):
diff_list = list()
for idx in range(interval, len(timeseries)):
另一项是在进行预测之前将过程反转:
def invert_difference(historical, inverted_scale_ts, interval=1):
return inverted_scale_ts + historical[-interval]
最后要做的是将输入时间序列观测值转换为特定比例。 我们将使用的神经网络模型是LSTM。 LSTM的默认激活函数是双曲正切,其输出值在-1和1之间,因此,本示例中使用的时间序列的最佳范围在同一范围内。 最小和最大缩放系数需要在训练数据集上计算,然后用于缩放测试数据集。 scikit-learn软件包为此提供了一个特定的类,
MinMaxScaler 。 我们需要实现两个函数,一个用于计算缩放系数:
from sklearn.preprocessing import MinMaxScaler
def scale_data_set(train_data, test_data):
min_max_scaler = MinMaxScaler(feature_range=(-1, 1))
min_max_scaler = min_max_scaler.fit(train_data)
scaled_test_data
第二个是将预测值的缩放比例反转:
def invert_scale(min_max_scaler, scaled_array, value):
row = [elem for elem in scaled_array] + [value]
array = numpy.array(row)
现在我们可以放在一起了。 我们首先使输入数据固定:
raw_values = series.values
diff_values = difference(raw_values, 1)
然后将数据转换为类似于监督学习案例的问题:
supervised = tsToSupervised(diff_values, 1)
最后将训练数据(1992年至2010年)和测试数据(2011年至今)进行拆分:
train, test = supervised[0:-98], supervised[-98:]
并转换训练数据的规模:
scaler, train_scaled, test_scaled = scale(train, test)
在这一阶段,我们现在可以构建和训练我们的LSTM。 但这将是本系列下一篇文章的核心主题。
完整的示例将在本系列第一部分的结尾作为Jupyter笔记本发布。
lstm训练时间序列