AIC 什么时候是一个好的预测模型选择标准,什么时候不是?

机器算法验证 时间序列 预测 aic 比克
2022-03-16 08:53:07

我试图弄清楚为什么 AIC 和其他类似的 IC 在尝试执行自动预测生成时充当样本外错误的代理。

因此,我对 AirPassengers 数据集进行了一项实验,该数据集与真实世界时间序列一样可预测。我使用 1958 年底的数据作为训练集,使用 1959 年和 1960 年的数据作为保留集。

我得到的结果令人惊讶:

使用 auto.arima()(stepwise=FALSE 和 approximation=FALSE),选择的最佳拟合模型是ARIMA(0,1,3)(0,1,0)12模型,AIC = 802.346,测试 RMSE = 69.235753。

然后我拟合一个带有极端参数的“over the top” ARIMA 模型ARIMA(15,1,15)(4,1,4)12. 正如预期的那样,这导致更高的 AIC 为 829.2997,但RMSE = 27.871115 更低

然后我尝试了一个更合理的 ARIMA 模型(即在 auto.arima() 考虑的范围内),ARIMA(2,1,2)(2,1,2)12它给了我一个 AIC=804.56 和一个 RMSE = 42.051491。

从预测图中可以更清楚地看出,具有最高 AIC的模型是给出最佳预测的模型。AICc 和 BIC 给出了类似的反向行为,具有最高 IC 值的模型给出了最低的 RMSE 和 MAPE。

我的问题:

  • 这不是与预期行为完全相反吗?我认为最小化 AIC(或任何其他 IC)给出了最好的模型,而不是最大化它?
  • 我的实验有问题吗,这给了我反直觉的结果?
  • 航空乘客时间序列非常规律和可预测的事实与此有关吗?AIC 会更好地处理非常嘈杂的数据吗?
  • 如果不在这种情况下,AIC 和其他 IC 何时适合选择时间序列模型?

在此处输入图像描述

#Call the necessary libraries 
library('ggplot2')  
library('forecast') 
library(zoo) 
library(scales) 
theme_set(theme_bw()) 

#load the airpassengers data 
data("AirPassengers") 

#Split the data into test and train 
train <- window(AirPassengers, end = c(1958, 12))
test <- window(AirPassengers, start = c(1959, 1), end = c(1960,12))


#Fit the models
fit <- auto.arima(train, stepwise = FALSE, approximation = FALSE)
fit2 <- Arima(train, order=c(15, 1, 15), seasonal = list (order= c(4, 1, 4) , period = 12), method='ML')
fit3 <- Arima(train, order=c(2, 1, 2), seasonal = list (order= c(2, 1, 2) , period = 12), method='ML')

#Generate forecasts 
#I am setting forecast intervals to 0 so that they are not displayed for better clarity  
arima_fct <- forecast(fit,level = c (0,0), h=24) 
arima_fct2 <- forecast(fit2,level = c (0,0), h=24) 
arima_fct3 <- forecast(fit3,level = c (0,0), h=24) 

fit$aic
fit2$aic
fit3$aic

accuracy(arima_fct,test)
accuracy(arima_fct2,test)
accuracy(arima_fct3,test)


  #Plot results 
  autoplot(arima_fct , ylab = 'Passengers') + scale_x_yearmon() + autolayer(test, series="Test Data") + autolayer(arima_fct$mean, series="ARIMA(0,1,3)(0,1,0)[12]: AIC = 802.3461, Test RMSE = 69.235753") + autolayer(arima_fct3$mean, series="ARIMA(2,1,2)(2,1,2)[12]: AIC = 804.56, Test RMSE = 42.051491") + autolayer(arima_fct2$mean, series="ARIMA(15,1,15)(4,1,4)[12]: AIC = 829.2997, Test RMSE = 27.871115") 
1个回答

我对我的回答并不完全满意,但是就这样吧。

  1. 在某种程度上,您是在比较苹果和橙子。您的两次调用Arima()use method="ML",而您auto.arima()使用默认值,即method="CSS-ML". 再说一次,用默认值重新调整所有内容并没有真正的区别。

  2. 最小化 AIC 渐近等效于最小化一步前平方预测误差。(抱歉,我手头没有参考资料。)请注意,这是一个合适的统计意义上的渐近结果。精心挑选的模型很有可能在有限长度的时间序列上胜过 AIC。在一个单一的,在那。

  3. 最后,正如您在评论中所写AirPassengers数据集表现出很强的乘法季节性。ARIMA 不模拟乘法季节性或趋势;它只能处理加法效应。您的过度参数化模型获得了正确的乘法趋势和季节性,但它也可能在表现出此类影响的系列中对此进行预测。通常不考虑这种大型模型是有原因的。

    为了模拟乘法效应,允许auto.arima()使用 Box-Cox 变换:

    > (foo <- auto.arima(train,lambda="auto"))
    Series: train 
    ARIMA(0,1,1)(0,1,1)[12] 
    Box Cox transformation: lambda= -0.3096628 
    
    Coefficients:
              ma1     sma1
          -0.3936  -0.5713
    s.e.   0.1035   0.0863
    
    > accuracy(forecast(foo,h=24,biasadj=TRUE),test)
                         ME      RMSE       MAE        MPE     MAPE      MASE       ACF1 Theil's U
    Training set -0.7186038  8.915531  6.691014 -0.2079082 2.753580 0.2341638 0.04889565        NA
    Test set     28.5600533 31.711896 28.884516  6.2710488 6.348486 1.0108644 0.17279165 0.6372069
    

    我删掉了 AIC,因为它无法与非转换数据上的 AIC 相提并论。请注意,在测试 RMSE 方面,我们最终更接近您的大型模型,但该模型更具可解释性,我个人会比 ARIMA(15,1,15)(4,1, 4)[12] 一。顺便说一句,搜索更多可能的 ARIMA 模型会产生完全相同的模型:

    > (bar <- auto.arima(train,max.p=15,max.q=15,max.P=4,max.Q=4,
    + lambda="auto",stepwise=FALSE,approximation=FALSE))
    Series: train 
    ARIMA(0,1,1)(0,1,1)[12] 
    Box Cox transformation: lambda= -0.3096628 
    
    Coefficients:
              ma1     sma1
          -0.3936  -0.5713
    s.e.   0.1035   0.0863