Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >霍尔特-温特斯的时间序列预测

霍尔特-温特斯的时间序列预测

作者头像
磐创AI
发布于 2024-04-03 11:17:18
发布于 2024-04-03 11:17:18
67400
代码可运行
举报
运行总次数:0
代码可运行

背景

我们讨论一组非常知名的预测模型,指数平滑。指数平滑的基本原则是将更多的权重放在最近的观测值上,而在历史观测值上放置更少的权重,以用来预测时间序列。

最基本的指数平滑模型是(有趣的是)简单指数平滑,也称为单一指数平滑。这个模型只预测时间序列的水平,不考虑趋势或季节性。要了解有关此模型的更多信息,请查看我的先前文章:

https://towardsdatascience.com/forecasting-with-simple-exponential-smoothing-dd8f8470a14c

从这个简单模型出发的下一步是霍尔特的线性趋势方法,也称为双指数平滑。顾名思义,该模型包括趋势以及水平。如果想了解有关霍尔特方法的更多信息,请参阅以下链接:

https://towardsdatascience.com/forecasting-with-holts-linear-trend-exponential-smoothing-af2aa4590c18

最后,从霍尔特方法出发的下一步是找到一种方法,将季节性纳入指数平滑模型中。这就是霍尔特-温特斯(三重指数平滑)发挥作用的地方!

在本文中,我们将回顾指数平滑的理论,深入探讨霍尔特-温特斯模型如何包括季节性的数学原理,最后通过Python进行实际示例演示。

霍尔特-温特斯模型理论

简单指数平滑回顾

让我们快速回顾一下简单指数平滑的工作原理:

有关简单指数平滑的详细解释,请参阅我之前的文章:

其中ŷ_{t+1}是我们要预测的值,y_t 是最近观察到的值,ŷ_{t-1} 是我们以前的预测,α 是平滑因子(0 ≤ α ≤ 1)。

该模型的分量形式是:

其中 h 是我们要预测的时间步,l_t = ŷ_{t+1} 明确表示这是模型的水平分量。

霍尔特的线性趋势方法回顾

霍尔特的线性趋势模型将趋势分量引入到预测中:

其中 b_t 是预测的趋势,b_{t-1} 是先前的预测趋势,β 是趋势平滑因子(0 ≤ β ≤ 1)。

有关霍尔特线性趋势方法的详细解释,请参阅我的先前文章。

霍尔特-温特斯

如上所述,霍尔特-温特斯模型通过将季节性纳入预测进一步扩展了霍尔特的线性趋势方法。季节性的添加导致了两种不同的霍尔特-温特斯模型,加法和乘法。

这两种模型之间的区别在于季节性波动的大小。对于加法模型,季节性波动主要是恒定的。然而,对于乘法模型,波动与该特定时间的时间序列值成比例。有关加法和乘法时间序列模型的更多信息,请查看我的先前博客文章:

https://towardsdatascience.com/time-series-decomposition-8f39432f78f9

现在让我们来看看这两种霍尔特-温特斯模型的方程式:

https://otexts.com/fpp3/holt-winters.html

加法模型:

其中 m 是时间序列的季节性,s_t 是季节性预测分量,s_{t-m} 是上一季度的预测,γ 是季节性分量平滑因子(0 ≤ γ ≤ 1-α)。

乘法模型:

这些方程式的细节我们不再详细讨论,它们的目的是计算时间序列的趋势线,并按季节性变化对趋势线上的值进行加权。

值得注意的是,还有其他形式的这些方程,其中包含一个阻尼参数。我们在本文中不涉及这些内容,但感兴趣的读者可以在此处了解更多信息。

够了,让我们不再讨论这些乏味的数学内容,转而在Python中实现这个模型!

Python示例

我们将像往常一样使用美国航空公司的数据集,并使用statsmodel库中的ExponentialSmoothing类来拟合霍尔特-温特斯预测模型。

https://www.statsmodels.org/dev/generated/statsmodels.tsa.holtwinters.ExponentialSmoothing.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import packages
import plotly.graph_objects as go
import pandas as pd
from statsmodels.tsa.holtwinters import SimpleExpSmoothing, Holt, ExponentialSmoothing

# Read in the data
data = pd.read_csv('AirPassengers.csv')
data['Month'] = pd.to_datetime(data['Month'])

# Split train and test
train = data.iloc[:-int(len(data) * 0.2)]
test = data.iloc[-int(len(data) * 0.2):]


def plot_func(forecast1: list[float],
              forecast2: list[float],
              forecast3: list[float],
              title: str,
              save_path: str) -> None:
    """Function to plot the forecasts."""
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=train['Month'], y=train['#Passengers'], name='Train'))
    fig.add_trace(go.Scatter(x=test['Month'], y=test['#Passengers'], name='Train'))
    fig.add_trace(go.Scatter(x=test['Month'], y=forecast1, name='Simple'))
    fig.add_trace(go.Scatter(x=test['Month'], y=forecast2, name="Holt's Linear"))
    fig.add_trace(go.Scatter(x=test['Month'], y=forecast3, name='Holt Winters'))
    fig.update_layout(template="simple_white", font=dict(size=18), title_text=title,
                      width=700, title_x=0.5, height=400, xaxis_title='Date',
                      yaxis_title='Passenger Volume')
    return fig.show()


