混合预测 - 单模型预测的平均值 - 通常用于产生比任何贡献预测模型更好的点估计。我展示了如何为混合预测构建预测区间,这种预测的覆盖范围比最常用的预测区间更准确(即80%的实际观测结果确实在80%置信区间内),在3,003 M3预测中进行了测试竞赛数据集。
预测间隔
预报员的问题是在预测组合中使用的预测间隔。预测间隔是与置信区间相似但不相同的概念。预测间隔是对尚未知但将在未来的某个点观察到的值(或更确切地说,可能值的范围)的估计。而置信区间是对基本上不可观察的参数的可能值范围的估计。预测间隔需要考虑模型中的不确定性,模型中参数的不确定估计(即那些参数的置信区间),以及与预测的特定点相关联的个体随机性。
例如,一项研究发现,预测间隔计算得包括真实结果95%的时间只能在71%到87%的时间之间得到它(感谢Hyndman再次在他的博客上轻松获得该结果)。有许多原因,但主要原因是模型构建和选择过程中的不确定性未得到充分考虑。开发预测区间的大多数方法实际上首先估计一系列值,条件是模型是正确的。由于我们的模型只是对现实的简化,因此,如果模型完全正确,我们会失败的次数更多。
粗略地看一眼,我找不到关于如何从预测组合产生预测区间的讨论。Hyndman避免在与上述相关的第一篇文章中引用该问题,只提出关于点估计的声明“如果你只想要点预测,那么(平均值ets
和auto.arima
)是forecast
包中可用的最佳方法。”
预测让我感到紧张,而在我的日常工作中,当现实与预测点明显不同时,它会导致问题。我希望更多地关注预测间隔的预测范围,我希望这个范围是准确的,或者是否有点保守(例如,我会更高兴83%的观察结果进入内部我80%的预测间隔比77%)。
介绍hybridf()
我喜欢结合auto.arima()
并ets()
快速,有效地进行混合预测,这可能与单变量系列一样好。事实上,它是一种可以在一天内轻松完成数千次的事情,所以为了使它更方便,我创建了一个hybridf()
在R中为我做这个并生成类对象的函数forecast
。这意味着我可以使用一行代码拟合预测,而Hyndman为该类开发的其他功能(如标准预测图)可用于生成的对象。这是1973年至1978年美国每月意外死亡时间序列的实际应用,用于Brockwell和Davis的1991年时间序列:理论和方法以及R的内置数据集之一。
library(devtools)
install_github("robjhyndman/forecast") # development version needed sorry
library(forecast)
深灰色区域是80%预测间隔,浅灰色区域是95%预测间隔。顶部面板显示混合预测。深蓝色线只是其他两种方法的点预测的平均值,预测区间采用保守的观点来显示组合两者的最宽范围的值。因此,混合预测间隔将比任一贡献模型的预测间隔宽。
测试M3竞赛系列
在这些易于访问计算机和数据的日子里,我们不必仅仅了解不同预测间隔的成功率,我们可以根据实际数据测试方法。我用了3,003 M3竞争的数据集进行比较所产生的80%和95%的预测区间ets()
,auto.arima()
和我hybridf()
。在对给定的历史数据拟合模型并产生所需长度的预测之后,我计算了预测间隔中有多少实际结果。结果如下:
变量 | 成功 |
---|---|
ets_p80 | 0.75 |
ets_p95 | 0.90 |
auto.arima_p80 | 0.74 |
auto.arima_p95 | 0.88 |
hybrid_p80 | 0.83 |
hybrid_p95 | 0.94 |
我的混合方法有在接近广告的成功率,而这两个预测区间ets()
和auto.arima()
不太成功。例如,混合80%预测区间包含83%的实际结果,95%预测区间具有94%的实际结果; 而对于auto.arima,成功率分别为74%和88%。
以下是我在M3数据上测试的方法。我构建了一个小函数pi_accuracy()
来帮助,它利用了类预测对象返回一个名为“lower”的矩阵和另一个名为“upper”的矩阵的事实,每个预测区间级别都有一列。由于这只是本博客的临时功能,我将其保留,因此它仅适用于生成80%和95%间隔的预测对象的默认值:
#------------------setup------------------------
library(showtext)
library(ggplot2)
library(scales)
library(forecast)
ly = "myfont"))
pi_accuracy <- function(fc, yobs){
# checks the success of prediction intervals of an object of class
In <- (yobsm
}
实际上拟合所有预测相对简单。我的笔记本电脑花了大约一个小时。当hybridf()
函数返回一个提供底层ets()
和auto.arima()
对象的对象时,它们不需要重新安装,并且有一些适度的效率。
#============forecasting with default values===============
num_series <- length(M3) # ie 3003
results <- matrix(0, nrow = num_series, ncol = 7)
for(i in 1:num_series){
cat(i, " ") # let me know how it‘s going as it loops through...
series <- M3[[i]]
ccess
fc1 <- fc3$fc_ets
r
geom_smooth(se = FALSE, method = "lm") +
theme(panel.grid.minor = element_blank())
当我们查看单个预测的成功率时,会出现一个有趣的模式,如上图所示。一小部分不幸的人在预测区间内有0%的实际数据 - 事情出错并且保持错误。通常,预测周期越长,预测间隔的准确率越高。预测间隔变得更宽,因为它们预测了更多的周期; 并且这种间隔中明确包含的随机性开始主导着首先出现错误模型的沉没成本不准确性。对于较长的预测期,标准预测间隔倾向于按照所宣传的方式执行,而对于较短的预测期,它们过于乐观。
引导
预测方法都ets()
和auto.arima()
有通过仿真和引导残差,而不是分析估计预测区间的选项,这些方法都是由我继承hybridf()
。我也检查了这些预测区间的值。结果与非引导结果非常相似; 如果有的话,基于自举和模拟的预测间隔稍微不准确,但差别无关紧要。
变量 | 成功 |
---|---|
ets_p80 | 0.72 |
ets_p95 | 0.88 |
auto.arima_p80 | 0.70 |
auto.arima_p95 | 0.86 |
hybrid_p80 | 0.80 |
hybrid_p95 | 0.92 |
#=====with bootstrapping instead of formulae for the prediction intervals=============
num_series <- length(M3)
resultsb <- matrix(0, nrow = num_series, ncol = 7)
for(i in 1:num_series){
cat(i, " ")
gather(variable, value, -h) %>%
mutate(weighted_val ighted_value) / sum(h), 2))
结论
- 根据M3竞赛数据进行测试
hybridf()
,通过组合预测间隔ets()
并auto.arima()
以保守方式(“通过叠加两个源间隔覆盖的最宽范围”)形成的预测间隔执行真实到期望的水平,即80%预测interval在80%的时间内包含真值,95%的预测间隔包含不到95%的时间的真值。
原文地址:https://www.cnblogs.com/tecdat/p/9550237.html