我現(xiàn)在深深的發(fā)現(xiàn)我老公就是個(gè)杠精瞻坝,我說(shuō)啥他都要杠,不杠就活不了了粹断。
生氣符欠。
這里不多說(shuō)指數(shù)平滑的原理,直接給一個(gè)結(jié)論瓶埋。
指數(shù)平滑預(yù)測(cè)模型的使用場(chǎng)合
預(yù)測(cè)模型選擇 | 長(zhǎng)期趨勢(shì) | 季節(jié)效應(yīng) |
---|---|---|
一次指數(shù)平滑 | 無(wú) | 無(wú) |
二次指數(shù)平滑 | 有 | 無(wú) |
三次指數(shù)平滑 | 有/無(wú) | 有 |
上述結(jié)論出自王燕的《應(yīng)用時(shí)間序列分析》希柿,第四版,196頁(yè)养筒。
請(qǐng)王越不要在跟我抬杠曾撤,千恩萬(wàn)謝。
一次指數(shù)平滑預(yù)測(cè)值恒為常數(shù)晕粪,所以最好只做1期預(yù)測(cè)挤悉。
最近我司又讓我做時(shí)間序列了,就目前我的水平而言巫湘,做出來(lái)的效果最好的是xgboost算法装悲。
出于興趣,自己研究了holt-winter的使用方法尚氛。
首先诀诊,這里使用的是統(tǒng)計(jì)學(xué)模型的python庫(kù)。
from statsmodels.tsa.holtwinters import ExponentialSmoothing
其次阅嘶,下面貼出代碼實(shí)現(xiàn)方法属瓣。
# -*- encoding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 1、對(duì)數(shù)據(jù)的預(yù)處理
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(","))
# 全部數(shù)據(jù)
all_data = []
for i in range(len(time_data)):
all_data.append(float(time_data[i][1]))
# 分一部分出來(lái)作為train數(shù)據(jù)
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、模型參數(shù)
ets3 = ExponentialSmoothing(train_data, trend='add', seasonal='add', seasonal_periods=24)
# 3奠涌、擬合模型
r3 = ets3.fit()
# 4宪巨、預(yù)測(cè)
pred3 = r3.predict(start=len(train_data), end=len(all_data)-1)
# 5、畫(huà)圖溜畅,可以忽略
pd.DataFrame({
'origin': test_data,
'pred': pred3
}).plot(legend=True)
plt.show()
print(pred3)
數(shù)據(jù)樣式如下捏卓,一小時(shí)一個(gè)點(diǎn),逗號(hào)前面是時(shí)間慈格,后面是數(shù)值怠晴。
第三,下面給出代碼的具體含義浴捆。
1蒜田、先拿到數(shù)據(jù),一小時(shí)一個(gè)點(diǎn)选泻,去除時(shí)間標(biāo)記冲粤,拿到數(shù)值,按照時(shí)間順序页眯,存入數(shù)組y3中梯捕。
2、設(shè)置模型的參數(shù)
看一下源碼里怎么說(shuō)的
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.
參數(shù):
第一個(gè)endog窝撵,當(dāng)然是時(shí)間序列的數(shù)據(jù)了傀顾,array-like的形式。
第二個(gè)trend是趨勢(shì)碌奉,有三種可選項(xiàng)短曾,就是加法趨勢(shì)和乘法趨勢(shì)還有None。
第三個(gè)damped是衰減赐劣,Boolean嫉拐,是否對(duì)趨勢(shì)進(jìn)行衰減。
第四個(gè)seasonal是季節(jié)性(周期)隆豹,也是三種選項(xiàng)椭岩,加法茅逮、乘法還有None璃赡。
第五個(gè)seasonal_periods,季節(jié)性周期献雅,int型碉考,holt-winter要考慮的季節(jié)的數(shù)量。簡(jiǎn)單來(lái)說(shuō)挺身,多少點(diǎn)是一個(gè)周期侯谁?你可以設(shè)定為一天,一星期,一個(gè)月墙贱,一年等等
參數(shù)比較簡(jiǎn)單热芹,一目了然。
我這邊設(shè)置的趨勢(shì)和季節(jié)都是加性的惨撇。因?yàn)閿?shù)據(jù)是一小時(shí)一個(gè)點(diǎn)的伊脓,所以周期我給的是24,即一天為一個(gè)周期魁衙。
3报腔、擬合模型
4、預(yù)測(cè)
看這個(gè)效果還不錯(cuò)是吧剖淀,那是因?yàn)榍懊娑荚谟?xùn)練集里面纯蛾,真正展現(xiàn)實(shí)力的是后面分叉的部分。效果很差纵隔。
如果只是把后面的部分截出來(lái)看翻诉,是不是對(duì)比更明顯一點(diǎn)。
下圖是我用同樣的數(shù)據(jù)捌刮,holt-winter和xgboost預(yù)測(cè)效果以及真實(shí)值的對(duì)比效果