/test_predict_ts

решение предсказания временного ряда

Primary LanguageJupyter Notebook

Реализация тестового задания

Цель — предсказать значение clients на 31 декабря 2014 года

Без ограничений, на Python.

Ответ - 24 часовых предсказания на 31 декабря 2014 года ( лучшее предсказание )

Выводы и предсказания:

Я использовал несколько подходов к предсказанию, для каждого из подходов провел кросс-валидацию временного ряда на 100 разбиениях временного ряда и сравнивал модели по метрике среднего RMSE на кросс-валидации. Для лучших моделей построил предсказания.

Использованные модели:

Модель Random Forest регрессия AR(80) LSTM fbprophet SARIMAX
RMSE (CV) 20,64 20,81 22,52 83,11 от 31,2 до 109 (на полном наборе данных не дождался конца 100 fold кросс-валидации)
Короткое описание Регрессор методом случайного леса на авторегрессионных переменных + экзогенные переменные Авторегрессионная модель до 80-го порядка + экзогенные переменные LSРекуррентная нейронная сеть, 100 нейронов в слое Автоматизированная процедура с учетом сезонности Авторегрессионное интегрированное скользящее среднее + сезонность
Описание входящих данных Значение clients с лагом 1-48 часов, значение часа, месяца, дня месяца, флаг последнего дня месяца, минимум, среднее и максимум clients за прошлые 24 и 48 часов Значение clients, значение часа, месяца, дня месяца, флаг последнего дня месяца, минимум, среднее и максимум clients за прошлые 24 и 48 часов Значение clients, часа, месяца, дня месяца, флаг последнего дня месяца, минимум и максимум clients за прошлые 48 часов Только clients и флаг Только clients и параметры модели
ссылка на прогноз rf_predict.csv ar_predict.csv fbpredict.csv
ссылка на реализацию в коде раздел Random forest раздел AR LSTM fbprophet + exploratory поиск параметров раздел Sarimax

Подробности

Общее про данные:

  • В файле содержится 4 года часовых данных по переменной "clients" без пропусков.
  • Годовая, недельная и часовая сезонность присутствуют, но объясняют не более +60 -40 колебания относительно тренда. (Графики сезонных компонент в analysis_and_fx.ipynb)
  • Модель, только на сезонности и тренде работает хуже всего (fbprophet)
  • Целевая переменная с тяжелым правым хвостом, наблюдаемые значение имеют положительную асимметрию, мода меньше среднего, все наблюдаемые значения <1000
  • Анализ автокорреляций и частных автокорреляция указывают на то, что стоит брать лаги вплоть до 20 или 80-го при моделировании.

Модель регрессии случайным лесом:

Самые значимые параметры:

переменная значимость описание
clients_l1 0,750 clients с лагом 1
clients_l2 0,133 clients с лагом 2
clients_l3 0,041 clients с лагом 3
clients_l4 0,013 clients с лагом 4
max48 0,002 максимум clients за прошлые 48 часов
hour 0,002 час дня
  • На кросс-валидации из 5 срезов по 24 часа подобрал гиперпараметры (max_features=0.8, n_estimators=50)
  • Использовал лаги clients до 48-го + переменные описывающие время + переменные скользящего окна (мин, макс, среднее)
  • Валидация методом out-of-bag RMSE=27,1. Эту оценку получаем бесплатно на этапе обучения модели.
  • Готовим пошагово все переменные в прогнозном периоде, оцениваем прогноз на 31 декабря 2014 года по часам.
  • Большой плюс модели — она регуляризована по построению + из рассмотренных уступает по скорости только AR модели

AR(80) модель

  • Авторегрессионная модель до 80-го порядка + экзогенные переменные
  • Используются аналогичные переменные, что и в случайном лесе.
  • Плюс — быстрее всего оценивается и предсказывает
  • Минус — не применялась регуляризация, есть основания считать, что страдает от мультиколлинеарности (незначимые коэффициенты при части лагов)
  • Дополнительная точка для изучения — остатки модели, они распределены почти равномерно, а не нормально. Тут или дополнительная закономерность, или специально сгенерированный шум. Следствие — нарушение предпосылок модели и проблемы с оценкой значимости весов. Потенциально — подбор трансформации данных может быть дополнительно проведен.

LSTM

  • Подход с рекуррентной нейронной сетью.
  • Использовал на входе переменную clients за прошлый час, параметры времени + 2 параметра скользящего окна в 48 часов.
  • Перебрал число нейронов, число эпох и размер поколения, выбрал оптимальное значение по RMSE на валидации за 2014 год.
  • Ожидалось, что этот метод будет лучше всех, однако ожидание не оправдалось. Потенциально — увеличить длину окна + делать создание дополнительной тренировочной выборки, делая ресэмплинг и использовать более глубокую сеть (вместо 1 слоя).
  • Плюс — минимум настроек, даже без дополнительного изучения данных работало на уровне лучших двух методов.

SARIMAX

  • Расширение над ARIMA моделью с учетом сезонности.
  • Есть потенциал работать лучше только авторегрессионной модели и сразу учесть сезонность.
  • Расчет гиперпараметров удалось провести только частично из-за ограничения по оперативной памяти.
  • Минус — самый медленный метод, кросс-валидацию в разумное время удалось сделать только 5 срезов, а не 100, как на других моделях. Также один из двух худших прогнозов.

FBProphet

  • Использовался как базовый прогноз
  • Плюс — минимум ручных настроек и простота. Также удобство визуализации вклада сезонностей
  • Минус — один из двух худших прогнозов
  • Потенциально можно реализовать — использовать его + бустинг на его ошибках, более качественными методами, которые поймают автокорреляции в данных.