将时间序列预测作为监督学习

时间序列预测可以被框定为一个监督学习问题。

这种重新构建时间序列数据的方式,使您可以在问题上使用一系列标准的线性、非线性机器学习算法。

在这篇文章中,您将了解如何将时间序列问题重新构建为用于机器学习的监督学习问题。阅读本文后,您将了解:

  • 什么是监督学习,以及它如何成为所有预测建模机器学习算法的基础。
  • 用于构建时间序列数据集的滑动窗口方法以及如何使用它。
  • 如何将滑动窗口用于多元数据和多步预测。

通过我的新书《使用Python进行时间序列预测启动您的项目,其中包括分步教程和所有示例的Python源代码文件。

让我们开始吧。

Time Series Forecasting as Supervised Learning

将时间序列预测作为监督学习
图片由Jeroen Looyé提供,保留部分权利。

监督机器学习

大多数实际的机器学习都使用监督学习。

监督学习是指您拥有输入变量(X)和输出变量(y),并使用算法学习从输入到输出的映射函数。

目标是很好地近似真实的底层映射,以便当您有新的输入数据(X)时,您可以预测该数据的输出变量(y)。

下面是一个监督学习数据集的虚构示例,其中每一行都是一个观测值,包含一个输入变量(X)和一个要预测的输出变量(y)。

之所以称为监督学习,是因为算法从训练数据集中学习的过程可以被认为是老师监督学习过程。

我们知道正确答案;算法迭代地对训练数据进行预测,并通过更新进行纠正。当算法达到可接受的性能水平时,学习停止。

监督学习问题可以进一步分为回归和分类问题。

  • 分类:分类问题是指输出变量是一个类别,例如“红色”和“蓝色”或“疾病”和“无疾病”。
  • 回归:回归问题是指输出变量是一个实数值,例如“美元”或“重量”。上面的虚构示例就是一个回归问题。

停止以**慢速**学习时间序列预测!

参加我的免费7天电子邮件课程,了解如何入门(附带示例代码)。

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

时间序列数据的滑动窗口

时间序列数据可以被表述为监督学习。

给定一个时间序列数据集的数字序列,我们可以重新构造数据,使其看起来像一个监督学习问题。我们可以通过使用先前的时间步作为输入变量,并将下一个时间步作为输出变量来实现这一点。

让我们用一个例子来具体说明这一点。假设我们有一个时间序列如下:

我们可以通过使用上一个时间步的值来预测下一个时间步的值,将此时间序列数据集重构为监督学习问题。以这种方式重新组织时间序列数据集后,数据将如下所示:

看看上面转换后的数据集,并将其与原始时间序列进行比较。以下是一些观察结果:

  • 我们可以看到,在上一个时间步是输入(X),下一个时间步是监督学习问题中的输出(y)。
  • 我们可以看到观测值之间的顺序得以保留,并且在使用此数据集训练监督模型时必须继续保留。
  • 我们可以看到,我们没有可用于预测序列中第一个值的先前值。我们将删除此行,因为我们无法使用它。
  • 我们还可以看到,我们没有已知要预测序列中最后一个值的下一个值。在训练监督模型时,我们也可能希望删除此值。

使用先前时间步来预测下一个时间步的方法称为滑动窗口方法。简而言之,在某些文献中可能称为窗口方法。在统计学和时间序列分析中,这称为滞后或滞后方法。

先前时间步的数量称为窗口宽度或滞后大小。

这个滑动窗口是我们如何将任何时间序列数据集转化为监督学习问题的基础。从这个简单的例子中,我们可以注意到几点:

  • 我们可以看到这如何将时间序列转化为实值或标签时间序列值的回归或分类监督学习问题。
  • 我们可以看到,一旦以这种方式准备好时间序列数据集,任何标准的线性、非线性机器学习算法都可以应用,只要行的顺序得以保留。
  • 我们可以看到滑动窗口的宽度如何增加以包含更多先前的时步。
  • 我们可以看到滑动窗口方法如何应用于具有多个值的时间序列,即所谓的多变量时间序列。

我们将探讨滑动窗口的一些用法,接下来从将其用于处理每个时间步具有多个观测值的时间序列(称为多变量时间序列)开始。

多变量时间序列数据的滑动窗口

时间序列数据集中给定时间记录的观测值数量很重要。

传统上,使用不同的名称:

  • 单变量时间序列:这类数据集在每个时间点只观测一个变量,例如每小时的温度。上一节的例子就是单变量时间序列数据集。
  • 多变量时间序列:这类数据集在每个时间点观测两个或更多变量。

大多数时间序列分析方法,甚至相关书籍,都专注于单变量数据。这是因为它最容易理解和处理。多变量数据通常更难处理。它更难建模,并且许多经典方法通常表现不佳。

多变量时间序列分析同时考虑多个时间序列。...通常,它比单变量时间序列分析复杂得多

— 第1页,《R和金融应用的多变量时间序列分析》

机器学习在时间序列方面的最佳应用场景是经典方法失效的地方。这可能发生在复杂的单变量时间序列中,由于额外的复杂性,在多变量时间序列中更有可能出现这种情况。

以下是另一个工作示例,以使滑动窗口方法在多变量时间序列中具体化。

假设我们有下面这个虚构的多变量时间序列数据集,每个时间步有两个观测值。我们还假设我们只关心预测measure2

我们可以将此时间序列数据集重新构建为窗口宽度为1的监督学习问题。

这意味着我们将使用measure1measure2的先前时间步值。我们还将提供measure1的下一个时间步值。然后我们将预测measure2的下一个时间步值。

这将为每个训练模式提供3个输入特征和一个要预测的输出值。

我们可以看到,就像上面单变量时间序列示例一样,我们可能需要删除第一行和最后一行才能训练我们的监督学习模型。

这个例子引出了一个问题:如果我们想预测下一个时间步的measure1measure2怎么办?

在这种情况下,滑动窗口方法也可以使用。

使用上面相同的时间序列数据集,我们可以将其表述为监督学习问题,其中我们使用相同的窗口宽度1预测measure1measure2,如下所示。

许多监督学习方法无法在不进行修改的情况下处理多个输出值的预测,但有些方法,例如人工神经网络,则几乎没有问题。

我们可以将预测多个值视为预测一个序列。在这种情况下,我们预测了两个不同的输出变量,但我们可能希望预测一个输出变量的多个时间步长。

这被称为多步预测,将在下一节中介绍。

使用滑动窗口进行多步预测

需要预测的提前时间步数很重要。

同样,根据要预测的时间步数,通常使用不同的问题名称:

  • 一步预测:预测下一个时间步 (t+1)。
  • 多步预测:预测两个或更多未来时间步。

到目前为止我们看过的所有例子都是一步预测。

有多种方法可以将多步预测建模为监督学习问题。我们将在未来的文章中介绍一些这些替代方法。

目前,我们专注于使用滑动窗口方法来构建多步预测。

考虑上面第一个滑动窗口示例中相同的单变量时间序列数据集

我们可以将此时间序列构建为窗口宽度为1的两步预测数据集,用于监督学习,如下所示:

我们可以看到,第一行和最后两行不能用于训练监督模型。

这也是一个很好的例子,说明了输入变量的负担。具体来说,监督模型只有X1可以用来预测y1y2

您的项目需要仔细思考和实验,以找到一个能够产生可接受模型性能的窗口宽度。

进一步阅读

如果您正在寻找更多关于如何将时间序列数据作为机器学习问题来处理的资源,请参阅以下两篇论文:

有关如何实现此功能的Python代码,请参阅以下帖子:

总结

在这篇文章中,你学习了如何将时间序列预测问题重新构建为监督学习问题,以便与机器学习方法一起使用。

具体来说,你学到了:

  • 监督学习是将问题框定为带有输入和输出的观测值集合的最流行机器学习方式。
  • 滑动窗口是将时间序列数据集重构为监督学习问题的方法。
  • 多变量和多步预测时间序列也可以使用滑动窗口方法框定为监督学习。

您对滑动窗口方法或本文有任何疑问吗?
在下面的评论中提出你的问题,我会尽力回答。

想用Python开发时间序列预测吗?

Introduction to Time Series Forecasting With Python

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

...只需几行python代码

在我的新电子书中探索如何实现
Python 时间序列预测入门

它涵盖了**自学教程**和**端到端项目**,主题包括:*数据加载、可视化、建模、算法调优*等等。

最终将时间序列预测带入
您自己的项目

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

查看内容

