Ансамбль, ARIMA, ETS, динамическая гармоническая регрессия, линейная регрессия временных рядов, STL-декомпозиция ETS, линейная зависимость Холта, линейное затухание Холта, простое экспоненциальное сглаживание, дрейф, сезонный NAIVE, NAIVE, CROSTON, SBA

Это продолжение моего предыдущего блога. В предыдущем блоге мы рассмотрели, как мы выполняем базовую предварительную обработку данных и как классифицировать временные ряды с помощью функции _1 _ . Эта серия будет состоять из следующих 5 частей:

Часть 1. Очистка данных и категоризация запросов.

Часть 2. Подгоните статистические модели временных рядов (ARIMA, ETS, CROSTON и т. д.) с помощью пакета R fpp3 (аккуратное прогнозирование)

Часть 3: Разработка функций для временных рядов с использованием пакета timetk R.

Часть 4. Подбор моделей машинного обучения (XGBoost, Random Forest и т. д.) & Настройка гиперпараметров с использованием пакетов modeltime и tidymodels R.

Часть 5. Подгонка моделей углубленного изучения (NBeats и DeepAR) и настройка гиперпараметров с использованием пакетов modeltime, modeltime.gluonts R.

В этом блоге я объясню, как соответствовать классическим моделям временных рядов (ARIMA, ETS, модель разложения и т. Д.) для данных (3 548 групп) группы временных рядов и выберите подходящую модель временных рядов для каждой группы.

Давайте начнем!

Схема рабочего процесса:

На приведенной выше диаграмме показан рабочий процесс, выполняемый для соответствия классическим статистическим моделям. Первый этап этого рабочего процесса (Считывание данных, подготовка данных и категоризация запросов) был объяснен в моем предыдущем блоге. Здесь мы сосредоточимся на подборе статистических моделей и вычислении R oot M ean S квадратного L огарифмического E rror (RMSLE) показатель точности для выбора подходящих моделей.

Давайте импортируем библиотеки.

pacman::p_load(tidyverse, magrittr) # data wrangling packages
pacman::p_load(lubridate, tsintermittent, fpp3, modeltime, timetk, modeltime.gluonts, tidymodels, modeltime.ensemble, modeltime.resample) # time series model 
packagespacman::p_load(foreach, future) # parallel functions
pacman::p_load(viridis, plotly) # visualizations packages
theme_set(hrbrthemes::theme_ipsum()) # set default themes

Шаг 01: Подбор моделей временных рядов для сглаженных и неустойчивых типов.

Мы уже определили тип спроса для каждой группы обедов / центров. Теперь мы отфильтруем только данные временных рядов сглаженного и неустойчивого типов спроса, еды / центровых групп.

smooth_tbl <- master_data_tbl %>%
  filter(demand_cate %in% c("Smooth", "Erratic"))

Теперь отфильтрованные данные разделены на данные тренировок и тестов (за последние 10 недель) для каждой комбинации прием пищи / центр.

train_tbl <- smooth_tbl %>%
  filter_index(. ~ "2018-07-23")
test_tbl <- smooth_tbl %>%
  filter_index("2018-07-30" ~ .)

Примечание. Здесь наш фрейм данных представляет собой объект tsibble, который представляет собой специальный тип фрейма данных, который работает с данными временных рядов. Мы уже указали «идентификаторы центра и еды» в качестве ключевых переменных в тиббле «master_data_tbl». Таким образом, наши функции tidyverse будут применяться ко всем группам еды / центра. Например, когда мы применяем функцию «filter_index», она будет фильтровать по дате для всех групп.

Затем мы собираемся подобрать следующие модели с 11 временными рядами для каждой группы приема пищи / центра , т. Е. вмещает 34 265 моделей.

Как есть 34 265 моделей?

Существует 1839 гладких и 1276 групп питания / центров беспорядочного типа, что в сумме составляет 3 115 различных групп. Мы подберем 11 различных моделей для каждой группы, что составит в общей сложности 3 115 * 11 = 34 265.

