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

刚开始接触深度学习时,准备数据可能会很困难。

长短期记忆(LSTM)循环神经网络在 Keras Python 深度学习库中需要三维输入。

如果你的时间序列数据中有数千个观测值,你必须将时间序列分割成样本,然后为你的 LSTM 模型重塑它。

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

立即开始你的项目,阅读我的新书 《时间序列预测深度学习》,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

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

如何为长短期记忆网络准备单变量时间序列数据
照片作者:Miguel Mendez,保留部分权利。

如何准备时间序列数据

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

我写了几篇关于这个主题的文章,例如

但是,这些文章并不能帮助所有人。

我最近收到了这封电子邮件

我的数据文件中包含两列,有 5000 行,第一列是时间(每小时一个间隔),第二列是 bits/sec,我正在尝试预测 bits/sec。在这种情况下,你能帮我设置 LSTM 的样本、时间步和特征吗?

这里有几个问题

  • LSTM 需要 3D 输入,第一次接触时可能会让你难以理解。
  • LSTM 不喜欢超过 200-400 个时间步的序列,因此数据需要分割成样本。

在本教程中,我们将利用这个问题来展示一种专门为 Keras 中的 LSTM 网络准备数据的方法。

时间序列深度学习需要帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

1. 加载数据

我假设您知道如何将数据加载为 Pandas Series 或 DataFrame。

如果不知道,请参阅这些文章

在这里,我们将通过在内存中定义一个具有 5000 个时间步的新数据集来模拟加载。

运行这段代码会打印出前 5 行数据以及加载数据的形状。

我们可以看到我们有 5000 行和 2 列:一个标准的单变量时间序列数据集。

2. 删除时间

如果你的时间序列数据在时间上是均匀的,并且没有缺失值,我们可以删除时间列。

如果不是,你可能需要考虑填补缺失值、将数据重采样到新的时间尺度,或者开发一个可以处理缺失值的模型。请参阅类似的文章

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

现在我们有了一个包含 5000 个值的数组。

3. 分割成样本

LSTM 需要处理样本,每个样本都是一个单一的时间序列。

在这种情况下,5000 个时间步太长了;根据我读过的一些论文,LSTM 在 200 到 400 个时间步之间工作效果更好。因此,我们需要将这 5000 个时间步分割成多个较短的子序列。

我在这里写了更多关于分割长序列的内容

有很多方法可以做到这一点,具体取决于你的问题,你可能需要探索其中一些。

例如,也许你需要重叠的序列,也许不重叠的序列很好,但你的模型需要在子序列之间保持状态等等。

在这里,我们将这 5000 个时间步分割成 25 个子序列,每个子序列包含 200 个时间步。为了让你能看清楚,我们不使用 NumPy 或 Python 的技巧,而是用传统的方法来实现。

我们现在有 25 个长度为 200 个时间步的子序列。

如果你想用一行代码完成,请随意尝试。我很想看看你能想出什么方法。
在下面的评论区分享你的方法。

4. 重塑子序列

LSTM 需要 [样本数、时间步数、特征数] 格式的数据。

这里,我们有 25 个样本,每个样本有 200 个时间步,以及 1 个特征。

首先,我们需要将我们的数组列表转换为一个 25 x 200 的二维 NumPy 数组。

运行这段代码,你应该会看到

接下来,我们可以使用 reshape() 函数为我们唯一的特征添加一个额外的维度。

这就完成了。

现在数据可以用作 LSTM 模型的输入 (X)。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

相关文章

API

总结

在本教程中,你学会了如何将长单变量时间序列数据转换为可以在 Python 中用于训练 LSTM 模型的形式。

这篇帖子有帮助吗?你有什么问题吗?
在下面的评论中告诉我。

立即开发时间序列深度学习模型!

Deep Learning for Time Series Forecasting

在几分钟内开发您自己的预测模型

...只需几行python代码

在我的新电子书中探索如何实现
用于时间序列预测的深度学习

它提供关于以下主题的自学教程
CNNLSTM多元预测多步预测等等...

最终将深度学习应用于您的时间序列预测项目

跳过学术理论。只看结果。

查看内容

