Python 中用于时间序列预测的指数平滑法简明介绍

指数平滑法是一种用于单变量时间序列预测的方法,它可以扩展以支持具有系统性趋势或季节性成分的数据。

它是一种强大的预测方法,可以作为流行的 Box-Jenkins ARIMA 系列方法的替代方案。

在本教程中,您将了解用于单变量时间序列预测的指数平滑法。

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

  • 什么是指数平滑法,以及它与其他预测方法有何不同。
  • 三种主要的指数平滑法及其配置方法。
  • 如何在 Python 中实现指数平滑法。

启动您的项目,阅读我的新书《Python 时间序列预测入门》,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

A Gentle Introduction to Exponential Smoothing for Time Series Forecasting in Python

Python 中用于时间序列预测的指数平滑法简明介绍
照片由 Wolfgang Staudt 提供,保留部分权利。

教程概述

本教程分为4个部分,它们是:

  1. 什么是指数平滑法?
  2. 指数平滑法的类型
  3. 如何配置指数平滑法
  4. Python 中的指数平滑法

什么是指数平滑法?

指数平滑法是一种用于单变量数据的时间序列预测方法。

像 Box-Jenkins ARIMA 系列方法这样的时间序列方法会建立一个模型,其中预测是近期过去观测值或滞后值的加权线性组合。

指数平滑预测方法与之类似,预测是过去观测值的加权和,但该模型明确使用指数衰减的权重来表示过去的观测值。

具体来说,过去的观测值以几何衰减的比率进行加权。

使用指数平滑法生成的预测是过去观测值的加权平均值,随着观测值变老,权重呈指数衰减。换句话说,观测值越近期,其关联权重越高。

— 第 171 页,预测:原理与实践,2013。

指数平滑法可以被视为时间序列预测中流行的 Box-Jenkins ARIMA 方法类别的同行和替代方案。

总而言之,这些方法有时被称为 ETS 模型,指代了对误差 (Error)、趋势 (Trend) 和季节性 (Seasonality) 的显式建模。

指数平滑法的类型

指数平滑法时间序列预测方法有三种主要类型。

一种假设没有系统性结构(简单方法),一种扩展方法,它明确处理趋势,以及最先进的方法,它增加了对季节性的支持。

简单指数平滑法

简单指数平滑法,简称 SES,也称为简单指数平滑法,是一种用于无趋势或季节性的单变量数据的时间序列预测方法。

它需要一个参数,称为 alphaa),也称为平滑因子或平滑系数。

此参数控制先前时间步长观测值指数衰减的速率。Alpha 通常设置为 0 到 1 之间的值。较大的值意味着模型主要关注最近的过去观测值,而较小的值意味着在进行预测时会考虑更多的历史。

接近 1 的值表示快速学习(即,只有最近的值会影响预测),而接近 0 的值表示慢速学习(过去的观测值对预测有很大影响)。

— 第 89 页,R 实用时间序列预测,2016。

超参数

  • Alpha:水平的平滑因子。

双重指数平滑法

双重指数平滑法是指数平滑法的一个扩展,它明确地为单变量时间序列中的趋势增加了支持。

除了用于控制水平的平滑因子的 alpha 参数外,还增加了一个额外的平滑因子来控制趋势变化影响的衰减,称为 betab)。

该方法支持以不同方式变化的趋势:加法和乘法,分别取决于趋势是线性的还是指数型的。

具有加法趋势的双重指数平滑法通常被称为 Holt 线性趋势模型,以该方法开发者 Charles Holt 的名字命名。

  • 加法趋势:具有线性趋势的双重指数平滑法。
  • 乘法趋势:具有指数趋势的双重指数平滑法。

对于更长期的(多步)预测,趋势可能会持续不切实际。因此,随着时间的推移,减少趋势的大小可能很有用。

阻尼意味着将未来时间步长的趋势大小减小到一个直线(无趋势)。

