Ансамбль, ARIMA, ETS, динамическая гармоническая регрессия, линейная регрессия временных рядов, STL-декомпозиция ETS, линейная зависимость Холта, линейное затухание Холта, простое экспоненциальное сглаживание, дрейф, сезонный NAIVE, NAIVE, CROSTON, SBA
Это продолжение моего предыдущего блога. В предыдущем блоге мы рассмотрели, как мы выполняем базовую предварительную обработку данных и как классифицировать временные ряды с помощью функции _1 _ . Эта серия будет состоять из следующих 5 частей:
Часть 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, динамической гармонической регрессии и регрессии временных рядов являются наиболее подходящими моделями для групп приема пищи / центра.
Итак, теперь мы знаем, как подобрать классические модели временных рядов для группы данных временных рядов. Однако это имеет некоторые недостатки в практическом / деловом мире. Что это за недостатки?
- Время: обучение занимает очень много времени, когда количество групп увеличивается. Например, в нашем случае нам нужно обучить около 35 тысяч моделей, чтобы найти 3,5 тысячи подходящих моделей.
- Воспроизводимость. После того, как вы найдете подходящую модель для группы, мы предполагаем, что эта же модель будет использоваться и в будущем. На практике это не так, поскольку наиболее подходящая модель может измениться при добавлении новых транзакций.
- Нет масштабируемости. Не существует единой глобальной модели. т.е. нам пришлось подбирать разные модели для каждой группы.
Что мы можем сделать, чтобы преодолеть эти проблемы?
Ответ на эти вопросы - модели машинного обучения и глубокого обучения.
В моем следующем блоге я объясню, как мы можем соответствовать моделям машинного обучения и глубокого обучения и заниматься разработкой функций. Эта модель машинного обучения также значительно повышает нашу точность.
использованная литература
Хайндман, Р.Дж., и Атанасопулос, Г. (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 г.].