131 条回复关于 “如何为长短期记忆网络准备单变量时间序列数据”

  1. Steven 2017年11月17日 9:44 AM #

    很棒的文章!我真希望几个月前我在为 TensorFlow 做同样的事情时能看到这篇文章。很高兴看到我的解决方案与你大体一致!

    你提到了讨论最佳样本数量的一些论文。能否分享一下这些论文的链接?我想看看作者们是如何得出这个数字的。

  2. went 2017年11月17日 12:32 PM #

    嗨 Jason,谢谢分享。

    假设我有一个时间序列数据集 [1,2,3,4,5,6,7,8],需要以时间步长 4 进行分割,在你的文章中,结果将是 [1,2,3,4], [5,6,7,8]。但在我读过的其他文章中,结果有时是这样的:[1,2,3,4], [2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8]。

    那么分割样本的最佳方式是什么呢?谢谢。

    • Jason Brownlee 2017年11月18日 10:11 AM #

      你列出的所有 3 种方法都是有效的,尝试每种方法,看看哪种最适合你的问题。

      • Martin 2017年11月21日 12:31 AM #

        有关于这个主题的文献吗?对于大型数据集,这 3 种解决方案似乎具有非常不同的训练时间。我假设对于第二种解决方案,我们应该保留单元格的内存,但对于第三种则不应该,对吗?

        另外,是否存在训练在早期学习中过度暴露某些时间步(例如示例中的时间步 5)的风险,从而赋予这些数据更大的权重?

        顺便说一句,你的博客很棒,你关于 LSTM 的书是我找到的最好的主题!谢谢。

  3. a 2017年11月17日 7:51 PM #

    好文章。Python 的列表推导式是我很喜欢的功能。一个可能的单行代码是

    samples = [data[i:i+length] for i in range(0,n, length)]

  4. Pedro Cadahía 2017年11月17日 10:38 PM #

    Went,你想要的是“滑动窗口”,你可以用以下代码实现

    from itertools import islice

    def window(seq, n=2)
    “返回一个滑动窗口(宽度为 n)的数据”
    ” s -> (s0,s1,…s[n-1]), (s1,s2,…,sn), … ”
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n
    yield result
    for elem in it
    result = result[1:] + (elem,)
    yield result

  5. Daniel Salvador 2017年11月20日 7:43 PM #

    嗨 Jason!首先,我必须说我真的很喜欢你的文章,它们非常有帮助。

    我面临一个时间序列分类问题(两个类别),其中我的序列大约有 120-200 个时间步,每个时间步有 7 个变量。问题是我只有 3000 个样本可以训练。你怎么看,一个 LSTM 网络是否可以先验地输入,还是我需要更多样本?

    你提到 LSTM 不擅长处理超过 200-400 个时间步。那么特征的数量呢?你会进行降维吗?

    提前非常感谢!

    • Jason Brownlee 2017年11月22日 10:40 AM #

      LSTM 可以支持多个特征。

      这听起来数据量不够。

      你可以尝试将序列分割成多个子序列看看是否有帮助?

  6. Staffan 2017年11月21日 6:40 AM #

    嗨,Jason,

    感谢你提供的这份精彩摘要,你的工作真的很出色……我对你花时间写这么多博客文章感到特别钦佩。

    我想知道为什么 LSTM 网络更喜欢 200-400 个样本的序列,这是由于内存分配问题吗?或者更长的序列会影响准确性(我不会这么想,但也许有可能)?

    批次大小在这里起什么作用?选择正确的批次大小是否可以减轻序列长度的限制?

    此致
    Staffan

    • Jason Brownlee 2017年11月22日 10:45 AM #

      这似乎是训练算法的一个限制。我在文献中看到过这个问题,但我自己并没有深入研究以更好地理解它。

      我鼓励你在你的问题上测试不同的配置。

  7. soloyuyang 2017年12月18日 1:26 PM #

    你好 jason,
    好帖子!我对“time-steps”参数有点困惑。“time-steps”是指输入数据的跨度吗?例如,对于单变量问题和一步预测,我使用“滑动窗口”构建了数据。对于每个样本,结构是“t-6,t-5,t-4,t-3,t-2,t-1,t 作为输入(train_x),以及 t+1 作为输出(train_y)”。使用 7 个数据来预测第 8 个。我将输入(train_x)重塑为 [样本数, 7, 1]。这样对吗?

  8. Davide 2018年2月17日 6:45 AM #

    你好 Jason,抱歉我的英语。我是神经网络的新手,我正在尝试开发一个神经网络来生成音乐。
    我有许多 .txt 文件,其中包含音符序列,如下所示:
    [音符编号(整数), 时间(整数), 时长(整数)]
    68 2357 159,
    64 2357 260,


    我应该选择哪种神经网络来实现这个目的?
    我该如何预处理这类数据?
    恭喜你的网站,谢谢你。

    • Jason Brownlee 2018年2月17日 8:51 AM #

      对于序列预测,像 LSTM 这样的 RNN 可能是一个不错的起点。

  9. falah 2018年3月1日 6:43 PM #

    你好
    我想对类别进行分类,每个类别包含 8 个时间步,每个时间步有 16 个特征。这个重塑是正确的吗?
    reshape(124,8,1)

    • Jason Brownlee 2018年3月2日 5:31 AM #

      我认为应该是 (?, 6, 16),其中“?”是样本数,如果我理解你的情况,可能是 124。

  10. C.Junior 2018年4月7日 2:05 AM #

    你好,Jason,感谢你的辛勤工作。
    我读了你关于将数据组织成 3D 的文章,但我的数据无法做到这一点,它总是出现类似这样的错误

    “检查目标时出错:预期 dense_363 具有 2 个维度,但收到形状为 (3455, 1, 1) 的数组”

    我的数据组织如下:

    开胃菜
    11,000 行,48 列,每行代表一天,每列代表 0.5 小时。

    输出 Y (0, 1) 是二元的,它代表事件的发生 1=是,0=否。

    所以我有 X = [0.1, 0.2, 0.3, ..., 0.48] Y = [0] 或 Y = [1]

    更多详情请看我的代码

    # 加载数据
    dataframe = pd.read_csv(‘Parque_A_Classificado_V2.csv’, header=None)
    dataset = dataframe.values

    # 将数据分割成训练集和测试集变量
    train_size = int(len(dataset) * 0.7)
    test_size = len(dataset) – train_size
    trainX, trainY = dataset[0:train_size,:48], dataset[train_size:len(dataset),48]
    testX, testY = dataset[0:test_size, :48], dataset[test_size:len(dataset), 48]

    # 重塑输入为 [样本,时间步,特征]
    trainX = trainX.reshape(trainX.shape[0],trainX.shape[1], 1)
    testX = testX.reshape(testX.shape[0], testX.shape[1], 1)
    trainY = trainY.reshape(trainY.shape[0], 1, 1)
    testY = testY.reshape(testY.shape[0], 1, 1)

    # 创建模型
    model = Sequential()
    model.add(LSTM(100, input_shape=(48, 1)))
    model.add(Dense(1, activation=’sigmoid’))
    # 编译模型
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
    model.fit(trainX, trainY, validation_data(testX, testY), epochs=1, batch_size=1)

    我找不到错误,你能帮我吗?

  11. Alon 2018年5月17日 3:07 AM #

    嗨,Jason,

    我遇到的问题与这里描述的类似,但略有不同。

    我正在解决一个分解问题,因此我的输出维度高于我的输入维度。为了简化,假设我的原始数据看起来像这样

    X.shape == [1000,1]
    Y.shape == [1000,10]

    我做了一些输入来让事情正常工作

    X = X.reshape(1,X.shape[0[,X.shape[1]) #将此参数设为依赖,以防我需要
    稍后使用更多特征

    我的网络看起来像这样

    model.sequential()
    model.add(LSTM(50,batch_input_shape = X.shape, stateful = True)
    model.add(Dense(Y.shape[1],activation = ‘relu’) #我的输出值不在+/-1之间,所以我
    选择了relu

    我选择了状态化模型,因为在实际训练时我将不得不进行批量分离,因为我有近 10^6 个样本

    然后我尝试了对 Y 向量做同样的事情,以及不碰它,无论哪种方式我都会得到一个错误(当我重塑 Y 时,我将 Y.shape[1] 改为 Y.shape[2])

    有什么想法?

  12. Srivatsa 2018 年 6 月 4 日下午 4:10 #

    当我划分并重塑 5000 行数据集时,如何将其分割为训练集和测试集?

  13. Jean 2018 年 6 月 15 日下午 7:11 #

    感谢这篇文章以及关于重塑 LSTM 输入数据的那篇文章,我理解了如何分割/重塑 LSTM 网络的输入,但我不知道如何处理标签……

    我的数据集是 3000 个时间步和 9 个特征。正如文章中所解释的,我将其分割以获得 15 个 200 个时间步长的样本,因此我的输入形状是 (15, 200, 9)。

    我的标签是 (3000, 6) 的二进制矩阵,也就是说,我想解决一个 6 类分类问题。

    如果我按原样输入标签,我会收到错误“找到 15 个输入样本和 3000 个目标样本”。
    如何正确地将标签输入网络?让我困惑的是,目标应该是 2D(与输入不同),所以我看不到我该如何像分割输入那样分割它们,例如获得 (15, 200, 6) 的形状……

  14. NN 2018 年 6 月 19 日上午 9:41 #

    很棒的博客,谢谢!
    据我理解,您展示了如何处理一个长时序列,但我无法理解如何处理多个输入。
    例如,我的输入是 x1,维度是 (25, 200, 1)
    但我有多个输入用于我的训练 X = [x1,x2…xn]

    我应该如何为 model.fit 和 LSTM 层进行形状调整?一个 4D 张量?

  15. NL 2018 年 6 月 19 日上午 9:51 #

    感谢精彩的博客。
    重塑时,总训练样本数放在哪里?
    据我理解:(子样本数量,时间步,每个时间步的特征)

    • Jason Brownlee 2018 年 6 月 19 日下午 2:45 #

      正确:[样本数,时间步,特征数]。

  16. Mr. T 2018 年 6 月 22 日上午 2:19 #

    我喜欢你所有的帖子!
    我有点困惑
    我猜时间步的数量限制了递归层的数量。因为时间步的数量等于你运行递归神经网络的时间步数。这是真的吗?如果是,LSTM 的内存如何能大于递归次数?

    如果它不大于,为什么有人会选择 time steps = 1 就像你在一些帖子中所做的那样?
    谢谢。

    • Jason Brownlee 2018 年 6 月 22 日上午 6:14 #

      时间步和节点/层是无关的。

      • Mr.T 2018 年 6 月 22 日上午 10:03 #

        抱歉,我把问题表述得不好。

        我的意思是:如果我有一个比如 100 个时间步长的样本序列,LSTM 的内存能大于这 100 个时间步长吗?
        内存是否受序列中给定时间步数限制?

        感谢您的时间。T

        • Jason Brownlee 2018 年 6 月 22 日下午 2:55 #

          根据文献,LSTM 的限制似乎大约在 200-400 个时间步长。

  17. K 2018 年 6 月 27 日上午 6:35 #

    嗨,Jason,

    您能否解释一下您所说的 LSTM 对 200-400 个时间步长效果不佳,而您却回复 Daniel Salvador 说 3000 个训练样本不够?

    200-400 是指预测 200-400 步吗?

    您认为多少训练样本才算足够?

  18. Eric Zheng 2018 年 8 月 23 日下午 12:32 #

    亲爱的 Jason,

    你能帮我解决这个问题吗?
    我有许多短语,每个短语包含许多单词(我已经填充,使它们具有相同的长度),并且我已经为每个单词训练了词嵌入。那么,在这种情况下,如果我想在 Keras 中使用 LSTM 来执行一些分类任务(例如,每个短语的标签是 1 或 0,这与单词的顺序有关),那么 LSTM 层的输入形状是什么?它是否像形状(短语数量,短语中的单词数,词嵌入的维度数)?我有点困惑。感谢您的帮助。

    • Jason Brownlee 2018 年 8 月 23 日下午 1:55 #

      可能是:[总短语数, 短语长度, 1]

      • Eric Zheng 2018 年 8 月 24 日凌晨 1:41 #

        感谢您的回复。但我仍然感到困惑。
        1. 为什么最后是“1”?
        2. 我认为我的输入 numpy 数组(将被输入到 Keras 顺序模型,其第一层是 LSTM 层)的形状是(短语数量,短语中的单词数,词嵌入的维度数)。这是否意味着 LSTM 的输入形状是(短语中的单词数,词嵌入的维度数)?因为我想根据单词之间的顺序学习东西。
        我的任务与您帖子中的任务非常相似。 https://machinelearning.org.cn/sequence-classification-lstm-recurrent-neural-networks-python-keras/
        在该帖子中,原始输入是一个单词向量。然后,它将被放入一个 keras 顺序模型,但是,第一层是 Word Embedding 层,然后是 LSTM 层。词嵌入层的输出形状应该是(2D)数组,对吧?那是否意味着在这种情况下 LSTM 的输入形状是 2D 而不是 3D?如果不是,那么在这种情况下输入形状是什么。
        谢谢你的帮助。

        • Jason Brownlee 2018 年 8 月 24 日上午 6:14 #

          因为您有一个 1D 整数序列要输入到您的模型中,例如作为嵌入的输入。

          词嵌入将处理其自身的维度,不要为它重塑数据。

  19. Pier 2018 年 9 月 3 日晚上 9:22 #

    嗨 Jason,您能帮我一下吗?
    我的数据集不是连续收集的,而是许多实验的结果,每个实验都代表我想让我的 LSTM 模型学习和预测的特定类别。
    在训练阶段准备序列的最佳策略是什么?
    我应该将所有可用的时间序列连接起来,然后使用滑动窗口生成序列吗?在这种情况下,我可能会冒险将不同类别的数据放在同一个序列中……
    或者为每个单独的类别创建序列会更好吗?
    提前感谢

    • Jason Brownlee 2018 年 9 月 4 日上午 6:06 #

      也许可以构思 3-5 种不同的方法来构建预测问题,然后对其中一些进行原型设计。这将帮助您理清正确的方法。

  20. Christopher 2018 年 9 月 15 日下午 4:50 #

    嗨,Jason,
    很棒的帖子!
    您在 PM 2.5 多变量时间序列示例中没有像这样进行操作 https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/
    # 分割成样本(例如 5000/200 = 25)
    samples = list()
    length = 200
    # 以 200 为步长遍历 5000 个数据
    for i in range(0,n,length)
    # grab from i to i + 200
    sample = data[i:i+length]
    samples.append(sample)
    print(len(samples))

    这是因为 PM2.5 示例假设了重叠的子序列?还是您有其他原因?

    为了方便您,您在该 PM2.5 示例中提供了以下代码片段
    # 将输入重塑为 3D [样本, 时间步, 特征]
    train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
    test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
    print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
    (8760, 1, 8) (8760,) (35039, 1, 8) (35039,)

    在我更改 n_hours=3,即时间步后,我在 Spyder 中得到以下输出
    (8760, 3, 8) (8760,) (35037, 3, 8) (35037,)
    训练 8760 个样本,验证 35037 个样本

    这意味着它们是重叠的子序列。

    如果我的理解正确,请告诉我。

    非常感谢。

    • Jason Brownlee 2018 年 9 月 16 日上午 5:57 #

      因为我试图让教程保持简单和专注。

      • Christopher 2018 年 9 月 16 日上午 11:58 #

        感谢您的回复。您没有在此教程中详细说明何时需要重叠子序列,何时不需要。您有关于此的教程或任何提示吗?

        • Jason Brownlee 2018 年 9 月 17 日上午 6:28 #

          这 realmente 取决于问题,例如,输入样本的组成取决于您希望模型学习或映射到输出样本的内容。

  21. Rashmi Ravishankar 2018 年 9 月 18 日晚上 11:06 #

    这太棒了(就像您的整个系列一样)!我一直发现您的文章简洁、清晰、明了,所以谢谢您。

    关于 LSTM 系列的一些小建议-您可以添加几行关于 Y 的形状和 return_sequence 选项。尽管读了您所有的 LSTM 文章,我之前在这方面遇到了困难,所以这可能会帮助其他人!

  22. Nancyz20 2018 年 9 月 22 日上午 9:39 #

    您能否提供标签数据形状的示例?维度应该是多少?我们可以训练 24 个样本并预测第 25 个样本吗?

  23. Dominik Zulovec Sajovic 2018 年 11 月 6 日上午 5:39 #

    你好,

    我只想说您的文章非常棒!

    我的问题是

    假设我们将数据分割成这样的形状

    (100, 60, 5)

    这意味着有 100 个样本,每个样本回顾 60 个时间步,包含 5 个特征。

    我是否可以正确地假设,在按所述方式分割数据后,我们可以随意地对这 100 个样本进行洗牌,结果将是相同的。

    这样我们就可以应用正常的交叉验证,而这对于 RNN 来说通常是不可能的?

  24. Guicheng Tian 2018 年 11 月 9 日下午 6:38 #

    嗨 Jason!首先,我必须说我真的很喜欢你的文章,它们非常有帮助。
    我有一些关于时间序列的问题,您能给我一些建议吗?

    1. 假设数据:t1, t2,…t10,我通过滚动窗口准备数据,窗口大小为 3,例如 [t1,t2,t3] -> t4,然后我训练了一个 LSTM 模型,我想知道如何预测未来一个时间步?例如:预测未来时间 t20 的值,但是历史特征 [t17, t18, t19] 为空。

    2. 如果每个时间步都有一个标签,我需要通过滚动窗口来准备数据吗?例如二元分类问题

    t1, f11, f12, f13, 1
    t2, f21, f22, f23, 0
    ....
    tn, fn1, fn2, fn3, 1

    当我训练 LSTM 时,我将 N 个时间样本 [N, 3] 重塑为 [-1, timesteps, 3],N 是时间样本的数量,输入到 LSTM 的训练数据形状是 [-1, timesteps, 3],但这要求 N 必须等于 k * timesteps,例如,[60, 3] -> [-1, 12, 3] 是可以的,但 [50, 3] -> [-1, 12, 3] 是错误的。我想知道如何处理最后 2 个时间样本,我应该用零向量填充以获得序列大小 12 吗?

    非常非常感谢。

  25. weiliu 2018 年 11 月 21 日下午 2:43 #

    嗨,Jason。感谢您的帖子。

    我有一些问题。假设我要预测一个地区的人数。我们将该地区划分为 3x3 网格,每个网格具有当前人数的值。然后每小时时间间隔都有一个 3x3 的矩阵,例如 8:00 有一个 3x3 的矩阵,9:00 有一个 3x3 的矩阵,我们的目标是使用前两个时间间隔(即 10:00 和 11:00)来预测接下来的两个时间间隔(即 10:00 和 11:00)的人数。我应该如何处理这个任务?谢谢!

    • Jason Brownlee 2018 年 11 月 22 日上午 6:20 #

      您可以使用 CNN-LSTM 或 ConvLSTM 来读取矩阵时间序列,然后使用编码器-解码器模型来输出多个时间步。

  26. Giulia 2019 年 2 月 8 日下午 7:53 #

    一切都很清楚,但我有一个问题。
    代码行
    data = array(samples)
    返回的不是 (number_samples, time_steps),而只是 (number_samples,),因此重塑指令不起作用。
    我该如何解决这个问题?

  27. Sandipan Banerjee 2019 年 3 月 17 日上午 10:31 #

    非常感谢您的博文。我是这个领域的新手(我是机械工程专业的博士生),想请您对如何处理时空数据发表一下意见。我来解释一下,我有一些流体流动在二维域中的模拟结果,域中每个点的位置都有特定的 x 和 y 坐标,具有特定的速度、压力、涡量等。对于每个时间步,我都有一个单独的数据文件,每个数据文件包含多行和多列。每一行对应于域上的一个特定点,每一列包含该点的 x 坐标、y 坐标、速度、涡量等。您建议用哪种类型的神经网络来解决这个问题?如果您知道有类似的帖子或博客,如果您能指出,我将非常感激。

    再次感谢您提供的博文内容!

    • Sandipan Banerjee 2019 年 3 月 17 日上午 10:34 #

      我忘了补充

      利用多个时间步的数据,我想训练一个模型,该模型将预测未来时间步在每个点的速度和涡量。同样,每个时间步都有包含多个数据点的单独文件。每个特定点的位置随时间保持不变。

    • Jason Brownlee 2019 年 3 月 18 日上午 6:03 #

      很好的问题!

      如果数据在空间上相关,例如像二维图像的时间序列,那么我建议您研究 CNN-LSTM 和 ConvLSTM。

      • Sandipan Banerjee 2019 年 3 月 19 日凌晨 12:11 #

        感谢您的回复,我将研究 CNN-LSTM。还有一个问题。当每个时间步都有一个包含多个行的数据文件时,我如何输入多个时间步的数据?我找到的示例都将每个时间步表示为一个数据文件中的一行。但我的数据有多个时间步,每个时间步都有一个单独的文件。

        • Jason Brownlee 2019 年 3 月 19 日上午 8:58 #

          也许可以将所有数据加载到内存中,或使用数据生成器逐步加载数据。

  28. David 2019 年 5 月 5 日上午 4:29 #

    非常好的教程。我有一个关于 y_train 的问题。
    在应用此教程后,我的 X_train 的形状是 (958, 75, 10)。但是,我的 y_train 只是 (71850, 9),这是一个包含 9 个可能类别的 one_hot_encoder 向量的长数组。
    我不明白如何重塑 y_train 以便为 Keras 中的 LSTM 模型做好准备。

    • Jason Brownlee 2019 年 5 月 5 日上午 6:35 #

      样本的输入和输出元素必须匹配。

      例如,如果您有 958 个输入样本,则需要为这些相同样本提供 958n 个输出元素。

  29. David 2019 年 5 月 6 日晚上 9:31 #

    你好,我有一个新问题, as updating the last one。
    如果我没记错的话,y_train 的形状取决于模型,如果我训练一个状态化模型,它必须是 (958, 9),但是如果我训练一个非状态化模型,它必须是 (958, 75, 9)?

  30. Ryan Gan 2019 年 6 月 19 日凌晨 2:20 #

    布朗利博士您好,

    是否可以将向量的向量发送到 LSTM?我有单词标记(seq 1)“hello” “how” “are” “you” 等…每个单词都由 word2vec 中的一个向量表示。所以我得到一个向量的向量。这是 seq 1。我最多有 seq n。我如何将它们作为 LSTM 的输入?

    • Jason Brownlee 2019 年 6 月 19 日上午 8:16 #

      是的,通常我们使用嵌入来存储向量。您可以直接将向量提供给 LSTM,每个向量的元素就是一个特征。

      因此,您将拥有一个特征向量(特征或嵌入)的序列(单词或时间步)。

  31. mahag 2019 年 7 月 9 日晚上 8:51 #

    很棒的教程,我有一个问题
    那么,如果我有一个单维数据,我是否必须通过添加时间步长来将其变成二维数据?
    所以它变成例如
    [1 20]
    [2 25]
    [3 30]
    .
    .
    .
    [10 65]
    谢谢你
    此致

  32. Hugh 2019 年 7 月 23 日晚上 11:53 #

    这是一个很好的资源,但我仍然对一件事感到困惑。我有一个分类问题,有 5 个特征,但我想训练模型来识别每个标签的时间步长序列。也就是说,sequence_feature1 + sequence_feature2 + sequence_feature3 + sequence_feature4 + sequence_feature5 = label。有没有办法修改 LSTM 的输入来解决这个问题?否则,我似乎是在训练模型,使 feature1+feature2 +feature3 + feature4 +feature5 = label 在每个时间步长(这是不正确的)。谢谢

    • Jason Brownlee 2019 年 7 月 24 日 上午 8:01 #

      抱歉,我不明白您问题的结构。

      如果您需要记忆先前的预测,模型会拥有一些内部状态——至少在重置该状态之前是这样。

  33. Kent 2019 年 8 月 8 日 下午 4:31 #

    您准备好的最终数据是 3D numpy 数组,不重叠,对吗?

    那么,不重叠意味着有些点我们无法预测。

    在示例中([samples, timesteps, feature] = [25, 200, 1]),
    ・使用 1-200 的值预测 201 的值。
    ・使用 201-400 的值预测 401 的值,依此类推。

    那么,我们无法预测,比如说 202 或 207,对吗?因为没有重叠。

    我的理解正确吗?

    • Jason Brownlee 2019 年 8 月 9 日 上午 8:05 #

      您可以按照您希望的任何方式设计问题框架。

      通常首选重叠,这实际上取决于您在实践中希望如何使用模型。

  34. kent 2019 年 8 月 9 日 下午 3:40 #

    非常感谢您的回答。

  35. Ruben Chevez 2020 年 1 月 29 日 上午 6:34 #

    感谢 Jason 的精彩文章。根据您的文章,我们得到了以下数据形状
    (25, 200, 1)。现在,让我们想象一下我们的模型已经训练好了。我们的模型现在期望的输入是(variable, 200, 1)。如果我只有一个数据点,并且我想预测二元输出(正面/负面),会发生什么?

    即使重新整形,它也会变成(1, 1, 1),第二个维度会让模型崩溃,因为它期望每个批次有 200 行。我应该只调整第二个维度,然后用空值填充其余部分吗?(1, 200, 1)第一行将是我的数据点,但其余将是空行?

  36. Jung Song 2020 年 2 月 16 日 上午 5:47 #

    你好 Jason,

    我很欣赏您的文章,我对 LSTM 有一个问题

    当您将 (25, 200, 1) 输入 LSTM 层时,此 LSTM 层中将有 200 个 LSTM 处理器(其中存在输入、遗忘门)来处理从 10、20 开始的输入,然后一直到 2,000 并进行记忆吗?

    对于您具有输入形状 (8760, 1, 8) 的多元示例,是否只有 1 个 LSTM 处理器,因为时间步长为 1?由于只有一个时间步长需要记忆,LSTM 会有效吗?

    谢谢!

  37. Viktor 2020 年 4 月 24 日 上午 4:32 #

    你好 Jason,

    感谢您提供学习资料。我想问一下,如果您有多个 5000 个序列(例如,来自多个不同的观察结果),您将如何进行?例如,如果您有 1000 个测量值,每个测量值有 5000 个,而您不关心个体,因为您想学习一些通用模式(因此没有必要在特征上区分它们)?

    谢谢!

      • Viktor 2020 年 4 月 24 日 上午 6:12 #

        感谢您的回复,但链接中的答案仍然考虑了一些个性化。以传感器读数(例如加速度计)预测汽车速度为例。您可能有成千上万个会话,您不关心是哪辆车或哪个传感器。您关心的是会话(有开始和结束),加速度计读数和速度。您有成千上万个非常长的会话。

        在这种情况下,为每个会话训练 stateful LSTM(会话可以是时间序列,切成较小的片段,作为预测的输入——就像文章中所述)并在重置状态之间通过所有会话循环进行训练是否有意义?

        我正在努力理解循环神经网络,而大多数文章都基于可能有点过于简化的案例。

        谢谢

        • Jason Brownlee 2020 年 4 月 24 日 上午 8:01 #

          可能不会,您必须从一个非常明确的定义开始,说明您想预测什么以及可能对做出预测有用的输入是什么。
          https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/

          • Viktor 2020 年 4 月 24 日 下午 4:55 #

            好的,以我的例子为例——我得到的源数据格式为 [2000, 30, 250, 3]——2000 个序列,每个序列分为 30 个时间序列,长度为 250,特征为 3(来自加速度计的读数)。对于每个时间序列,我想预测速度。

            如何在此数据上进行训练?

            for i in range(2000])
            model.fit(X[i], y[i], epochs=1, verbose=0, batch_size=1)

            其中 X[0] 的形状为 30x250x3,y[0] 的形状为 30×1(如果是多对一)?

            抱歉打扰您,但如我所述,我从未见过使用此类数据的示例,因此我不确定如何处理。

            再次感谢您的帮助。

          • Jason Brownlee 2020 年 4 月 25 日 上午 6:39 #

            这取决于每个样本的 300 个时间序列是如何相关的。

            如果它们不相关,您就有 2000*300 个样本。
            如果它们相关,可能上述方法,或者为每个样本拟合一个单独的模型。
            或者可能是 convlstm 或 cnn lstm。

  38. Viktor 2020 年 4 月 25 日 上午 7:04 #

    好的,谢谢您的回答。我只是不确定我是否错过了什么。

  39. Rajrudra 2020 年 4 月 28 日 下午 6:27 #

    抱歉,features 是表示列数

  40. Rajrudra 2020 年 4 月 28 日 下午 6:49 #

    嘿 Jason,我喜欢您的解释方式,但我有一个疑问
    我想用 LSTM 进行预测,但我遇到了问题。这是我的代码

    def predict(self) -> list
    """
    用于预测用于创建类的测试数据的方法
    """
    yhat = []

    if(self.train_test_split > 0)

    # 获取最后的 n 个时间序列
    _, X_test, _, _ = self.create_data_for_NN()

    # 生成预测列表
    yhat = [y[0] for y in self.model.predict(X_test)]

    return yhat

    def predict_n_ahead(self, n_ahead: int)
    """
    用于预测 ahead n 个时间步长的方法
    """
    X, _, _, _ = self.create_data_for_NN(use_last_n=self.lag)

    # 生成预测列表
    yhat = []

    for _ in range(n_ahead)
    # 生成预测
    fc = self.model.predict(X)
    yhat.append(fc)

    # 为预测创建新的输入矩阵
    X = np.append(X, fc)

    # 忽略第一个变量
    X = np.delete(X, 0)

    # 为下一次迭代重新整形
    X = np.reshape(X, (1, len(X), 1))

    return yhat
    您能为我推荐一个更好的预测方法吗?
    因为在 predict() 函数中,有递归,这对我来说有点难理解

    • Jason Brownlee 2020 年 4 月 29 日 上午 6:24 #

      抱歉,我没有能力审查/调试您的代码。

      也许您可以将您的问题总结为一两句话?

      • Rajrudra 2020 年 4 月 29 日 下午 3:40 #

        所以,如果您能理解我的代码,我实际上想要一种更短、更简单的方法来做预测

  41. Rajrudra 2020 年 4 月 30 日 下午 3:05 #

    Jason,拜托,我需要您的帮助

    • Jason Brownlee 2020 年 5 月 1 日 上午 6:28 #

      我很乐意回答关于机器学习或教程的具体问题。

  42. Rajrudra 2020 年 5 月 1 日 下午 3:42 #

    所以你能告诉我,也许用一个代码示例,如何使用 keras evaluate() 吗?

  43. Espen Holst Wiik 2020 年 5 月 13 日 上午 7:18 #

    我尝试重塑我的数据集,它有 38881 行和 7 列。如果将目标变量也算进去,那就是 8 列,因为我的问题是一个分类问题。
    在这个步骤上我遇到了很多困难。
    您的示例对我来说不起作用,因为我的数据集已经是 2d 数组了(我认为)。
    我该如何将我的数据集转换为 3d 数据集?
    感谢您的帮助

  44. Monica 2020 年 5 月 16 日 上午 1:29 #

    您好 Jason。感谢您的指南,这是我找到的唯一一个清晰的指南。
    但是,我无法运行我的案例。

    主要问题似乎出在预测方面。
    我试图使用时间序列来预测非线性系统的响应(这是一个由 f(t)=cost*sin(omega*t) 驱动的非线性质点弹簧系统)。

    根据您在这篇文章中的说法,我有
    – 2 个样本(在 2 个不同的 omega 值下的输入力)。
    – 每个样本包含 2000 个时间步长。
    – 1 个特征(输入力是我提供给模型的唯一输入)

    => (2,2000,1) 是输入张量。
    我为 LSTM 层提供了 input_shape=(2000,1)。

    此数据集以相当令人满意的方式训练了模型。但是
    1- 我无法使用形状为 (1,2000,1) 的 validation_data。它对应于与训练集不同的 omega 值下的输入力。
    2- 我无法预测系统在不同 omega 输入力下的响应。形状与验证数据相同,但输入力使用了不同的 omega。

    您能帮我理解我哪里出错了吗?

    我在预测代码行上收到以下错误

    tensorflow.python.framework.errors_impl.InvalidArgumentError: Specified a list with shape [2,1] from a tensor with shape [1,1]

    希望您能提供帮助!提前感谢。

    • Jason Brownlee 2020 年 5 月 16 日 上午 6:16 #

      2k 时间步太多了。尝试将其限制在 200-400。

      也许这会有帮助。
      https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input

      • Monica 2020 年 5 月 18 日 上午 4:57 #

        Jason,我已阅读过,并按照您的指示设置了数据维度。我问的是,如果我使用多于 1 个样本的数据进行训练,验证数据和输入数据必须是什么样的。我总是收到关于预测数据期望 [2,1] 维度的错误。我应该训练使用更多样本,并且可以预测其他数据,这些数据以 1 个样本(相同数量的特征、相同数量的时间步长)的形式给出,所以

        训练数据:(2,2000,1)
        验证数据:(1,2000,1)
        预测数据:(1,2000,1)

        我看到 2000 个时间步可能太长了,但即使我减少了时间步,predict() 函数也不接受预测数据的形状。
        谢谢

        • Jason Brownlee 2020 年 5 月 18 日 上午 6:22 #

          不确定您为什么会收到错误——但您的数据形状看起来不对。时间步太多,样本太少。

  45. Shubham Agrawal 2021 年 3 月 5 日 上午 6:11 #

    精彩的文章。我想知道每个样本是如何标记的?假设时间序列心率数据用于预测一个人是静止的 (0) 还是移动的 (1)。心率:[1,2,3,4,5,6,7,8,9,10,11,12]。目标变量:[1,0,1,0,1,1,0,1,0,1,0,0]。假设我们将其分为 4 个时间步长。这将得到 3 个样本:[1,2,3,4]、[5,6,7,8]、[9,10,11,12]。每个样本的目标变量看起来会是什么样子?

    • Jason Brownlee 2021 年 3 月 5 日 上午 8:15 #

      每个输入序列(样本)将有一个输出值或输出序列。

  46. Josh 2021 年 9 月 1 日 下午 8:02 #

    我已阅读评论,但我仍然不明白如何更改每个样本的标签。我知道每个输入样本将有一个输出序列,但是:我们如何选择这个值?

    以前我们有例如 5000 个时间步长,因此每个时间步长有 5000 个标签。现在我们有 25 个样本,每个样本有 200 个时间步长,但是我们如何分割标签以获得 25 个标签对应于 25 个样本?

    先谢谢您了。

  47. David 2023 年 8 月 11 日 下午 7:05 #

    您好 Jason,感谢您的文章。
    我遇到了一个问题,我有一个约 9000 种不同产品的数据集,每种产品都有 5 年(60 个时期)的月度需求。所以一行代表一个产品,而 60 列中的每一列代表其 5 年的需求。
    我想构建一个 LSTM 网络来为每个产品预测 1 年。LSTM 的输入格式需要是什么?我想让我的 LSTM 从所有产品中学习。

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。