天天看点

【时序预测】3 统计学算法介绍

作者:轮回路上打碟的小年轻

1 概述

统计学时间序列预测是利用历史时间序列数据进行预测的方法。与机器学习不同,统计学方法更加注重数据的稳定性、趋势性和季节性等因素,并通常假设数据之间存在一定的自相关性和正态分布性。

在应用统计学方法进行时间序列预测时,需要根据数据的特点选择合适的模型,并进行数据预处理、模型选择和参数调整等工作来提高预测的准确性。

2 算法介绍

2.1 ETS

ETS(Error, Trend, Seasonality)是一种基于时间序列的预测方法,可以用来预测具有趋势和季节性的时间序列数据。ETS算法基于时间序列数据的误差、趋势和季节性进行建模,可以根据历史数据来预测未来数据的趋势和季节性。ETS算法的核心思想是将时间序列分解成误差、趋势和季节性三个部分,并通过建模和拟合这三个部分来预测未来数据。具体而言,ETS算法首先对时间序列数据进行平滑处理,然后通过时间序列分解来拆分出误差、趋势和季节性三个部分,并对这三个部分分别进行建模和预测。

  • ETS算法的优点在于:
  • 简单易懂:ETS算法基于时间序列分解和模型拟合,易于理解和实现。
  • 适用范围广:ETS算法适用于具有趋势和季节性的时间序列数据,并可以处理各种不同的趋势和季节性模式。
  • 精度高:ETS算法在某些情况下可以比ARIMA等其他预测方法更准确地预测时间序列数据。

ETS算法虽然具有简单易懂和精度高等优点,但其仍然有一些限制和局限性。例如,ETS算法对于长期趋势和极端值等情况的处理不够准确,需要根据具体应用场景进行合理选择和调整。

2.1.1 SES

简单指数平滑模型(SES),是一种常见的时间序列预测方法。它适用于一些没有明显趋势和季节性的时间序列数据。模型假设未来的值与过去的值呈指数衰减的关系,即未来的值受到过去值的影响,而这种影响的权重会随着时间的推移而不断减小。SES模型通过指数平滑的方法对过去时间点的数据进行平滑处理,然后将平滑后的值作为未来值的预测值。SES模型的基本思想是,对于一个长度为T的时间序列Y,其第t个时间点的预测值Yt可以表示为:

其中,Yt表示第t个时间点的实际值,Yt−1表示第t-1个时间点的预测值,α是平滑参数,用于控制过去值的影响程度。平滑参数α的取值范围为0到1,当α越接近1时,过去值对未来值的影响越大,当α越接近0时,过去值对未来值的影响越小。

SES模型的优点在于简单易懂,易于实现和解释。但它的局限性也比较明显,它只适用于一些没有明显趋势和季节性的时间序列数据。对于存在明显趋势和季节性的数据,SES模型的预测效果会比较差,需要使用其他更加复杂的模型进行预测。

model = ExponentialSmoothing(trend=None, seasonal=None)

for feature in ['CPU利用率', '内存利用率', 'License利用率']:
    model.fit(train[f'{feature}'])
    backtest = model.historical_forecasts(
        series=ts[f'{feature}'],
        start=0.75,
        forecast_horizon=10,
        verbose=True)
    ts[f'{feature}'].plot(label="actual")
    backtest.plot(label="backtest (D=10)")
plt.title(label='SES')
plt.legend()
plt.show()           
【时序预测】3 统计学算法介绍

2.1.2 Holt-Winters

Holt-Winters是一种经典的时间序列预测方法,也称为三重指数平滑模型(Triple Exponential Smoothing)。与简单指数平滑模型(SES)只考虑了时间序列的平稳性不同,Holt-Winters模型还考虑了序列的趋势和季节性变化。基本思想是在SES模型的基础上再增加一个趋势平滑参数β和一个季节性平滑参数γ,通过对历史数据进行三重指数平滑,得到未来值的预测。

Holt-Winters模型可以分为三种类型:1)简单Holt-Winters模型,仅考虑序列的趋势变化,不考虑季节性变化;2)季节性Holt-Winters模型,仅考虑序列的季节性变化,不考虑趋势变化;3)带趋势和季节性的Holt-Winters模型,同时考虑序列的趋势和季节性变化。

