Skip to content

Latest commit

 

History

History
204 lines (135 loc) · 8.13 KB

prepare-univariate-time-series-data-long-short-term-memory-networks.md

File metadata and controls

204 lines (135 loc) · 8.13 KB

如何为长短期记忆网络准备单变量时间序列数据

原文: https://machinelearningmastery.com/prepare-univariate-time-series-data-long-short-term-memory-networks/

当您刚刚开始深度学习时,很难准备数据。

长期短期记忆,或 LSTM,循环神经网络期望在 Keras Python 深度学习库中进行三维输入。

如果您的时间序列数据中包含数千个长序列,则必须将时间序列拆分为样本,然后将其重新整形为 LSTM 模型。

在本教程中,您将了解如何使用 Keras 在 Python 中为 LSTM 模型准备单变量时间序列数据。

让我们开始吧。

How to Prepare Univariate Time Series Data for Long Short-Term Memory Networks

如何为长期短期记忆网络准备单变量时间序列数据 照片来自 Miguel Mendez ,保留一些权利。

如何准备时间序列数据

也许我得到的最常见问题是如何为监督学习准备时间序列数据。

我写过一些关于这个主题的帖子,例如:

但是,这些帖子对每个人都没有帮助。

我最近收到了这封邮件:

我的数据文件中有两列有 5000 行,第 1 列是时间(间隔 1 小时),第 2 列是比特/秒,我试图预测比特/秒。在这种情况下,您可以帮我设置[LSTM]的样本,时间步长和功能吗?

这里几乎没有问题:

  • LSTM 期望 3D 输入,并且第一次了解这个问题可能具有挑战性。
  • LSTM 不喜欢超过 200-400 个时间步长的序列,因此需要将数据拆分为样本。

在本教程中,我们将使用此问题作为显示为 Keras 中的 LSTM 网络专门准备数据的一种方法的基础。

1.加载数据

我假设你知道如何将数据加载为 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)

2.停机时间

如果您的时间序列数据随着时间的推移是一致的并且没有缺失值,我们可以删除时间列。

如果没有,您可能希望查看插入缺失值,将数据重采样到新的时间刻度,或者开发可以处理缺失值的模型。看帖子如:

在这里,我们只删除第一列:

# drop time
data = data[:, 1]
print(data.shape)

现在我们有一个 5,000 个值的数组。

(5000,)

3.拆分成样品

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

如果您更喜欢在一个班轮中这样做,那就去吧。我很想知道你能想出什么。 在下面的评论中发布您的方法。

4.重塑子序列

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)

进一步阅读

如果您希望深入了解,本节将提供有关该主题的更多资源。

相关文章

API

摘要

在本教程中,您了解了如何将长的单变量时间序列数据转换为可用于在 Python 中训练 LSTM 模型的表单。

这篇文章有帮助吗?你有任何问题吗? 请在下面的评论中告诉我。