时间序列的7种预测模型

背景

时间序列问题比较常见,比如股市,工业生产指标等。

导入必要的Python包:

from statsmodels.tsa.api import ExponentialSmoothing, \
SimpleExpSmoothing, Holt

import statsmodels.api as sm

1. 朴素估计

y ^ t + 1 = y t \hat{y}_{\mathrm{t}+1}=\mathrm{y}_{\mathrm{t}} y^t+1=yt

使用最后一个时间点的值估测后面一段时间段的值。

dd= np.asarray(train.Count)
y_hat = test.copy()
y_hat['naive'] = dd[len(dd)-1]

在这里插入图片描述

2. 简单平均

把历史时刻变量所有值的平均值作为预测值:
在这里插入图片描述

y_hat_avg = test.copy()
y_hat_avg['avg_forecast'] = train['Count'].mean()

在这里插入图片描述

4. 滑动窗平均

使用之前一定大小时间段的平均值作为这个时间点的值。
在这里插入图片描述

或者使用加权的滑动窗平均:

加权的权重可以根据时间来设定,比如越是近的时刻的权重越大。

在这里插入图片描述

y_hat_avg = test.copy()
y_hat_avg['moving_avg_forecast'] = train['Count'].rolling(60).mean().iloc[-1]

在这里插入图片描述

5. 简单指数平滑

当前时刻的值由历史时刻的值确定,但是根据时刻进行了指数衰减。

在这里插入图片描述
where 0≤ α ≤1 是平滑参数.

如果时间序列很长,可以看作:
在这里插入图片描述

from statsmodels.tsa.api import ExponentialSmoothing, \
SimpleExpSmoothing, Holt
y_hat_avg = test.copy()
fit2 = SimpleExpSmoothing(np.asarray(train['Count'])).fit(
smoothing_level=0.6,optimized=False)
y_hat_avg['SES'] = fit2.forecast(len(test))

5 Holt’s线性趋势方法

在这里插入图片描述

主要考虑趋势。

import statsmodels.api as sm
sm.tsa.seasonal_decompose(train.Count).plot()
result = sm.tsa.stattools.adfuller(train.Count)

7 Holt-winters 方法

在这里插入图片描述

这种思想比较简单有效,假设数据服从两点,

1.数据是呈递增、递减趋势的;
2.数据服从一个周期变化。

然后,对残差,再进行其他方式的拟合,比如三次样条曲线。

y_hat_avg = test.copy()
fit1 = ExponentialSmoothing(np.asarray(train['Count']) ,
seasonal_periods=7 ,trend='add', seasonal='add',).fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))

8 Arima方法

ARIMA模型(Autoregressive Integrated Moving Average model)整合移动平均自回归模型。

ARIMA(p,d,q)模型:

在这里插入图片描述

ARIMA(p, d, q) 由三个部分组成:

  • AR§:AR是autoregressive的缩写,表示自回归模型,含义是当前时间点的值等于过去若干个时间点的值的回归——因为不依赖于别的解释变量,只依赖于自己过去的历史值,故称为自回归;如果依赖过去最近的p个历史值,称阶数为p,记为AR(p)模型。
  • I(d):I是integrated的缩写,含义是模型对时间序列进行了差分;因为时间序列分析要求平稳性,不平稳的序列需要通过一定手段转化为平稳序列,一般采用的手段是差分;d表示差分的阶数,t时刻的值减去t-1时刻的值,得到新的时间序列称为1阶差分序列;1阶差分序列的1阶差分序列称为2阶差分序列,以此类推;另外,还有一种特殊的差分是季节性差分S,即一些时间序列反应出一定的周期T,让t时刻的值减去t-T时刻的值得到季节性差分序列。
  • MA(q):MA是moving average的缩写,表示移动平均模型,含义是当前时间点的值等于过去若干个时间点的预测误差的回归;预测误差=模型预测值-真实值;如果序列依赖过去最近的q个历史预测误差值,称阶数为q,记为MA(q)模型。
y_hat_avg = test.copy()
fit1 = sm.tsa.statespace.SARIMAX(train.Count, order=(2, 1, 
4),seasonal_order=(0,1,1,7)).fit()
y_hat_avg['SARIMA'] = fit1.predict(start="2013-11-1", 
end="2013-12-31", dynamic=True)

9. PROPHET 方法

Facebook提出的一种方法,与Holt-winters类似,主要想法是"
时间序列的分解(Decomposition of Time Series),它把时间序列 分成几个部分,分别是季节项 ,趋势项 ,剩余项,与Holt-winters方法类似 。

fbprophet的安装依赖Pystan.


最近开通了个公众号,主要分享python原理与应用,推荐系统,风控等算法相关的内容,感兴趣的伙伴可以关注下。
在这里插入图片描述
公众号相关的学习资料会上传到QQ群596506387,欢迎关注。


reference:

  1. analytics : Time-series forecast
  2. 知乎 arima详解
  3. Forecasting at Scale Facebook
  4. Wiki Arima;
  5. ARIMA模型详解;
  6. Fbprophet 使用官网;
  • 64
    点赞
  • 841
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
时间序列预测模型的预测失误是指模型对未来时间点的预测与实际观测值之间的差异。这差异可能由多因素引起,包括但不限于以下几个方面: 1. 数据质量:如果输入的时间序列数据存在缺失、异常值或噪音等问题,那么模型的预测结果可能会受到影响。 2. 模型选择:选择不合适的时间序列预测模型也可能导致预测失误。不同类型的时间序列数据可能需要不同的模型,包括自回归模型(AR)、移动平均模型(MA)、自回归移动平均模型(ARMA)、自回归积分移动平均模型(ARIMA),以及更高级的模型如长短期记忆网络(LSTM)等。 3. 参数估计:时间序列模型通常需要通过参数估计来拟合数据。不准确或不恰当的参数估计方法可能导致预测失误。 4. 存在未考虑的因素:时间序列数据的生成往往受到多个因素的影响,有些因素可能难以被观察或量化。如果模型没有考虑到这些因素,预测结果可能会产生误差。 5. 预测时段长度:预测的时段长度也可能影响预测失误。较长的预测时段可能会引入更多的不确定性,导致较大的预测误差。 为了减少时间序列预测模型的预测失误,可以考虑以下几点: 1. 数据清洗和预处理:确保输入的时间序列数据质量良好,包括处理缺失值、异常值和噪音等。 2. 模型选择和调参:根据时间序列数据的特征选择合适的模型,并通过交叉验证等方法调整模型参数,以提高预测准确性。 3. 考虑外部因素:如果已知或猜测到某些外部因素对时间序列数据有影响,可以尝试将这些因素纳入模型中,以提高预测的准确性。 4. 使用集成方法:考虑使用集成方法(如随机森林、梯度提升树等)来结合多个模型的预测结果,以降低误差和提高稳定性。 5. 监控和更新模型:定期监控模型的预测准确性,并根据需要对模型进行更新和调整,以保持其预测性能。 需要注意的是,时间序列预测是一个复杂的问题,没有一通用的方法可以解决所有情况。因此,在实际应用中,需要根据具体的问题和数据特征来选择和调整合适的模型和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosefunR

你的赞赏是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值