Holt 线性方法生成的预测在未来显示出恒定的趋势(增加或减少)。指数趋势方法生成的预测甚至更极端……基于此观察……引入了一个参数,该参数在未来某个时候将趋势“阻尼”为一条直线。

— 第 183 页,预测:原理与实践,2013。

与趋势本身的建模一样,我们可以使用相同的原理来阻尼趋势,特别是加法或乘法以获得线性的或指数的阻尼效果。阻尼系数 Phip)用于控制阻尼速率。

  • 加法阻尼:线性阻尼趋势。
  • 乘法阻尼:指数阻尼趋势。

超参数

  • Alpha:水平的平滑因子。
  • Beta:趋势的平滑因子。
  • 趋势类型:加法或乘法。
  • 阻尼类型:加法或乘法。
  • Phi:阻尼系数。

三重指数平滑法

三重指数平滑法是指数平滑法的一个扩展,它明确地为单变量时间序列增加了对季节性的支持。

此方法有时称为 Holt-Winters 指数平滑法,以该方法的两位贡献者 Charles Holt 和 Peter Winters 的名字命名。

除了 alpha 和 beta 平滑因子外,还增加了一个新的参数,称为 gammag),它控制对季节性成分的影响。

与趋势一样,季节性可以建模为加法或乘法过程,以获得线性的或指数的季节性变化。

  • 加法季节性:具有线性季节性的三重指数平滑法。
  • 乘法季节性:具有指数季节性的三重指数平滑法。

三重指数平滑法是指数平滑法中最先进的变体,通过配置,它也可以开发双重和单重指数平滑模型。

作为一种自适应方法,Holt-Winters 指数平滑法允许水平、趋势和季节性模式随时间变化。

— 第 95 页,R 实用时间序列预测,2016。

此外,为确保正确建模季节性,必须指定季节性周期中的时间步数(周期)。例如,如果序列是月度数据,并且季节性周期每年重复一次,则周期=12。

超参数

  • Alpha:水平的平滑因子。
  • Beta:趋势的平滑因子。
  • Gamma:季节性的平滑因子。
  • 趋势类型:加法或乘法。
  • 阻尼类型:加法或乘法。
  • Phi:阻尼系数。
  • 季节性类型:加法或乘法。
  • 周期:季节性周期的时间步数。

如何配置指数平滑法

所有模型超参数都可以显式指定。

这可能对专家和初学者来说都很有挑战性。

相反,通常使用数值优化来搜索并找到导致最低误差的模型的平滑系数(alphabetagammaphi)。

[…] 获得任何指数平滑法中未知参数的更稳健和客观的方法是从观测数据中估计它们。 […] 未知参数和任何指数平滑法的初始值可以通过最小化 SSE [平方误差和] 来估计。

— 第 177 页,预测:原理与实践,2013。

指定趋势和季节性变化类型的参数,例如它们是加法还是乘法,以及是否应阻尼它们,必须显式指定。

Python 中的指数平滑法

本节介绍如何在 Python 中实现指数平滑法。

Python 中指数平滑法的实现由 Statsmodels Python 库提供。

这些实现基于 Rob Hyndman 和 George Athana­sopou­los 的优秀著作“预测:原理与实践”(2013 年)中对该方法的描述以及他们在其“forecast” R 包中的 R 实现。

简单指数平滑法

简单指数平滑法或简单平滑法可以通过 SimpleExpSmoothing Statsmodels 类在 Python 中实现。

首先,必须实例化 SimpleExpSmoothing 类并传入训练数据。然后调用 fit() 函数,提供拟合配置,特别是称为 smoothing_levelalpha 值。如果未提供或设置为 None,模型将自动优化该值。

fit() 函数返回一个 HoltWintersResults 类实例,其中包含学习到的系数。可以在结果对象上调用 forecast()predict() 函数来生成预测。

例如

双重和三重指数平滑法

