我使用auto.arima()
函数构建ARIMA模型,然后计算预测精度:
library(fpp2)
data("AirPassengers")
train <- window(AirPassengers, end = c(1959, 12))
test <- window(AirPassengers, start = 1960)
ARIMA <- auto.arima(train, lambda = 0, biasadj = TRUE)
ARIMAf <- forecast(ARIMA, h = 12)
accuracy(ARIMAf, test)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
Training set 0.579486 9.907267 7.483159 0.1187348 2.880429 0.2457523 0.01227544 NA
Test set -16.986385 23.931703 18.527682 -3.9334909 4.182395 0.6084625 0.04802038 0.5336134
auto.arima()
函数将AIC
,AICc
或BIC
的值最小化,但是我想建立一个具有最小值的ARIMA模型,例如测试集上的RMSE
。例如,通过开发一组具有不同参数值的ARIMA模型,以便找到测试集上具有最小RMSE的模型。请帮助我了解我该怎么做。
ARIMA模型建立在训练数据上,通常使用最小二乘法来最大化其对训练数据的拟合度。它使用AIC或类似方法在候选模型之间进行决策,以防止过度拟合。
最小化模型和测试数据之间的RMSE取决于两件事:模型和测试数据。除非模型也知道测试数据,否则您不能要求模型本身降低RMSE。但是预测模型的全部要点是,您想问一个变量的未来值是多少,因此您当然不能在模型中包括它。
当您考虑时,您所问的是“我如何使我的模型面向未来?”
这并不是说您无法通过更改arima.auto
的参数在测试数据上获得较低的RMSE,但只能通过将输出与test
数据进行比较来做到这一点。
如果要检查不同的参数并查看哪个模型最适合测试数据,则可以像这样自动进行多个模型拟合:
test_seasons <- function(train, test)
{
seasonal = c("seas", "ocsb", "hegy", "ch")
RMSE <- 1000
for(i in 1:3)
{
latest_model <- auto.arima(train, lambda = 0, biasadj = TRUE, seasonal.test = seasonal[i])
latest_RMSE <- accuracy(forecast(latest_model, h = 12), test)[2, 2]
if(latest_RMSE < RMSE)
{
RMSE <- latest_RMSE
output <- latest_model
best_season <- seasonal[i]
}
}
cat("The optimal seasonal.test parameter was \"", best_season, "\" (RMSE ",
RMSE, ")", sep = "")
}
您可以这样做
test_seasons(train, test)
# The optimal seasonal.test parameter was "seas" (RMSE 18.78836)
但是,如果要使用最佳数值参数,这种方法将非常慢。
[从统计角度来看,我也要谨慎选择根据其对单个年份的预测程度来使用的模型。如果您有额外一年的数据,最好的使用方法是将其包括在模型中,而不是手动调整参数。