Наивный: Наивная модель устанавливает все будущие значения такими же, как последнее значение наблюдения.

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

Дрейф: Модель дрейфа - это разновидность наивной модели, позволяющая прогнозировать увеличение или уменьшение с течением времени.

Простое экспоненциальное сглаживание. Простая экспоненциальная сглаживающая модель используется, когда не удается идентифицировать четкий тренд или сезонную модель.

Линейная модель Холта. Линейная модель Холта - это расширенная версия SES, позволяющая прогнозировать с учетом тренда.

Линейная характеристика затухания по Холту. Модель тенденции затухающей добавки - это расширенная версия линейной зависимости Холта, позволяющая изменяться с течением времени с помощью параметра затухания phi.

Прогнозирование с декомпозицией. Модель декомпозиции используется для декомпозиции временных рядов с помощью разложения по сезонам и трендам с использованием метода Лесса (STL). Затем метод ETS можно использовать для прогнозирования данных с сезонной корректировкой, после чего к данным прогноза можно добавить сезонную составляющую.

ARIMA: Модели ARIMA объясняют автокорреляции в данных. Здесь мы собираемся использовать автоматическую модель ARIMA, которая автоматически выбирает заказы ARMA с использованием min AICC.

Динамическая гармоническая регрессия. Модель динамической гармонической регрессии позволяет включать другие данные, такие как базовая цена, цена оформления заказа, продвижение по электронной почте и указанная домашняя страница.

Регрессия временных рядов. Модель регрессии временных рядов используется для прогнозирования зависимой переменной Y, предполагая, что она имеет линейную связь с другими независимыми переменными X. т. е. в этой ситуации при прогнозировании делается допущение, что количество заказов и расчетная цена, базовая цена, адрес электронной почты для продвижения и указанная домашняя страница имеют линейную зависимость.

Ансамбль. Модель ансамбля просто использует одновременно несколько разных моделей и вычисляет среднее значение полученных прогнозов. Например, здесь модели ARIMA, SES и Decomposition используются вместе для расчета среднего значения прогноза.

Теперь мы поместим указанные выше 11 моделей в R с помощью пакета R fpp3. Здесь мы преобразовали в журнал количество заказов, чтобы наложить положительное ограничение. Вы можете видеть, что в коде R мы добавили один в качестве смещения; это необходимо для решения проблемы бесконечности log (0).

Это займет больше времени, поскольку подходит для моделей 34k.

fpp3_model_table <- train_tbl %>%
  model(
    ## Model 1: Naive ----
    naive_mod = NAIVE(log(num_orders + 1)),
    ## Model 2: Snaive ----
    snaive_mod = SNAIVE(log(num_orders + 1)),
    ## Model 3: Drift ----
    drift_mod = RW(log(num_orders + 1) ~ drift()),
    ## Model 4: SES ----
    ses_mod = ETS(log(num_orders + 1) ~ error("A") + trend("N") + season("N"), opt_crit = "mse"),
    ## Model 5: Holt's Linear ----
    hl_mod = ETS(log(num_orders + 1) ~ error("A") + trend("A") + season("N"), opt_crit = "mse"),
    ## Model 6: Damped Holt's Linear ----
    hldamp_mod = ETS(log(num_orders + 1) ~ error("A") + trend("Ad") + season("N"), opt_crit = "mse"),
    ## Model 7: STL decomposition with ETS ----
    stl_ets_mod = decomposition_model(STL(log(num_orders + 1)), ETS(season_adjust ~ season("N"))),
    ## Model 8: ARIMA ----
    arima_mod = ARIMA(log(num_orders + 1)),
    ## Model 9: Dynamic harmonic regression ----
    dhr_mod = ARIMA(log(num_orders + 1) ~ PDQ(0,0,0) + fourier(K=6) + checkout_price + emailer_for_promotion),
    ## Model 10: TSLM ----
    tslm_mod = TSLM(log(num_orders + 1) ~ checkout_price + base_price + emailer_for_promotion)) %>%
  ## Model 11: Ensemble Model ----
  mutate(ensemble_sm_mod = combination_ensemble(arima_mod, ses_mod, stl_ets_mod))

