如何使用 Python 为时间序列预测制作基线预测

在任何时间序列预测问题中,建立基准都至关重要。

性能基准可以让你了解所有其他模型在你的问题上实际表现如何。

在本教程中,你将学习如何开发一种持久性预测模型,你可以使用它来计算 Python 中时间序列数据集的基准性能水平。

完成本教程后,您将了解:

  • 计算时间序列预测问题性能基准的重要性。
  • 如何在 Python 中从头开始开发持久性模型。
  • 如何评估持久性模型的预测并使用它来建立性能基准。

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

让我们开始吧。

  • 2019 年 4 月更新:更新了数据集链接。
How to Make Baseline Predictions for Time Series Forecasting with Python

如何使用 Python 为时间序列预测制作基线预测
照片由 Bernard Spragg. NZ 拍摄,保留部分权利。

预测性能基准

预测性能基准提供了比较的依据。

它是你问题中所有其他建模技术的参考点。如果模型达到的性能低于或等于基准,则该技术应进行修正或放弃。

用于生成预测以计算基准性能的技术必须易于实现,并且不涉及问题特定的细节。

在你的预测问题上建立性能基准之前,你必须开发一个测试工具。这包括:

  1. 你打算用于训练和评估模型的数据集
  2. 你打算用于估计技术性能的重采样技术(例如,训练/测试分割)。
  3. 你打算用于评估预测的性能度量(例如,均方误差)。

准备好后,你需要选择一种朴素技术,你可以用它来做出预测并计算基准性能。

目标是尽快在你的时间序列预测问题上获得基准性能,以便你可以更好地理解数据集并开发更高级的模型。

用于进行基准预测的良好技术具有三个特性:

  • 简单:一种需要很少或不需要训练或智能的方法。
  • 快速:一种实现速度快且计算上微不足道的预测方法。
  • 可重复:一种确定性方法,这意味着给定相同的输入,它会产生预期的输出。

用于建立基准性能的常用算法是持久性算法。

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

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

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

持久性算法(“朴素”预测)

监督机器学习最常见的基准方法是 零规则 算法。

该算法在分类情况下预测多数类,或在回归情况下预测平均结果。这可以用于时间序列,但未考虑时间序列数据集中的序列相关结构。

用于时间序列数据集的等效技术是持久性算法。

持久性算法使用上一个时间步 (t-1) 的值来预测下一个时间步 (t+1) 的预期结果。

这满足了基准预测的上述三个条件。

为了使其具体化,我们将研究如何开发持久性模型并使用它来为简单的单变量时间序列问题建立基准性能。首先,让我们回顾一下洗发水销售数据集。

洗发水销售数据集

此数据集描述了三年内每月洗发水销售数量。

单位是销售计数,共有 36 个观测值。原始数据集归功于 Makridakis、Wheelwright 和 Hyndman (1998)。

以下是数据的前 5 行样本,包括标题行。

以下是整个数据集的图表,你可以在其中下载数据集并了解更多信息。

Shampoo Sales Dataset

洗发水销售数据集

该数据集显示出增加的趋势,可能还有一些季节性成分。

下载数据集并将其放在当前工作目录中,文件名为“shampoo-sales.csv”。

以下代码片段将加载洗发水销售数据集并绘制时间序列。

运行示例将绘制时间序列,如下所示

Shampoo Sales Dataset Plot

洗发水销售数据集图

持久性算法

在 Python 中可以轻松实现持久性模型。

我们将本节分为 4 个步骤:

  1. 将单变量数据集转换为监督学习问题。
  2. 为测试工具建立训练和测试数据集。
  3. 定义持久性模型。
  4. 进行预测并建立基准性能。
  5. 查看完整示例并绘制输出。

让我们开始吧。

步骤 1:定义监督学习问题

第一步是加载数据集并创建滞后表示。也就是说,给定 t-1 处的观测值,预测 t+1 处的观测值。

此代码片段创建数据集并打印新数据集的前 5 行。

我们可以看到,第一行(索引 0)将不得不被丢弃,因为在第一次观测之前没有观测值可用于进行预测。