318 条评论 时间序列预测作为监督学习

  1. Robert 2016年12月6日上午12:32 #

    感谢这篇文章。我理解了转换。现在如何将数据分成训练集和测试集?另外,下一篇文章会介绍一个简单的例子来构建预测模型吗?

    • Jason Brownlee 2016年12月6日上午8:26 #

      好问题,罗伯特,我很快会写一篇关于这个的帖子。

    • Frank Wang 2019年2月19日下午10:15 #

      直接对数据进行回归模型并用该模型预测未来有什么问题?

      • Nick 2019年3月13日上午7:25 #

        您可能会过度拟合您的模型。

      • Emmanuel 2021年5月25日下午2:33 #

        嗨,弗兰克,非常感谢您的有用帖子。希望您能就我的情况给我更精确的解释或建议。我汇总了每周手提箱的销售额,需要预测未来几周的销售额,并且我被要求使用机器学习完成此任务。这是一个单变量时间序列,但我需要将其转换为机器学习问题。到目前为止,我从时间变量中提取了一些预测变量(例如月份、日期、周数等),因为我总是可以为未来的日期重新创建它们。我的问题在于滞后以及如何将其作为预测变量处理。使用您上面关于单变量的插图,并假设您的Y对应我的每周销售额。现在我滞后Y并获得一个带有NA的新预测变量,然后我删除每个预测变量的相关行。结果,周数也下降了。我理解这样做我将使用过去的值来预测当前值,但是我如何为未来或今天的数据重新创建该滞后?例如,在您最初有6行或6个时间戳的情况下,您如何生成第7行?我很高兴能得到您的反馈。

          • Eddie Zhang 2021年9月14日下午8:10 #

            嘿,Jason。

            感谢您提供了这么多有用的文章。您能帮我进行时间序列预测吗?现在,我有两个变量,X和Y。X是时间戳,但其形式是1631500000、1631500050、1631500100…类似500个点。对应的Y是“status_score”,内容是1.000625、-1.040353、-0.742401以及其他分数。
            现在我被要求建立一个模型,并预测一个只包含时间戳的数据集。我认为预测结果应该是与时间戳对应的“status_score”。
            我该怎么办?非常感谢您的反馈。

          • Adrian Tam
            Adrian Tam 2021年9月15日下午10:56 #

            我没看到单独的时间戳有什么有趣的地方。我同意你的看法。

  2. Leo 2016年12月6日下午1:38 #

    机器学习方法不适用于时间序列分析。它们没有考虑到数据值之间存在的这种关系。

    • Jason Brownlee 2016年12月7日上午8:53 #

      有趣的观点,利奥。

      机器学习方法要求明确地向它们公开这种关系,形式是移动平均线、滞后观测值、季节性指标等。就像ARIMA中的线性回归一样。这里并没有很大的飞跃。

      当关系非线性、观测值不独立同分布、残差不服从高斯分布等情况出现时,经典方法(如MA/AR/ARMA/ARIMA及其变体)就会失效。有时问题的复杂性要求我们尝试替代方法。

      最后,还有一些新的方法可以学习序列,比如LSTM循环神经网络。这些方法有可能重新定义一个行业,就像在语音识别和计算机视觉领域所做的那样。

  3. Leo 2016年12月7日下午12:12 #

    机器学习方法要求变量之间没有相关性。这在时间序列中不成立,因为滞后值是相关的。
    此外,还有许多非线性时间序列方法,如GARCH及其变体。

    • Jason Brownlee 2016年12月8日上午8:13 #

      很有道理,谢谢利奥。

      关于相关输入这一点,对于许多统计方法来说是正确的,但对于其他方法,如树模型、基于实例的方法,甚至某些神经网络(CNN和RNN),则不那么正确。

      我认为你说的很对——大多数小型单变量时间序列数据集都可以通过经典统计方法得到满足。也许LSTMs或决策树在滞后变量上可以增加一些东西,也许不能。

      当时间分量数据(如运动预测、手势分类等)变得棘手时,也许机器学习是可行的方法。我需要更好地阐述这个细节。

      • yangsp 2017年3月17日下午8:03 #

        我半个月前试过,但效果不好

    • dirk 2017年1月20日下午9:23 #

      那不是有点夸大其词吗?

      有几家量化对冲基金通过使用机器学习方法和多变量时间序列数据中的相关变量,获得了并且持续获得惊人的回报。

      也许我错过了什么?

    • Jong 2017年7月29日下午5:06 #

      机器学习并不要求变量之间没有相关性……任何回归模型也都不要求。

  4. Leo 2016年12月8日上午10:38 #

    好点子,杰森。我想我需要学习LSTM。

  5. John 2017年1月8日下午4:47 #

    您什么时候发布关于多步预测的内容? 🙂

    • Jason Brownlee 2017年1月9日上午7:48 #

      它们计划在本月晚些时候或下月初发布。

  6. Dehai 2017年1月20日上午9:19 #

    物联网或工业机器传感器生成的数据也是典型的时间序列,通常数量巨大,即工业大数据。
    对于这种类型的时间序列,在分析时会使用许多数字信号处理方法,例如FFT、小波变换、欧几里得距离。
    似乎讨论时间序列机器学习的书籍通常不涵盖这个数字信号处理领域。您怎么看?

    • Jason Brownlee 2017年1月20日上午10:25 #

      我同意德海的说法。

      我们可以将这些方法视为项目过程中的数据准备/数据转换。

      使用FFT和小波等更高级的方法需要DSP知识,这对于希望在数学背景较少的情况下进入机器学习的开发人员来说可能有点过于复杂。

  7. Jay Urbain 2017年1月20日上午9:22 #

    谢谢!

    我曾有一个项目,需要根据事件日志预测设备故障的可能性。效果非常好的是,我根据事件日志创建了一个训练集,其中包含时间目标特征,包括设备是否在接下来的30、60天等时间内发生故障。我还添加了设备过去历史的时间特征,例如不同时间段内的维护频率、测量值的方差等。然后可以使用任何机器学习技术。测试集是从最后20%的样本中创建的。
    — Jay Urbain

    • Jason Brownlee 2017年1月20日上午10:26 #

      非常好,谢谢分享,杰伊!

    • xjackx 2017年2月13日上午10:25 #

      嗨,杰伊,

      我对你参与的预测任务很感兴趣。你有没有博客或者可以通过电子邮件分享更多信息?

    • Sune 2017年10月9日下午11:45 #

      嗨,杰森和杰伊

      我们也在尝试根据温度、湿度、功耗、事件/警报等时间信号预测设备故障。

      如何将5个时间数据信号关联到周期结束时的一个单一的通过/失败结果?

      大多数示例似乎都是关于预测信号本身的,而在我们的案例中,我们可能需要找出信号之间关系的模式。例如,如果耗电量很大,环境温度很低,但温度没有下降,那么压缩机就可能出了问题。

      任何建议都将不胜感激。

      • Jason Brownlee 2017年10月10日上午7:47 #

        也许这个多元预测的例子可以作为一个起点
        https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/

      • Dana 2018年10月16日晚上8:28 #

        嗨,Sune,

        你的项目进展如何?我正在处理一个类似的案例,想看看你最终是如何制定这个问题的。你的输入值最终跨越了多长时间?你在此过程中找到了什么有价值的资源吗?我想到的一种表述是预测选定的度量值,然后将预测分类为失败/未失败。然而,这将严重依赖于前一个模型的准确预测。

  8. Ziad 2017年1月20日下午1:32 #

    Jason,使用多步时间滞后与多元KNN或随机森林是否等同于以类似于核函数的方式转换特征空间?

    我也很想知道SVM如何应用于多元问题。

    感谢这篇帖子。

    • Jason Brownlee 2017年1月21日上午10:23 #

      我想不是Ziad,你有什么具体的想法吗?

  9. Kavitha Devi M K 2017年1月20日下午4:10 #

    在活动预测应用中,活动只能在多个步骤序列(多元时间序列数据)之后才能预测。请建议如何处理此问题以预测活动

    • Jason Brownlee 2017年1月21日上午10:24 #

      不错的问题,Kavitha。抱歉,我没有活动预测的例子。我不想给你不准确的建议。

  10. pankaj 2017年1月20日晚上8:42 #

    如果时间序列中有2级或n级分类,时间序列重组会受到什么影响?例如,在传感器数据的情况下,我们每天都会收到数据,并且在一天内,比如每隔5秒。相关性可能存在于外部级别,即日期级别,但可能不存在于内部级别,即下一个样本(以秒为单位)。
    第1天测量
    下午5点 20
    下午5点5秒 22
    第2天测量
    下午5点 25
    下午5点5秒 27
    等等。

    • Jason Brownlee 2017年1月21日上午10:27 #

      好问题,pankaj。

      我建议将数据重新采样到几个不同的时间尺度,并在每个时间尺度的滞后信号上构建模型,然后集成预测。还可以在每个尺度上基于滞后信号构建更大的模型,以便让你的模型充分利用问题中的时间结构。

  11. Okpako A. Ejaita 2017年1月21日下午6:10 #

    这是一篇很棒的文章。我的问题不完全是关于这个主题的。
    如何在神经网络中捕获每个数据实例的错误并在Java中打印出来,以及如何对捕获的错误进行插值以预测错误。

  12. NGUYEN Quang Anh 2017年1月22日晚上9:15 #

    这太棒了。尽管多步预测有点困扰我。如果我们用特征建立一个数据模型,例如3个连续滞后,那么它表明下一步将以这3个数据的值为基础,例如X(t) = a1.X(t-1) + a2.X(t-2) + a3.X(t-3)。更重要的是,为了预测更远的未来,我们是否扩大了窗口的宽度?在这种情况下,随着特征数量的增加,训练数据的大小也必须增加,对吗?

    • Jason Brownlee 2017年1月23日上午8:39 #

      没错。

      多步预测有两种通用方法:直接法(每个未来时间步长预测一个模型)和递归法(反复使用一步模型,并将预测作为输入)。

  13. Pranab 2017年1月23日下午3:05 #

    好文章。你建议将监督学习用于复杂的时间序列,而不是经典的预测方法。你有什么特定的监督学习方法吗?如果有,你为什么认为它会比基于NN的LSTM表现更好?

    你还在评论中提到,有些机器学习技术不会受到相关输入的不利影响。你能解释一下你的评论吗?

    • Jason Brownlee 2017年1月24日上午10:58 #

      嗨,Pranab,

      没有特定的方法,更多的是将时间序列预测构建为监督学习的方法论,使其可用于线性、非线性机器学习算法和集成方法。当然,这不是一个新想法。

      当然,决策树在处理不相关特征和相关特征时通常是可靠的。事实上,当特征之间存在未知的非线性交互时,接受输入特征中的成对多重共线性通常会带来更好的模型性能。

  14. Hassine Saidane 2017年1月27日上午2:40 #

    你好 Jason,

    这是一个非常有趣的话题。您是否考虑过将一步提前预测作为多步之前的函数?这将表示一个由几个变量组成的输出函数。有趣的问题是,与传统多元函数类比,需要使用多少个变量(回溯步长),以及通过变量选择过程哪些变量最重要。变量选择可以识别哪些时间段影响分析和预测。

    这种方法可以极大地促进使用所有机器学习算法进行时间序列的预测和分析。

    我和一位同事应用了这种方法。关于这项工作的四篇已发表论文可以通过“谷歌我的名字(Hassine Saidane)”找到。

    祝您继续顺利,感谢分享文章。

  15. sam 2017年2月8日上午11:51 #

    嗨,Jason,

    我正在尝试根据收入趋势时间序列预测客户流失

    月1 -> $;月2 -> $ 作为训练数据集。

    如何使用预测算法根据上述训练数据预测客户流失?

    谢谢
    山姆

    • Jason Brownlee 2017年2月9日上午7:21 #

      我鼓励你重新阅读这篇文章,它准确地说明了如何构建你的问题,Sam。

  16. Sam 2017年2月10日上午11:03 #

    感谢您的回复,Jason。我理解了上面的例子。上面的例子似乎是预测Y作为回归值。但我正在尝试预测Y作为分类值(流失=1或未流失=0)

    示例:以下是收入的时间序列,其中1,2,3...是月份,Y告诉我们客户是否流失。Y将只有2个值1或0。

    那么我可以用以下格式作为我的测试数据吗?

    收入1 收入2 收入3 ...Y

    100 50 -25 1

    200 100 300 ..... 0

    感谢您的帮助。

    谢谢
    山姆

  17. Sam 2017年2月11日上午7:16 #

    非常感谢你,Jason,感谢你的迅速回复。你让我高兴了一整天:)

  18. Anthony from Sydney 2017年2月22日下午3:22 #

    尊敬的Jason博士,
    请谈两个话题
    (1) 关于数据裁剪和将模型应用于“现实世界”。我理解裁剪是在第0个和第k个数据点上完成的,以使t和t-1时的数据值之间存在1:1的对应关系。我从之前的帖子中假设你裁剪了(k-10)到第k个数据点,执行了连续的1步提前预测,并根据测试模型和预测模型之间差异的min(所有选定模型的MSE集合)来选择模型。
    (a) 这种做法是为了预测第 (k+1) 个未知值吗?
    (b) 我们能否假设一旦获得更多数据,我们“训练”的模型仍然可以接受?换句话说,如果你收集了另外 x 个数据点,并且想要预测第 (k + x + 1) 个数据点,我们能否假设在 k 个数据点上训练的模型对 k + x 个数据点仍然有效?或者换句话说,你何时“重新训练”模型?

    (2) 关于数据分窗:基于这个博客,数据分窗的目的是找到差异并训练差异数据以找到模型吗?我们如何假设第(k+1)个差异观测值可以从第k个差异观测值预测出来?
    谢谢你,
    来自澳大利亚悉尼的安东尼

    • Jason Brownlee 2017年2月23日上午8:51 #

      嗨,安东尼,

      抱歉,我不明白你说的裁剪是什么意思。也许你可以举个例子?

      通常,我们使用所有可用的历史数据进行一步预测(t+1)或多步预测(t+1,t+2,…,t+n)。这适用于评估模型和新数据可用时。

      窗口化是将单变量时间序列构建为监督学习问题,其中滞后观测作为输入特征。这使我们能够使用传统的监督学习算法来建模问题并进行预测。

      希望这能有所帮助。

      • Anthony from Sydney 2017年2月23日上午10:02 #

        尊敬的Jason博士,
        我将把(1)和(2)重新表述为一个。

        也许我根本不清楚。

        裁剪。我的意思是通过滞后操作,将最早的第0个和最晚的第k个数据点移除,因为它们没有相应的滞后值。
        例如
        数据点值滞后数据点数组引用
        1 ? – 这被裁剪/修剪 0
        2 1 1
        3 2 2
        44 3 3
        5 4 4
        . .
        560 1234 k-1。
        ? X – 这被裁剪/修剪。k

        可用于处理的数据集
        数据点 滞后数据点(基于原始数据的数组引用)
        2 1 1
        3 2 2
        44 3 3
        5 44 4
        . .
        560 1234 k-1

        这是上述数据集,其中第0个和第k个元素已从原始数据中裁剪/修剪。
        我应该说得更清楚些。我道歉。
        我的问题
        (a) 基于“新”的滞后数据集,鉴于第k个数据点不可用,你如何预测第(k+1)个数据集?换句话说,你是否基于第(k-1)个数据点来预测第(k+1)个数据点?

        (b) 也许我遗漏了什么,阅读了关于ARIMA的其他帖子。当数据可能存在MA或AR或其他类型的过程时,我们如何假设下一个数据点的预测是基于前一个数据点?或者换句话说,我们如何假设像本教程/博客中那样进行差分或窗口化将成为我们训练模型的基础?

        (c) 假设你基于原始数据集训练了你的模型。假设你的系统获取了更多数据点,原始训练的模型不会失效吗?比如说你获得了额外的10个或1000个数据点,你是否需要重新训练你的数据,因为原始模型的系数可能不足以预测更大的数据集。

        再次感谢,我希望我表达得更清楚了,
        来自澳大利亚悉尼的安东尼

        • Jason Brownlee 2017年2月24日上午10:08 #

          嗨,安东尼,

          k 是什么?是时间步长 t 吗?我想根据上下文是这样的。

          如果你想预测训练数据集之外的新数据点(t+1),你的模型将使用 t-1、... t-n 作为输入进行预测。

          这适用于所有类型的模型。例如,如果你使用AR,输入将是滞后观测值。如果是MA,输入将是滞后误差序列的自回归。

          如果在模型准备过程中进行了差分,那么对任何新数据都必须进行差分。是否进行差分或季节性调整的决定取决于数据本身以及你对趋势和季节性等时间结构的分析。

          是的,随着新数据的到来,模型需要重新拟合。这并非所有问题的要求,但这是一个好主意。为了模拟这种现实世界的期望,我们使用“步进验证”以相同的方式评估模型,它正是这样做的——每次有新的观测值可用时重新拟合模型,并预测下一个样本外的观测值。

          我希望这有帮助。我的书中,一课一课地涵盖了所有这些。

  19. Anthony from Sydney 2017年2月23日上午10:06 #

    尊敬的Jason博士,再次抱歉,我最初的带空格的数据集示例没有显示整齐。
    在原始数据集和裁剪/修剪/窗口化数据集中,都应该有三列,分别包含数据、滞后1的数据以及基于原始数据集的数组索引。
    我不知道如何在此博客上发布回复时获得漂亮的带制表符的数据
    此致
    悉尼的Anthony

    • Jason Brownlee 2017年2月24日上午10:10 #

      你可以使用 pre HTML 标签,例如:

      • Anthony from Sydney 2017年2月24日上午11:36 #

        [src]https://en.wikipedia.org/wiki/BBCode[/src]
        关于如何在论坛回复中插入BBCode

        [list]
        * 1 ?
        * 2 1
        * 3 2
        * 4 3
        * ? 4
        [/list]
        这是一个在论坛回复中插入HTML代码的实验。
        希望这有效,
        [b] 安东尼 [/b] [i] 来自悉尼 [/i]

  20. Anthony of Sydney 2017年2月26日下午2:06 #

    测试使用被“'”包围的“pre”,插入“this is a test message”,然后是“'”

    希望它能奏效

  21. Nirikshith 2017年3月14日下午2:09 #

    亲爱的 Jason,
    你有没有计划关于多元时间序列预测的博客?我看了你的ARIMA帖子,对我来说是一个很好的起点。
    谢谢,
    #学生 #有抱负的数据分析师

    • Jason Brownlee 2017年3月15日上午8:07 #

      谢谢,Nirikshith。

      是的,我希望很快深入探讨多元时间序列预测。

  22. Bruce Anthony 2017年3月31日下午2:23 #

    Jason,
    我是机器学习的新手。我有一个问题类型,我想知道你是否可以指点我学习正确的领域,这样我就可以学习和应用适当的模型/技术。我有一组时间序列数据(行),由一个过程中的许多不同测量值(列)组成。想象一下数百个传感器,每秒测量一次。我有一种预感,列之间存在时间上的偏移关系。比如说,在时间 t1 时,第1列发生了某事,10秒后,第2列发生了变化。我的愿望是找到具有这种时间关系的列,以及一列中发生变化与相关列中发生变化之间的时间间隔。我的目标是训练一个模型,根据早期时间变量的变化来指示预测,然后再改变后期时间变量。你的文章有助于理解我如何尝试训练一个模型来预测单列中的数据,但如何训练或挖掘列之间的关系呢?

    如果你能指点我应该重点学习机器学习的哪些部分,我将不胜感激。

    谢谢
    布鲁斯

    • Jason Brownlee 2017年4月1日上午5:51 #

      嗨,布鲁斯,时间序列分析是一个很大的领域。我建议找一本好的实用书籍。

      通常,考虑寻找特定滞后与你的输出变量之间的相关性(例如,相关图)。

      希望这些能作为一个开始有所帮助。

  23. Bruce Anthony 2017年4月1日下午2:11 #

    Jason,
    谢谢,你有什么好的入门书籍推荐吗?
    布鲁斯

  24. HP 2017年6月24日上午5:33 #

    嗨,Jason,

    非常好的文章,只是有一个问题,是否有针对区域/分支的预测技术。

  25. Rishi 2017年7月31日下午5:28 #

    嗨,Jason,

    感谢这篇文章。我有两个问题

    1. 有没有办法完全避免删除行?如果我们创建滞后 (t-2), (t-3) 等,那么我们将不得不删除更多的行。我见过 Kaggle 大神使用 XGB 并带有 missing = NA 选项来处理缺失数据,但不确定其他模型能怎么做。

    2. 您能否就数据可能不是独立同分布(i.i.d. P(Y|X))(可能相同但 y|x 对行可能不独立)的事实进行一些阐述。我认为大多数机器学习模型在这种情况下都会失败。我的想法对吗?此外,有没有办法检查 iid 假设?

    此致,
    里希

    • Jason Brownlee 2017年8月1日上午7:54 #

      谢谢,Rishi。

      是的,你可以将这些值标记为 NaN 值,有些算法可以支持这种做法,或者将它们设置为 0.0 并进行掩码处理。比如 XGBoost 或神经网络。

      说得好。经典方法不会失败,但可能会比针对依赖性进行调整的方法表现更差。我仍然建议对一套方法进行抽样检查作为基线。ARIMA 已经对依赖性进行了修正(据我所知)。

      • Rishi 2017年8月1日下午2:06 #

        感谢您的回复,Jason。我一直在阅读回归中的自相关修正(使用Durbin Watson检测),但这适用于连续数据——Cochrane Orcutt。通常有没有办法进行修正?我认为我们现实世界中处理的大多数问题都是时间序列,例如客户流失等。我觉得时间序列回归也是我们(不知不觉地)做的,例如使用X,如上个月的业绩等。请推荐一些资料。

        此致,
        里沙布

        • Jason Brownlee 2017年8月2日上午7:44 #

          抱歉,我不确定你在问什么,你能重新陈述一下你的问题吗,Rishi?

  26. Rishi 2017年8月2日下午4:06 #

    假设我们选择一个现实案例研究,预测客户本月的零售支出。在这种情况下,一个人本月的消费金额可能取决于他上个月是否有大额消费。显然,我们可以将滞后的y作为模型中的X来捕获信息,但你认为数据会是独立同分布的吗?残差分析肯定会提供一些见解(Durbin Watson也应该有助于检测)。

    还有像客户流失这样的问题,我总是使用这种方法:固定一个时间线,比如说1月1日,目标是1月至2月流失的客户,而X是过去的信息(所有客户在过去2个月的消费,即12月和11月)。使用的变量类似过去X个月的消费等。这种方法对于时间序列分类是否正确?

    抱歉,帖子很长,只是想澄清我的想法。

    • Jason Brownlee 2017年8月3日上午6:46 #

      是的,我鼓励你进行实证测试,而不是过于纠缠于分析。

      你无法通过分析为特定的预测问题选择最佳算法。

  27. Varun 2017年8月9日下午5:48 #

    嗨,Jason,

    精彩的帖子!

    我有一个疑问。我正在处理一个现实生活中的问题,预测零售店3天的销售额。
    我正在考虑应用混合模型(ARIMAX+神经网络),即使用auto.arima的回归量进行动态回归,然后对残差拟合神经网络模型。最终的预测将是y = L+N,其中L = ARIMAX的预测,N = NNETAR的残差预测。您认为这种方法如何?
    另外,我需要您对应用交叉验证技术的意见。我拥有从2014年1月到2017年6月的每日销售数据。使用交叉验证技术(添加月份/季度)来调整参数是否值得?或者我应该只训练一次模型(比如说从2014年1月到2016年12月),并在其余数据上测量准确性?(测试和验证)?鉴于我只需要3天的预测,最佳方法可能是什么?

  28. Muthu Kalyan 2017年9月22日上午3:38 #

    Jason

    关于时间序列预测的优秀文章。我对统计传统机器学习技术及其应用有相当的了解。我有几个关于将NN/LSTM应用于时间序列预测的问题。

    1. 我们需要多大程度上担心过拟合?

    2. 有没有集成技术可以将不同的模型应用于不同的时间范围?

    • Jason Brownlee 2017年9月22日上午5:39 #

      在应用机器学习中,过拟合始终是一个问题。

      我不确定我是否理解。如果你有不同的时间范围,那么你需要不同的模型来进行这些预测。也许你可以将一个模型的输出作为另一个模型的输入,但我没有见过结构化的方法来做到这一点——我鼓励你进行实验。

    • Hanan Shteingart 2019年9月23日上午7:13 #

      你可以做编码器-解码器或多任务学习

  29. Harshit 2017年10月24日下午6:28 #

    嗨,Jason,

    感谢您分享的这篇精彩而有用的文章。我正在尝试实现一篇基于预测云资源使用的研究论文。需要使用滑动窗口技术进行数据预处理,并将数据作为输入馈送给LSTM。例如,在预测特定虚拟机的CPU使用率时,我每隔1分钟就有以下格式的时间序列数据

    时间戳 CPU使用率
    1. t 值1
    2. t+1 值2
    3. t+2 值3
    .
    .
    .
    .

    等等,同样适用于其他参数,如RAM、DISK等。

    如果您使用LSTM,请指导我训练和测试集的格式应该是什么。

    提前感谢。

  30. Jeff 2017年10月25日上午8:59 #

    嗨,Jason,

    我想知道在多元分析中使用两个窗口/滞后是否常见/良好做法?假设y与x1上的t-1相关,但与x2上的t-5相关。这可能吗?

    谢谢,

    杰夫

    • Jason Brownlee 2017年10月25日下午4:00 #

      是的,通常所有特征都提供固定窗口的滞后观测值。零系数可以用来消除不增加价值的特征。

  31. Rishu 2017年10月26日晚上11:17 #

    嗨Jason,我正在处理多元时间序列数据进行异常检测,您能推荐一些算法吗?我尝试过孤立森林和ARIMA,但ARIMA只适用于单个变量。
    请帮助

  32. Riveral 2017年11月21日上午5:44 #

    你好 Jason,

    我读过您的文章,我假设如您所说,预测时间序列可能会与某些算法(如您所说的LSTM)一起使用,但是,我正在分析一个多元回归,其中随机森林根据属性向量预测最终输出值,但随机森林的性质是它不依赖于时间,所以我相信不需要这个时间窗口?

    • Jason Brownlee 2017年11月22日上午10:44 #

      然而,ML滞后观测值可以作为输入变量,有时无状态(时间无关)方法可以取得令人印象深刻的结果。在您的问题上尝试一下看看。

  33. Shani 2017年12月8日晚上7:57 #

    你好,
    谢谢你写了一篇很棒的帖子!我很喜欢读它:)

    这是我第一次尝试解决时间序列问题,所以您的解释真的缓解了“从何开始”的问题。

    我有一个问题,我正在尝试找到以下之间的相关性
    1. 每3毫秒9种面部表情分数(给定:喜悦0.9,快乐0.77,愤怒0.5等)
    2. 参与者行动 – 移动、旋转、播放音乐、停止音乐(带有时间戳的封闭选项列表)
    3. 好奇心分数 – 通过各种方式(问卷、行为测量)测量 – 每位参与者一个分数。

    研究问题:用户的面部表情与他们的行为和好奇心之间是否存在相关性?

    您能建议一种处理这种数据的方法吗?
    您能推荐一篇关于它的帖子或文章给我吗?

    任何想法/建议/解决方案都会有帮助:)

    非常感谢,
    Shani

  34. David 2018年1月11日上午1:11 #

    太有用了!
    我使用了你的技术(多元时间序列)来准备数据。
    在运行回归模型后,我获得了惊人的日工业用电量预测精度。我发誓能源需求真的非常不稳定!

    谢谢杰森!

  35. Andrea 2018年1月15日晚上11:46 #

    你好,我不明白以下陈述

    “我们可以看到观测值之间的顺序得以保留,并且在使用此数据集训练监督模型时必须继续保留。”
    “我们可以看到,一旦时间序列数据集以这种方式准备好,任何标准的线性和非线性机器学习算法都可以应用,只要行的顺序得以保留。”

    为什么在训练数据时必须保留行的顺序?一旦您在给定行中包含了相关的滞后,您不是已经将时间序列数据转换为横截面数据了吗?

    谢谢你,
    Andrea

    • Jason Brownlee 2018年1月16日上午7:36 #

      不,我们正在将时间结构作为输入公开。

      • Antonio 2018年4月19日上午6:16 #

        我不明白Andrea的相同声明,我还有一个问题。

        1) 为什么在训练数据时必须保留实例(行)的顺序?
        2) 这是否意味着我们不能对准备好的数据集执行k折交叉验证?

        谢谢。

        • Jason Brownlee 2018年4月19日上午6:41 #

          在时间序列中,观测值之间的顺序很重要,我们希望在模型中利用这一点。这也是一个约束,例如,我们不能使用未来的观测值来预测未来。

          正确,我们不能执行k折交叉验证。我们可以改用步进式验证。
          https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/

          • Antonio 2018年4月20日上午1:04 #

            感谢您的耐心,但我有一个具体问题。我有一个单变量时间序列,我想训练一个支持向量机(回归)来预测提前一步。假设我们有序列:1, 2, 3, 4, 5, 6, 7, 8, 9。
            如您所建议,我创建了以下表示以执行监督学习

            1 2 3 | 4
            2 3 4 | 5
            3 4 5 | 6
            4 5 6 | 7
            5 6 7 | 8
            6 7 8 | 9

            其中最后一列是目标。现在我想训练一个支持向量机,我必须选择超参数,例如C和最佳输入特征数量,所以我需要k折交叉验证。我不明白您所说的训练期间必须保留实例(上述数据集的单行)顺序的观点,因此我们无法创建随机样本作为k折交叉验证的折叠。通常,如果我们选择数据集并使用反向或随机顺序的实例(第一个实例是向量6, 7, 8,目标为9,第二个向量是5, 6, 7,目标为8,依此类推)训练支持向量机,我们必须获得相同的模型。
            我发现了一篇文章,其中作者使用SVM和ANN进行时间序列预测问题,为了实现监督学习,他们根据您的想法转换时间序列,但也进行k折交叉验证(随机样本)以选择最佳超参数。您如何看待这篇文章(第7页)?http://docsdrive.com/pdfs/ansinet/jas/2010/950-958.pdf

            我理解如果我们使用统计模型(ARIMA,指数平滑等),我们不能对原始时间序列进行k折交叉验证,所以我们使用步进式验证,我接受这一点。但是,对于SVM和ANN等通用算法,如果我们将时间序列数据转换为用于监督学习的数据框,其中包含输入变量(特征)和输出变量(目标),我们可以将其用作回归问题的“正常”数据集,其中训练顺序不重要,因此我们可以随机拆分进行训练和测试。

            谢谢你的支持!

          • Jason Brownlee 2018年4月20日上午5:56 #

            是的,这是一个很好的观点。

            如果模型没有状态(例如,不是LSTM),那么它只处理输入/输出对。在这种情况下,使用k折交叉验证可能是可行的。甚至可能是首选。

            只要训练/测试集的准备方式能够保留观测值随时间变化的顺序,这一点就成立。例如,模型在训练期间不会学习测试集。

  36. Mónica Gutierrez 2018年2月2日上午8:25 #

    嗨,Jason,

    非常感谢您的贡献。您的贡献极大地帮助我理解了如何将两个强大的工具结合使用。但我有一个问题。我有一系列数据显示出季节性。使用这种技术会不会有问题,或者我应该先应用SARIMA模型再应用您的建议?

    谢谢!

  37. Matt 2018年3月26日下午12:28 #

    嗨,Jason!关于我建模问题的方式,我有三个问题。

    前言

    我正在尝试预测一家公司不同产品的需求。我有订单注册的日期、产品价格、订单大小、客户ID等等,以及过去5年或更长时间的每个订单的信息。

    例子

    这是一个我写过的过于简化的例子,以使其更清晰

    日期 | 价格 | 大小
    1 | 80 | 3
    2 | 85 | 10
    3 | 90 | 5
    4 | 100 | 8
    5 | 110 | 10
    6 | 100 | 12
    7 | 90 | 1 <-- t=7时尺寸较小,这可能导致t=10时增加
    8 | 100 | 21
    9 | 95 | 18
    10 | 90 | 50 <-- 增加
    11 | 100 | 25
    12 | 100 | 20
    13 | 110 | 1 <-- t=13时尺寸较小,这可能导致t=14时增加
    14 | 110 | 60
    15 | 110 | 27

    问题 1

    我首先尝试了回归,但很难知道它的表现如何,模型很容易预测 t+1 的值等于 t 的值加上/减去一个随机数,图表无论如何都会看起来相当不错,事实上,我可以将 t+1 的值近似为简单的移动平均线,这在大多数情况下都有效,除了我试图检测的快速增长期间。在这种问题中,您如何评估回归模型的性能?

    问题 2

    我还尝试将其建模为分类问题,这就是我陷入困境的地方。我决定使用两个标签:增加和减少。您如何决定使用的窗口大小?换句话说,如果我在 t 时看到快速增加,我是否应该将 t-1 中的样本标记为“增加”?我不这么认为,也许这种快速增加的线索在 t-2 或 t-10 中。

    我担心无论我选择什么窗口大小,我都会强迫网络在可能没有任何相关性可看的地方寻找我的输入和标签之间的相关性。也许有时标签应该在 t-1 中,其他时候在 t-10、t-9、t-8、…、t-1 中,谁知道呢。

    问题 3

    价格可能会因通货膨胀和其他因素而变化,所以同一种产品一年前可能价格为30美元,明年为200美元,这没关系。如果我按照上面描述的训练模型,我不应该做些什么来让所有价格相互比较吗?

    理想情况下,在训练模型后,我希望它能够在当时的价格水平下给出良好的预测,特别是由于测试数据集包含来自不同时期的样本!如果我使用不同产品的数据训练模型,情况会更糟,因为在同一时期内,我将有两种产品,价格分别为100美元和1000美元,或者需求看起来完全不同。我感觉我应该以某种方式相对化这些值。

    非常感谢您!

    • Jason Brownlee 2018年3月26日下午2:33 #

      您必须为您的问题选择一种评估预测的方法。它必须在技术上和对利益相关者来说都有意义。

      找出利益相关者对预测的重视程度。他们可能会说最小误差。在这种情况下,您可以使用预测的RMSE或MAE来估计和呈现模型的技能。

      从简单的开始,如持久性和移动平均。如果机器学习方法不能比这些做得更好,那么它就没有技巧,您可以继续前进。更多信息请参阅此处
      https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/

      我鼓励您探索尽可能多的问题框架。将问题框架为分类问题是一个巧妙的想法。看看您能将其推到多远。如何最好地框架数据或设置您情况下的窗口大小?没有人知道,设计实验并发现答案。

      也许可以查看ACF和PACF图,以了解可以用来帮助设计窗口大小的显著相关性。更多信息请参阅此处
      https://machinelearning.org.cn/gentle-introduction-autocorrelation-partial-autocorrelation/

      通货膨胀影响很小。然而,您可能需要在建模之前校正数据。例如,将所有美元转换为2018年的美元或类似物。

      此外,考虑按产品、按产品组、按所有产品等进行建模。发挥创造力,看看什么有效。没有正确答案,只有在您可用的时间和资源下,您在问题上能发现的最佳结果。

      这算是一个开始的帮助吗?

      • Matt 2018年3月26日下午4:37 #

        感谢您的回答和及时回复。您提到的一些事情我不太确定,请允许我问一些细节。

        > 找出利益相关者对预测的重视程度。

        他们希望在需求高峰出现之前进行预测,但高峰只偶尔出现,因此通常如果使用移动平均线,误差(RMSE或MAE)会很低,但这种简单的模型当然也会错过所有高峰。

        我猜这就是网络对回归所做的事情。也许我可以使用一个损失函数来非常严厉地惩罚趋势上的差异(它预测需求会上涨而实际上却下跌,无论具体值是多少)。

        > 没人知道,设计实验并发现答案。

        我主张,对于这个问题,应该有一种我不知道的更可靠的方法。在我的例子中,任何窗口大小都不能使标签正确。我是这样——作为一个人——标记它的,假设小的需求量意味着在不久的将来会有大的需求量。

        日期 | 价格 | 大小 | 标签
        1 | 80 | 3 | 正常
        2 | 85 | 10 | 正常
        3 | 90 | 5 | 正常
        4 | 100 | 8 | 正常
        5 | 110 | 10 | 正常
        6 | 100 | 12 | 正常
        7 | 90 | 1 | 增加(窗口大小 3)
        8 | 100 | 20 | 正常
        9 | 95 | 18 | 正常
        10 | 90 | 50 | 减少(窗口大小 2)
        11 | 100 | 25 | 正常
        12 | 110 | 1 | 增加(窗口大小 2)
        13 | 100 | 20 | 正常
        14 | 110 | 60 | 减少(窗口大小 1)
        15 | 110 | 27 | –

        如您所见,我不得不使用不同的窗口大小。问题在于,在这个愚蠢的例子中,标签非常明显,但实际上并非如此,所以我认为我可以做些什么。

        一个想法是在快速增长之前的n个样本标记为“增长”,但这样网络会查看例如t=8和t=9,并试图从中找到某种模式,而实际上根本没有模式。得分将是随机的,并且性能(如精确率/召回率)将难以解读!

        有道理吗?不知道如何解决这个问题。

        > 您可能需要先对数据进行校正,然后再进行建模

        关于在同一个数据集中添加多个产品(或不同时期的同一产品)。我不确定行业中是否使用,但我曾考虑过将某个值减去前N个值的移动平均值,这样如果价格或需求随时间自然增长,我将只看到它与之前值的差异。

        我无法想到将不同价格范围的产品放入同一数据集的任何其他方法。

        • Jason Brownlee 2018年3月27日上午6:31 #

          有意思。

          Matt,这应该是一个辛苦的工作,这就是工作:弄清楚如何构建问题以及什么最有效。运行代码是容易的部分。

          根据这些信息,我建议您考虑将问题构建为异常检测,也许是一个分类问题,您预测在下一个时间间隔是否会发生高峰。这可能让您捕捉到高峰的前兆,并简化高峰,这样您就不必预测大小,只需预测发生(更简单)。如果这在某种程度上奏效,您以后可以看看是否也能预测大小。

          此外,有些问题是不可预测的。或者在现有数据/资源下不可预测。请记住这一点。

          告诉我进展如何。

  38. Matt 2018年3月26日下午5:43 #

    再一想,我觉得这个问题类似于预测股市的走势。

    我的样本标记将等同于在股票价格飙升之前标记K线。在这种情况下,我猜“飙升”标签的正确位置应该在它发生之前,而不是任意一段时间之前(比方说15分钟)。

    即使飙升的催化剂不是我标记为“飙升”的K线,LSTM也应该能够学习正确的依赖关系。对吗?

    • Jason Brownlee 2018年3月27日上午6:33 #

      LSTM在自回归方面表现不佳,而且我没有深入研究您的数据。我无法确定任何方法都会奏效。您是您问题的专家,您必须自己发现这些答案。

      LSTM__可能__在分类一系列观测值并指示事件是否即将发生方面很有用。不过,这需要大量的先前示例。

  39. Siddu 2018年3月27日晚上9:10 #

    你好 Jason,
    有没有办法使用 LSTM 预测状态方差?
    先谢谢您了。

  40. Akii 2018年4月11日晚上11:00 #

    嗨,Jason,
    很棒的文章。
    我想预测未来6个月人力资源分析中候选人的离职率(百分比)。影响因素包括入职日期、年龄、性别、加班、通勤时间、去年奖励、当前服务年限等。现在我想问一下

    1) 这是一个时间序列问题还是一个分类问题。

    如果我进行分类,那么如何进行未来几个月的离职率预测,如果我进行时间序列分析,那么如何将其他因素考虑在内。请指教。

    • Jason Brownlee 2018年4月12日上午8:44 #

      您可以将其构架为序列预测或不构架。我建议探索这两种方法,看看哪种最适合您的具体数据。

  41. Akii 2018年4月16日上午5:44 #

    Jason,谢谢你的回复,但主要问题是如何连续预测未来第1、第2和第3个月的离职率,因为我需要预测未来3个月的离职率。您能指导我一下吗?我有很多独立变量,比如入职日期、离职日期、性别、工资、加班等。

    这是否意味着如果我有过去3个月的数据,那么预测是针对第4个月的。现在要考虑第5个月,我需要合并过去3个月 + 未来1个月的数据,以便预测第5个月吗?

    我查阅了很多博客,但没有明确提到这一点。我认为这也会帮助其他人。

  42. Dave Bird 2018年4月22日上午9:26 #

    你好 Jason,
    我很喜欢您的博客和两本关于时间序列的电子书。我一直在尝试用一个分配了look_back值的LSTM进行训练。在训练和测试之后,绘制的结果在最终训练结果和第一个测试结果之间有一个等于look_back间隔的间隙。有没有办法使用train/test size split指令来强制训练数据集和测试数据集之间重叠?我想看到测试数据的前几个结果,即使它会使网络暴露于以前训练过的数据(至少是look_back范围的一部分)。我可以为训练和测试准备单独的.csv文件,但我想知道是否有更简单的方法可以实现这一点。谢谢

  43. Daniel 2018年5月10日上午3:42 #

    滑动窗口方法生成的时间序列数据样本通常不能被认为是独立同分布(i.i.d.)随机变量,因此将时间序列数据转换为标准监督学习分类器的训练数据的策略似乎值得怀疑。至少有另一位在上面的另一个评论中提到了这一点(但表述略有不同)。

    • Jason Brownlee 2018年5月10日上午6:36 #

      它们不会是独立同分布的,许多监督学习方法不直接做出这个假设。

      此外,这种方法对某些问题可以证明非常有效。

      • Siraj 2018年9月15日上午1:52 #

        但你难道不认为这些假设必须得到尊重吗?此外,我们这里处理的是数值算法,它们最终会给我们一些数字,但问题是,这些数字是否正确?另外,你能否阐明这些方法在哪类问题上有效?谢谢。

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

          不。我会尊重规则,但如果这意味着我能获得更好的预测性能,我就会打破所有规则。

          在预测建模中,模型性能比“正确性”更重要。我们不是试图理解领域,而是试图预测它。理解是另一个称为“分析”的问题。

  44. NAY 2018年6月5日上午2:47 #

    你好 Jason,

    我发现您在https://machinelearning.org.cn/time-series-forecasting-supervised-learning/https://machinelearning.org.cn/convert-time-series-supervised-learning-problem-python/上的文章非常棒!这是我第一次看到如此详细和简洁地讨论滞后值的文章。

    然而,在阅读了您在这里的文章 -> https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/ 后,我有些困惑。

    希望我的问题不会太打扰您,因为我是这个领域的新手。尽管这看起来微不足道,但我已经被这个问题困扰了很长时间。

    你看,我正在对我的单变量时间序列数据集使用滑动窗口方法,它将被输入到前馈人工神经网络进行预测。

    问题在于,在使用ANN时,我们需要将数据分成训练集和测试集。所以,我想知道我应该先将数据重构为监督学习问题,然后再将数据分成训练集和测试集,还是应该先拆分数据,然后再分别在训练数据和测试数据上使用滑动窗口?您在您的另一篇文章中提到了“尊重观测值的时间顺序”,但我不太明白这句话的含义。

    希望您能为我解答这个问题。您的帮助不胜感激。提前谢谢您!

    • Jason Brownlee 2018年6月5日上午6:42 #

      谢谢。

      是的,将数据结构化为一个监督学习问题,然后将其分成训练/测试集。

      这有帮助吗?还有其他困惑吗?

  45. Himanshu 2018年6月13日晚上10:41 #

    嗨,Jason博士,

    感谢这篇精彩的文章。

    我想知道是否有基于独立变量进行预测的算法。
    我有12个月的数据,包含30个特征,我想预测未来3-6个月(因变量),但我没有未来的独立变量,所以我无法使用传统预测技术,如多元预测模型。

  46. Alessandro Surace 2018年6月16日上午1:14 #

    哇哦,谢谢Jason和所有社区成员。我从帖子和所有问题/答案中学到了很多!我真的很感激。

    我完全是一个新手,我正在处理一个容量规划问题。基本上,我需要创建一个ML/AI系统,根据以前的数据预测白天需要运行多少计算实例,以应对所有传入的请求。由于实例需要一些时间才能准备就绪,我无法依赖实时自动扩缩。

    这个问题肯定是多变量的,因为在这个游戏中我有多个区域(3个),容量规划应该考虑到一个区域可能完全失效,而其他区域将管理增加的流量。
    在我的想法中,特征将是
    – QPS(每秒查询数)x 区域
    – 全球总QPS
    – 星期几
    – 一年中的某一天

    预测将是我应该管理多少QPS来处理所有传入的流量。在我有了QPS之后,我就可以知道需要多少个实例。
    我认为时间序列预测会帮助我。您能给我一些关于如何解决这个问题的提示或建议吗?

    我还有一个担忧是如何将先前的分析知识转移到下一个分析中,而无需从头开始处理所有数据。想象一下,我每小时运行模型,我需要进行多步(2-3步)预测,并且我已经有几年的历史数据,如果可能的话,我想避免在每次运行时都从头开始处理所有数据。

    谢谢
    Alessandro

    • Jason Brownlee 2018年6月16日上午7:29 #

      听起来是个很棒的问题。我建议从一个简单的机器学习方法开始,例如将其框定为监督学习问题,并测试sklearn中的大量方法。

      我目前正在撰写大量关于此主题的教程。它们应该很快就会上线。

  47. Alessandro Surace 2018年6月18日 上午1:29 #

    嗨 Jason,
    你能分享你心目中的教程标题吗?这样我就可以去看看了。
    谢谢

  48. JamesJohnson 2018年7月24日 下午9:09 #

    嗨,Jason,

    我有一个问题想请教你。假设时间序列数据中的属性之间存在相关性,那么在选择要应用的算法时是否有任何限制?

    如果时间序列数据中存在缺失值,你推荐什么解决方案?为什么?

  49. sushi 2018年7月25日 上午2:56 #

    嗨,Jason,
    假设我们有多元时间序列数据,但数据量很小,你能为以下问题推荐一个半监督深度学习模型吗?
    1) 回归问题
    2) 分类问题

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

      或许可以尝试使用在更多时间序列数据上拟合的模型进行迁移学习?

  50. Deepak Jaiswal 2018年9月15日 上午1:34 #

    嗨 Jason

    任何回归模型都需要样本点彼此独立。但由于自相关性,这似乎不可能。因为时间点 t 的值取决于之前的值。你如何解释这种依赖性?之前有人问过类似的问题,但我没有真正理解。你能再解释一下吗?

  51. MAK 2018年10月18日 上午6:27 #

    你好,杰森,
    很棒的文章,我有一些问题。
    我仍然不明白如何通过 SVM 预测多元时间序列。
    在你的例子中

    X1, X2, y1, y2
    ?, ?, 0.2, 88
    0.2, 88, 0.5, 89
    0.5, 89, 0.7, 87
    0.7, 87, 0.4, 88
    0.4, 88, 1.0, 90

    如何预测 y1 和 y2?SVM 只能预测一个值。

    2. 在以下示例中,我认为输入特征的数量需要是 4,因为你有 2 个原始特征,并且每个特征都预测一个步长,所以 2*2=4
    X1, X2, X3, y
    ?, ?, 0.2 , 88
    0.2, 88, 0.5, 89
    0.5, 89, 0.7, 87
    0.7, 87, 0.4, 88
    0.4, 88, 1.0, 90
    1.0, 90, ?, ?

    3. 在这种方法中,模型是否只能为 N 个样本序列创建连接?

  52. Cherry 2018年10月23日 上午2:24 #

    亲爱的 Jason 先生,
    感谢您的有用分享。
    如果我想使用滑动窗口方法将时间序列数据转换为回归数据。
    x1 x2 ... xm
    x2 x3 ... xm+1
    .
    .
    .
    xN-m xN-m+1... xN-1

    那么,我只使用一个窗口,并且窗口大小是 xN-m 对吗?
    这种方法叫做滑动窗口还是仅仅是窗口方法?

    • Jason Brownlee 2018年10月23日 上午6:29 #

      上面的教程确实描述了一种带有重叠的滑动窗口方法。

  53. Michael 2018年11月8日 下午11:39 #

    这是我见过的关于为什么要使用滞后变量的最佳解释。
    但是,在包含多少个先前值方面,你会在哪里划清界限呢?包含许多滞后变量有助于对季节性进行建模吗?季节性为预测值设定了一个客观的范围,但我不清楚监督模型如何应用甚至发现季节性,因为它不能从单个观测中得出。

  54. Rajesh 2018年11月15日 上午7:22 #

    嗨,Jason,

    非常棒的文章,向机器学习迈进。

    我们有一个玩具公司的销量预测问题。您能帮我指出关于如何开始使用机器学习预测零售环境中的销量或销售额的具体建议吗?

  55. Sus 2018年11月19日 上午4:25 #

    嗨,Jason,

    感谢您的精彩教程。

    我有以下时间序列预测问题。我想预测 t+1 时刻 var1 的值,给定过去 3 个时间步长 (t,t-1,t-2) 的数据,数据如下所示:

    var1 var2 vark

    传感器 1 (上午8:00) ...
    传感器 1 (上午9:00) ...
    传感器 1 (上午10:00) ...

    传感器 2 (上午8:00) ...
    传感器 2 (上午9:00) ...
    传感器 2 (上午10:00) ...

    传感器 k (上午8:00) ...
    传感器 k (上午9:00) ...
    传感器 k (上午10:00) ... ...。

    如果我通过为 (t,t-1,t-2) 创建滞后特征将此问题重新构架为监督学习问题,则生成的 DataFrame 将类似于:

    var1-t var2-t vark-t var1-t-1 var2-t-1 varkt-1
    var1-t-2 var2-t-2 vark-t-2 ->> var1-t+1 var2-t+1 vark-t+1

    传感器 1
    传感器 1
    传感器 1

    传感器 2
    传感器 2 ...
    传感器 2 ...

    传感器 k ...
    传感器 k ...
    传感器 k ... ....

    我清楚如何解决来自一个传感器的数据问题(使用您的教程中显示的信息)。但是,如果涉及多个传感器:

    – 您会建议每个传感器一个模型,还是使用来自所有传感器的数据训练一个模型(假设它们行为相似)?

    – 如果对所有传感器使用一个模型,我如何将所有
    传感器的数据放在一起训练模型?我应该为每个传感器创建滞后特征并
    将它们连接为行(如前所示),还是作为一组新的特征(列)?

    附注:我认为这个问题与此处描述的类似。
    https://machinelearning.org.cn/how-to-develop-machine-learning-models-for-multivariate-multi-step-air-pollution-time-series-forecasting/

    提前感谢!

  56. Sus 2018年11月19日 上午5:08 #

    关于我之前的帖子,另一种选择是数据集中的每一行可以是完整的序列。

    var 1(t) var2(t) var3(t) var 1(t-1) var2(t-1) var3(t-1)
    var 1(t-2) var2(t-2) var3(t-2)…..var 1(t-n) var2(t-n) var3(t-n) ->>
    var 1(t+1) var2(t+1) var3(t+1)

    传感器 1
    传感器 2

    哪种方法更好?网站上是否有您实现过类似情况的教程?如果能看到针对这种需要多个站点、产品等场景修改过的 series_to_supervised 函数,那就太好了。

    提前感谢!

    • Jason Brownlee 2018年11月19日 上午6:49 #

      使用原型和真实结果来_发现_什么最适合你的特定问题。

  57. Aniruddh 2018年12月17日 上午6:10 #

    你好 Jason,

    在使用滑动窗口方法后,我们可以在数据上使用经典的(皮尔逊)相关矩阵吗?此外,即使我们将序列问题转换为监督学习问题,我们是否仍应使用步行前向验证而不是交叉验证?

  58. Sahil 2018年12月21日 下午10:08 #

    感谢这篇帖子。
    假设我有一个单变量时间序列数据,进行多步预测(例如 30 步)的最佳方法是什么?

  59. Madusha Amarasinghe 2018年12月24日 上午12:18 #

    我想用 Python 中的 SVR 预测未来五天的股票价值。请问您能给我推荐一种方法吗?

  60. khoabd 2019年1月6日 下午10:29 #

    嗨,Jason,

    很棒的教程!

    我实际上正在将时间序列数据集转换为多分类监督机器学习问题。
    每个类别由不同的时间序列表示。不同的类别具有不同的时间序列长度。
    我在选择最适合或正确的滞后观测或滑动窗口方面遇到问题,以便适用于不同的类别。
    对于第一个类别,滞后观测介于 10-30 年之间,对于第二个类别,滑动窗口大约为 100 年,对于第三个类别,则小于 10 小时。
    我不知道该如何处理这个问题,我应该单独训练每个类别,还是应该选择一个适用于所有三个类别的独特滑动窗口,或者
    解决这个问题的最佳方法是什么?或者我应该尝试其他时间序列多分类方法,例如动态时间规整或形状变换或隐马尔可夫方法...?

    非常感谢您的建议和帮助!

    • Jason Brownlee 2019年1月7日 上午6:34 #

      我建议测试不同大小的窗口和历史输入,以发现最适合您的数据和模型的方法。

  61. Nandy 2019年1月15日 下午6:29 #

    你好 Jason,

    很棒的帖子。请就我的疑问提供您的意见。我需要根据数据(日期和当天收到的火警数量)预测每天的建筑火警数量。我有大约 6 个月(2018 年 6 月至 11 月)的数据。我使用了 ARIMA 时间序列预测方法(遵循您的帖子)来预测未来每天的警报数量,例如 2018 年 12 月、2019 年 1 月等。

    但我一直在思考,根据过去的火警数量来预测未来的火警数量是否有意义?火警不是季节性的等。它们取决于可能来自各种物联网传感器的故障。我想我应该尝试获取更多相关数据(更多特征数量)。

    请建议我如何构建这个问题并着手解决它。

    此致。

    您怎么看?解决此类问题最合理的方法是什么?

    • Jason Brownlee 2019年1月16日 上午5:45 #

      或许可以尝试以几种不同的方式来构建它,对每种方式进行原型设计,然后选择能够产生最准确预测的方法。

  62. Faisal 2019年3月9日 上午9:57 #

    嗨,Jason,

    假设一个时间序列像这样:
    1 2 1 3 2 1 1 1

    使用滞后 4 将其转换为监督学习,它将是:
    1 2 1 3 2
    2 1 3 2 1
    1 3 2 1 1
    3 2 1 1 1
    其中最后一列是在时间 t 预测的输出。

    现在,仅使用此模型,模型会产生高误差。所以我找到了连续时间步长的差值。
    原始时间序列现在转换为这样:
    1 -1 2 -1 -1
    -1 2 -1 -1 0
    2 -1 -1 0 0
    其中正数表示趋势增加,零表示不变,负数表示减少。

    现在我应用机器学习算法,并假设预测最后一列的输出为:
    -1.5
    0.2
    0.3

    现在我的问题是关于回到原始值。它是否像下面这样?
    2 + (-1.5) = 0.5
    1 + (0.2) = 1.2
    1 + (0.3) = 1.3

    或者我需要进行累积和?
    2 + (-1.5) = 0.5
    0.5 + (0.2) = 0.7
    0.7 + (0.3) = 1.0

  63. Faisal 2019年3月10日 上午10:17 #

    谢谢。

    阅读了那篇文章和另外两篇文章后,我现在知道那是差分变换。在我上面的例子中,我认为我正在做同样的事情,先进行差分,然后进行移位。您想在这里指出我没有理解的其他内容吗?

    我在您的一个回答中看到,我们可以使用实际值或预测值进行反演。我理解得对吗?实际上,我在此之后会四舍五入值,使其像分类问题。结果可能会略有变化,但会对准确性产生一些影响。我也阅读了您的回归与分类帖子,在我看来没问题,但您的回答会给我更多信心。

    • Jason Brownlee 2019年3月11日 上午6:44 #

      如果这是一个时间序列分类问题,则无需反转预测值的差分,因为值之间不会存在线性关系。

  64. Faisal 2019年3月11日 上午7:39 #

    所以您是说在差分变换之后,我运行算法,然后将预测输出与变换后的输出进行比较。如果我想以原始类别来报告呢?我的实际值是整数,但我的模型给出实数/双精度数。所以我使用 MSE,并且还想查看对双精度数四舍五入后的准确性。除了四舍五入来计算准确性之外,您还有其他更好的建议吗,因为四舍五入误差有时会导致误分类或反之。

    此外,您是否有任何预测分类问题中概率的示例?

  65. Faisal 2019年3月11日 下午10:21 #

    谢谢,我之前读过那篇文章,它清楚地解释了回归和分类之间的区别。

    我使用模糊逻辑,它提供了一个精确的双精度值,然后我将其四舍五入,看看它是否被正确分类。这就是为什么我需要一些关于差分变换的见解。因为当我们进行这种变换时,尺度会变小,然后当我进行逆变换时,实际值和预测值之间的差异很小,四舍五入会给出很好的准确性。抱歉,我的解释可能不太好。

  66. Faisal 2019年3月14日 下午11:31 #

    嗨,Jason,

    如果我正在开发一个病人护理预测系统,每个病人都有时间序列,例如一个病人有这个时间序列:
    1 2 3 4 5
    另一个病人有这个时间序列:
    5 6 7 8 9
    现在使用滞后 2,我们得到病人 1 的数据:
    1 2 3
    2 3 4
    3 4 5
    以及病人 2 的数据:
    5 6 7
    6 7 8
    7 8 9

    现在我的问题是,如果我将这些和许多其他病人数据结合起来并应用一些机器学习算法,这是否有意义?我们是否正在开发一种针对所有响应的平均算法。因此,当新病人作为测试用例出现时,我们应用这个模型并获得一些预测。

    这对于自相关性以找出显著滞后是否相同?我可以将所有数据组合起来尝试找到相关性,还是必须按病人进行?

    最后,由于每个病人的时间步长非常小,如果您想按病人进行预测,您建议哪种方法,因为 MLP 需要大量数据。ARIMA 或其他简单算法怎么样?

    我尝试了 LSTM,但对于绘图来说,它不能像一个时间序列那样,必须为每个病人进行。

  67. Thana Yeeram 2019年3月25日 下午3:46 #

    我在 WEKA 中使用您上面所说的相同方法进行时间序列预测。我尝试使用线性回归、多层感知器和 SMOreg 预测空间中的电子通量,提前一天使用通量的滞后值。不幸的是,所有三种方法的预测都与验证数据相差约 1 天;预测比观测数据快一天。我不明白这是为什么。是数据集偏移还是误差?请解释一下,这非常重要。

  68. Thana Yeeram 2019年3月26日 下午1:31 #

    非常感谢。因为我使用了神经网络,这意味着:
    模型需要进一步调优或
    所选模型无法处理特定数据集或
    这可能还意味着时间序列问题是不可预测的,对吗?。

    有没有更简单的方法来解决这个问题。请给我建议。

    忠实地,

  69. Abbas 2019年3月30日 上午2:18 #

    嗨,Jason,
    我读了这篇文章,非常有意义。
    所以我有关于上述两个观测示例的问题。
    X1, X2, X3, y
    ?, ?, 0.2 , 88
    0.2, 88, 0.5, 89
    0.5, 89, 0.7, 87
    0.7, 87, 0.4, 88
    0.4, 88, 1.0, 90
    1.0, 90, ?, ?
    我必须将 (X1,X2,X3) 的值作为输入 'X',将 (y) 的值作为输出 'Y' 馈入 LSTM 模型,例如:
    model.fit(X ,Y ,....)。
    我说的对吗?
    谢谢

    • Jason Brownlee 2019年3月30日 上午6:31 #

      是的。

      • Abbas 2019年4月1日 上午2:16 #

        我心中还有另一个问题。

        时间,测量值1,测量值2
        1, 0.2, 88
        2, 0.5, 89
        3, 0.7, 87
        4, 0.4, 88
        5, 1.0, 90

        这个例子的 shape1 = (1 个输入特征,1 个输出)。

        转换为监督学习后
        X1, X2, X3, y
        ?, ?, 0.2 , 88
        0.2, 88, 0.5, 89
        0.5, 89, 0.7, 87
        0.7, 87, 0.4, 88
        0.4, 88, 1.0, 90
        1.0, 90, ?, ?

        现在它的 shape2 = (3 个输入特征,1 个时间戳,1 个输出)。

        所以我的问题是,当我用 shape2 训练模型并用 3 个输入特征保存它时,但之后当我再次加载它来预测未见过的数据时,它有 1 个输入特征,因为未见过的数据没有时间戳 (X1,X2) 也没有预测/输出变量 (y)。
        加载后用不同的输入特征进行预测将会出现问题。
        我们应该怎么做呢?
        提前感谢您的时间。

        • Jason Brownlee 2019年4月1日 上午7:52 #

          您可以利用训练集中先前的数据作为输入,用于预测测试集或真实数据上的下一个值。

          • Abbas 2019年4月3日 上午1:44 #

            抱歉,我不明白训练集中的先验数据。
            如果我想预测输入 (X3) = 1.2 的输出 (y)。(这是我的真实数据)。
            训练集将包含许多行,那么 (X1,X2) 的值应该是什么?

          • Jason Brownlee 2019年4月3日 上午6:46 #

            这取决于您问题的框架。

            如果问题接受前两个时间步并预测随后的时间步,则输入将是前两个时间步。

            如果先前的时步是训练数据集中的观测值,那么您将需要检索它们。

  70. Abhilash 2019年3月30日 下午1:57 #

    嗨 Jason

    我目前正在进行传感器数据的时间序列分类。我已经达到了足够高的分类准确率。

    作为第二步,我将获得系统指标及其值。我知道传感器数据会受到系统指标的影响,但我很难想象在应用任何模型时应该如何将两者联系起来。

    • Jason Brownlee 2019年3月31日 上午9:27 #

      或许可以将它们都作为输入特征提供?

      • Abhilash 2019年4月4日 上午4:26 #

        我和制作数据集的人谈过了。

        我试图找出数据中的异常。这两个数据集用于识别不同类型的异常,并且是独立的。

        感谢您的回复。

  71. Alberto 2019年4月11日 下午9:48 #

    嗨 Jason

    我正在研究机器学习模型,我想将时间序列作为描述符而不是预测变量纳入我的数据集。这可能吗?

    • Jason Brownlee 2019年4月12日 上午7:46 #

      我看不出为什么不。

      • Alberto 2019年4月12日 下午7:04 #

        只用st()改变我数据集中变量的类别,模型会知道如何处理这类变量吗?

        • Jason Brownlee 2019年4月13日 上午6:25 #

          抱歉,我没听懂你的问题,能请你换个说法吗?

  72. Rania Elashmawy 2019年4月21日 下午5:26 #

    大家好,我是时间序列数据的新手

    我有一个输入数据集(18,24,2),即(样本数,时间步长,特征数)和输出(18,1),这种类型的数据很难处理。

    我用LSTM训练了我的模型,但性能不佳,我猜是因为数据量太小。有没有其他模型可以训练我的数据以获得良好性能,甚至与LSTM性能进行比较?

  73. Amin 2019年4月24日 上午8:23 #

    你好Jason,感谢你的好文章。
    我有一个问题。如你所知,现实世界中的大多数时间序列都不是平稳的。你需要使它们平稳(转换,差分等)。我在这篇文章中没有看到这一步。你的意思是使用窗口方法,然后使用机器学习可以跳过这一步吗?

    • Jason Brownlee 2019年4月24日 下午1:56 #

      你可以使用差分来去除趋势和季节性,并使用幂变换来消除方差变化。

      一个好的起点是这里
      https://machinelearning.org.cn/machine-learning-data-transforms-for-time-series-forecasting/

      • Amin 2019年5月24日 下午5:10 #

        所以,这四种方法(差分、变换、标准化等)在机器学习中是可选的,并且在应用机器学习(如ARIMA)之前不需要转换为平稳模型。这是正确的吗?

        • Jason Brownlee 2019年5月25日 上午7:43 #

          这取决于数据的具体情况。尝试使用和不使用给定的转换,并比较生成模型的技能。

          许多模型不需要数据是平稳的,例如它们学习趋势/季节性,尽管许多方法在数据平稳时表现更好。

  74. karim 2019年5月5日 上午9:16 #

    Jason您好,首先非常感谢您这篇精彩的文章。

    我想分享我的问题并寻求一些想法。我有一个发电厂数据集,我每分钟从7个不同的传感器获取7种不同的数据。我必须预测第8个传感器的数据。由于这个问题不仅取决于时间,还取决于其他不同的变量,所以我可以说这是一个多元时间序列问题。在我的案例中,我假设我有早上8点到10点(120分钟)的训练数据,我想预测早上10点到11点(1小时的每一分钟,以及1小时的每5分钟)的数据。不幸的是,我无法找到解决这个问题的结构化方法。问题是我不明白如何制作我的训练数据集和测试数据集。

    我已将DateTime作为数据集的索引。如果您能提供任何链接或想法,让我可以获得一些关于解决多元时间序列(一步预测,多步预测)的资源,我将不胜感激。

    另外一件事,如果我的数据集有10000行(分钟),我有8个传感器数据(其中7个将作为输入特征,最后一个是目标),那么如果我说——

    数据集=[传感器 1,2,3,4,5,6,7,8]
    train_X=数据集[:8000,:7]
    train_y=数据集[:8000,7]
    test_X=数据集[8000:,:7]
    test_y=数据集[8000:,7] 这是正确的吗??我这样问是因为我会先像这样制作数组,然后应用滑动窗口方法,还是有完全不同的方法来制作训练和测试数组以训练和测试模型?

    我也阅读了您的https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/文章。

  75. Roy 2019年8月6日 下午1:24 #

    我有一个问题,如果你的窗口中有一个连续的值,比如心电图波、脑电波(有尖锐的尖峰),如何将其转换为有限向量?如果你使用一对一映射,似乎不可能将其转换为有限向量

    • Jason Brownlee 2019年8月6日 下午2:10 #

      您可以对输入数据的重叠窗口进行操作。

  76. Hector 2019年8月13日 下午10:08 #

    你好 Jason,

    我有一个关于您重新构建多元数据集方式的问题。

    最初它看起来像这样

    时间,测量值1,测量值2
    1, 0.2, 88
    2, 0.5, 89
    3, 0.7, 87
    4, 0.4, 88
    5, 1.0, 90

    重新构建后,它看起来像这样
    X1, X2, X3, y
    ?, ?, 0.2 , 88
    0.2, 88, 0.5, 89
    0.5, 89, 0.7, 87
    0.7, 87, 0.4, 88
    0.4, 88, 1.0, 90
    1.0, 90, ?, ?

    如果 measure2 是我们想要预测的变量,并且我们的窗口宽度 = 1,为什么重新构建后的数据集不是这样的呢?

    X1-1, X2-1, y
    ?, ?, 88
    0.2, 88, 89
    0.5, 89, 87
    0.7, 87, 88
    0.4, 88, 90
    1.0, 90, ?

    我以为使用窗口宽度为1重新构建数据集意味着您用对应t-1(或您选择的任何窗口宽度)的X变量替换您的t时刻的X变量。

    让我困惑的是,您保留了 measure1(后来定义为 X3),而不是将其删除并得到我示例中所示的结果。

    谢谢你的帮助。

    • Jason Brownlee 2019年8月14日 上午6:41 #

      好问题,这真的取决于你如何构架问题。

      两种不同的构架都是有效的。你必须选择你想要的输入和输出,这不仅适用于变量本身,也适用于滞后观测值。

      这篇文章中的一些奇特的例子可能会有所帮助。
      https://machinelearning.org.cn/how-to-develop-lstm-models-for-time-series-forecasting/

      • Hector 2019年8月27日 上午9:16 #

        谢谢你的回复。

        我决定采用我上面建议的方法,并使用该框架实现了KNN和高斯过程回归,但是,由于某种原因,我的预测似乎比它们应该的提前了一步。我的预测在准确性方面实际上非常好,唯一的问题是它们似乎提前移动了,并且与预期的Y不符。我猜这种行为不正常。您对如何处理这个问题有什么建议吗?

        谢谢!!!

      • Peppy 2020年4月5日 上午3:26 #

        嗨,Jason,

        这是一篇很有帮助的文章!我只是有点困惑,多步预测和多窗口宽度有什么区别。多窗口宽度的数据会是什么样子。

        谢谢!

  77. chirag 2019年8月31日 上午2:58 #

    Jason老师您好,
    我是一名大学生,正在网上实习,但我缺乏信心,因为我没有指导老师来完成,您能帮我判断我是否在正确的道路上吗?
    这将对我帮助很大。
    我的 Gmail 邮箱是 cv091998@gmail.com,我的领英资料是 https://www.linkedin.com/in/chirag-verma-205005159/

  78. Karan Sehgal 2019年10月4日 下午10:06 #

    嗨,Jason,

    1. 为了将时间序列数据准备成用于时间序列预测的监督式机器学习数据,新的滞后变量是否应该只从目标变量而非预测变量形成?

    2. 我们应该为模型t-1,t-2……滞后到什么程度来创建新变量?我们是否也应该使用t+1?

  79. Ali 2019年10月10日 下午9:36 #

    嗨,Jason,

    我有一个需求预测问题需要解决。我有几种产品的时间序列,我需要对所有产品进行多步预测。理想情况下,我希望产品之间能交换跨系列信息。因此,阅读您的博客文章后,我假设我的问题可以归类为多元多步预测,对吗?我正在考虑使用LSTM来解决这个问题。您能给我一些关于如何处理这个问题的建议吗?我将不胜感激。

    此致,
    阿里

  80. Joichiro 2019年10月13日 上午5:47 #

    嗨,Jason,

    我目前正在研究一个多元多步回归问题。基本上,我想预测未来一天或未来24小时的电价。我拥有每小时记录的系统负荷信息、电价以及其他外生因素,我假设它们也是实时记录的,并且带有时间戳。我编写了一些代码,但在时间偏移方面有些困惑。我对此有几个问题

    1) 我的输入中包含了滞后的系统负荷和电价:具体来说,这些是24小时之前的数据,以及24小时之前的简单移动平均值(SMA),还有一周的滞后数据。现在,我是否也需要对目标电价应用24步的负向偏移(向未来偏移)?我对此感到非常困惑。

    2) 此外,将数据向未来偏移24小时(负向偏移)是否可以作为一种有效的方法,从实时记录中生成所谓的“日内”预测,用作预测器?

    3) 将预测器及其滞后等效项一起使用是否有效?我将系统负荷与其滞后对应项一起使用。

    感谢您的阅读和此博客。我很乐意通过购买您的书籍来支持您,但不幸的是,我目前正从与工作相关的伤害中康复,手头拮据。与此同时,我正在努力学习如何编程,以防万一,您的博客真的很有帮助。请继续努力,再次感谢您。

  81. Joichiro 2019年10月13日 上午6:49 #

    附录

    我一直在思考,但对第一个问题可能有一些直觉

    假设我只预测未来一步,并且我的输入中有一个一步滞后输入以及其他未滞后输入。就像这样
    [[ 输入 ]] [[ 目标 ]]
    t-1 t t+1
    x-1 x, a, b y

    现在 (t) 可以被认为是过去 (t-1) 的预测。日内或明天是未来 (t+1),它由现在 (和过去) 预测。因此,我确实需要对目标应用负向偏移或向未来偏移,同时对滞后应用偏移。
    这说得通吗?
    感谢您的阅读。

  82. Antonio 2019年11月22日 上午2:48 #

    Jason你好,我非常喜欢你的网站。我从中学到了很多。感谢你的所有贡献!

    我有一个问题。一旦你完成了所有的特征工程并创建了所有滞后值等,你如何进行未来预测?因为你没有未来的滞后值。我仍然不明白这部分。我应该预测未来一天t+1,然后使用该预测来创建一个未来的滞后值,并使用它们来预测t+2吗?或者是否可能一次性预测多个步骤?

    非常感谢Jason!!!

  83. Chris Parrett 2019年12月14日 上午2:29 #

    我正在努力理解“窗口化”的各个方面。您的文章通过强调数据转换和窗口化非常棒,但是当涉及到从 (x) 预测 (y) 时,x 或 y 是关于窗口化的向量,您能解释一下可能性吗?

    我认为是以下几种情况

    1) 给定一个序列 S 和 S 的一个值 s,我们可以使用 s 之前的“m”个值来预测 s 之后的“n”个值。

    2) 在这种情况下,x 有“m”个值,y 有“n”个值

    这类似于从 m 个特征预测 n 个值的多元模型。

    据我理解您的文章,我们通过在序列 S 上进行窗口化来生成多个 x 和 y。窗口大小在值 s 之前或之后不需要相同,我们甚至可以在窗口遍历序列 S 时改变窗口大小……这正确吗?是否有已经正式化的技术术语来捕捉这些概念?我不想重新发明轮子。

    • Jason Brownlee 2019年12月14日 上午6:21 #

      窗口大小保持不变,例如5个输入或10个输入,其中每个输入都是一个滞后观测值,例如t-1、t-2等。

      不确定你说的技术概念是什么意思?这方面没什么可说的。

  84. Chris Parrett 2019年12月17日 上午6:41 #

    我猜我对预测如何使用过去的值有点困惑。我认为我理解正确,即在单个序列上使用窗口化,我们可以将其转换为多元线性模型(如果残差模式正确的话),其中我们预测,比如8个输入对应的5个输出。由于窗口保持固定,那么对于窗口中的每个移位(滞后),我们都有这个模型的一个实例。这正确吗?

    但是,如果我们有两个序列,那么我们是否会有一组多元模型,每个序列一个?

  85. Karan Sehgal 2020年2月22日 下午5:30 #

    嗨,

    您能告诉我什么是固定效应和随机效应模型吗?如何判断何时使用固定效应和随机效应模型?固定效应和随机效应模型的例子有哪些?

    提前感谢

    • Jason Brownlee 2020年2月23日 上午7:24 #

      抱歉,我没有关于这个主题的教程。我无法给你好的即时建议。

  86. Karan Sehgal 2020年2月23日 下午8:27 #

    你好,

    由于ARIMA模型使用线性回归建模。
    因此,线性回归有一些假设,其中之一是数据不应该存在自相关。
    现在我的问题如下:
    1. 为什么ARIMA模型在建模中使用自相关,而数据本身不应该存在自相关?
    2. ARIMA模型如何通过差分、去趋势或去季节性来避免自相关?
    3. 为什么我们在ARIMA模型中去趋势、去季节性或使用差分?

    • Jason Brownlee 2020年2月24日 上午7:41 #

      该模型是一个自相关模型,例如滞后观测值与当前观测值相关。

      我们不回避它,它是该方法的基本假设。

      我们去除明显的结构,如趋势和周期,这样模型就可以专注于序列中的信号。

  87. Karan Sehgal 2020年2月23日 下午8:38 #

    非平稳数据本质上是异方差的吗?这就是我们对数据进行去趋势和去季节性处理以使其平稳的原因吗?

  88. Karan Sehgal 2020年2月23日 下午11:32 #

    在ARIMA模型中,我们使用单变量作为输入。现在我想知道,ARIMA模型是否会创建输入单变量的三个新的独立变量,然后对第一个变量进行AR操作,对第二个变量进行差分,对第三个变量进行MA操作?还是所有操作,即AR、差分和MA,都只对同一个输入单变量进行?

    • Jason Brownlee 2020年2月24日 上午7:43 #

      是的,这取决于模型的参数,例如p/q值。

      • Karan Sehgal 2020年2月24日 下午2:16 #

        这里我指定了两个参数,即:

        1. 它创建一个单一变量,或
        2. 它创建多个变量。

        请具体说明。

        • Jason Brownlee 2020年2月25日 上午7:40 #

          是的,p和q定义了要使用的AR和MA输入的数量。d控制了应用于AR和MA输入的差分操作的数量。

  89. manjunath 2020年2月25日 上午5:57 #

    嗨,这真的很棒,我喜欢您的所有ML内容,那么在这篇文章中,我们如何使用滑动窗口方法进行预测?是否有任何用例或示例,如果您已经发布过,请分享链接。
    谢谢

  90. manjunath22 2020年2月25日 上午5:58 #

    在时间序列预测中,有没有什么库或包可以使用滑动窗口方法?

  91. manjunath 2020年2月25日 下午6:06 #

    from pandas import read_csv
    from pandas import DataFrame
    from pandas import concat
    series = read_csv(r’data.csv’, header=0, index_col=0)
    temps = DataFrame(series.values)
    dataframe = concat([temps.shift(3), temps.shift(2), temps.shift(1), temps], axis=1)
    dataframe.columns = [‘t-3’, ‘t-2’, ‘t-1’, ‘t+1’]
    print(dataframe.head(20))

    输出
    t-3 t-2 t-1 t+1
    0 NaN NaN NaN 41
    1 NaN NaN 41 40
    2 NaN 41 40 39
    3 41 40 39 39
    4 40 39 39 40
    5 39 39 40 39
    6 39 40 39 38
    7 40 39 38 42
    8 39 38 42 51
    9 38 42 51 59
    10 42 51 59 62
    11 51 59 62 63
    12 59 62 63 62
    13 62 63 62 61
    14 63 62 61 65
    15 62 61 65 56
    16 61 65 56 64
    17 65 56 64 65
    18 56 64 65 64
    19 64 65 64 61

    所以这就是使用滑动窗口方法进行预测的方式吗?
    如果我的方法正确,那么t-2 t-3是我的预测值吗?
    我有点困惑,请给我一些建议。

    谢谢
    Jason

    • manjunath 2020年2月26日 上午5:56 #

      请提供关于此帖的一些信息

    • Jason Brownlee 2020年2月26日 上午8:16 #

      这就是使用滑动窗口方法准备数据的方式。

  92. manjunath 2020年3月3日 上午2:13 #

    嗨,Jason,我尝试了你的方法,但在这一步卡住了。

    日期 值
    1-1-19 5
    2-1-19 6
    3-1-19 8
    4-1-19 10
    5-1-19 2
    6-1-19 11

    这是我的数据,我用滑动窗口对其进行了重构。
    那么,在这种情况下,我应该考虑日期列还是需要删除它?

    如果需要考虑,我需要将日期列作为索引吗?

    因为我正在使用回归模型来预测时间序列数据?

    请给我一些建议,我如何将这个日期传递给回归模型?

  93. Ksanya 2020年3月3日下午7:55 #

    你好,
    我只想问你一个关于我研究中问题的问题。
    我不太擅长编程,但我正在寻找解决问题的方法。

    我有基于半小时的涡度协方差测量数据,持续4年。
    我正在研究二氧化碳通量,但不幸的是我们有3.5个月的空白,我无法用常见技术填补。所以我需要使用一些 RF 或 SVR,或者 BiLSTM 模型来填补这个长空白。你能建议我如何以及在哪里寻找这些模型的代码(最好是 Python)吗?
    提前感谢

  94. developersvil 2020年3月10日下午6:37 #

    有一个包含以下字段的数据集:日期、余额、销售额、数量(目标变量)。如果我们创建训练和测试样本来拟合模型,那么预测结果如何投入生产,因为在实际情况下,除了预测的日期之外,将没有任何数据,并且余额、销售额将发送到测试样本?

    • Jason Brownlee 2020年3月11日上午5:21 #

      您必须根据您打算如何在生产中使用模型来设计模型。例如,选择在预测时可用的输入。

  95. Samarth Khandelwal 2020年5月2日上午2:53 #

    嗨,Jason,

    感谢这篇文章,它解决了我的几个疑问。

    我有一个问题,我正在处理一个数据集,其中包含许多时间序列(股票价格和宏观经济变量),并且只有一个因变量。我想使用所有时间序列(基本上想包括宏观经济变量的影响)预测下一个时间步的股票价格。您认为在我的研究中使用因变量和自变量的12个周期滞后是可取的吗?我有点担心使用因变量滞后,因为它可能导致偏差并可能降低其他变量的影响。另外,我是否应该使用所有变量的滞后以不丢失任何信息,然后使用特征重要性删除不重要的变量?
    抱歉问题很长,非常感谢您的建议。提前表示感谢。

  96. Vishnu Pratap Singh 2020年6月6日下午12:54 #

    你好先生!您能举一个窗口大小大于2或3的例子吗?实际上,先生,我不明白滑动窗口概念中的“滑动”是什么意思。

    谢谢您,先生。

  97. Naveen 2020年6月24日上午4:13 #

    您有关于需求感知的文章吗?

  98. David 2020年7月3日上午11:18 #

    Jason,

    一如既往的好文章,我理解上面关于时间序列预测被视为监督学习问题的解释。它可以被视为其他方式吗,例如无监督学习、半无监督学习、强化学习等?

    • Jason Brownlee 2020年7月3日下午2:24 #

      谢谢!

      我看不出为什么不。

      • David 2020年7月3日下午4:07 #

        你有什么例子吗?我不知道,如果这个问题被视为无监督学习或强化学习,数据应该如何处理,以及应该使用哪种人工神经网络。

        • Jason Brownlee 2020年7月4日上午5:51 #

          抱歉,我没有。我专注于监督学习。

          • David 2020年7月4日上午6:05 #

            你知道我在哪里可以找到吗?

          • Jason Brownlee 2020年7月4日上午6:07 #

            或许可以从 scholar.google.com 开始搜索。

  99. David 2020年9月8日上午2:00 #

    嗨,Jason,

    非常有趣的文章,感谢清晰的分步代码。

    但我认为我忽略了问题。如果我们使用 LSTM,这种处理数据的方式是否多余?我在想 y(t-1) 可以作为 x(t) 馈送到下一个单元格。而 x 和 y 的任何其他相关信息(包括来自 t-2、t-3 等)都传递到单元格状态 (t-1) 和隐藏激活 (t-1) 中。

    这里构建数据的方式明确添加了 x(t-2)、x(t-3) 等,而以前它们隐含在单元格状态和隐藏激活中。这使得它有点多余。

    然而,我是序列模型的新手,我可能遗漏了什么 🙂 很想听听你的想法。

    大卫

  100. Darrell Kartrip 2020年10月21日下午2:41 #

    杰森,感谢您的文章。滑动窗口将帮助我预测未来许多步骤,但我需要在这些模型中考虑外生输入。有什么办法可以做到这一点吗?

    • Jason Brownlee 2020年10月21日下午3:59 #

      是的,外生变量可以用相同的方式准备。

  101. Simon F 2020年11月19日上午6:31 #

    您好,感谢您的文章,我从中受益匪浅。如果您有如下时间序列数据集,您有什么建议可以阅读哪些主题或研究哪些算法/方法:
    时间 值
    1 2
    2 0
    3 3

    并且我有一个针对整个数据集的单一输出变量“通过/失败”。因此,我需要为新的整个数据集决定它们是类似于“通过”数据集还是“失败”数据集。我在想转换为以下格式是否可以:
    ID 1 2 3 … 输出
    数据集_1 2 0 3 通过
    数据集_2 1 2 4 失败

    是可以的。

    感谢您的主题和回复!

  102. Awais 2020年12月5日上午9:07 #

    你好 Jason,
    感谢这篇精彩的教程,我阅读了许多关于预测使用回归问题的教程。例如价格预测、天气和股票,但我有一个生产线数据集,其中机器产生多个错误代码作为目标变量。

    我知道使用分类是一个相当容易的工作,但我的目标是预测未来10个周期可能出现的错误代码。
    您能推荐我应该阅读哪些教程,以及是否有关于此主题的任何工作示例吗?

    这是我的数据样子:

    时间戳 周期 故障代码 磨损编号 直流压降 上升时间 温度__RT

    09:02:30 0 0 20 500 20000 24.86
    09:02:36 1 41 34 500 20000 24.85
    09:02:42 2 0 11 500 20000 24.86
    09:02:48 3 0 69 500 20000 24.85
    09:02:54 4 0 6 500 20000 24.84
    09:02:58 5 90 7 0 0 -999.00

  103. Sharmin 2020年12月15日上午2:04 #

    嗨,Jason,

    我正在查阅在线应用机器学习模型到时间序列的工作和文章。

    我注意到,除了应用滑动窗口之外,许多工作对所有未来时间步进行点预测。我的意思是他们创建日期时间特征或与他们想要进行的预测一样大的简单滞后,或者除了目标之外的时间序列作为特征。这意味着他们所有的特征都可用于未来的未知数据。然后他们将其输入任何机器学习模型并预测未来所有时间步。

    我的问题是,这不也是一种多步预测吗?
    尽管它既不是递归的也不是直接的。我们把这种“偷懒”的方法叫做什么?

    • Jason Brownlee 2020年12月15日上午6:28 #

      如果你正在预测未来多个步骤,那么这就是多步预测。

  104. Sanket 2021年1月27日上午4:48 #

    嗨,Jason,

    预测问题可以被视为预测性问题吗?

    例如:假设我有一个月的发电量数据。下个月的发电量可以预测吗?

    说下个月的电量是预测而不是预报,这样可行吗?

    如果我没记错的话,预测完全取决于特定的数据点,如果我们谈论实时评分的话。

    另一方面,预测是根据以前的数据点进行学习并预测值,甚至不依赖于实时数据。这就是预测的意义。

  105. Penn 2021年2月8日下午6:54 #

    嗨,Jason!

    我想听听你的看法!

    我使用混合随机森林和 MLP 预测港口码头性能

    (吞吐量)。输入是2009年至2020年9个港口性能指标(月度数据),我得到了不错的结果。这是一个对2021年12个月的多步预测。

    但研究界表示我应该使用经典方法来解决这个问题!

    我该如何捍卫在这种情况下使用机器学习模型呢?

    • Jason Brownlee 2021年2月9日上午6:32 #

      好问题。

      收集关于经典方法在相同数据/问题上表现如何的证据,并直接比较您的替代方法。这将有力地支持您的方法更适合或更有能力解决该问题。

  106. Varun 2021年2月13日上午7:23 #

    嗨 Jason

    我正在解决一个问题,我有一个包含日期、节假日和市场指标的每日交易量文件。

    目标是利用每日交易量数据创建一个函数,以滚动方式预测未来1天。

    将使用一个保留集来衡量模型准确性(MAE、MSE 和方向准确性)。

    不要使用任何在预测当天不可用的数据(不要使用当天数据进行当天预测)。在现实生活中,我们不会有这些数据。

    杰森,您认为将给定的时间序列转换为监督学习格式能帮助我做到这一点吗?

    如果您能在这里帮助我,我将不胜感激。

    • Jason Brownlee 2021年2月13日上午8:28 #

      是的,只要您保留观测值的时间顺序(例如,不要打乱)。

      另外,使用向前验证进行评估。

      • varun gupta 2021年2月13日下午6:07 #

        我正在解决一个多变量问题。因此,当我将训练数据转换为监督学习时,我丢失了第一行和最后一行。我需要对保留集进行类似的转换吗?

  107. Liliana 2021年4月19日上午9:27 #

    非常感谢您的解释,它们对我非常有用。我有一个这些情况的变体,如果我想要从数据框中获取时间序列的几行作为输入 (X),并且输出 (y) 是时间戳的下一个值,例如:时间序列的前10行是输入 (X),第11行是输出 (y);然后从第2行到第11行是下一个输入 (X),输出是第12行,依此类推。

    对于多变量序列,这些可以通过滑动窗口方法或其他方法实现吗?

    感谢您的关注,我正在等待您的回复。

  108. Liliana 2021年4月22日上午7:49 #

    谢谢你的回答,我会查看例子,如果我没有找到类似的东西,我会再评论。

  109. Sasha 2021年4月27日上午10:10 #

    嗨,Jason,

    感谢您投入的所有时间。我有一个基本问题,出于某种原因我就是想不明白。在用于多步预测的监督学习设置中,当您有多个输出(每个 t+k 步一个)时,您如何实际获得样本外预测?如果我想要特定日期的预测,我可能会在一个输出列中获得该日期的一个预测(例如 +5 预测窗口),而在另一个输出列中获得该同一天的另一个预测(例如 +4 预测窗口)。那么我如何从中获得单个预测?我在这里遗漏了什么?

    祝好,

    • Jason Brownlee 2021年4月28日上午5:57 #

      不客气。

      您必须根据预测时可用的数据来构建模型的输入,或者递归地使用模型。

  110. Anjali 2021年5月5日下午6:54 #

    将时间序列数据转换为监督形式后或之前,我们需要进行缩放或归一化吗?
    依我看,如果我们在转换为监督形式之前进行缩放,那么 scaler.inverse_transform 会给出错误的结果?
    如果我错了,请纠正我。
    请回复。这将非常有帮助。
    提前感谢。

    • Jason Brownlee 2021年5月6日上午5:43 #

      之前,每个变量。仅在训练集上拟合以避免数据泄漏。

      • John Dudley 2025年6月23日下午2:14 #

        我想问一个关于这个问题的后续问题,如果我想用数据分割和缩放进行滑动窗口,正确的顺序是什么。

        • James Carmichael 2025年6月24日上午6:50 #

          如果您正在使用滑动窗口方法进行时间序列预测项目,那么正确地安排步骤的顺序非常重要。它有助于防止数据泄漏,并确保您的模型从过去的数据中学习,而不会意外地窥探未来。

          所以,您应该这样操作:

          首先,将数据分为训练集和测试集。由于是时间序列数据,请确保分割基于时间——例如,您可以使用前80%用于训练,后20%用于测试。这样,模型始终从过去学习并预测未来,这反映了它在实践中将如何使用。

          接下来,您需要缩放数据——无论是通过归一化还是标准化——但关键在于:只在训练数据上拟合缩放器。一旦拟合完成,使用相同的缩放器转换训练集和测试集。这有助于保持公平,确保模型在不应该学习测试集中的任何内容之前不会意外学习。

          之后,您可以应用滑动窗口技术。这就是您获取时间序列数据块(例如,过去三个时间步)并使用它们来预测下一步的地方。这将您的时间序列转换为监督学习问题,大多数模型都可以轻松处理。

          总而言之,顺序应该是这样的:

          从原始时间序列开始
          → 分割成训练集和测试集
          → 在训练集上拟合缩放器
          → 使用该缩放器转换两个集合
          → 创建滑动窗口
          → 训练你的模型

          如果您想查看一些将此付诸实践的代码,请告诉我。

  111. Hitesh Panda 2021年6月3日下午11:46 #

    先生,这个主题讲得非常漂亮,概念清晰。

    您能写一些关于时序差分和即时技术的文章吗?我想那会对很多人有很大的帮助。

    期待您的回复。

    此致。

  112. Joko 2021年7月18日下午3:39 #

    你好杰森,总是从你的文章和书中获得启发。

    我有一个问题,一个相当愚蠢的问题,请原谅我。

    我比较了 ARIMA 和其他滑动窗口算法(如 ANN)在单变量时间序列数据上的性能。

    我想知道,将 p 和 q 都设为 5 的 ARIMA 与滑动窗口为 2 个观测值(t-2, t-1 用于预测 t+1)的 ANN 进行比较是否公平?

    或者我应该为两种算法使用相同的滞后吗?也就是说,p 和 q 应该与 ANN 参数相同吗?

    谢谢
    Joko

    • Jason Brownlee 2021年7月19日上午5:17 #

      嗯,通常你必须选择一个比较点并为之辩护。

      就我而言,只要两种算法都能访问相同的数据并在相同条件下进行评估,那么评估似乎是合理的,例如,只要 ARIMA 配置相对于其他配置是最优的,这意味着你正在充分利用它。

      • Joko 2021年7月19日上午5:45 #

        谢谢杰森。看来我的最优配置ARIMA在平稳和非平稳数据集上总是优于我的ANN。
        可能我选择了错误的数据集来玩,因为有时持久性/朴素模型也能打败ANN……唉……。

  113. Ludo 2021年8月4日下午11:28 #

    嗨,Jason,

    很棒的文章,非常感谢您回答了聊天中的所有问题!阅读它们非常有帮助。

    我也有个问题。

    我有一个时间序列数据集,包含多个特征 X_n,我想从中预测输出 y。然而,x 和 y 值都是不均匀间隔的,有时以不同的频率收集。

    例如,假设温度变量每天收集3次,而氧饱和度每天只收集一次,然后输出(收获重量)每两天收集一次。此外,有时数据根本就没有收集,因此会有很多缺失值。

    建模这类数据集的最佳实践是什么?我应该在所有数据点之间进行非常基本的线性插值,然后向模型提供最细粒度的插值值吗?还是最好坚持使用粒度较小的值并丢失高频数据的所有信息?

    目的是创建一个数据集,我将使用滑动窗口将其输入各种机器学习预测模型(高斯过程、LSTM、CNN、符号回归等)

    任何帮助将不胜感激!

  114. Min 2021年8月27日上午6:05 #

    嗨,Jason,

    非常感谢您精彩的文章。这对我非常有帮助。如果我想使用滞后量 = 4 的 KNN 回归来预测单变量时间序列,您能给我一些关于如何重构数据表的建议吗?

    我的想法是为 x-4、x-3、x-2、x-1 创建 4 个输入列,并为输出 y 创建 1 个列,这样我就可以计算 y 到每个输入值的距离。由于我完全是机器学习/KNN 的新手,我仍然不知道我的方向是否正确。

    希望能尽快收到您的回复。

    非常感谢。

    最小值

    • Adrian Tam
      Adrian Tam 2021年8月28日上午4:19 #

      如果你使用回归(无论KNN与否),你需要将x-1,x-2,x-3,x-4作为预测变量,x(滞后0)作为目标。

  115. Min 2021年8月30日下午6:03 #

    非常感谢 Adrian。

    最小值

  116. Jacques Musonda 2021年9月13日下午7:55 #

    非常感谢您这篇精彩的教程。

  117. Saeideh 2021年9月18日下午6:08 #

    你好,感谢你的精彩文章。
    我有一个实际的时间序列问题,需要预测许多产品未来几天的销售额。
    你有什么想法可以解决这个问题吗?我不知道这种问题的处理方法叫什么,所以我无法在谷歌上搜索。
    经过大量的搜索和阅读许多文章,我发现了两个关键词:分组和分层方法。这是真的吗?如果是,你的网站上有关于它的文章吗?
    如果你能给我任何相关的关键词、提示或链接,那将是你的好意。

    • Adrian Tam
      Adrian Tam 2021年9月19日上午6:38 #

      抱歉,我认为没有关于这些方法的文章。但我注意到这本书涵盖了这些主题:https://otexts.com/fpp3/
      也许你可以看看。我强烈推荐这本书给那些想深入了解时间序列预测的人。

      • Saeideh 2021年9月24日上午5:41 #

        谢谢。我会查看的。

  118. hassan 2021年10月17日下午9:55 #

    嗨 Jason
    非常感谢您的出色培训。
    我读过您几篇关于输入数据及其重塑的文章,但我仍然有点困惑。
    如果我想为本文中的每个示例定义输入数据的形状,它将如下所示:
    例如 input_shape= (样本数, 时间步长, 特征数)
    1 输入 1 输出 (4, 1, 1)
    3 输入 1 输出 (4, 3, 1)
    2 输入 2 输出 (4, 2, 2)
    1 输入 2 输出 两步 (3, 2, 2)

    请纠正我!

    另一个问题是,LSTM 层中的节点数量与输入数据数量之间有什么关系?节点不应该作为输入数据数量的因子吗?

    • Adrian Tam
      Adrian Tam 2021年10月20日上午9:11 #

      不,您的输出不应计入输入形状。如果您有 3 个输入特征,那么对于模型中要使用的样本数 N 和时间步长 M,形状将是 (N, M, 3)。

  119. haile 2021年11月23日上午1:25 #

    你好,Jason。
    我尝试使用 XGBoost 回归集成算法进行时间序列预测来研究 COVID-19 脆弱性预测,并且还使用了两个日期和病例独立变量。我想您对我所做的事情有所了解。但我不太擅长编程。您能否附上一个样本链接,作为初学者的清晰指导。如果我的研究有类似的文章,请再次附上链接。
    感谢您的合作,我的培训师。

  120. haile 2021年11月23日上午1:51 #

    抱歉,我使用的工具是 Python。

  121. Josh Higgins 2022年12月13日下午4:00 #

    嗨,Jason,

    我是时间序列分析的新手,但这篇简短的博文非常有见地。您在博文的末尾提到:“在您的问题上需要仔细思考和实验,以找到一个能够产生可接受模型性能的窗口宽度。” 有没有什么好的经验法则或一般原则可以帮助为给定数据集找到那个窗口?

  122. Yudum 2023年2月18日上午7:38 #

    嗨 James,
    感谢这篇精彩的文章,我有一个关于多元时间序列部分的问题,当你将其转换为时间序列时,你使用时间 t 的 measure1 值作为特征,但在时间 t 我们不知道 measure1 对吗?所以它应该像下面这样,因为我们不知道 x3?

    x1 x2 Y
    滞后1(measure1) 滞后1(measure2) measure1 (在时间t)

    另外,我还有另一个问题,我想找到具有相同依赖特征的独立预测,例如我想找到 100 家商店未来 15 天的销售额,并且我有每家商店的每日汇总销售数据,要将此系列转换为监督学习,您建议使用哪种方法?时间序列还是机器学习技术?
    谢谢你

  123. Raphael 2023年5月4日下午7:00 #

    嘿,詹姆斯,

    非常感谢您的出色工作。

    我正在努力将您的代码与一个已经为每个变量分离列的 .xlsx 文件(不像您的一列 .csv 测试数据)一起使用。您能帮我如何将数据集从单列 csv 切换到多列 excel 并使您的代码再次工作吗?

    非常感谢,祝您一切顺利!

  124. Praneetha 2024年5月15日上午5:08 #

    嘿,詹姆斯,
    感谢这份速查表。我有一个普遍的问题,我尝试为几个唯一的标识符开发监督机器学习模型,但结果在不同的标识符之间不一致。我需要为每个标识符单独开发一个模型吗?或者有没有其他方法可以使用?

    • James Carmichael 2024年5月15日上午8:05 #

      嗨,Praneetha……在监督机器学习问题中处理多个唯一标识符(例如,不同的产品、用户或位置)时,有几种方法可以解决这些标识符之间结果不一致的问题。最佳方法取决于问题的具体上下文、数据的性质以及标识符之间的关系。以下是一些您可以考虑的策略:

      ### 1. 为每个标识符建立单独的模型
      为每个唯一标识符创建一个单独的模型可以确保每个模型都针对与该标识符相关联的数据的特定特征进行定制。但是,如果您的标识符数量庞大,这种方法可能会占用大量资源,并且可能不切实际。

      **优点:**
      – 为每个标识符量身定制模型。
      – 每个单独标识符的性能可能更好。

      **缺点:**
      – 高计算成本和维护工作。
      – 由于每个标识符的数据有限,存在过拟合的风险。

      ### 2. 将标识符作为特征的单一模型
      将标识符作为特征合并到一个单一模型中。这种方法利用所有标识符的信息,同时允许模型学习与每个标识符相关的特定模式。

      **优点:**
      – 简化模型维护。
      – 利用所有数据,可能提高泛化能力。

      **缺点:**
      – 模型可能难以捕捉每个标识符的高度特定模式。
      – 特征工程和缩放可能更复杂。

      ### 3. 多任务学习
      如果标识符之间存在关联或共享信息,您可以使用多任务学习。这种方法涉及训练一个模型同时执行多个任务,在任务之间共享模型的一些层,同时保持其他层特定于每个任务。

      **优点:**
      – 可以捕捉共享和特定模式。
      – 通常通过利用共享信息来提高泛化能力。

      **缺点:**
      – 更复杂的模型架构。
      – 需要仔细调整和验证。

      ### 4. 分层模型
      使用分层或嵌套建模方法,其中全局模型捕捉一般模式,局部模型捕捉标识符特定模式。例如,全局模型可以预测总体趋势,而单独的局部模型则可以微调每个标识符的预测。

      **优点:**
      – 平衡泛化和特异性。
      – 在每个标识符数据有限的情况下可以提高性能。

      **缺点:**
      – 实现和调优更复杂。
      – 计算成本高于单一模型。

      ### 5. 集成方法
      使用集成技术组合多个模型的预测。例如,您可以训练一个全局模型和几个局部模型,然后使用堆叠、装袋或提升等技术组合它们的预测。

      **优点:**
      – 可以提高鲁棒性和准确性。
      – 利用不同模型的优势。

      **缺点:**
      – 增加计算和维护复杂性。
      – 需要仔细调整集成组件。

      ### 建议

      1. **分析数据特征**:检查不同标识符之间数据模式的相似性和差异。如果存在很强的共性,那么将标识符作为特征的单一模型可能就足够了。如果存在显著差异,请考虑单独的模型或分层方法。

      2. **实验和验证**:尝试不同的方法,并使用交叉验证或留出测试集验证其性能。比较准确率、精确率、召回率和 F1 分数等指标,以确定最佳方法。

      3. **混合方法**:有时多种方法的组合效果最好。例如,您可以使用全局模型来捕捉一般趋势,并使用标识符特定模型来微调预测。

      ### Python 中的实现示例

      这是一个使用 scikit-learn 将标识符作为特征整合到单一模型中的简单示例

      python
      import pandas as pd
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import OneHotEncoder, StandardScaler
      from sklearn.ensemble import RandomForestClassifier
      from sklearn.pipeline import Pipeline
      from sklearn.compose import ColumnTransformer

      # 示例数据
      data = pd.DataFrame({
      'identifier': ['id1', 'id2', 'id1', 'id2'],
      'feature1': [1, 2, 3, 4],
      'feature2': [5, 6, 7, 8],
      'target': [0, 1, 0, 1]
      })

      # 将数据分为训练集和测试集
      X = data.drop('target', axis=1)
      y = data['target']
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

      # 预处理:独热编码 'identifier' 并缩放数值特征
      preprocessor = ColumnTransformer(
      transformers=[
      ('num', StandardScaler(), ['feature1', 'feature2']),
      ('cat', OneHotEncoder(), ['identifier'])
      ])

      # 定义模型
      model = Pipeline(steps=[
      ('preprocessor', preprocessor),
      ('classifier', RandomForestClassifier(random_state=42))
      ])

      # 训练模型
      model.fit(X_train, y_train)

      # 评估模型
      accuracy = model.score(X_test, y_test)
      print(f'准确率: {accuracy}')

      这种方法对标识符进行编码并将其包含在模型中,利用所有标识符的信息,同时仍然允许模型学习每个标识符的特定模式。

      通过实验这些策略并验证其性能,您可以确定在机器学习模型中处理多个唯一标识符最有效的方法。

发表回复

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