Шаг 02: Подбор моделей временных рядов для прерывистых и неоднородных типов.

На этом этапе мы отфильтруем данные временного ряда прерывистые и неровные группы приема пищи / центров.

inter_tbl <- master_data_tbl %>%
  filter(demand_cate %in% c("Intermittent", "Lumpy"))

Теперь отфильтрованные данные разделены на данные тренировок и тестов (за последние 10 недель) для каждой группы приема пищи / центра.

train_tbl <- inter_tbl %>%
  filter_index(. ~ "2018 W30")
test_tbl <- inter_tbl %>%
  filter_index("2018 W31" ~ .)

Затем мы подберем следующие модели 5-ти временных рядов для каждой группы приема пищи / центра , т. Е. вмещает в общей сложности 1960 моделей.

Как есть 1960 моделей?

Существует 273 прерывистых и 119 групп с едой / центральными блюдами, что в сумме составляет 392 разных групп. Мы собираемся подогнать по 5 разных моделей для каждой группы, что в сумме составит 392 * 5 = 1960.

Простое экспоненциальное сглаживание. См. объяснение выше.

ARIMA: см. приведенное выше объяснение.

КРОСТОН. Модель Кростона - наиболее подходящий метод для медленно движущихся продуктов (прерывистый).

SBA: Модель SBA - это еще один вариант / улучшенная версия метода Кростона.

Ансамбль: здесь модели CROSTON, SBA, ARIMA и SES используются вместе для расчета среднего значения прогноза.

Теперь мы поместим указанные выше 5 моделей в R с помощью пакета R fpp3.

fpp3_model_table <- train_tbl %>%
  model(
    ## Model 1: Croston ----
    crost_mod = CROSTON(log(num_orders + 1)),
    ## Model 2: SBA ----
    sba_mod = CROSTON(log(num_orders + 1), type = "sba"),
    ## Model 3: SES ----
    ses_mod = ETS(log(num_orders + 1) ~ error("A") + trend("N") + season("N"), opt_crit = "mse"),
    ## Model 4: ARIMA ----
    arima_mod = ARIMA(log(num_orders + 1))) %>%
  ## Model 5: Ensemble ----
  mutate(ensemble_inter_mod = combination_ensemble(crost_mod, sba_mod, ses_mod, arima_mod))

Шаг 03: Прогноз на Тестовый период.

Сейчас у нас есть 36 225 (т. Е. 34 265 + 1 960) подогнанных моделей. Далее нам нужно выяснить, какая модель подходит для каждой группы приема пищи / центра. Для этого мы должны спрогнозировать каждую модель в период тестирования и рассчитать показатель их точности.

Теперь сделаем прогноз на Тестовый период.

forecast_tbl <- fpp3_model_table %>%
    forecast(test_tbl, times = 0) %>%
    as_tibble() %>%
    select(week_date, meal_id, center_id, .model, fc_qty = .mean)

Шаг 04: Рассчитайте точность.

На этом этапе мы рассчитаем точность каждой модели, чтобы выбрать подходящую модель для каждой группы блюд / центр. Используемый здесь показатель точности - R oot M ean S quared L ogarithmic E rror (RMSLE). Я выбрал RMSLE просто потому, что это была мера, используемая для оценки этого соревнования. Однако я лично предпочитаю RMSSE, поскольку он использовался в конкурсе по прогнозированию M5.

RMSLE можно вычислить в R с помощью функцииrmsle в пакете R Metrics.

