当您刚刚开始深度学习时,很难准备数据。
长期短期记忆,或 LSTM,循环神经网络期望在 Keras Python 深度学习库中进行三维输入。
如果您的时间序列数据中包含数千个长序列,则必须将时间序列拆分为样本,然后将其重新整形为 LSTM 模型。
在本教程中,您将了解如何使用 Keras 在 Python 中为 LSTM 模型准备单变量时间序列数据。
让我们开始吧。
如何为长期短期记忆网络准备单变量时间序列数据 照片来自 Miguel Mendez ,保留一些权利。
也许我得到的最常见问题是如何为监督学习准备时间序列数据。
我写过一些关于这个主题的帖子,例如:
但是,这些帖子对每个人都没有帮助。
我最近收到了这封邮件:
我的数据文件中有两列有 5000 行,第 1 列是时间(间隔 1 小时),第 2 列是比特/秒,我试图预测比特/秒。在这种情况下,您可以帮我设置[LSTM]的样本,时间步长和功能吗?
这里几乎没有问题:
- LSTM 期望 3D 输入,并且第一次了解这个问题可能具有挑战性。
- LSTM 不喜欢超过 200-400 个时间步长的序列,因此需要将数据拆分为样本。
在本教程中,我们将使用此问题作为显示为 Keras 中的 LSTM 网络专门准备数据的一种方法的基础。
我假设你知道如何将数据加载为 Pandas Series 或 DataFrame。
如果没有,请参阅以下帖子:
在这里,我们将通过在 5,000 个时间步长内存中定义新数据集来模拟加载。
from numpy import array
# load...
data = list()
n = 5000
for i in range(n):
data.append([i+1, (i+1)*10])
data = array(data)
print(data[:5, :])
print(data.shape)
运行此片段既会打印前 5 行数据,也会打印已加载数据的形状。
我们可以看到我们有 5,000 行和 2 列:标准的单变量时间序列数据集。
[[ 1 10]
[ 2 20]
[ 3 30]
[ 4 40]
[ 5 50]]
(5000, 2)
如果您的时间序列数据随着时间的推移是一致的并且没有缺失值,我们可以删除时间列。
如果没有,您可能希望查看插入缺失值,将数据重采样到新的时间刻度,或者开发可以处理缺失值的模型。看帖子如:
在这里,我们只删除第一列:
# drop time
data = data[:, 1]
print(data.shape)
现在我们有一个 5,000 个值的数组。
(5000,)
LSTM 需要处理样品,其中每个样品是单个时间序列。
在这种情况下,5,000 个时间步长太长;根据我读过的一些论文,LSTM 可以更好地完成 200 到 400 个步骤。因此,我们需要将 5,000 个时间步骤分成多个较短的子序列。
我在这里写了更多关于拆分长序列的文章:
有很多方法可以做到这一点,你可能想根据你的问题探索一些。
例如,您可能需要重叠序列,也许非重叠是好的,但您的模型需要跨子序列的状态等等。
在这里,我们将 5,000 个时间步骤分成 25 个子序列,每个子序列有 200 个时间步长。我们将采用老式方式,而不是使用 NumPy 或 Python 技巧,以便您可以看到正在发生的事情。
# split into samples (e.g. 5000/200 = 25)
samples = list()
length = 200
# step over the 5,000 in jumps of 200
for i in range(0,n,length):
# grab from i to i + 200
sample = data[i:i+length]
samples.append(sample)
print(len(samples))
我们现在有 25 个子序列,每个子序列有 200 个时间步长。
25
如果您更喜欢在一个班轮中这样做,那就去吧。我很想知道你能想出什么。 在下面的评论中发布您的方法。
LSTM 需要具有[样本,时间步长和特征]格式的数据。
在这里,我们有 25 个样本,每个样本 200 个时间步长和 1 个特征。
首先,我们需要将我们的数组列表转换为 25 x 200 的 2D NumPy 数组。
# convert list of arrays into 2d array
data = array(samples)
print(data.shape)
运行这件作品,你应该看到:
(25, 200)
接下来,我们可以使用reshape()
函数为我们的单个特征添加一个额外的维度。
# reshape into [samples, timesteps, features]
# expect [25, 200, 1]
data = data.reshape((len(samples), length, 1))
print(data.shape)
就是这样。
现在,数据可用作 LSTM 模型的输入(X)。
(25, 200, 1)
如果您希望深入了解,本节将提供有关该主题的更多资源。
- 如何将时间序列转换为 Python 中的监督学习问题
- 时间序列预测作为监督学习
- 如何在 Python 中加载和探索时间序列数据
- 如何在 Python 中加载机器学习数据
- 如何使用 Python 处理序列预测问题中的缺失时间步长
- 如何使用 Python 处理缺失数据
- 如何使用 Python 重新取样和插值您的时间序列数据
- 如何处理具有长短期记忆循环神经网络的超长序列
- 如何准备 Keras 中截断反向传播的序列预测
在本教程中,您了解了如何将长的单变量时间序列数据转换为可用于在 Python 中训练 LSTM 模型的表单。
这篇文章有帮助吗?你有任何问题吗? 请在下面的评论中告诉我。