从监督学习的角度来看,t-1 列是输入变量(X),t+1 列是输出变量(y)。

步骤 2:训练集和测试集

下一步是将数据集分成训练集和测试集。

我们将把前 66% 的观测值用于“训练”,其余 34% 用于评估。在分割时,我们注意排除数据中带有 NaN 值的第一个行。

在这种情况下不需要训练;这只是习惯。然后将每个训练集和测试集分成输入变量和输出变量。

步骤 3:持久性算法

我们可以将我们的持久性模型定义为一个函数,该函数返回作为输入提供的值。

例如,如果提供了 t-1 值 266.0,则将其作为预测返回,而实际的真实或预期值恰好是 145.9(取自我们滞后数据集中第一个可用行)。

步骤 4:进行并评估预测

现在我们可以在测试数据集上评估这个模型。

我们使用步进验证方法来完成此操作。

不需要模型训练或再训练,因此本质上,我们逐个时间步地遍历测试数据集并获取预测。

一旦为训练数据集中的每个时间步进行了预测,它们就会与预期值进行比较,并计算均方误差 (MSE) 分数。

在这种情况下,测试数据集上的误差超过 17,730。

步骤 5:完整示例

最后,绘制一张图表,显示训练数据集以及测试数据集中与预期值有所偏差的预测。

从持久性模型预测的图表中可以看出,该模型比实际情况滞后 1 步。销售数据存在上升趋势和逐月波动,这突显了持久性技术的局限性。

Shampoo Sales Persistence Model

洗发水销售持久性模型

完整的示例如下所示。

我们已经看到了为洗发水销售问题从头开发的持久性模型的示例。

持久性算法是朴素的。它通常被称为朴素预测

它对所应用的时间序列问题的具体细节不作任何假设。这使得它易于理解、快速实现和评估。

作为机器学习实践者,它也可以激发大量的改进。

把它们写下来。

这很有用,因为这些想法可以成为特征工程工作中的输入特征,或稍后在集成工作中可以组合的简单模型。

总结

在本教程中,你学习了如何使用 Python 在时间序列预测问题上建立基准性能。

具体来说,你学到了:

  • 建立基准的重要性以及你可以使用的持久性算法。
  • 如何在 Python 中从头实现持久性算法。
  • 如何评估持久性算法的预测并将其用作基准。

你对基准性能或本教程有什么疑问吗?
在下面的评论中提出你的问题,我会尽力回答。

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

Introduction to Time Series Forecasting With Python

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

...只需几行python代码

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

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

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

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

查看内容

