Создание модели ARIMA с минимальным значением ошибки прогноза в R - PullRequest
1 голос
/ 26 января 2020

Я использую функцию 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 с различными значениями параметров, чтобы найти модель с минимальным среднеквадратическим средним значением в тестовом наборе. Пожалуйста, помогите мне понять, как я могу это сделать.

1 Ответ

3 голосов
/ 26 января 2020

Модель ARIMA построена на данных тренировки и, как правило, использует метод наименьших квадратов для максимального соответствия ее данным тренировки. Он использует AI C или аналогичный для выбора между подходящими моделями для предотвращения переоснащения.

Минимизация СКО между моделью и данными испытаний зависит от двух вещей: модели и данных испытаний. Вы не можете попросить саму модель уменьшить среднеквадратическое среднеквадратичное отклонение, если модель также не знает данные испытаний. Но весь смысл прогнозирующей модели заключается в том, что вы хотите спросить, каким будет будущее значение переменной, поэтому, конечно, вы не можете включить это в модель.

Когда вы думаете об этом, вы спрашиваете: «Как мне заставить мою модель смотреть в будущее?»

Это не значит, что вы не можете получить более низкое среднеквадратичное значение для вашей модели. проверить данные, изменив параметры arima.auto, но это можно сделать только путем сравнения выходных данных с данными 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)

Однако, этот метод будет очень медленным, если вы хотите найти оптимальное числовые параметры.

Со статистической точки зрения я бы также с осторожностью подходил к выбору модели для использования на основе того, насколько хорошо она прогнозирует один год. Если у вас есть данные за дополнительный год, лучше всего использовать их в своей модели, а не настраивать параметры вручную.

...