Holt-Winters模型的预测基于以下三个方程:

  • Level方程(水平方程):用于计算序列的当前水平值(Level)。该方程表达式为:

其中,Lt表示第t个时间点的水平值,α为水平平滑参数,Yt表示第t个时间点的实际值,St−m表示第t个时间点的季节性值(即距离t最近的m个季节的平均值),Lt−1

表示第t-1个时间点的水平值,Tt−1表示第t-1个时间点的趋势值。

  • Trend方程(趋势方程):用于计算序列的当前趋势值(Trend)。该方程表达式为:

其中,Tt表示第t个时间点的趋势值,β为趋势平滑参数。

  • Seasonality方程(季节性方程):用于计算序列的当前季节性值(Seasonality)。该方程表达式为:

其中,St表示第t个时间点的季节性值,γ为季节性平滑参数。

最终,预测值为:

其中,h为预测的时间跨度,mod表示取余数操作。

Holt-Winters模型的参数较多,需要进行参数调整和模型选择,常用的方法是采用交叉验证等技术来选择最优的模型参数。Holt-Winters模型的预测精度较高,在许多实际应用中得到了广泛的应用。

model = ExponentialSmoothing(trend=ModelMode.ADDITIVE, seasonal=SeasonalityMode.ADDITIVE, seasonal_periods=4)
for feature in ['CPU利用率', '内存利用率', 'License利用率']:
    model.fit(train[f'{feature}'])
    backtest = model.historical_forecasts(
        series=ts[f'{feature}'],
        start=0.75,
        forecast_horizon=10,
        verbose=True)
    ts[f'{feature}'].plot(label="actual")
    backtest.plot(label="backtest (D=10)")
plt.title(label='Holt-Winters')
plt.legend()
plt.show()           
【时序预测】3 统计学算法介绍

2.2 AR&MA

2.2.1 AR

自回归模型(AR)是最简单的线性自回归时序预测算法之一,可以用来描述时间序列数据的自相关关系,它基于一个假设,即未来的值取决于过去的值,该算法使用历史数据来预测未来的数据点。AR模型的阶数代表了它考虑历史数据的时间跨度,AR模型的参数由数据自身决定,可以通过最小化残差平方和来估计模型参数。AR模型可以表示为AR(p),其中p为自回归阶数,一般通过自相关函数(ACF)和偏自相关函数(PACF)来确定。

2.2.2 MA

移动平均模型(MA)是另一个基于时间序列的线性预测算法,可以用来描述时间序列数据的平均移动值的变化。与AR模型类似,MA模型也基于历史数据进行预测。不同的是,MA模型将误差项作为输入变量。该模型假设当前时刻的数据值仅由前几个时刻的噪声项决定,即存在一种线性关系。MA模型的参数由数据自身决定,可以通过最小化残差平方和来估计模型参数。MA模型可以表示为MA(q),其中q为滑动平均阶数,MA模型的阶数也可以通过ACF和PACF来确定。

# 模型构建
model = MovingAverage(30)

for feature in ['CPU利用率', '内存利用率', 'License利用率']:
    backtest = model.filter(ts[f'{feature}'])

    ts[f'{feature}'].plot(label="actual")
    backtest.plot(label="backtest (D=10)")

# 可视化
plt.title(label='MA')
plt.legend()
plt.show()           
【时序预测】3 统计学算法介绍

2.2.3 ARMA

自回归移动平均模型(ARMA)是AR模型和MA模型的结合体,可以用来描述时间序列数据的自相关关系和平均移动值的变化,AR模型用于预测未来值与过去值的线性组合,而MA模型用于预测未来值与过去误差的线性组合。ARMA模型基于历史数据,同时考虑历史值和误差项,以预测未来数据点。该模型假设当前时刻的数据值与前几个时刻的数据值和噪声项均存在一定的线性关系。ARMA模型的参数由数据自身决定,可以通过最小化残差平方和来估计模型参数。ARMA模型可以表示为ARMA(p,q),其中p为自回归阶数,q为滑动平均阶数,ARMA模型的阶数可以通过ACF和PACF来确定。

2.2.4 ARIMA

