[译]如何使用Python构建指数平滑模型:Simple Exponential Smoothing, Holt, and Holt-Winters
原文连接:How to Build Exponential Smoothing Models Using Python: Simple Exponential Smoothing, Holt, and…
今年前12个月,iPhone XS将售出多少部?在埃隆·马斯克(Elon musk)在直播节目中吸食大麻之后,特斯拉的需求趋势是什么?这个冬天会暖和吗?(我住在加拿大。)如果你对这些问题感到好奇,指数平滑法可以通过建立模型来预测未来。
指数平滑方法为过去的观测分配指数递减的权重。得到的观测值越近,权重就越大。例如,与12个月前的观测结果相比,对上个月的观测结果给予更大的权重是合理的。

上图为指数平滑权值从过去到现在。
本文将说明如何使用Python和Statsmodel构建简单指数平滑、Holt和Holt- winters模型。对于每个模型,演示都按照以下方式组织。
模型操作方法+Python代码
Statsmodels是一个Python模块,它为实现许多不同的统计模型提供了类和函数。我们需要将它导入Python代码,如下所示。
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
我们示例中的源数据如下:
data = [253993,275396.2,315229.5,356949.6,400158.2,442431.7,495102.9,570164.8,640993.1,704250.4,767455.4,781807.8,776332.3,794161.7,834177.7,931651.5,1028390,1114914]
我们可以先看看折线图
plt.plot(data);

简单指数平滑(SES)
对于没有明显趋势或季节规律的预测数据,SES是一个很好的选择。预测是使用加权平均来计算的,这意味着最大的权重与最近的观测值相关,而最小的权重与最远的观测值相关

其中0≤α≤1是平滑参数。
权重减小率由平滑参数α控制。 如果α很大(即接近1),则对更近期的观察给予更多权重。 有两种极端情况:
- α= 0:所有未来值的预测等于历史数据的平均值(或“平均值”),称为平均值法。
- α= 1:简单地将所有预测设置为最后一次观测的值,统计中称为朴素方法。
这里我们运行三种简单指数平滑变体:
- 在
fit1中,我们明确地为模型提供了平滑参数\(α= 0.2\) - 在
fit2中,我们选择\(α= 0.6\) - 在
fit3中,我们使用自动优化,允许statsmodels自动为我们找到优化值。 这是推荐的方法。
# Simple Exponential Smoothing
fit1 = SimpleExpSmoothing(data).fit(smoothing_level=0.2,optimized=False)
# plot
l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='o')
fit2 = SimpleExpSmoothing(data).fit(smoothing_level=0.6,optimized=False)
# plot
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='o')
fit3 = SimpleExpSmoothing(data).fit()
# plot
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='o')
l4, = plt.plot(data, marker='o')
plt.legend(handles = [l1, l2, l3, l4], labels = ['a=0.2', 'a=0.6', 'auto', 'data'], loc = 'best', prop={'size': 7})
plt.show()
我们预测了未来五个点。

Holt's 方法(二次指数平滑)
Holt扩展了简单的指数平滑(数据解决方案没有明确的趋势或季节性),以便在1957年预测数据趋势.Holt的方法包括预测方程和两个平滑方程(一个用于水平,一个用于趋势):

其中\(0≤α≤1\)是水平平滑参数,\(0≤β*≤1\)是趋势平滑参数。
对于长期预测,使用Holt方法的预测在未来会无限期地增加或减少。 在这种情况下,我们使用具有阻尼参数\(0 <φ<1\)的阻尼趋势方法来防止预测“失控”。

同样,这里我们运行Halt方法的三种变体:
- 在
fit1中,我们明确地为模型提供了平滑参数\(α= 0.8\),\(β* = 0.2\)。 - 在
fit2中,我们使用指数模型而不是Holt的加法模型(默认值)。 - 在
fit3中,我们使用阻尼版本的Holt附加模型,但允许优化阻尼参数\(φ\),同时固定\(α= 0.8\),\(β* = 0.2\)的值。
data_sr = pd.Series(data)
# Holt’s Method
fit1 = Holt(data_sr).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='^')
fit2 = Holt(data_sr, exponential=True).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='.')
fit3 = Holt(data_sr, damped=True).fit(smoothing_level=0.8, smoothing_slope=0.2)
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='.')
l4, = plt.plot(data_sr, marker='.')
plt.legend(handles = [l1, l2, l3, l4], labels = ["Holt's linear trend", "Exponential trend", "Additive damped trend", 'data'], loc = 'best', prop={'size': 7})
plt.show()

