Как построить модель на основе временных рядов с метриками и эвристиками
Что проверяют
Понимаете ли вы, что во временных рядах главное не выбор модели, а честная валидация и правильная метрика. Эвристики упоминают не случайно: спросят, какой простой бейзлайн вы бы поставили и как доказали, что модель его обгоняет.
Как отвечать
Идите от задачи к проверке:
- постановка: горизонт прогноза, частота, уровень агрегации (товар, магазин, регион) и цена ошибки. Недопрогноз и перепрогноз часто стоят по-разному;
- бейзлайны и эвристики: наивный прогноз «как вчера», сезонный наивный «как неделю назад», скользящее среднее. Эвристики живут и в постобработке: обрезать отрицательные значения, учесть известные праздники и акции ручными правилами;
- модели: ETS и SARIMA для немногих рядов с понятной сезонностью, градиентный бустинг (LightGBM, CatBoost) на лагах, скользящих статистиках и календарных признаках для тысяч рядов, нейросетевые вроде N-BEATS или TFT при большом объёме данных;
- валидация: только по времени. Скользящее или расширяющееся окно,
TimeSeriesSplitв scikit-learn, несколько отсечек с горизонтом, равным боевому; - метрики: MAE и RMSE для одного ряда, WAPE для суммы по многим рядам, MASE для сравнения с наивным прогнозом. Для интервалов квантильная функция потерь.
Ответ сильнее, если вы свяжете метрику с бизнесом: WAPE по складу понятнее закупщику, чем RMSE.
Где спотыкаются
Делят данные случайно 80 на 20 или берут обычный k-fold. Модель видит будущее, валидация получается красивой, а на проде качество проваливается.
Допускают утечку в признаках: скользящее среднее включает текущую точку, нормализация посчитана по всему ряду, в признаки попали данные, которых на момент прогноза ещё нет.
Берут MAPE не глядя. При нулевых или близких к нулю продажах она взрывается, а перепрогноз штрафует сильнее недопрогноза. Туда же относится требование стационарности для бустинга: это условие ARIMA, а не всех моделей.