# Fit simple model and get forecasts
model_simple = SimpleExpSmoothing(train['#Passengers']).fit(optimized=True)
forecasts_simple = model_simple.forecast(len(test))

# Fit Holt's model and get forecasts
model_holt = Holt(train['#Passengers'], damped_trend=True).fit(optimized=True)
forecasts_holt = model_holt.forecast(len(test))

# Fit Holt Winters model and get forecasts
model_holt_winters = ExponentialSmoothing(train['#Passengers'], trend='mul',
                                          seasonal='mul', seasonal_periods=12)\
                                          .fit(optimized=True)
forecasts_holt_winters = model_holt_winters.forecast(len(test))

# Plot the forecasts
plot_func(forecasts_simple, forecasts_holt, forecasts_holt_winters,  "Holt-Winters Exponential Smoothing")

从上图可以看出,霍尔特-温特斯的预测明显是最好的,因为它捕捉到了时间序列的趋势和季节性。

在调用模型时,我们传递了参数seasonal_periods、trend和seasonal给模型对象。从上图可以看出,有明显的年度季节性,因此我们设置seasonal_periods=12。此外,趋势不是很直线,因此它是乘法的,因此trend='multi'。最后,季节性波动不是一些固定的一致值,而是与时间序列的值成比例,因此季节性是乘法的,即seasonal='multi'。

霍尔特-温特斯模型还可以通过执行summary方法进行诊断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(model_holt_winters.summary())

平滑度参数smoothing_level、α和smoothing_seasonal、γ相对较高,表明季节性和水平分量经常变化。然而,平滑趋势参数smoothing_trend、β的值相对较小,意味着趋势变化不是很大。

总结

通过讨论可能是最有用的模型霍尔特-温特斯,我们完成了指数平滑家族的介绍。这个模型考虑了趋势和季节性分量,因此可以有效地用来建模大多数时间序列。正如我们的Python示例所示,它很好地捕捉了季节性和趋势分量。

本文中使用的完整代码在我的GitHub上可用:

