12.8 训练集和测试集预测

通常,我们计算训练集数据的一步预测(“拟合值”)和测试集数据的多步预测。然而,有时我们可能希望计算训练集数据的多步预测,或者测试集数据的一步预测。

训练集数据的多步预测

我们通常将拟合值定义为训练集数据上的一步预测值(参见第 3.3 节),类似的思路也可以用于多步预测。我们将通过一个对澳大利亚外出就餐支出数据拟合的 ARIMA(2,1,1)(0,1,2)\(_{12}\) 模型来说明该方法。将近五年的数据作为测试集,预测结果如图12.7所示。

training <- subset(auscafe, end=length(auscafe)-61)
test <- subset(auscafe, start=length(auscafe)-60)
cafe.train <- Arima(training, order=c(2,1,1),
                    seasonal=c(0,1,2), lambda=0)
cafe.train %>%
  forecast(h=60) %>%
  autoplot() + autolayer(test) + 
   ylab("训练集") + xlab("时间") +
   theme(text = element_text(family = "STHeiti"))
对澳大利亚咖啡馆训练数据拟合ARIMA模型进行预测。

图 12.7: 对澳大利亚咖啡馆训练数据拟合ARIMA模型进行预测。

函数fitted()中有一个h参数可用于对训练集数据进行 \(h\) 步预测。图12.8是一个对训练集数据进行12步预测(一年)的过程。由于模型包含季节性(滞后12阶)和一阶(滞后1阶)差分,因此无法计算前几次观测值对应的这些预测值。

autoplot(training, series="Training data") +
  autolayer(fitted(cafe.train, h=12), 
            series="12-step fitted values") +
  ylab("训练集") + xlab("时间") +
  theme(text = element_text(family = "STHeiti"))
对澳大利亚咖啡馆训练数据拟合ARIMA模型得到的12步拟合值。

图 12.8: 对澳大利亚咖啡馆训练数据拟合ARIMA模型得到的12步拟合值。

测试集数据的一步预测

通常的做法是使用训练集数据拟合模型,然后根据测试集数据评估其预测性能。通常我们在不同的预测范围上对测试数据的预测精度进行比较。在上面的例子中,我们使用了最后60个观察值作为测试集,并在训练集数据的基础上估计我们的预测模型。那么预测误差将分为1步,2步,…,60步误差。预测方差通常随预测范围的增加而增加,所以如果我们简单地对测试集的绝对误差或平方误差进行平均,我们就把不同的预测方差结合起来了。

这个问题的一个解决方案是在测试集数据基础上得到一步预测误差。也就是说,我们仍然使用训练数据来估计所有的参数,但是当我们计算测试集数据的预测值时,我们使用每个观测之前的所有数据(包括训练和测试数据)。因此训练集数据对应时期为 \(1,2,\dots,T-60\) 。我们使用这些数据估计模型,然后计算 \(\hat{y}_{T-60+h|T-61+h}\) ,其中 \(h=1,\dots,T-1\) 。由于测试数据不用于估计参数,所以这仍给出我们一个“公平”的预测结果。对于ets()Arima()tbats()nnetar()函数,使用model参数都能很容易得到这些计算结果。

使用与上面相同的 ARIMA 模型,我们现在将模型应用于测试数据集

cafe.test <- Arima(test, model=cafe.train)
accuracy(cafe.test)
#>                     ME    RMSE     MAE      MPE  MAPE
#> Training set -0.002622 0.04591 0.03413 -0.07301 1.002
#>                MASE     ACF1
#> Training set 0.1899 -0.05704

需要注意的是Arima()在这种情况下不会重新估计。相反,先前获得的模型(存储为cafe.train)会被应用于测试数据集。由于模型没有被重新估计,这里得到的“残差”实际是一步预测误差。因此,accuracy()命令得到的结果实际上是测试集的结果(尽管输出是“训练集”)。