Holt-Winters 方法(三次指数平滑)
(彼得·温特斯(Peter Winters)是霍尔特(Holt)的学生。霍尔特-温特斯法最初是由彼得提出的,后来他们一起研究。多么美好而伟大的结合啊。就像柏拉图遇到苏格拉底一样。)
Holt-Winters的方法适用于具有趋势和季节性的数据,其包括季节性平滑参数\(γ\)。 此方法有两种变体:
- 加法方法:整个序列的季节变化基本保持不变。
- 乘法方法:季节变化与系列水平成比例变化。
在这里,我们运行完整的Holt-Winters方法,包括趋势组件和季节性组件。 Statsmodels允许所有组合,包括如下面的示例所示:
- 在
fit1中,我们使用加法趋势,周期season_length = 4的加性季节和Box-Cox变换。 - 在
fit2中,我们使用加法趋势,周期season_length = 4的乘法季节和Box-Cox变换。 - 在
fit3中,我们使用加性阻尼趋势,周期season_length = 4的加性季节和Box-Cox变换。 - 在
fit4中,我们使用加性阻尼趋势,周期season_length = 4的乘法季节和Box-Cox变换。
data_sr = pd.Series(data)
fit1 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='add').fit(use_boxcox=True)
fit2 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='mul').fit(use_boxcox=True)
fit3 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='add', damped=True).fit(use_boxcox=True)
fit4 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='mul', damped=True).fit(use_boxcox=True)
l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='^')
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='*')
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='.')
l4, = plt.plot(list(fit4.fittedvalues) + list(fit4.forecast(5)), marker='.')
l5, = plt.plot(data, marker='.')
plt.legend(handles = [l1, l2, l3, l4, l5], labels = ["aa", "am", "aa damped", "am damped","data"], loc = 'best', prop={'size': 7})
plt.show()

总而言之,我们通过3个指数平滑模型的机制和python代码。 如下表所示,我提供了一种为数据集选择合适模型的方法。

总结了指数平滑方法中不同分量形式的平滑参数。

指数平滑是当今行业中应用最广泛、最成功的预测方法之一。如何预测零售额、游客数量、电力需求或收入增长?指数平滑是你需要展现未来的超能力之一。
[译]如何使用Python构建指数平滑模型:Simple Exponential Smoothing, Holt, and Holt-Winters的更多相关文章
- Holt Winter 指数平滑模型
1 指数平滑法 移动平均模型在解决时间序列问题上简单有效,但它们的计算比较难,因为不能通过之前的计算结果推算出加权移动平均值.此外,移动平均法不能很好的处理数据集边缘的数据变化,也不能应用于现有数据集 ...
- OpenAI的GPT-2:用Python构建世界上最先进的文本生成器的简单指南
介绍 "The world's best economies are directly linked to a culture of encouragement and positive f ...
- (转)利用Auto ARIMA构建高性能时间序列模型(附Python和R代码)
转自: 原文标题:Build High Performance Time Series Models using Auto ARIMA in Python and R 作者:AISHWARYA SI ...
- 使用OpenCV和Python构建自己的车辆检测模型
概述 你对智慧城市的想法感到兴奋吗?如果是的话,你会喜欢这个关于建立你自己的车辆检测系统的教程的 在深入实现部分之前,我们将首先了解如何检测视频中的移动目标 我们将使用OpenCV和Python构建自 ...
- 使用Boost.Python构建混合系统(译)
目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...
- Python中利用LSTM模型进行时间序列预测分析
时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- 构建Java并发模型框架
Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...
随机推荐
- Spring自动注入Bean
通过@Autowired或@Resource来实现在Bean中自动注入的功能,但还要在配置文件中写Bean定义,下面我们将介绍如何注解Bean,从而从XML配置文件 中完全移除Bean定义的配置. 1 ...
- 浏览器顶部设置margin-top时存在的bug
浏览器bug<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...
- crm-权限管理
1 用户登录 设置session 将权限存放在session中 2 设置中间件,进行拦截 0 添加白名单,判断是否在白名单上 1 判断是否登录 2 权限过滤
- svn 外部引用别的项目文件
建立了一个文件目录E:\My\myproject 想在该目录下有一个文件夹引用别的工程的文件. 1.在E:\My\myproject 空白处右键属性. 2.点击Properties,弹出 3.点击ne ...
- Devexpress GridControl中 repositoryItemCheckEdit作为选择列以及作为显示列的使用方法
一.在gridcontrol列表控件中使用单选框作为选择列,这里有两种方式. 方式一:选择gridcontrol控件的Run Designer按钮,添加一列,设置该列的ColumnEdit为check ...
- redhat7.4安装git(按照官网从源码安装)
按照官方文档建议使用源码安装 1.为什么不用yum安装 yum安装确实简单,只用一行命令就可以了,但是yum安装的版本太低. //安装前使用info查看git版本信息等 yum info git yu ...
- 【git 命令总结】一
git help config init commit diff rename mv rm head revert reset branch checkout branch-diff fast-for ...
- 走进JavaWeb技术世界4:Servlet 工作原理详解
从本篇开始,正式进入Java核心技术内容的学习,首先介绍的就是Java web应用的核心规范servlet 转自:https://www.ibm.com/developerworks/cn/java/ ...
- 生成要发送到社区的内核补丁时如何指定发布的版本号(v2,v3...)?
1. 生成一个补丁 git format-patch --subject-prefix=v2 -1 那么生成的patch文件就会有如下类似的信息: Subject: [v2] your descrip ...
- LC 988. Smallest String Starting From Leaf
Given the root of a binary tree, each node has a value from 0 to 25 representing the letters 'a' to ...