在本系列的第二篇文章中,我们将学习如何准备用于训练和评估LSTM神经网络以进行时间序列预测的数据。 与本系列的其他任何文章一样,我所指的是Python3。使用的数据集与第1部分相同。
LSTM (长期记忆)神经网络是Sepp Hochreiter和Jurgen Schmiduber于1997年引入的RNN (递归神经网络)的一种特殊技术,用于解决影响RNN 的消失梯度的问题 。 LSTM用于语言翻译,文本生成,图像字幕,音乐生成和时间序列预测的实际应用中。 您可以在我的书中找到有关LSTM的更多信息,或者等待本系列的下一篇文章。 这篇文章主要关注在使用数据集进行Keras库的时间序列预测问题中的LSTM训练和评估之前,数据准备的最佳实践之一。 让我们先加载数据集:
from pandas import read_csv
from pandas import datetime
def parser(x):
return datetime.strptime(x, '%Y-%m-%d')
features = ['date', 'value']
series = read_csv('./advance-retail-sales-building-materials-garden-equipment-and-supplies-dealers.csv', usecols=features, header=0, parse_dates=[1], index_col=1, squeeze=True, date_parser=parser)
要做的第一步是改变时间序列,以使预测可能成为监督学习问题而成为威胁。 在监督学习中,通常将数据集分为输入(包含自变量)和输出(包含目标变量)。 我们将使用前一个时间步长的观测值(标识为t-1 )作为输入,并使用当前时间步长的观测值(标识为t )作为输出。 无需从头开始实现此转换逻辑,因为我们可以使用可用于pandas DataFrames的shift函数。 输入变量可以通过将原始时间序列的所有值下移一位来构建。 输出是原始时间序列。 最后,我们将两个系列连接到一个DataFrame中。 因为我们需要将此过程应用于原始数据集的值,所以最好为其实现一个函数:
from pandas import DataFrame
from pandas import concat
def tsToSupervised(series, lag=1):
seriesDf = DataFrame(series)
columns = [seriesDf.shift(idx) for idx in range(1, lag+1)]
columns.append(seriesDf)
seriesDf = concat(columns, axis=1)
seriesDf.fillna(0, inplace=True)
return seriesDf
supervisedDf = tsToSupervised(series, 1)
以下是受监管的DataFrame外观的示例:
supervisedDf.head()
数据集现在准备好用于训练和验证网络了吗? 还没。 其他转换需要完成。 但这将是下一篇文章的主题。
完整的示例将在本系列第一部分末作为Jupyter笔记本发布。