在 R 中创建具有最小预测误差值的 ARIMA 模型
Creating ARIMA model with a minimum value of forecast error in R
我使用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,除非模型也知道测试数据。但是预测模型的全部要点是你想问一个变量的未来值是多少,所以你当然不能把它包括在模型中。
仔细想想,你问的是"how do I make my model look into the future?"
这并不是说您不能通过更改 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)
但是,如果你想找到最佳数值参数,这种方法会很慢。
从统计学的角度来看,我也会谨慎选择一个模型来根据它对某一年的预测有多好来使用。如果您有额外一年的数据,最好的使用方法是将其包含在您的模型中,而不是手动调整参数。
我使用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,除非模型也知道测试数据。但是预测模型的全部要点是你想问一个变量的未来值是多少,所以你当然不能把它包括在模型中。
仔细想想,你问的是"how do I make my model look into the future?"
这并不是说您不能通过更改 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)
但是,如果你想找到最佳数值参数,这种方法会很慢。
从统计学的角度来看,我也会谨慎选择一个模型来根据它对某一年的预测有多好来使用。如果您有额外一年的数据,最好的使用方法是将其包含在您的模型中,而不是手动调整参数。