三次指数平滑(holt-winter)
2019-03-11 本文已影响69人
曦宝
我现在深深的发现我老公就是个杠精,我说啥他都要杠,不杠就活不了了。
生气。
这里不多说指数平滑的原理,直接给一个结论。
指数平滑预测模型的使用场合
预测模型选择 | 长期趋势 | 季节效应 |
---|---|---|
一次指数平滑 | 无 | 无 |
二次指数平滑 | 有 | 无 |
三次指数平滑 | 有/无 | 有 |
上述结论出自王燕的《应用时间序列分析》,第四版,196页。
请王越不要在跟我抬杠,千恩万谢。
一次指数平滑预测值恒为常数,所以最好只做1期预测。
最近我司又让我做时间序列了,就目前我的水平而言,做出来的效果最好的是xgboost算法。
出于兴趣,自己研究了holt-winter的使用方法。
首先,这里使用的是统计学模型的python库。
from statsmodels.tsa.holtwinters import ExponentialSmoothing
其次,下面贴出代码实现方法。
# -*- encoding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 1、对数据的预处理
input_data = open("ftproot.txt", mode='r').read().split("\n")
time_data = []
for i in range(len(input_data)):
time_data.append(input_data[i].split(","))
# 全部数据
all_data = []
for i in range(len(time_data)):
all_data.append(float(time_data[i][1]))
# 分一部分出来作为train数据
train_data = []
test_data = []
train_data.extend([all_data[i] for i in range(0, 1334)])
test_data.extend([all_data[i] for i in range(1334, len(all_data))])
# 2、模型参数
ets3 = ExponentialSmoothing(train_data, trend='add', seasonal='add', seasonal_periods=24)
# 3、拟合模型
r3 = ets3.fit()
# 4、预测
pred3 = r3.predict(start=len(train_data), end=len(all_data)-1)
# 5、画图,可以忽略
pd.DataFrame({
'origin': test_data,
'pred': pred3
}).plot(legend=True)
plt.show()
print(pred3)
image.png
数据样式如下,一小时一个点,逗号前面是时间,后面是数值。
第三,下面给出代码的具体含义。
1、先拿到数据,一小时一个点,去除时间标记,拿到数值,按照时间顺序,存入数组y3中。
2、设置模型的参数
看一下源码里怎么说的
Holt Winter's Exponential Smoothing
Parameters
----------
endog : array-like
Time series
trend : {"add", "mul", "additive", "multiplicative", None}, optional
Type of trend component.
damped : bool, optional
Should the trend component be damped.
seasonal : {"add", "mul", "additive", "multiplicative", None}, optional
Type of seasonal component.
seasonal_periods : int, optional
The number of seasons to consider for the holt winters.
Returns
-------
results : ExponentialSmoothing class
Notes
-----
This is a full implementation of the holt winters exponential smoothing as
per [1]. This includes all the unstable methods as well as the stable methods.
The implementation of the library covers the functionality of the R
library as much as possible whilst still being pythonic.
参数:
第一个endog,当然是时间序列的数据了,array-like的形式。
第二个trend是趋势,有三种可选项,就是加法趋势和乘法趋势还有None。
第三个damped是衰减,Boolean,是否对趋势进行衰减。
第四个seasonal是季节性(周期),也是三种选项,加法、乘法还有None。
第五个seasonal_periods,季节性周期,int型,holt-winter要考虑的季节的数量。
参数比较简单,一目了然。
我这边设置的趋势和季节都是加性的。因为数据是一小时一个点的,所以周期我给的是24,即一天为一个周期。
3、拟合模型
4、预测
image.png
看这个效果还不错是吧,那是因为前面都在训练集里面,真正展现实力的是后面分叉的部分。效果很差。
如果只是把后面的部分截出来看,是不是对比更明显一点。
image.png
下图是我用同样的数据,holt-winter和xgboost预测效果以及真实值的对比效果
image.png