可以使用 ExponentialSmoothing Statsmodels 类在 Python 中实现单重、双重和三重指数平滑法。

首先,必须实例化 ExponentialSmoothing 类,同时指定训练数据和模型的一些配置。

具体来说,您必须指定以下配置参数:

  • trend:趋势分量类型,可以是“add”(加法)或“mul”(乘法)。通过将其设置为 None 可以禁用趋势建模。
  • damped:趋势分量是否应该被阻尼,可以是 TrueFalse
  • seasonal:季节性分量类型,可以是“add”(加法)或“mul”(乘法)。通过将其设置为 None 可以禁用季节性建模。
  • seasonal_periods:季节性周期的步数,例如,对于每年重复的季节性结构,12 个月为 12(更多信息)。

然后可以通过调用 fit() 函数在训练数据上拟合模型。

此函数允许您指定指数平滑模型的平滑系数,或者让它们被优化。默认情况下,它们被优化(例如,optimized=True)。这些系数包括:

  • smoothing_levelalpha):水平的平滑系数。
  • smoothing_slopebeta):趋势的平滑系数。
  • smoothing_seasonalgamma):季节性分量的平滑系数。
  • damping_slopephi):阻尼趋势的系数。

此外,fit 函数可以在建模之前执行基本数据准备;具体来说:

  • use_boxcox:是否对序列执行幂变换(True/False)或指定变换的 lambda。

fit() 函数将返回一个 HoltWintersResults 类实例,其中包含学习到的系数。可以在结果对象上调用 forecast()predict() 函数来生成预测。

进一步阅读

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

教程

书籍

API

文章

总结

在本教程中,您了解了单变量时间序列预测的指数平滑法。

具体来说,你学到了:

  • 什么是指数平滑法,以及它与其他预测方法有何不同。
  • 三种主要的指数平滑法及其配置方法。
  • 如何在 Python 中实现指数平滑法。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

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

Introduction to Time Series Forecasting With Python

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

...只需几行python代码

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

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

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

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

查看内容