如何使用 Python 进行时间序列预测并建立基准预测的 86 条回复

  1. Kevin 2016 年 12 月 26 日 下午 3:56 #

    很棒的帖子。然而,我认为应该用 (t) 和 (t+1),而不是 (t-1) 和 (t+1)。前者表示滞后 2 个时间步;而持久性模型只需要 1 个时间步的回溯。

    • Jason Brownlee 2016 年 12 月 27 日 上午 5:21 #

      那样会更清楚,谢谢 Kevin。

    • Hans 2017 年 4 月 26 日 下午 7:05 #

      有什么关于如何实现它的建议吗?

      • Hans 2017 年 4 月 27 日 下午 6:17 #

        这仅仅是列声明的问题吗?

        dataframe.columns = ['t-1', 't+1'] vs. dataframe.columns = ['t', 't+1']

        ...或者我需要更改更多代码逻辑吗?

  2. Ansh Gandhi 2016 年 12 月 27 日 上午 9:30 #

    好文章!

  3. electricscootershq.org 2016 年 12 月 28 日 上午 9:33 #

    创建基准预测。基准的难点当然在于未来。经济学家或气象学家在预测股市或天气方面的表现如何?不确定性是这项工作不可避免的一部分。

    • Jason Brownlee 2016 年 12 月 29 日 上午 7:14 #

      是的,我不确定我是否理解。也许你可以重述你的观点?

  4. Hans 2017 年 4 月 26 日 下午 6:37 #

    您好,我有一个问题。

    引用:“如果模型达到的性能低于或等于基准,
    ……该技术应予以修正或放弃”

    基准线在图中哪里?

    就示例图而言,“低于或等于基准线”是什么意思?

    红色和绿色的线描述了什么?

    我假设

    蓝线 = 训练数据
    绿线 = 测试数据
    红线 = 预测

    我这样做对吗?

    我不怕问愚蠢的问题。我学了很多,知道没有人无所不知 :-)。

    • Jason Brownlee 2017 年 4 月 27 日 上午 8:37 #

      这里,基准是你选择作为基准的模型。例如,一个持久性预测。

      • Hans 2017 年 4 月 27 日 下午 6:06 #

        那么我就必须比较基准模型和所选模型的 MSE 值
        来决定我所选的模型是否是预测某物的正确模型。

        基准模型的性能是

        测试得分:17730.518 MSE

        我已将洗发水数据输入到您的多层感知器示例中。

        测试 A)

        多层感知器模型在洗发水数据上的性能是

        训练得分:6623.57 MSE

        测试得分:19589.78 MSE

        MLP 模型测试分数:19589.78 MSE > 基准模型测试分数:17730.518 MSE

        结论

        所选的 MLP 模型预测了一些东西,因为它的 MSE 高于
        使用相同原始数据时的基准模型的 MSE。
        “这有一些意义”。

        到目前为止,这是对的吗?
        实际上,我希望更高的错误率是一个坏信号。

        测试 B)
        航空 LSTM 示例(用洗发水数据填充)

        testScoreMyTest = mean_squared_error(testY[0], testPredict[:,0])
        print(‘testScoreMyTest: %.2f MSE’ % (testScoreMyTest))

        航空 LSTM 测试得分:20288.20 MSE > 基准模型测试得分:17730.518 MSE

        结论

        航空 LSTM 示例在洗发水数据上进行了预测。
        这里我有一个问题。我想看看用户 Wollner 是否正确。
        https://machinelearning.org.cn/time-series-prediction-lstm-recurrent-neural-networks-python-keras/#comment-383708

        基准测试是否表明他错了???

        • Hans 2017 年 4 月 27 日 下午 6:51 #

          我也尝试使用 RMSE

          testScore = math.sqrt(mean_squared_error(test_y, predictions))
          print(‘测试得分: %.2f RMSE’ % (testScore))

          RMSE 值越小,模型的预测精度越好。

          http://docs.aws.amazon.com/machine-learning/latest/dg/regression-model-insights.html

          基准模型的性能是

          testScore = math.sqrt(mean_squared_error(test_y, predictions))
          print(‘测试得分: %.2f RMSE’ % (testScore))

          测试得分:133.16 RMSE

          我已将洗发水数据输入到您的多层感知器示例中。

          测试 A)
          多层感知器模型在洗发水数据上的性能是

          测试得分:139.96 RMSE > 133.16 RMSE

          测试 B)
          航空 LSTM 示例(用洗发水数据填充)

          测试得分:142.43 RMSE > 133.16 RMSE

          结论

          实际上,根据亚马逊的文档,我会说这两个模型
          与基准模型相比表现不佳,因此它们
          在专业上不适合解决“洗发水问题”。

          我这里是不是有什么误解?

        • Jason Brownlee 2017 年 4 月 28 日 上午 7:37 #

          其目的是将基准模型的性能与你在问题上评估的所有其他模型进行比较。

          关于 MSE,目标是最小化误差,因此值越小越好。

  5. Hans 2017 年 4 月 26 日 下午 6:52 #

    我尝试按照 https://matplotlib.net.cn/users/legend_guide.html 在图中添加标签

    例如

    pyplot.plot(train_y, label=’训练数据’)

    但我每次都必须进入绘图窗口的选项并检查“自动生成标签”才能查看我的声明。

    这种行为正常吗?

    • Jason Brownlee 2017 年 4 月 27 日 上午 8:38 #

      抱歉,我不是 matplotlib 专家,但你可以通过编程方式设置绘图的所有样式。

  6. Vlad 2017 年 12 月 10 日 上午 2:20 #

    很棒的帖子,我阅读了整个迷你课程,现在正尝试实现它。

    关于修改代码以接受多变量输入的任何提示?

    • Jason Brownlee 2017 年 12 月 10 日 上午 5:21 #

      谢谢。

      我希望将来能更详细地介绍多变量情况。

  7. Howell 2017 年 12 月 12 日 上午 10:12 #

    为什么持久性模型图的步骤 5 中有间隙?如何弥补图中的间隙?

    • Jason Brownlee 2017 年 12 月 12 日 下午 4:08 #

      不确定我是否明白?

      我们正在绘制不同的系列,因此它们在不同的位置开始和结束,并且具有不同的颜色。

      我想你可以绘制任何你喜欢的东西,例如将历史记录与预测连接起来?

  8. Aditya Sharma 2018 年 4 月 18 日 下午 9:05 #

    嘿,Jason
    您能告诉我如何获得下个月的预测值吗?
    假设我有 n 个月的数据,那么如何预测 n+1 个月的值呢?

  9. Ankit Tripathi 2018 年 5 月 21 日 下午 5:30 #

    嗨,Jason,

    有没有办法在通过 ARIMA 进行预测时设置上限和下限?这对于避免业务数据中的错误值很有用。

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

      你可以在评估之前对预测进行后处理。

      • Ankit Tripathi 2018 年 5 月 23 日 上午 3:26 #

        是的,我做到了。我以为,也许有一种方法可以像在 R 中的 Prophet 中那样将边界作为参数传递。无论如何,谢谢 Jason 🙂

  10. Andrea 2018 年 6 月 21 日 下午 5:41 #

    嗨,谢谢你的好帖子! 😀

    我读了很多你的文章。不过,我有一个问题。

    使用 LSTM 对随机游走过程(例如股票价格)进行预测会得到基线预测。

    我怎样才能避免这种情况?

    任何建议都会有所帮助。谢谢!

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

      有些问题是不可预测的,例如随机游走。

  11. KR Ju 2018 年 7 月 14 日 下午 7:04 #

    谢谢你的博客,Jason。
    即使读完了这篇文章,我也没有完全理解。
    根据你的说法,持久性模型不是预测。在本文中,“预测”这个词可能不合适,不是吗?

    你能告诉我吗;当我得到与原始数据图完全匹配的持久性图时,那意味着什么?
    Ju

    • Jason Brownlee 2018 年 7 月 15 日 上午 6:10 #

      这是一种预测,只是一个朴素的预测。

  12. KR Ju 2018 年 7 月 14 日 下午 7:08 #

    Jason,此外在这个博客中,

    如果我得到了与原始数据图完全匹配的基准线,我就不需要应用其他模型来解决目标问题了吗?

    Ju

    • Jason Brownlee 2018 年 7 月 15 日 上午 6:11 #

      如果持久性模型给出零误差,则意味着你的时间序列是一条平坦的直线(例如没有信息)。

      否则,也许你有一个 bug?

  13. Brian Stephans 2018 年 8 月 7 日 上午 4:49 #

    博士您好,

    我在加载数据时遇到了问题,我似乎总是遇到带有 datetime 的数据的问题,但似乎无法找出问题所在,我是 Python 新手。希望能帮助我,因为我非常喜欢您的网站。错误似乎在第 6 行

    /usr/local/bin/python3.7 /Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py
    回溯(最近一次调用)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3021 行,在 converter 中
    date_parser(*date_cols), errors='ignore')
    文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
    return datetime.strptime('190 ' +x, '%Y-%m')
    TypeError: strptime() 参数 1 必须是 str,而不是 numpy.ndarray

    处理上述异常时,发生了另一个异常

    回溯(最近一次调用)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3030 行,在 converter 中
    dayfirst=dayfirst),
    文件“pandas/_libs/tslibs/parsing.pyx”,第 434 行,在 pandas._libs.tslibs.parsing.try_parse_dates 中
    文件“pandas/_libs/tslibs/parsing.pyx”,第 431 行,在 pandas._libs.tslibs.parsing.try_parse_dates 中
    文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
    return datetime.strptime('190 ' +x, '%Y-%m')
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 577 行,在 _strptime_datetime 中
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 359 行,在 _strptime 中
    (data_string, format))
    ValueError: 时间数据 '190 1-01' 与格式 '%Y-%m' 不匹配

    处理上述异常时,发生了另一个异常

    回溯(最近一次调用)
    文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 8 行,在
    series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 678 行,在 parser_f 中
    return _read(filepath_or_buffer, kwds)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 446 行,在 _read 中
    data = parser.read(nrows)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1036 行,在 read 中
    ret = self._engine.read(nrows)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1922 行,在 read 中
    index, names = self._make_index(data, alldata, names)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1426 行,在 _make_index 中
    index = self._agg_index(index)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1504 行,在 _agg_index 中
    arr = self._date_conv(arr)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3033 行,在 converter 中
    return generic_parser(date_parser, *date_cols)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/date_converters.py”,第 39 行,在 generic_parser 中
    results[i] = parse_func(*args)
    文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
    return datetime.strptime('190 ' +x, '%Y-%m')
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 577 行,在 _strptime_datetime 中
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
    文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 359 行,在 _strptime 中
    (data_string, format))
    ValueError: 时间数据 '190 1-01' 与格式 '%Y-%m' 不匹配

    进程以退出代码 1 结束

  14. András Novoszáth 2018 年 10 月 9 日 上午 1:47 #

    嗨,很棒的帖子,我只是想知道为什么我们需要 for 循环来计算 predictions 和错误率,而对我来说似乎我们可以简单地使用以下行


    test_score = mean_squared_error(test_y, test_X)

    我错过了什么吗?

    • Jason Brownlee 2018 年 10 月 9 日 上午 8:46 #

      这更多的是方法论,你可以用任何你喜欢的东西替换持久性预测。

  15. Hossein 2019 年 3 月 12 日 下午 3:14 #

    但我认为这不仅仅是为了更清楚。t-1 完全是错误的,它应该是 t。谢谢 Jason!

  16. Leen 2019 年 4 月 1 日 下午 3:38 #

    你好 Jason,感谢你的精彩教程!!

    我们可以为多元时间序列建立持久性模型吗?

    • Jason Brownlee 2019 年 4 月 2 日 上午 8:03 #

      是的。

      • Leen 2019 年 4 月 3 日 下午 10:25 #

        但这样做,我们只取目标列,而丢弃所有其他列,对吗?

  17. Amin 2019 年 4 月 7 日 上午 3:04 #

    感谢您的出色工作,您是否仅通过查看图表就能发现模型是平稳的?文章提到数据可能显示出一些季节性成分?我们需要确认这一点吗?

  18. Lhicel Joyce Aytona 2019 年 4 月 27 日 上午 4:50 #

    如果机器学习无法超越持久性模型(使用 t-1 数据进行 t+1 预测)的 RMSE,该怎么办?我们能做些什么来改进模型?或者是否有其他方法来衡量模型的预测能力?

  19. Claire Taylor 2019 年 5 月 25 日 下午 3:03 #

    嗨,Jason,我想知道为什么预测模型看起来比测试数据错开了一步?我们的模型似乎比实际观测值晚了一点。那么如何纠正它呢?提前感谢。

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

      这被称为持久性模型,它是最简单的时间序列预测方法,用于与更高级的方法进行比较。

      • Louiza 2023 年 1 月 11 日 上午 3:46 #

        感谢您的精彩文章。它们非常有帮助。
        我正在尝试将 pytorch 预测基线应用于我的时间序列数据(太阳辐照度)。当我尝试预测少于 8 小时时,mse 等于或接近零,但当我进行其他预测时,mse 超过 100。
        这正常吗?
        以及
        pytorch 预测使用哪种基线。

        • James Carmichael 2023 年 1 月 11 日 上午 7:56 #

          嗨,Louiza……非常欢迎你!

          你可能正在处理回归问题并实现零预测误差。

          或者,你可能正在处理分类问题并实现 100% 的准确率。

          这很不寻常,原因有很多,包括:

          你不小心在训练集上评估了模型性能。
          你的保留数据集(训练集或验证集)太小或不具代表性。
          你的代码中引入了一个错误,它正在做一些与你预期不同的事情。
          你的预测问题很容易或微不足道,可能不需要机器学习。
          最常见的原因是你的保留数据集太小或不代表更广泛的问题。

          可以通过以下方法解决:

          使用 k 折交叉验证来估计模型性能,而不是训练/测试拆分。
          收集更多数据。
          使用不同的数据拆分进行训练和测试,例如 50/50。

  20. Ruth 2019 年 7 月 24 日 上午 6:58 #

    嗨,Jason – 我真的很喜欢这些教程!信息量很大。但有一个问题 – 我总是卡在所有练习的步进验证部分。当我执行代码 “test_score = mean_squared_error(test_y, predictions)” 时,我总是收到以下错误:

    “发现输入变量的样本数量不一致”

    有什么解决办法吗?我在洗发水、香槟和每日出生数据集上都遇到了相同的错误消息。非常感谢您的帮助!

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

      这可能表明 test_y 和 predictions 中的样本数量不匹配。

      也许你的示例中出现了 bug?

    • Girish LC 2020 年 8 月 7 日 下午 12:57 #

      train_X, train_y = train[:,0], train[:,1]
      test_X, test_y = test[:,0], test[:,1]

  21. thiagu 2019 年 10 月 1 日 下午 1:49 #

    嗨,杰森,
    我对步进验证和持久性模型有点困惑……我无法理解其目的……你能给我一个清晰的解释吗……

  22. thiagu 2019 年 10 月 1 日 下午 4:17 #

    你好 Jason,
    我可以在多元时间序列数据中使用步进验证吗?

  23. thiagu 2019 年 10 月 3 日 上午 12:51 #

    谢谢你……

  24. Tom Leung 2020 年 2 月 16 日 下午 7:20 #

    嗨,Jason,

    感谢您关于时间序列预测的精彩文章!

    我想做多步预测,哪种基准模型是好的选择?如果我没理解错,持久性模型只是将时间 t-1 的值复制为时间 t 的预测,当预测多步时,它将是一条直线。

    谢谢!

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

      持久性是一个很好的基准模型,适用于一步和多步预测。

      • Eduardo 2020 年 7 月 31 日 上午 11:41 #

        让我理解一下,您创建了一个持久性模型,它将问题框架为监督问题并查看性能,那么解决这个问题的最佳选择是什么?
        这只是输入 (x) 和预测 (y) 吗?还是有其他更好的选择?

        • Jason Brownlee 2020 年 7 月 31 日 下午 1:41 #

          抱歉,我不明白你的问题,你能详细说明或重述一下吗?

  25. Nicholas Jallan 2020 年 4 月 6 日 下午 6:06 #

    嗨,Jason,

    我觉得有些地方大错特错:你用测试数据进行预测……它应该从训练数据进行……测试数据应该用作真实值并与预测进行比较。
    目前,你所做的只是值的偏移复制粘贴。这毫无用处,绝不是任何形式的预测。

  26. Girish LC 2020 年 8 月 7 日 下午 12:36 #

    嗨,Jason,

    非常感谢您的精彩解释,我成了您的粉丝。

    能给我处理多变量预测的链接吗?

    问题:那么对于相同的数据集,如果我们构建任何其他模型,MSE 值应该小于 17,730 吗?我说的对吗?

  27. Priya 2020 年 10 月 8 日 下午 8:29 #

    嗨,在原始数据上应用基线模型(例如持久性)是必需的,还是可以在应用持久性模型之前应用差分或归一化?

    • Priya 2020 年 10 月 8 日 下午 8:47 #

      实际上,在我的案例中,原始数据上的持久性模型给出了糟糕的结果,r2-score 为负数。但是当我对持久性模型应用季节性差分时,它给出了非常好的结果。

      请给我一些建议,告诉我为什么会这样,我应该怎么做?

      • Jason Brownlee 2020 年 10 月 9 日 上午 6:44 #

        如果你愿意,可以使用具有季节性差分的持久性模型作为基准。这是你的项目!

    • Jason Brownlee 2020 年 10 月 9 日 上午 6:43 #

      是的,基准应该不做/少做假设,并在原始数据上操作。

  28. pals 2020 年 10 月 29 日 下午 7:25 #

    你好,
    我需要使用移动平均线(窗口大小为 3、7 和 30),然后计算 MAE 和 RMSE 吗?
    我该怎么做?此外,shift(1) 和步进法在这种情况下是如何应用的?
    shift(1) 与移动平均线的窗口大小 = 1 相同吗?

  29. Ben Bartling 2020 年 12 月 3 日 上午 7:57 #

    嗨,Jason,

    如果你的项目是每次预测 24 个样本。每小时数据预测一天。你能否建立一个反映这个过程的持久性模型?不是一次一个数据样本,而是一次 24 个样本。

    例如,对于我测试数据集中(大约半年)的每一天,我的持久性模型将一次预测 24 个样本,这将是昨天的数据(24 个样本)

    希望这有道理。我想我然后可以将这个持久性模型的 RMSE 结果与我实际的机器学习时间序列预测模型的相同测试数据集的一天预测结果的 RMSE 进行比较……对吗?

    • Jason Brownlee 2020 年 12 月 3 日 上午 8:25 #

      当然,我想你正在描述多步预测,例如输入若干时间步并预测若干时间步(7 天、24 小时、10 分钟等)。博客上有很多很多示例。

  30. Qizal Ashfaq 2021 年 3 月 24 日 上午 10:26 #

    持久性模型可以进行多步预测吗?如何将其用作多元多步预测的基准模型?

    • Jason Brownlee 2021 年 3 月 25 日 上午 4:37 #

      当然,取每个变量的最后一个值,并将其用于每个预测步骤。

  31. Paul Holdsworth 2021 年 7 月 12 日 上午 11:08 #

    嗨,Jason,

    在以下代码中,'190+x' 的目的是什么?

    return datetime.strptime('190'+x, '%Y-%m')?

    谢谢

  32. Victor 2021 年 8 月 5 日 下午 9:37 #

    嗨,Jason,感谢您的文章——这篇以及其他很多文章!

    只是一个小小的提醒

    from pandas import datetime – 导致警告
    “FutureWarning: pandas.datetime 类已弃用,并将在未来的 pandas 版本中移除。请改从 datetime 模块导入。”

    因此,在我的代码中,我已按照建议进行了更改
    import datetime as dt

  33. Huy Truong 2022 年 3 月 8 日 上午 7:16 #

    嗨,Jason,你能解释一下你的以下结论吗:“销售数据存在上升趋势和逐月波动,这突显了持久性技术的局限性。”

    我不确定“逐月波动”

    — 谢谢!

  34. nate 2022 年 4 月 3 日 上午 8:14 #

    我不太确定你所说的“不需要模型训练或再训练,因此本质上,我们逐个时间步地遍历测试数据集并获取预测”是什么意思。如果模型不使用训练数据,那么将数据分成训练和测试的意义何在?根据我对此主题的理解,我是否可以说所有这些的目的是为了获得均方误差,并将其用作模型选择的基线?

    • James Carmichael 2022 年 4 月 3 日 上午 10:32 #

      嗨,Nate……如果可能,你应该有单独的训练、测试和验证数据集。

  35. Domi Bruns 2024 年 1 月 30 日 下午 11:59 #

    嘿,Jason

    谢谢你,真的很有帮助!另外,非常感谢你的博客,多年来它一直非常有帮助——在这个快速发展的领域中,它能持续有用真是太棒了!!

    关于这篇博客文章的两点快速反馈
    – test_score = ((predictions – test_y) ** 2).mean() – 你从 sklearn 导入的功能也能做同样的事情,但让读者看到这不是导入函数背后的高深科学可能会很好 🙂
    – 仅复制分步之间的代码片段会导致库无法正确导入,例如第一个片段有 from pandas import datetime。对于任何使用过这些库的人来说,这没什么问题,但对于初学者来说可能有点棘手!

    • James Carmichael 2024 年 1 月 31 日 上午 10:58 #

      嗨,Domi……非常欢迎你!感谢你的反馈!我们很感激!

发表回复

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