Какие особенности построения датасета и валидации для моделей временных рядов
Что проверяют
Понимаете ли вы, что случайное разбиение временного ряда даёт утечку из будущего и завышенную метрику. Следом обычно спрашивают, как построить лаговые признаки, не заглянув вперёд, и как валидация связана с горизонтом прогноза.
Как отвечать
Главный принцип: валидация повторяет боевой сценарий. В проде модель видит только прошлое, значит и на валидации ей нельзя видеть ничего после точки отсечки.
- разбиение: train всегда раньше validation, validation раньше test.
train_test_splitс перемешиванием и обычныйKFoldздесь не подходят; - кросс-валидация: расширяющееся или скользящее окно. В scikit-learn это
TimeSeriesSplitс параметрамиn_splits,test_size,max_train_sizeиgap. Зазорgapнужен, когда таргет считается по окну вперёд или данные приходят с задержкой; - горизонт: при прогнозе на семь дней вперёд лаги короче семи дней в момент прогноза недоступны. Бэктест строят ровно так, как модель будут вызывать;
- признаки: лаги, скользящие статистики со сдвигом (
shift(1)передrolling), календарь, праздники. Масштабирование, заполнение пропусков и target encoding обучаются только на train внутри каждого фолда; - несколько рядов: одна дата отсечки для всех рядов, иначе один магазин подсказывает другому будущее. Отдельно проверяют новые ряды без истории;
- метрики: MAE и RMSE, а MAPE ломается на нулях, поэтому берут WAPE или MASE. Обязательно сравнение с наивным прогнозом: вчерашнее значение или значение сезон назад.
Хорошо добавить про доступность данных во времени: признак берётся в том виде, в каком был известен в момент прогноза, а не после поздних досчётов.
Где спотыкаются
Считают rolling(7).mean() без сдвига. Окно включает текущее значение таргета, модель видит ответ, метрика отличная на валидации и проваливается в проде.
Заполняют пропуски интерполяцией или масштабируют по всему датасету до разбиения. Интерполяция тянет значения из будущего в прошлое.
Не сравнивают с наивным бейзлайном. Сложная модель нередко проигрывает прогнозу «как неделю назад», и без такого сравнения этого никто не заметит.