从前慢

Holt-Winters 双周期预测

时间序列是一种便捷的预测手段,其实现方便,不需要特征开发,很适合作为解预测问题时的初始方案。

这里介绍一个之前做的例子。

问题描述


赛题是一个交通预测问题,需要根据每天6-8点和16-18点的车流数据来预测8-9点和18-19点的车流。赛题一共给出了两段数据,第一段是9月19日-10月16日每天24小时数据,第二段是10月17日到10月23日每天6-8点和16-18点。得分评价方式采用 MAE:

问题分析

第一段数据是一个连续的时间序列,可以直接拿来构建一个时间序列模型,但赛题在第二个时间段每天还额外给出了4个小时的数据,而这4个小时的数据紧邻预测目标,显然非常有价值。为了能够用上这两个小时的数据,我将数据做了一定的过滤。

在第一段数据里,我每天只用6-8点和16-18点的数据,使之构成一个9月19-10月23日的连续周期,其中小周期为每天3小时,大周期为每周21小时。

因为第二段时间每天9点和19点的数据是未知的,因此我将用第一个模型来预测10月17日9点的值,然后将预测值作为输入,按照同样方式来预测10月18日9点的值,以此类推预测全部10月17日到10月23日数据。

模型预测

使用 R 对处理后的数据进行预测。datats1为每天6、7、8三个小时的数据,datats2为每天16、17、18三个小时的数据,mae 用以储存预测值与真实值的误差。

1
2
3
4
5
6
7
8
9
10
11
12
13
datats1_predict_ts <- datats1
datats2_predict_ts <- datats2
mae <- matrix(0,7,2)
for (i in 1:7){
t <- 78 + 3*i
print(t) # 预测第 t 个时间
datats1_predict <- dshw(datats1_predict_ts[1:t-1], period1 = 3, period2 = 21, h = 1)
datats2_predict <- dshw(datats2_predict_ts[1:t-1], period1 = 3, period2 = 21, h = 1)
mae[i, 1] <- abs(datats1_predict$mean - datats1_predict_ts[t])
mae[i, 2] <- abs(datats2_predict$mean - datats2_predict_ts[t])
datats1_predict_ts[t] <- datats1_predict$mean
datats2_predict_ts[t] <- datats2_predict$mean
}

结果

本模型得到的结果 MAE 为12。观察 datats1 预测值,可以发现真实值与预测值还是存在一定偏差。

思考

因为采用的是时间序列模型,有大量明细数据未使用。另外通过数据观察可以发现,数据双周期现象并不明显,也是效果一般的原因。