Признаки для временных рядов
Фичи решают в прогнозе больше модели, и все они - про одно правило: окно смотрит только назад. Вопрос «какие фичи для прогноза спроса» проверяет и арсенал, и дисциплину направления времени.
// Одна фича, заглянувшая в будущее, и весь бэктест превращается в фантастику.
Лаги и скользящие агрегаты
Лаги - основной сигнал: значения t−1, t−7, t−28 - под память и сезонности ряда; кандидатов подсказывают пики ACF (autocorrelation function) и домен.
Скользящие агрегаты - среднее, медиана, std, мин/макс за окно - кодируют локальный уровень и волатильность, сглаживая шум. Окно всегда заканчивается «вчера»: включил текущую точку - фича знает таргет.
// Разности и относительные изменения (t−1 к t−8) кодируют динамику вместо уровня - модель проще переносится на растущие ряды.
- лаг-фича
- значение из прошлого как фича текущего момента
Календарь и внешние регрессоры
Календарные фичи: день недели, час, праздники - включая канун и день после, промо-флаги. Циклическое кодируется sin/cos, чтобы 23:00 и полночь были соседями, а не «максимально далеки», как в one-hot.
Внешние регрессоры (погода, цены, трафик) усиливают прогноз, но обязаны быть известны на момент прогноза. Промо-флаг «была ли распродажа» из факта - утечка: в момент прогноза он неизвестен, нужен плановый флаг.
// Тест на каждую фичу один: «знал бы я это значение в момент прогноза?» Нет - фича вон.
- sin/cos кодирование
- цикличность часа/дня недели без разрыва на границе
Глобальная модель и иерархии
ML-подход: ряды разворачиваются в табличку «один объект = одна точка времени» с лагами и календарём - одна глобальная модель на тысячи рядов, кросс-серии учатся друг у друга.
Без нормировки уровня крупные ряды доминируют в лоссе: нормируй таргет или добавляй уровень фичей.
// Иерархии (SKU → категория → всего) требуют согласования прогнозов - reconciliation снизу вверх или оптимальное, чтобы уровни не противоречили друг другу.
- глобальная модель
- одна модель на все ряды; серии учатся друг у друга
- reconciliation
- согласование прогнозов по уровням иерархии
- SKU
- stock keeping unit
Как отвечать: «Какие фичи соберёшь для прогноза спроса?»
Три семьи. Лаги - t−1, t−7, t−28, кандидатов смотрю по ACF; скользящие статистики за 7/28 дней - среднее, медиана, std - все окна заканчиваются вчера. Календарь: день недели и час через sin/cos, праздники с кануном и последствием, плановые промо - именно плановые: флаг из факта в момент прогноза неизвестен. Плюс разности к прошлой неделе - динамика вместо уровня. Строю одну глобальную модель на все ряды с нормировкой уровня. И каждый признак прогоняю через один вопрос: знал бы я это значение в момент прогноза?
Арсенал по семьям и правило-фильтр честности - компактная демонстрация и широты, и дисциплины.
На чём валят
- −Rolling-окно с текущей точкой - фича «знает» таргет.
- −One-hot часа без цикличности - полночь и 23:00 «максимально далеки».
- −Промо-флаг из факта, неизвестного в момент прогноза.
- −Одна модель на все ряды без нормировки уровня - крупные ряды доминируют в лоссе.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 11, остальные разбираются в тренажёре.
- Почему таргет-энкодинг категорий и глобальная нормализация особенно коварны именно во временных рядах?A)Они ломают типы данных в датафрейме, из-за чего модель не может начать обучениеB)Их статистики считаются по всему периоду и тянут будущее в прошлое; в рядах их надо считать expanding, по прошломуC)Эти приёмы работают для картинок и текста и технически неприменимы к табличным даннымD)Они замедляют обучение в десятки раз, поэтому во временных рядах от них принято отказываться из-за скорости
показать ответ и разбор
+B)Их статистики считаются по всему периоду и тянут будущее в прошлое; в рядах их надо считать expanding, по прошлому// разбор: Таргет-энкодинг заменяет категорию средним таргета, глобальная нормализация — статистиками по всему датасету. Если считать их по всему периоду, в признак для точки t попадает информация из будущего — тихая утечка, раздувающая метрику на бэктесте. В рядах такие статистики считают только по прошлому (expanding/по трейн-периоду), пересчитывая по мере движения окна.
- Зачем сезонность кодируют признаками Фурье (пары sin/cos), а не сотней сезонных дамми?A)Признаки Фурье убирают тренд ряда, поэтому сезонные дамми-переменные становятся не нужныB)Это основной способ закодировать сезонность; дамми-переменные для сезонов не работаютC)Несколько гладких гармоник компактно задают сложную/длинную сезонность — параметров меньше, чем у сотен даммиD)Фурье-признаки нужны для звуковых сигналов и к рядам продаж неприменимы на практике
показать ответ и разбор
+C)Несколько гладких гармоник компактно задают сложную/длинную сезонность — параметров меньше, чем у сотен дамми// разбор: Для длинной сезонности (365 дней) сотня дамми раздувает параметры и переобучается, а для дробных/множественных периодов дамми неудобны. Несколько пар sin/cos с нужными частотами задают гладкую периодическую форму компактно (2K параметров на K гармоник), ловят годовую и недельную сезонность разом и хорошо экстраполируются. Тренд они не убирают — это отдельная компонента модели.
- Хотите добавить в прогноз спроса внешний признак (exogenous). Какое требование к нему критично?A)Признак обязан быть числовым — категориальные внешние признаки использовать не получитсяB)Признак должен просто сильно коррелировать с таргетом в прошлом — этого условия вполне достаточно, чтобы его братьC)Внешний признак нужно обязательно нормировать в диапазон [0,1], иначе модель прогноза его попросту не приметD)Значение признака должно быть известно на момент, НА который строится прогноз, иначе им не воспользоваться
показать ответ и разбор
+D)Значение признака должно быть известно на момент, НА который строится прогноз, иначе им не воспользоваться// разбор: Экзогенный признак полезен, только если в момент реального прогноза его будущее значение известно (календарь, план промо, анонсированная цена) или само надёжно прогнозируется. Если признак станет известен лишь постфактум (фактическая погода прогнозируемого дня), в проде его не будет — на истории он «работает» и создаёт утечку. Корреляция, тип и нормировка вторичны по сравнению с доступностью на горизонте.
- Помимо скользящего среднего в фичи берут скользящее стандартное отклонение. Что оно даёт и о чём помнить?A)Оно дублирует скользящее среднее и не несёт новой информации, поэтому его обычно не используютB)Локальную волатильность (разброс) ряда; считать по прошлому со сдвигом, иначе утечка через окноC)Тренд ряда в чистом виде, заменяя собой необходимость в лаг-признаках у модели прогнозаD)Точный будущий разброс ряда, что позволяет строить прогноз спроса вообще без обучения какой-либо модели
показать ответ и разбор
+B)Локальную волатильность (разброс) ряда; считать по прошлому со сдвигом, иначе утечка через окно// разбор: Скользящее std описывает локальную волатильность — насколько ряд «дёргается» в окне (спрос перед праздником нестабилен, у одних SKU разброс выше). Как любой rolling-агрегат для прогноза точки t, оно должно считаться строго по прошлому и сдвигаться (shift), иначе в признак попадёт текущая/будущая точка — утечка. Это не дубль среднего, не тренд и не «готовый» будущий разброс.
- Спрос скачет НЕ в сам праздник, а за 2-3 дня до него. Как это поймать признаками?A)Добавить признаки «дней до/после события» и флаги предпраздничного окна, а не только флаг самого дняB)Достаточно одного бинарного флага «сегодня праздник» — модель сама как-нибудь выучит и предшествующие дниC)Праздники не получится закодировать признаками, их эффект ловится исключительно отдельной сложной модельюD)Нужно просто удалить все предпраздничные дни из обучающей выборки как аномальные выбросы в данных ряда
показать ответ и разбор
+A)Добавить признаки «дней до/после события» и флаги предпраздничного окна, а не только флаг самого дня// разбор: Флаг «сегодня праздник» не объяснит всплеск за 2-3 дня до него — модель не свяжет причину и следствие без явного сигнала. Добавляют признаки «сколько дней до/после ближайшего события», флаги предпраздничного окна, иногда отдельные фичи под конкретные праздники. Эти признаки известны заранее (календарь), поэтому утечки не создают. Удалять предпраздничные дни — значит выкинуть самый ценный сигнал.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.