Прогнозирование временных рядов
Стационарность и тест ADF, ACF/PACF, rolling-origin бэктест, GBDT против ARIMA, многошаговый прогноз, сезонность и прерывистый спрос.
11 вопросов
JuniorТеорияОчень частоЧем аддитивная сезонность отличается от мультипликативной и как закодировать её для GBDT?
Чем аддитивная сезонность отличается от мультипликативной и как закодировать её для GBDT?
Аддитивная сезонность прибавляет фиксированную величину, мультипликативная масштабируется с уровнем, поэтому амплитуда растёт, а логарифм делает её аддитивной. Для GBDT кодируют календарь — день недели, Fourier-члены года, флаги праздников.
Типичные ошибки
- ✗Подают дереву сырую отметку времени и ждут, что оно выучит недельный цикл
- ✗Подгоняют аддитивную сезонность к ряду, где амплитуда растёт с уровнем
- ✗Кодируют день года одной категорией высокой мощности вместо гладких членов
Уточняющие вопросы
- →Почему Fourier-члены лучше одной фиктивной переменной на каждый день года?
- →Как закодировать плавающий праздник вроде Пасхи?
JuniorТеорияОчень частоЧто предполагают о ряде градиентный бустинг на лагах, ARIMA и библиотека Prophet?
Что предполагают о ряде градиентный бустинг на лагах, ARIMA и библиотека Prophet?
ARIMA предполагает один стационарный ряд с линейной автокорреляцией. Prophet подгоняет аддитивный тренд с сезонностью и праздниками и терпим к пропускам. GBDT на лагах ловит нелинейность по многим рядам, но не экстраполирует тренд.
Типичные ошибки
- ✗Ждут от деревьев экстраполяции тренда за пределы виденного при обучении
- ✗Подгоняют ARIMA на каждый из ста тысяч SKU и называют это бейзлайном
- ✗Считают Prophet универсальной моделью, а не подгонкой кривой с декомпозицией
Уточняющие вопросы
- →Какие признаки добавить, чтобы GBDT справился с растущим трендом?
- →Когда классическая модель на каждый ряд всё ещё верный выбор?
JuniorТеорияЧастоВ тесте Дики-Фуллера (ADF) какова нулевая гипотеза и что доказывает невозможность её отвергнуть?
В тесте Дики-Фуллера (ADF) какова нулевая гипотеза и что доказывает невозможность её отвергнуть?
Нулевая гипотеза — в ряду есть единичный корень (ряд нестационарен); малое p-value её отвергает и поддерживает стационарность. Неотвержение ничего не доказывает — свидетельств против корня нет, а мощность на коротких рядах низка.
Типичные ошибки
- ✗Читают большое p-value как доказательство стационарности ряда
- ✗Игнорируют низкую мощность теста на паре сотен наблюдений
- ✗Запускают ADF на сильно сезонном ряде без сезонной разности
Уточняющие вопросы
- →Чем тест стационарности KPSS дополняет ADF при противоположном нуле?
- →Какой вывод делать, когда ADF и KPSS расходятся на одном ряду?
JuniorТеорияЧастоЧто такое стационарность и что именно чинят взятие разностей и логарифмирование?
Что такое стационарность и что именно чинят взятие разностей и логарифмирование?
Стационарный ряд держит постоянными среднее, дисперсию и автоковариацию — это и предполагает ARIMA. Взятие разностей убирает тренд или единичный корень и стабилизирует среднее; логарифм гасит дисперсию, растущую вместе с уровнем.
Типичные ошибки
- ✗Называют стационарным ряд со стабильным средним, но растущей дисперсией
- ✗По привычке берут разности дважды, переразностив ряд и добавив шум
- ✗Ждут, что логарифм уберёт тренд, а не стабилизирует дисперсию
Уточняющие вопросы
- →Как отличить переразностивание от действительно нестационарного ряда?
- →Когда берут разность на сезонном лаге, а не на лаге один?
MiddleДебаггингЧастоПрогноз выглядит отлично, но, возможно, просто повторяет вчерашнее значение — как это поймать?
Прогноз выглядит отлично, но, возможно, просто повторяет вчерашнее значение — как это поймать?
Сверните прогноз с фактом — пик на лаге 1 означает копирование вчерашнего. Сравните её с наивным и сезонно-наивным бейзлайнами по MASE, ведь на почти случайном блуждании MAPE мал; настоящее доказательство — обойти сезонно-наивный.
Открыть задачу →Типичные ошибки
- ✗Судят о прогнозе, ни разу не построив наивный бейзлайн для сравнения
- ✗Верят малому MAPE на медленном ряде, где его даст и копия с лагом один
- ✗Считают MAPE на ряде с почти нулевыми фактами, где метрика взрывается
Уточняющие вопросы
- →Почему MAPE взрывается при фактах около нуля и что приходит ему на смену?
- →Какой бейзлайн выбрать для ряда с сильной недельной сезонностью?
MiddleТеорияЧастоКакие очевидные признаки временного ряда незаметно протекают из будущего и как строить их безопасно?
Какие очевидные признаки временного ряда незаметно протекают из будущего и как строить их безопасно?
Центрированные скользящие средние, агрегаты по всей истории и импутация, обученная поперёк разбиения, затягивают будущие значения в обучающую строку. Делайте окно смотрящим назад и сдвинутым на шаг, а импутеры обучайте внутри фолда бэктеста.
Типичные ошибки
- ✗Берут центрированное окно, усредняющее значения после самой отметки времени
- ✗Обучают скейлеры или импутеры на всей истории до разбиения бэктеста
- ✗Забывают сдвиг на шаг, из-за чего строка тихо включает собственный таргет
Уточняющие вопросы
- →Какой длины эмбарго нужно, если метка созревает лишь через неделю?
- →Как ловить такую утечку автоматически внутри пайплайна признаков?
SeniorТеорияЧастоРекурсивный, прямой или многовыходный многошаговый прогноз — как в каждом накапливается ошибка?
Рекурсивный, прямой или многовыходный многошаговый прогноз — как в каждом накапливается ошибка?
Рекурсивный подаёт свой же прогноз на вход, поэтому ошибка накапливается с горизонтом, зато одна модель покрывает все шаги. Прямой обучает модель на каждый горизонт — накопления нет, но стоимость в h раз выше. На горизонте 30 обычно выигрывает прямой.
Типичные ошибки
- ✗Считают, что сильная оценка на шаге один переносится на горизонт тридцать
- ✗Не учитывают, что рекурсивный подаёт обратно свой же шумный прогноз
- ✗Упускают h-кратную стоимость обучения и обслуживания прямой стратегии
Уточняющие вопросы
- →Как сохранить согласованность прогнозов прямой модели по соседним горизонтам?
- →Почему оценку бэктеста нужно приводить по горизонтам, а не общим числом?
JuniorТеорияИногдаПочему обычная k-fold кросс-валидация недопустима на временном ряде и чем её заменяют?
Почему обычная k-fold кросс-валидация недопустима на временном ряде и чем её заменяют?
Случайный k-fold кладёт будущие строки в обучающий фолд, поэтому модель учится на будущем и оценка завышена. Его заменяет rolling-origin бэктест — обучаемся до отсечения, тестируем следующее окно, затем сдвигаем отсечение вперёд.
Типичные ошибки
- ✗Перемешивают строки перед разбиением упорядоченного по времени набора
- ✗Отчитываются k-fold-оценкой для модели, которая в проде прогнозирует вперёд
- ✗Держат одно фиксированное тестовое окно вместо сдвига начала вперёд
Уточняющие вопросы
- →Когда скользящее окно предпочтительнее расширяющегося?
- →Зачем оставлять зазор-эмбарго между отсечением обучения и тестовым окном?
SeniorТеорияИногдаКак читать порядки p и q для ARIMA по графикам автокорреляции (ACF) и частной (PACF) и когда это ненадёжно?
Как читать порядки p и q для ARIMA по графикам автокорреляции (ACF) и частной (PACF) и когда это ненадёжно?
На продифференцированном ряде PACF, обрывающийся после лага p при затухающей ACF, даёт AR(p); ACF, обрывающийся после лага q при затухающей PACF, — на MA(q). Правило ломается на смешанной ARMA, сезонных или нестационарных данных и коротких выборках.
Типичные ошибки
- ✗Читают графики до дифференцирования, из-за чего тренд забивает все лаги
- ✗Меняют роли местами, беря p по ACF, а q по PACF
- ✗Верят чистому обрыву на смешанной ARMA, где не обрывается ни один график
Уточняющие вопросы
- →На какой критерий опираться, когда оба графика просто затухают?
- →Как сезонный всплеск на лаге двенадцать меняет подгоняемую модель?
SeniorТеорияИногдаПромо или шок ломают режим — как обнаружить дрейф в прогнозной модели и что с ней делать?
Промо или шок ломают режим — как обнаружить дрейф в прогнозной модели и что с ней делать?
Следите за скользящей ошибкой против коридора бэктеста, за устойчивым смещением остатков и запускайте тест разладки по входам. Подтвердив дрейф, переобучите на коротком свежем окне, добавьте признаки событий и держите наивный бейзлайн.
Типичные ошибки
- ✗Ждут планового переобучения вместо мониторинга ошибки на лету
- ✗Реагируют на один плохой день, а не на устойчивый сдвиг смещения остатков
- ✗Переобучаются на всей истории, размывая новый режим
Уточняющие вопросы
- →Как отличить разовый шок от постоянной смены режима?
- →Какой предохранитель не даст свежепереобученной модели выкатить худший прогноз?
SeniorДизайнРедкоНужно прогнозировать недельный спрос по 100 000 SKU на 40 складах ритейлера. Большинство пар SKU-склад за неделю не продаются вовсе, медианная ненулевая продажа — 2 штуки, а несколько сотен пар дают основную выручку. Прогнозы питают систему пополнения, которая заказывает на 4 недели вперёд, и вся сетка должна пересчитываться за ночь в окно 2 часа. История — 3 года, включая промо и государственные праздники. Опишите модель или модели, оптимизируемый лосс, уровень агрегации и то, как вы будете оценивать результат, чтобы команда пополнения ему доверяла.
Нужно прогнозировать недельный спрос по 100 000 SKU на 40 складах ритейлера. Большинство пар SKU-склад за неделю не продаются вовсе, медианная ненулевая продажа — 2 штуки, а несколько сотен пар дают основную выручку. Прогнозы питают систему пополнения, которая заказывает на 4 недели вперёд, и вся сетка должна пересчитываться за ночь в окно 2 часа. История — 3 года, включая промо и государственные праздники. Опишите модель или модели, оптимизируемый лосс, уровень агрегации и то, как вы будете оценивать результат, чтобы команда пополнения ему доверяла.
Обучите одну глобальную GBDT на все пары с лагами, календарём и промо вместо 100k локальных, под Tweedie-лоссом для таргета с избытком нулей. Разреженные пары агрегируйте выше, а мерьте rolling-origin бэктестом по MASE против сезонно-наивного.
Типичные ошибки
- ✗Подгоняют по классической модели на ряд, когда рядов сто тысяч
- ✗Оптимизируют квадрат ошибки на таргете, который почти всегда ноль
- ✗Отчитываются по MAPE там, где факты в основном нули и метрика не определена
Уточняющие вопросы
- →Как превратить точечный прогноз в объём заказа под целевой уровень сервиса?
- →Что заставит вернуться к локальной модели для пар с наибольшей выручкой?