forecast_tbl <- master_data_tbl %>%
  as_tibble() %>% # change tsibble -> tibble
  select(week_date, center_id, meal_id, num_orders) %>%
  right_join(forecast_tbl, by = c("week_date", "meal_id", "center_id")) %>% # join forecast values
  mutate(fc_qty = ifelse(fc_qty < 0, 0, fc_qty)) # change negative & NA orders
accuracy_tbl <- forecast_tbl %>%
  group_by(center_id, meal_id, .model) %>%
  summarise(accuracy_rmsle = Metrics::rmsle(num_orders, fc_qty)) # calculate RMSLE

Шаг 05: Выберите подходящую модель.

На этом этапе мы собираемся выбрать подходящую модель для каждой группы приема пищи / центра на основе минимального RMSLE.

suitable_model_tbl <- accuracy_tbl %>%
  ungroup() %>%
  group_by(meal_id, center_id) %>%
  filter(accuracy_rmsle == min(accuracy_rmsle)) %>%
  slice(n = 1)

Теперь у нас есть список моделей, которые подходят для каждой группы приема пищи / центра.

Например, в таблице ниже показано, что для Center 110 и Meal 2104 наиболее подходящей моделью является Seasonal Naive (snaive_mod), тогда как наиболее подходящей моделью для Center 67 и Meal 1885 является линейная модель Холта (hl_mod). Эти соответствующие модели можно использовать для каждой группы в будущем для прогнозирования количества заказов.

Шаг 06: Визуализация и обзор точности

На приведенном выше графике показан обзор точности наших подходящих моделей. Он показывает, что высокая точность (т.е. менее 1 RMSLE) была достигнута для большинства групп приема пищи / центра. Однако было несколько групп приема пищи / центров, которые показали низкую точность; для этих групп с низкой точностью можно использовать другие расширенные модели временных рядов / машинного обучения, чтобы повысить точность прогнозов. Более того, большинство групп с низкой точностью были неровными / прерывистыми, что означало, что для этого типа групп, а не подгонки предварительных моделей, основное внимание следует уделять расчетам страхового запаса.

На приведенном выше графике показано количество групп приема пищи / центров по сравнению с подходящими моделями, выбранными с помощью минимального RMSLE. Он показывает, что модели ARIMA, динамической гармонической регрессии и регрессии временных рядов являются наиболее подходящими моделями для групп приема пищи / центра.

Итак, теперь мы знаем, как подобрать классические модели временных рядов для группы данных временных рядов. Однако это имеет некоторые недостатки в практическом / деловом мире. Что это за недостатки?

  1. Время: обучение занимает очень много времени, когда количество групп увеличивается. Например, в нашем случае нам нужно обучить около 35 тысяч моделей, чтобы найти 3,5 тысячи подходящих моделей.
  2. Воспроизводимость. После того, как вы найдете подходящую модель для группы, мы предполагаем, что эта же модель будет использоваться и в будущем. На практике это не так, поскольку наиболее подходящая модель может измениться при добавлении новых транзакций.
  3. Нет масштабируемости. Не существует единой глобальной модели. т.е. нам пришлось подбирать разные модели для каждой группы.

Что мы можем сделать, чтобы преодолеть эти проблемы?

Ответ на эти вопросы - модели машинного обучения и глубокого обучения.

В моем следующем блоге я объясню, как мы можем соответствовать моделям машинного обучения и глубокого обучения и заниматься разработкой функций. Эта модель машинного обучения также значительно повышает нашу точность.

использованная литература

Хайндман, Р.Дж., и Атанасопулос, Г. (2021) Прогнозирование: принципы и практика, 3-е издание, OTexts: Мельбурн, Австралия. OTexts.com/fpp3. Проверено [Доступно 8 февраля 2021 г.].

Куренцес, Н., 2014. Пакет периодического прогнозирования спроса для Р. - Николаоса Курентеса. Kourentzes.com. Доступно по адресу: ‹https://kourentzes.com/forecasting/2014/06/23/intermittent-demand-forecasting-package-for-r/› [по состоянию на 22 января 2021 г.].