我可以使用准确度函数中的平均绝对比例误差 (MASE) 进行时间序列交叉验证吗?

机器算法验证 r 时间序列 预测 交叉验证 马斯
2022-04-08 11:25:47

我正在使用 R 中的“预测”包来预测时间序列数据。我正在根据 Rob J Hyndman 的阅读资源编写一些时间序列交叉验证。

Hyndman “测量预测准确性”中第 7 页的最后一段指出:

“要计算 MASE(原文如此,平均绝对缩放误差),我们需要计算缩放统计量 Q,但我们不希望 Q 的值随着每个训练集而改变。一种方法是使用所有可用数据计算 Q”

我将其解释为在所有 MASE 计算中保持朴素预测常数的平均绝对误差 (MAE) 计算。(注:MASE=MAE/Q

“forecast”包中的accuracy函数计算预测和状态的 MASE(在手册的第 4 页):

默认情况下,MASE 计算使用非季节性时间序列的样本内朴素预测、季节性时间序列的样本内季节性朴素预测和非时间序列数据的样本内平均预测的 MAE 进行缩放。

当我向前滚动我的预测原点时,我可以运行该accuracy函数来计算 MASE 吗?或者我是否必须手动计算 MASE,因为该accuracy函数不使用“所有可用数据”并且会针对每个训练数据集进行更改?

1个回答

accuracy()使用特定预测所基于的训练样本。正如您所注意到的,这将在滚动原点评估的每次迭代中发生变化。所以确实,你需要“自己动手”。

这不像看起来那么繁琐。请注意,MASE 是 MAE 或 MAD,除以一些比例因子。accuracy()会给你MAE。(当然,您可以在滚动原点评估中使用它。)因此,您只需为每个时间序列计算一个比例因子,然后将其应用于滚动原点 MAE。

例如,最初提出的“经典”比例因子Hyndman & Koehler (2006)只是简单随机游走预测的样本内 MAE。如果您要以此为基础的数据(例如,“通用”历史)是

foo <- ts(rnorm(1,20))

那么你可以很容易地计算出这个

mean(abs(foo[-1]-foo[-20]))

(注意:应该可以使用tail(foo,-1)-head(foo,-1),但这会产生一个全为零的向量......我想知道这里是否有问题,尽管两者tail(foo,-1)看起来都head(foo,-1)很好。很奇怪。)

(更新:tail(foo,-1)-head(foo,-1)适用于普通的香草 R,但如果我加载forecast8.5 包,则不能。听起来像一个错误。我会通知 Rob Hyndman。)

(更新 2:我从 Rob 那里得到了以下答案 -

这是一个功能,而不是一个错误。

通过定义 head.ts 和 tail.ts,我们确保 ts 对象上的 head() 和 tail() 现在保留它们的类(对于绘图等是必不可少的)。通过保留“ts”类,该-操作现在将使用Ops.ts. 这将计算相对于时间而不是相对于向量中的位置的数学运算。

)