Без ограничений, на 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 модели
- Авторегрессионная модель до 80-го порядка + экзогенные переменные
- Используются аналогичные переменные, что и в случайном лесе.
- Плюс — быстрее всего оценивается и предсказывает
- Минус — не применялась регуляризация, есть основания считать, что страдает от мультиколлинеарности (незначимые коэффициенты при части лагов)
- Дополнительная точка для изучения — остатки модели, они распределены почти равномерно, а не нормально. Тут или дополнительная закономерность, или специально сгенерированный шум. Следствие — нарушение предпосылок модели и проблемы с оценкой значимости весов. Потенциально — подбор трансформации данных может быть дополнительно проведен.
- Подход с рекуррентной нейронной сетью.
- Использовал на входе переменную clients за прошлый час, параметры времени + 2 параметра скользящего окна в 48 часов.
- Перебрал число нейронов, число эпох и размер поколения, выбрал оптимальное значение по RMSE на валидации за 2014 год.
- Ожидалось, что этот метод будет лучше всех, однако ожидание не оправдалось. Потенциально — увеличить длину окна + делать создание дополнительной тренировочной выборки, делая ресэмплинг и использовать более глубокую сеть (вместо 1 слоя).
- Плюс — минимум настроек, даже без дополнительного изучения данных работало на уровне лучших двух методов.
- Расширение над ARIMA моделью с учетом сезонности.
- Есть потенциал работать лучше только авторегрессионной модели и сразу учесть сезонность.
- Расчет гиперпараметров удалось провести только частично из-за ограничения по оперативной памяти.
- Минус — самый медленный метод, кросс-валидацию в разумное время удалось сделать только 5 срезов, а не 100, как на других моделях. Также один из двух худших прогнозов.
- Использовался как базовый прогноз
- Плюс — минимум ручных настроек и простота. Также удобство визуализации вклада сезонностей
- Минус — один из двух худших прогнозов
- Потенциально можно реализовать — использовать его + бустинг на его ошибках, более качественными методами, которые поймают автокорреляции в данных.