https://github.com/egorhowell/Medium-Articles/blob/main/Time%20Series/Exponential%20Smoothing/holt_winters.py?source=post_page-----b78ffc322f24

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GPT4做数据分析时间序列预测之八相当棒2023.6.1
1、用了多种方法预测未来6个月的销售额,并计算了算法的标准差、平均值、与1绝对值求和等验证指标。
用户7138673
2023/08/16
4070
GPT4做数据分析时间序列预测之八相当棒2023.6.1
单变量时间序列平滑方法介绍
时间序列是由按时间排序的观察单位组成的数据。可能是天气数据、股市数据。,也就是说它是由按时间排序的观察值组成的数据。
deephub
2022/11/11
8250
单变量时间序列平滑方法介绍
数据导入与预处理-拓展-pandas时间数据处理03
数据导入与预处理-拓展-pandas时间数据处理01 数据导入与预处理-拓展-pandas时间数据处理02 数据导入与预处理-拓展-pandas时间数据处理03 备注:如果有帮助,欢迎点赞收藏评论一键三联哈~~
用户2225445
2022/11/12
1.3K0
数据导入与预处理-拓展-pandas时间数据处理03
Theta方法:一种时间序列分解与预测的简化方法
Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。
deephub
2024/07/01
2790
Theta方法:一种时间序列分解与预测的简化方法
打开我的收藏夹 -- Python时间序列分析篇
这两天,又接收到了不少新的讯息。我是越来越佩服“梦想橡皮檫”,檫哥了(打开周榜/总榜很好找,前排),他居然能用几年的时间来打磨一个系列。别说收39块,就是原价99我也买了,不为啥,就凭人家打磨了三年的毅力,我服!!!
看、未来
2021/09/18
7900
基于趋势和季节性的时间序列预测
时间序列预测是基于时间数据进行预测的任务。它包括建立模型来进行观测,并在诸如天气、工程、经济、金融或商业预测等应用中推动未来的决策。
deephub
2022/11/11
1.2K0
基于趋势和季节性的时间序列预测
通过 Python 代码实现时间序列数据的统计学预测模型
Autoregressive Integrated Moving Average model (ARIMA),差分整合移动平均自回归模型。ARIMA(p,d,q)主要包含三项:
deephub
2020/05/09
2.1K0
通过 Python 代码实现时间序列数据的统计学预测模型
用Python进行时间序列分解和预测
本文介绍了用Python进行时间序列分解的不同方法,以及如何在Python中进行时间序列预测的一些基本方法和示例。
Datawhale
2021/01/07
3.8K0
用Python进行时间序列分解和预测
使用TabPy将时间序列预测与Tableau进行集成
我们将使用三个时间序列模型,它们是使用python建立的超级商店数据集(零售行业数据)。我们将使用jupyter notebook 来构建我们的python代码,然后转移到Tableau。
deephub
2021/07/01
2.3K0
4大类11种常见的时间序列预测方法总结和代码示例
本篇文章将总结时间序列预测方法,并将所有方法分类介绍并提供相应的python代码示例,以下是本文将要介绍的方法列表:
deephub
2022/03/12
3.9K0
4大类11种常见的时间序列预测方法总结和代码示例
GPT4做数据分析时间序列预测之二相当棒2023.5.25
这个错误是因为在你的循环中,你在每次迭代时都试图将'年月'列设置为索引。然而,一旦你在第一次迭代中将'年月'列设置为索引,它就不再是数据框的一部分,所以在后续的迭代中,你不能再次将它设置为索引。
用户7138673
2023/08/16
3380
GPT4做数据分析时间序列预测之二相当棒2023.5.25
使用R语言进行时间序列(arima,指数平滑)分析
您要分析时间序列数据的第一件事就是将其读入R,并绘制时间序列。您可以使用scan()函数将数据读入R,该函数假定连续时间点的数据位于包含一列的简单文本文件中。
拓端
2020/08/04
5.2K0
使用R语言进行时间序列(arima,指数平滑)分析
Holt-Winters季节性预测模型
算法:Holt-Winters季节性预测模型是一种三次指数平滑预测,除了水平和趋势外,还将指数平滑应用到季节分量上。
裴来凡
2022/05/29
1.9K0
Holt-Winters季节性预测模型
GPT4做数据分析时间序列预测之四相当棒2023.5.25
根据您的需求,我将这些方法的代码合并,并将预测结果保存到Excel文件的不同列中。请注意,预测方法的参数可能需要根据您的实际数据进行调整。此外,这里的代码仅适用于包含年月和销售金额两列的Excel文件。
用户7138673
2023/08/16
4130
GPT4做数据分析时间序列预测之四相当棒2023.5.25
探索时间序列,预测未来
时间序列(time series)是按时间顺序记录的一组数据。其中观察的时间可以是年份,季度,月份或其它任何时间形式,为了方便表述,文中用 t 表示所观察的时间, Yt表示在时间t上的观测值。
herain
2022/04/27
5030
探索时间序列,预测未来
Power BI的时间序列预测——指数平滑法
在本公众号的第4篇推文里,我们向大家分享过Power BI进行时间序列预测的几种方法。其中提到,Power BI的折线图自带有预测功能。当时简单地以为PBI使用移动平均方法。最近查阅官方文档发现,Power View的预测功能用的是指数平滑法(Exponential Smoothing),同时按是否季节性做了区分。PBI跟Power View一脉相承,可以推测应该也是沿用指数平滑法。
btharp
2021/08/31
3.2K0
GPT4做数据分析时间序列预测之五相当棒2023.5.26
1、Excel的a列是年月,b列是本年月销售额。写一个Python程序,读取Excel,计算单元格某个年月后面6个月销售额累计值,用指数平滑的时间序列预测某个年月后面6个月销售额累计值。将年月、本年月销售额、后6个月销售额累计值、预测6个月销售额累计值记录到新Excel表格。
用户7138673
2023/08/16
3080
GPT4做数据分析时间序列预测之五相当棒2023.5.26
​Kaggle M5 Forecasting:传统预测方法与机器学习预测方法对比
本文使用的数据集来自 kaggle:M5 Forecasting — Accuracy。该数据集包含有 California、Texas、Wisconsin 三个州的产品类别、部门、仓储信息等。基于这些数据,需要预测接下来 28 天的每日销售量。
deephub
2020/05/09
2K0
​Kaggle M5 Forecasting:传统预测方法与机器学习预测方法对比
手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)
对于任何业务而言,基于时间进行分析都是至关重要的。库存量应该保持在多少?你希望商店的客流量是多少?多少人会乘坐飞机旅游?类似这样待解决的问题都是重要的时间序列问题。
数据派THU
2018/07/30
4.3K0
手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)
时间序列的R语言实现
这部分是用指数平滑法做的时间序列的R语言实现,建议先看看指数平滑算法。 用指数平滑做预测 简单指数平滑(Simple Exponential Smoothing) 对可用加性模型描述的,非周期性的时间序列数据,可用简单指数平滑来做短期的预测。指数平滑是根据平滑常熟α来做的,α取值在0-1的区间上,α越小越接近0,就表示做预测时对近期观测所取的比重较大。 说明:指数平滑算法的原理就是利用历史观测数据对未来做预测,α的取值决定着对近期和远期观测数据所取的权重。详细的可以去了解该算法。 下面是伦敦1813年到19
机器学习AI算法工程
2018/03/13
3.2K1
时间序列的R语言实现
推荐阅读
相关推荐
GPT4做数据分析时间序列预测之八相当棒2023.6.1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验