差分自回归移动平均模型(ARIMA)是ARMA模型的扩展版,它加入了时间序列的差分,可以处理非平稳时间序列,描述时间序列数据的趋势和季节性变化。该模型假设当前时刻的数据值与前几个时刻的数据值、噪声项和差分项存在一定的线性关系,首先对原始时间序列进行差分,以使其成为平稳序列,然后在平稳序列上应用ARMA模型。ARIMA模型的参数由数据自身决定,可以通过最小化残差平方和来估计模型参数。ARIMA模型可以表示为ARIMA(p,d,q),其中p为自回归阶数,d为差分阶数,q为滑动平均阶数,ARIMA模型的阶数也可以通过ACF和PACF来确定。

# 模型构建
model = ARIMA(p=1, d=1, q=1)
# model = AutoARIMA()
# model = StatsForecastAutoARIMA()

for feature in ['CPU利用率', '内存利用率', 'License利用率']:
    # 模型训练
    model.fit(train[f'{feature}'])
    # 模型推理
    backtest = model.historical_forecasts(
        series=ts[f'{feature}'],
        start=0.75,
        forecast_horizon=10,
        retrain=False,
        verbose=True,
    )

    ts[f'{feature}'].plot(label="actual")
    backtest.plot(label="backtest (D=10)")

# 可视化
plt.title(label='ARIMA')
plt.legend()
plt.show()           
【时序预测】3 统计学算法介绍
【时序预测】3 统计学算法介绍
【时序预测】3 统计学算法介绍

2.2.5 SARMA

季节性自回归移动平均模型(SARMA)是ARMA模型在季节性时间序列上的推广,其基本思想是在ARIMA模型中加入季节性因素,并进行季节性差分,可以有效地捕捉季节性时间序列的特征。SARMA模型中有两个重要的参数:季节周期和季节差分,SARMA模型的阶数也可以通过ACF和PACF来确定。

2.2.6 SARIMA

季节性差分自回归移动平均模型(SARIMA)是ARIMA模型的季节性扩展版,它考虑了时间序列的季节性,能够更准确地预测季节性趋势。SARMA模型中有两个重要的参数:季节周期和季节差分,首先对原始数据进行季节性差分,然后在平稳序列上应用ARMA模型。SARIMA模型中有六个重要的参数:季节周期、季节差分阶数、自回归阶数、差分阶数、移动平均阶数和季节性自回归阶数,SARIMA模型的阶数也可以通过ACF和PACF来确定。

2.2.7 VAR

向量自回归模型(VAR)模型是一种多变量时间序列模型,它建立了多个时间序列之间的关系,并利用向量自回归的方法进行预测。VAR模型可以同时对多个变量进行建模和预测,因此在多变量时间序列分析中应用广泛。

2.2.8 VARIMA

VARIMA是VAR模型和ARIMA模型的结合,既考虑了多个变量之间的关系,也考虑了时间序列的趋势和季节性。在VARIMA模型中,多个变量之间可以相互影响,而每个变量的趋势和季节性可以通过ARIMA模型进行建模。

VARIMA模型可以描述多个变量之间的线性关系,假设有p个变量和q阶滞后,VARIMA(p,d,q)模型的表示形式为:

在VARIMA模型中,可以通过ADF检验检验每个变量是否平稳,如果某些变量不平稳,可以对其进行差分处理。同时,还可以根据ACF和PACF来确定模型的阶数,以及季节性的影响。VARIMA模型可以通过最大似然估计来估计模型参数,并通过预测误差的方差来评估模型的预测性能。

# 模型构建
model = VARIMA(p=1, d=1, q=1)
# 模型训练
model.fit(train)
# 模型推理
backtest = model.historical_forecasts(
    series=ts,
    start=0.75,
    forecast_horizon=10,
    retrain=False,
    verbose=True,
)

# 可视化
ts.plot(label="actual")
backtest.plot(label="backtest (D=10)")
plt.title(label='ARIMA')
plt.legend()
plt.show()           
【时序预测】3 统计学算法介绍

2.2.9 GARCH

广义自回归条件异方差模型(GARCH)是一种能够描述时间序列波动性的模型,它可以对序列的方差进行建模,常用于金融市场的波动性预测和风险管理。

2.2.10 RW

随机游走模型(RW)是利用过去时间序列数据的随机变化对未来进行预测的方法。它的基本思想是假设未来时间点的值与当前值相同,并根据过去数据的随机变化对未来进行预测。

继续阅读