68 条对“Python 指数平滑法时间序列预测入门”的回复

  1. Sandeep 2018年8月20日晚上10:18 #

    嗨,Jason,

    非常感谢您的帖子。这是非常有用的资源。我想知道如何安装“statsmodels.tsa.holtwinters”,因为我在运行命令时遇到了错误。
    from statsmodels.tsa.holtwinters import ExponentialSmoothing

    似乎 statsmodels 包没有这个命令。
    您能帮我解决这个问题吗?

    谢谢,
    Sandeep

    • Jason Brownlee 2018年8月21日早上6:16 #

      这很大程度上取决于您的平台,例如

      或者,可以尝试这个教程
      https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/

      • Ehsan E Nasiri 2018年8月23日凌晨2:15 #

        你好 Jason,

        我正在处理一个大型数据集的预测项目,该数据集包含 15 列和约 9000 行。问题是我必须根据 14 列独立数据预测未来两年的结果,并且结果应该是二元的(0,1)。
        我在网上看到了许多预测问题,但它们大多是基于仅一列独立数据进行预测,且结果不是二元的。
        是否有任何方法可以指导我或推荐任何参考资料来解决这个问题?

        在此先感谢,
        Ehsan

        • Jason Brownlee 2018年8月23日早上6:15 #

          是的,神经网络可以轻松地预测多个变量,可以从 MLP 开始。

        • Landry Noulawe 2020年8月25日晚上9:57 #

          也许您的问题是二元分类而不是预测问题。请仔细看看。

    • Satakarni 2018年10月30日晚上6:56 #

      嗨 Jason

      感谢您的帖子。
      我在 R 和 Python 中对 DES 方法的结果不一致。Python ETS 是否不是 Hyndman 等人(2008 年)所描述的完整实现?R ETS 方法有太多控制标志?请澄清。
      ————–

      R 代码

      ——————
      > x

      一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月

      1 36 78 35 244 25 283 42 6 59 5 47 20

      2 0 0 5 38 16 143 14 37 60 2 55 0

      3 0

      > fit forecast::forecast(fit, h=1)

      点预测 Lo 80 Hi 80 Lo 95 Hi 95

      二月 3 -2.728456 -96.36635 90.90943 -145.9353 140.4783

      >

      ———————
      Python
      ———————-

      dft
      Out[42]
      quantity
      month_end
      2016-01-31 36
      2016-02-29 78
      2016-03-31 35
      2016-04-30 244
      2016-05-31 25
      2016-06-30 283
      2016-07-31 42
      2016-08-31 6
      2016-09-30 59
      2016-10-31 5
      2016-11-30 47
      2016-12-31 20
      2017-01-31 0
      2017-02-28 0
      2017-03-31 5
      2017-04-30 38
      2017-05-31 16
      2017-06-30 143
      2017-07-31 14
      2017-08-31 37
      2017-09-30 60
      2017-10-31 2
      2017-11-30 55
      2017-12-31 0
      holt_r = ets.ExponentialSmoothing(np.abs(dft), trend=’additive’, damped=False, seasonal=None).fit()
      C:\Anaconda\lib\site-packages\statsmodels\tsa\base\tsa_model.py:171: ValueWarning: 未提供频率信息,因此将使用推断的频率 M。
      % freq, ValueWarning)

      holt_r.forecast(1)
      Out[44]
      2018-01-31 13.049129
      Freq: M, dtype: float64

  2. Elie Kawerk 2018年8月20日晚上11:52 #

    嗨,Jason,

    Hyndman 已发布了《预测、原理与实践》的新版本。可免费获取:https://otexts.org/fpp2/

    祝好,
    Elie

  3. Karmen 2018年8月21日晚上2:25 #

    感谢分享——内容清晰、易懂,还有不错的后续资源!

  4. Sandeep 2018年8月24日早上9:16 #

    感谢您分享关于指数平滑法的非常精彩且有用的内容。

  5. Ahmed Elshami 2018年10月6日早上9:52 #

    嗨,Jason博士,

    我想知道一件事。

    假设我平滑了整个时间序列数据,然后我拟合模型并进行了预测。
    我的问题是,我应该对预测进行反平滑还是不进行反平滑来计算误差?

    • Jason Brownlee 2018年10月6日中午11:44 #

      如果您的平滑目标是使问题更容易学习,那么则无需更改。

      反平滑具体是什么样的?添加随机噪声?

  6. Alice 2018年12月21日凌晨2:23 #

    嗨 Jason

    我有一些关于序列预测可能方法的问题。

    输入 y_0=100, y_1=y_0*0.96, y_2=y_1*0.97=y_0*0.96*0.97, y_3=y_2*0.978=y_0*0.96*0.97*0.978

    预测 y_k

    这看起来像 y_k 具有指数函数的动态衰减因子。
    y_k=y_0*((D_k)^(k))

    如果我使用 0.96,0.97.0.978 的平均变化率
    那么 y_k=y_0*(0.96^k)*(((0.97/0.96)+(0.978/0.97))/2)^(1+2+3..k) =y_0*(0.96^k)*(1.009)^(k*(k+1)/2)

    那么 log(y_k)=a+b*k+c*(k^2)。

    我应该使用三重指数平滑法还是 LSTM 来预测 y_k?还是有其他可能的方法?

    如果输入 y_0, y_1, y_2 是不确定的。例如 y_0=100,101或103 y_1=100*0.963, 101*0.964或103*0.966。我应该使用哪种方法来预测 y_k(只有一个值)?

    • Jason Brownlee 2018年12月21日早上5:30 #

      可以尝试多种方法,找出最适合您特定数据集的方法。

  7. Mridul 2019年3月8日凌晨4:23 #

    嗨 Jason,谢谢您。这真的很有帮助。

    您能否也介绍一下 Python 中的 Brown 双重或 LES 模型?

  8. Sheetal 2019年4月8日凌晨3:50 #

    嗨,Jason,

    当我使用 statsmodel 运行 SimpleExpSmoothing 和 Holtwinters 模型时,我收到以下错误。

    AttributeError: ‘Holt’ object has no attribute ‘_get_prediction_index’

    这是我的代码:

    from statsmodels.tsa.holtwinters import ExponentialSmoothing,Holt,SimpleExpSmoothing
    fit2 = SimpleExpSmoothing(np.asarray(Train['Count']))
    fit2._index = pd.to_datetime(Train.index)
    pred = fit2.fit()
    y_hat_avg['SES'] = pred.forecast(len(valid))


    谢谢!

    • Jason Brownlee 2019年4月8日早上5:58 #

      很抱歉听到这个消息,您能否确认您的 statsmodels 版本是最新的?

  9. Jem94 2019年6月29日晚上6:26 #

    嗨,Jason,

    我想问一下,是否有迭代函数,每次有新数据进来时,不需要重新计算 ExponentialSmoothing,而只需添加新数据(更新模型)?

    • Jason Brownlee 2019年6月30日早上9:35 #

      好问题。

      我相信您可能需要自己实现。

  10. Amit 2019年7月7日晚上8:40 #

    作为这个分析领域的新手,我该如何熟悉统计学术语?如何最好地让自己适应统计学术语?

  11. DataNoob2020 2019年8月23日凌晨4:11 #

    你好,Jason!
    我看到您在示例中使用了 ExponentialSmoothing 来实现双重指数平滑法。您能解释一下为什么没有使用 statsmodels 的 Holt API 吗?我已包含我所指模型的链接。https://statsmodels.cn/dev/generated/statsmodels.tsa.holtwinters.Holt.html

    看起来两者都可以用于双重指数平滑法。只是想知道您为什么选择一种而不是另一种。谢谢!

    • Jason Brownlee 2019年8月23日早上6:34 #

      没什么特别的原因,我只是为了示例的一致性。

      您是否更喜欢一种而不是另一种?如果喜欢,为什么?

      • DataNoob2020 2019年8月23日早上6:48 #

        谢谢回复!我是一名新手,大约一年半前才自学了 Python。

        我使用了您的方法,然后尝试了 Holt 方法,但据我所见,结果却是一团糟。与关闭季节性的 ExponentialSmoothing 相比,结果存在很大的差异。

        我不想劫持这次对话,但我有一个关于预留(holdout)预测的问题,如果您不介意的话。我在您的一篇指南中看到您计算了实际值与预测值的 RMSE,但我认为您只计算了一个时期。我目前正在进行为期 6 个月的预留预测,最初只是像这样运行我的模型:

        # model2 = ExponentialSmoothing(data[:-6], trend=’add’, seasonal=None, damped=False).fit(smoothing_level=0.1, smoothing_slope=0.1, optimized=False)
        # fcast2 = model2.forecast(6)

        然后我将使用预测值与实际值来计算 RMSE。有人告诉我这样做不是最佳实践,因为我应该一次一个时期地进行预留预测。基本上,我会将 model2.forecast(1) 应用于 data[:-6],然后将 model3.forecast(1) 应用于 data[:-5],依此类推。

        如果您不介意,我将不胜感激!

        • Jason Brownlee 2019年8月23日晚上2:07 #

          好问题。

          这取决于您想如何使用模型,以及您想如何评估它。

          例如,如果最重要的是单步预测,那么就评估其在此方面的能力。如果是 n 步预测,那么您可能想知道在多次预测中每一步的平均误差。

          这篇帖子可能为您提供有关向前滚动验证的一些想法。
          https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/

          • DataNoob2020 2019年8月23日晚上11:45 #

            谢谢!这篇文章太棒了。看起来向前滚动验证是正确的方法,尽管运行所有这些双重指数平滑会大大增加运行时间。我想我需要重写我的 DoubleExpo 函数以使用多进程或多线程。

            您接受比特币捐赠吗?您的网站在我预测的道路上非常有帮助。

          • Jason Brownlee 2019年8月24日早上7:52 #

            很好,是的,一个为速度而定制的实现也会是我的选择。

            谢谢!

            我接受 PayPal 捐赠,如果那还有效的话。
            https://machinelearning.org.cn/support/

  12. edgar panganiban 2019年10月22日晚上2:29 #

    我想进行单步预测,使用以下代码:

    from statsmodels.tsa.holtwinters import HoltWintersResults

    model_fit_se = HoltWintersResults.initialize(‘model_se.pkl’,smoothing_level=0.8,smoothing_slope=0.2,optimized=False)
    yhat = model_fit_se.forecast()[0]
    print(‘Predicted: %.3f’ % yhat)

    但我得到了这个错误:

    TypeError: initialize() 缺少 2 个必需的位置参数:“model”和“params”

    我认为问题出在参数部分……如何解决?

    • Jason Brownlee 2019年10月23日上午6:28 #

      抱歉,我没有好建议,或许可以尝试把你的代码和错误发布到stackoverflow上?

  13. Kenny Shu 2019年10月31日上午12:45 #

    嗨,Jason,

    非常直观的文章!我想知道您是否知道如何处理关于时间窗口的最优准则。例如,我想选择一个模型,该模型优化未来12个周期数据的MSE之和,而不是仅仅优化下一个周期。

    如何根据您的模型实现这一目标?

    提前感谢!

  14. Shubhendu Dwivedi 2019年12月31日下午5:40 #

    Jason您好,您能告诉我如何在Python中计算指数平滑的置信区间吗?也就是说,在预测的同时获得CI?

  15. Zee 2020年3月7日下午1:20 #

    抱歉,也许我错过了什么。如果fit方法是自动优化的,为什么我们要进行网格搜索?

  16. Marco 2020年4月8日下午2:22 #

    抱歉,我有一个问题,我无法使用predict,也不知道为什么。你能帮我吗?


    from statsmodels.tsa.holtwinters import SimpleExpSmoothing
    data=y
    model=SimpleExpSmoothing(data)
    model1=model.fit
    yhat=model1.predict(21)

    plt.figure()
    plt.plot(yhat)
    回溯(最近一次调用)

    File “”, line 5, in
    yhat=model1.predict(21)

    AttributeError: ‘function’ object has no attribute ‘predict’
    我不确定为什么没有predict

    • Jason Brownlee 2020年4月9日上午7:54 #

      调用fit()后不需要再赋值给model1。它已经被赋值了。

  17. Sreekar 2020年4月8日下午9:04 #

    嗨,Jason,

    我想了解更多关于平滑值和阻尼值是什么以及如何选择它们的信息?它们的范围是多少?如果您有相关文章,请与我分享。

    提前感谢!!

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

      是的,请参阅“更多阅读”部分中列出的参考文献。

  18. BEKHZOD HAMIDOVICH KUZIBOEV 2020年4月22日上午5:55 #

    Jason Brownlee,我将引用此页面。您能提供正式的引用链接吗?我的意思是,此页面上的信息是否属于您的任何研究论文?

  19. Hamsapriye 2020年5月6日上午2:28 #

    您好!在哪本电子书中可以找到以上主题“Python中指数平滑时间序列预测的温和介绍”?非常好。我没有在《Python时间序列预测导论》中找到。

  20. John 2020年5月12日下午5:15 #

    嗨,Jason,

    我想要“data”本身平滑后的结果。这些是正确的步骤吗:用“data”拟合SimpleExpSmoothing。然后对“data”运行.predict?谢谢。

  21. Oxana 2020年5月15日上午11:38 #

    嗨 Jason,
    非常感谢您发布的所有帖子。它们非常有帮助,我总是回来阅读您的帖子。
    我有一个关于如何处理HoltWinters数据缺失的问题。
    我应该填充缺失的数据吗?
    例如,当我使用LineraRegression获取线性趋势时,我会考虑日期之间的间隔来移动索引,并将索引用作X。

    原始df:移动后的df
    ind date value ind date value
    0 2002-10-02 10 0 2002-10-02 10
    1 2002-10-03 11 1 2002-10-03 11
    2 2002-10-05 10 3 2002-10-05 10
    3 2002-10-06 13 4 2002-10-06 13
    …… ……

    对于HoltWinters,最好的方法是什么?使用插值/外插?

    您对HoltWinters有什么建议?SARIMA也是同样的问题。
    谢谢你

  22. Yogesh Agrawal 2020年6月4日下午4:18 #

    嘿Jason,当我使用ETS [holtwinter]并设置以下参数时

    数据 – 2015至2020年(月度频率)

    训练期 – 2015至2019年
    测试期 – 2019年至2020年

    当我预测13或14个月时,我看到数字在12个月后重复出现,即第1个月的数字出现在第13个月,依此类推……。

    您能建议我可能出了什么问题吗?

    我的ETS代码如下

    def ETS_method_Updated(train_df,test_df)
    ets_model = ExponentialSmoothing(endog=train_df[‘Sales Retail’],damped=True,trend=”add”,seasonal=’mul’,seasonal_periods=12).fit()
    predicted_val_test_ets = ets_model.predict(start=test_df.index.min(),end=test_df.index.max())
    fitted_val_ets = ets_model.fittedvalues
    In_sample_mape_ets = mean_absolute_percentage_error(train_df[‘Sales Retail’],fitted_val_ets)
    out_of_sample_mape_ets = mean_absolute_percentage_error(test_df[‘Sales Retail’],predicted_val_test_ets)

    return ets_model,fitted_val_ets,predicted_val_test_ets,In_sample_mape_ets,out_of_sample_mape_ets

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

      或许可以探索模型的其他配置?
      或许在建模之前尝试进行数据预处理?
      也许尝试其他模型?

  23. ymj 2021年1月11日上午9:42 #

    最新的statsmodels Python库在statsmodels.tsa.holtwinters.ExponentialSmoothing中会出现导入错误。

  24. Apoorva Awasthi 2021年1月28日凌晨12:42 #

    嗨,Jason,

    感谢您的信息丰富的博客……!
    我的数据集有一些负的endog值,因此它给了我一个错误。

    “ValueError: endog必须是严格正值,当使用乘法趋势或季节性成分时。”
    我不确定为什么会给我这个错误。您能解释一下概念/逻辑吗?

    • Jason Brownlee 2021年1月28日上午6:00 #

      这很令人惊讶。我以前没见过这个,抱歉。

  25. ALINAITWE WILFRED 2021年4月30日下午6:26 #

    非常感谢您发布的最佳帖子,事实上,我的目标是攻读统计学硕士学位,以便在BBA之后能更深入地探索这些内容。

  26. alessandro 2021年10月9日凌晨2:32 #

    你好Jason,谢谢你的博客!

    我想知道您是否可以就如何计算与指数平滑预测相关的误差提供任何建议?谢谢!

    • Adrian Tam
      Adrian Tam 2021年10月13日凌晨5:36 #

      为什么标准的(例如,均方误差)在这里不适用?

  27. Apoorva Awasthi 2023年2月21日下午4:52 #

    嗨,Jason,

    感谢您的博客。它非常有信息量。我想理解,是否可以将指数平滑作为一种预处理技术(即,在将数据馈入SARIMAX/神经网络模型之前,使用指数平滑来平滑数据)?

    如果是,我们如何确定数据在输入模型之前需要平滑?
    提前感谢。

留下回复

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