ИИ-аналитика · ULTRA
Прогноз спроса: когда хватит простой модели, когда нужно машинное обучение и как не обмануть себя
· 14 мин чтения · Редакция ultrathink
Прогнозирование спроса начинается не с выбора алгоритма, а с вопроса, какое решение будет принято по прогнозу и какая ошибка допустима. Во многих задачах простая модель с учётом сезонности даёт результат, который сложные методы улучшают незначительно, поэтому она всегда строится первой. Машинное обучение оправдано, когда рядов много и есть внешние факторы, известные заранее, а большая языковая модель для самого расчёта прогноза обычно не подходит — её место рядом с расчётом, а не внутри него.
Начните с решения, а не с модели
Прогноз нужен, чтобы что-то сделать: заказать товар, составить расписание смен, спланировать бюджет, решить, открывать ли дополнительную группу или кассу. От решения зависят горизонт прогноза, уровень детализации и цена ошибки. Прогноз на завтра по каждому товару в каждом магазине и прогноз на квартал по категории — разные задачи, у которых разные данные, методы и способы проверки.
Прежде чем открывать данные, запишите ответы на четыре вопроса. Этот короткий документ потом сэкономит недели: по нему выбирается метрика ошибки, способ разбиения данных и то, насколько сложной имеет смысл делать модель.
- 01Горизонт: на сколько вперёд нужен прогноз и как часто он обновляется. Заказ, который везут неделю, требует прогноза минимум на неделю вперёд, а не на завтра.
- 02Гранулярность: товар, категория, филиал, регион; день, неделя, месяц. Чем мельче уровень, тем больше шума и тем ниже точность каждого отдельного ряда.
- 03Цена ошибки: что обходится дороже — недостаток или излишек. Для скоропортящегося товара дорог излишек, для ключевого товара, без которого уходит клиент, — недостаток.
- 04Ограничения: минимальная партия, кратность упаковки, срок годности, вместимость склада, график поставок.
Пример: как решение меняет задачу
Представим условную сеть магазинов, которая хочет «прогнозировать продажи». Для закупщика свежей выпечки нужен дневной прогноз по каждому магазину, и главная опасность — списания. Для финансового отдела нужен месячный прогноз выручки по сети, и отдельные товары ему не важны. Для логистики нужен недельный прогноз объёма по складам. Это три разных прогноза, и попытка сделать «один универсальный» обычно даёт результат, который не устраивает никого.
Подготовка данных: продажи — это не спрос
Почти все данные о спросе на самом деле являются данными о продажах. Разница принципиальна: продажи показывают то, что удалось продать, а спрос — то, что хотели купить. Когда товар заканчивается, продажи падают до нуля, хотя покупатели приходили. Модель, обученная на таких данных, выучит, что в эти дни спроса не было, и будет систематически занижать прогноз.
Дефицит и отсутствие товара
Если есть данные об остатках, отметьте дни, когда товара не было или его оставалось слишком мало. Такие дни либо исключают из обучения, либо восстанавливают спрос оценкой — например, по похожим дням и похожим магазинам. Если данных об остатках нет, хотя бы ищите подозрительные серии нулей у обычно продаваемого товара.
Акции, цены и разовые события
Акция поднимает продажи во время себя и часто снижает их сразу после: покупатели запаслись. Если акции не отмечены в данных, модель примет всплеск за случайность или, хуже, за новую норму. Каждое разовое событие — закрытие точки на ремонт, сбой кассы, крупный корпоративный заказ — стоит пометить отдельным признаком или исключить.
Календарь
Выходные, праздники, начало учебного года, Рамадан и другие события со смещающейся датой сильно влияют на спрос во многих отраслях. Подвижные праздники особенно коварны: простое сравнение «с тем же месяцем прошлого года» их не учитывает, потому что событие сместилось. Календарь событий нужно собрать заранее, на весь период истории и на горизонт прогноза.
Новые и редкие товары
У нового товара нет истории, а у редкого — продажи нулевые большинство дней. Для первых прогноз строят по аналогам: похожим товарам, той же категории, похожему ценовому сегменту. Для вторых точечный дневной прогноз почти бессмыслен, и лучше прогнозировать на более крупном уровне или сразу вероятность и объём продаж за период.
Базовые прогнозы и когда их хватает
Первым всегда строится базовый прогноз. Это не формальность, а точка отсчёта: любая более сложная модель должна обыгрывать базовый уровень на честной проверке, иначе она не нужна. Удивительно часто оказывается, что аккуратно настроенная простая модель почти не уступает сложной, а поддерживать её на порядок проще.
Наивные методы
- Наивный прогноз: завтра будет как сегодня. Хорошо работает для медленно меняющихся рядов и служит минимальной планкой.
- Сезонный наивный: в этот понедельник будет как в прошлый понедельник, в этом месяце — как в том же месяце год назад. Естественная планка для рядов с выраженной сезонностью.
- Скользящее среднее: среднее за последние несколько периодов. Сглаживает шум, но запаздывает при изменениях тренда.
Экспоненциальное сглаживание и классические модели
Экспоненциальное сглаживание придаёт свежим наблюдениям больший вес, чем старым, и в расширенных вариантах учитывает тренд и сезонность. Классические статистические модели временных рядов дают ещё и оценку неопределённости. Эти методы быстрые, работают на каждом ряду отдельно, хорошо изучены и понятны бизнесу.
Когда простой модели достаточно
- Рядов немного, и каждый можно при необходимости посмотреть глазами.
- История достаточно длинная и стабильная, сезонность понятная.
- Внешние факторы влияют слабо или их невозможно надёжно знать заранее.
- Решение не требует большой точности: например, грубое планирование бюджета.
- В команде нет ресурсов поддерживать сложный конвейер данных и модель.
В этих условиях простая модель с понятными ошибками часто полезнее сложной. Планировщики привыкают к её поведению и знают, когда её поправить, а объяснить результат руководителю можно в двух фразах.
Когда нужно машинное обучение
Модели машинного обучения — например, градиентный бустинг на табличных признаках — полезны, когда рядов много, они похожи друг на друга и спрос зависит от факторов, которые известны в момент прогноза: акции, цены, праздники, выходные, открытие новых точек. Такая модель обычно одна на все ряды: она учится сразу на всех товарах и магазинах и переносит закономерности между похожими.
Признаки, которые обычно работают
- Лаги: продажи этого же ряда за прошлые периоды, сдвинутые не меньше чем на горизонт прогноза.
- Скользящие статистики: среднее, медиана, разброс за прошлые окна — тоже со сдвигом на горизонт.
- Календарь: день недели, неделя месяца, праздник, предпраздничный день, школьные каникулы.
- Цена и акции: собственная цена, скидка, тип акции, если они известны заранее.
- Характеристики объекта: категория товара, формат магазина, регион.
- Внешние факторы, известные заранее: запланированные события, график работы.
Рамка выбора
Если рядов мало и внешних факторов нет — начните со статистических моделей. Если рядов много, но факторов нет — попробуйте одну общую ML-модель на лагах и календаре, она часто лучше справляется с короткими рядами за счёт соседей. Если есть значимые факторы, известные заранее, — ML-модель почти всегда стоит попробовать, потому что статистические методы плохо учитывают такие признаки. Во всех случаях итоговый выбор делает проверка на истории, а не мода.
Цена машинного обучения — сложность. Нужны конвейер признаков, валидация, мониторинг, регулярное переобучение, обработка новых товаров и магазинов. Если команда не готова это поддерживать, простая модель, которая работает каждый день, полезнее сложной, которая однажды молча сломается из-за изменившегося формата выгрузки.
Иерархия: на каком уровне прогнозировать
Спрос почти всегда имеет иерархию: товар — категория — весь ассортимент, магазин — регион — сеть, день — неделя — месяц. На верхних уровнях ряды гладкие и предсказуемые, на нижних — шумные. Отсюда практический вопрос: прогнозировать снизу и суммировать, прогнозировать сверху и распределять или делать оба и согласовывать.
- Снизу вверх: прогноз по каждому товару и магазину, затем суммирование. Сохраняет детали, но суммирует и шум.
- Сверху вниз: прогноз по категории или сети, затем распределение по долям. Устойчиво, но теряет локальные особенности.
- Согласование: прогнозы строятся на нескольких уровнях и приводятся к тому, чтобы сумма нижних совпадала с верхним.
Важно, чтобы разные отделы не жили с несовместимыми цифрами. Если сумма прогнозов закупщиков по товарам заметно расходится с прогнозом финансового отдела по выручке, рано или поздно кто-то будет принимать решения по неверному числу.
Почему большая языковая модель не подходит для расчёта
Большая языковая модель предсказывает следующий фрагмент текста, а не значения числового ряда. Если вставить в чат таблицу продаж и попросить прогноз, она выдаст правдоподобные цифры, но без воспроизводимости, без честной оценки неопределённости и с риском арифметических ошибок. Повторный запрос может дать другие числа, а проверить, откуда взялось конкретное значение, невозможно.
Существуют специализированные модели, обученные именно на временных рядах, — их иногда называют базовыми моделями для временных рядов. Это другой класс инструментов, и к ним применяются те же правила: сравнение с базовым прогнозом, проверка на истории, контроль утечки. Само по себе слово «нейросеть» ничего не гарантирует.
Где языковая модель действительно полезна
- Написать код подготовки данных, модели и проверки — который затем читается и запускается человеком.
- Объяснить результат: почему прогноз на следующую неделю выше, какие признаки повлияли.
- Сформулировать комментарий к отклонению факта от прогноза для руководства.
- Извлечь из текстов — писем поставщиков, планов маркетинга, объявлений — информацию о будущих акциях и событиях, которая станет признаком.
- Проверить код и логику на типовые ошибки, включая утечку будущего.
Утечка будущего в данные
Самая опасная ошибка в прогнозировании — использовать при обучении информацию, которой не будет в момент реального прогноза. Модель выглядит отлично на проверке и проваливается в работе. Утечка бывает незаметной и проникает через признаки, агрегаты и даже через способ разбиения данных.
Типичные источники утечки
- Случайное разбиение на обучение и проверку вместо разбиения по времени: модель видит соседние дни из будущего.
- Скользящие средние и агрегаты, в окно которых попадает текущий или будущий период.
- Лаги короче горизонта: для прогноза на неделю вперёд нельзя использовать вчерашние продажи, их ещё не будет.
- Признаки, известные только задним числом: фактическая погода, фактическое число посетителей, итоговые остатки на конец дня.
- Нормализация, заполнение пропусков или кодирование категорий по всему ряду, включая будущее.
- Данные, исправленные задним числом: возвраты и корректировки, которых на момент прогноза ещё не было.
Пример утечки, которую легко не заметить
Допустим, аналитик строит дневной прогноз на семь дней вперёд и добавляет признак «среднее продаж за последние семь дней». На проверке модель показывает прекрасный результат. Но в реальной работе, делая прогноз на седьмой день вперёд, последних шести дней ещё нет — они в будущем. Модель обучилась на информации, которой у неё никогда не будет, и в работе её ошибка окажется заметно выше. Лечение — сдвигать все такие признаки минимум на горизонт или строить отдельные признаки для каждого шага горизонта.
Как поймать утечку
- 01Для каждого признака задайте вопрос: знал бы я это значение в тот момент, когда делаю прогноз?
- 02Запишите для каждого признака дату, на которую он известен, и сравните её с датой прогноза.
- 03Насторожитесь, если модель на проверке подозрительно хороша, особенно намного лучше базового прогноза.
- 04Посмотрите важность признаков: если сверху оказался признак, который «слишком много знает», проверьте его первым.
- 05Запустите модель в теневом режиме на реальных новых данных и сравните ошибку с ошибкой на проверке.
Как проверить прогноз
Проверка должна имитировать реальное использование модели. Если в работе прогноз делается каждый понедельник на следующие четыре недели по данным до воскресенья, то и на истории нужно воспроизвести именно это: обучение на данных до определённой даты, прогноз на тот же горизонт, сравнение с фактом.
Бэктест скользящим окном
- 01Выберите несколько дат отсечения в истории, охватывающих разные сезоны.
- 02Для каждой даты обучите модель только на данных до неё.
- 03Постройте прогноз на рабочий горизонт и сравните с фактом.
- 04Повторите для базового прогноза на тех же окнах.
- 05Сравните ошибки не только в среднем, но и по окнам: стабильность важна не меньше среднего.
Выбор метрики ошибки
Метрика выбирается под решение. Если важна ошибка в штуках, подходит средняя абсолютная ошибка. Если нужно сравнивать товары разного масштаба, используют взвешенную процентную ошибку — отношение суммы абсолютных ошибок к сумме факта. Классическая процентная ошибка по каждому ряду ломается на нулевых и маленьких продажах: деление на ноль или на очень маленькое число даёт огромные значения, которые искажают средний результат.
Отдельно всегда смотрите смещение — систематически ли модель завышает или занижает. Модель с небольшой средней ошибкой, которая стабильно занижает прогноз, может быть хуже для бизнеса, чем модель с ошибкой побольше, но без смещения. Если цена недостатка и излишка различается, это стоит прямо заложить в метрику или в правило заказа поверх прогноза.
Прогноз — это диапазон, а не одно число
Решения о закупке или штате принимаются с учётом риска, поэтому одной точечной цифры мало. Полезнее показывать интервал: в каком диапазоне спрос окажется с высокой вероятностью. Для товара с коротким сроком годности и для товара, который может лежать на складе месяцами, разумный уровень заказа будет разным даже при одинаковом среднем прогнозе. Интервалы тоже проверяются на истории: если факт выходит за них заметно чаще, чем заявлено, модель недооценивает неопределённость.
После запуска
Проверка не заканчивается на запуске. Регулярно сравнивайте прогноз с фактом, отслеживайте рост ошибки и смещения, особенно после изменений ассортимента, цен или формата данных. Если планировщики вручную корректируют прогноз, сохраняйте и исходное значение, и поправку — тогда можно проверить, улучшают ли ручные правки результат или только добавляют шум.
Типичные ошибки и как их поймать
- Нет базового прогноза. Признак: сложную модель не с чем сравнить. Лечение: построить сезонный наивный прогноз и оценивать всё относительно него.
- Продажи приняты за спрос. Признак: серии нулей у ходового товара. Лечение: учесть остатки и исключить или восстановить дни дефицита.
- Случайное разбиение данных. Признак: на проверке всё прекрасно, в работе — плохо. Лечение: разбиение только по времени.
- Лаги короче горизонта. Признак: качество резко падает с ростом горизонта в работе, но не на проверке. Лечение: сдвиг признаков на горизонт.
- Процентная ошибка на редких товарах. Признак: средняя ошибка определяется несколькими рядами с маленькими продажами. Лечение: взвешенная метрика или абсолютная ошибка.
- Игнорирование смещения. Признак: модель стабильно ниже факта. Лечение: отслеживать смещение отдельно от средней ошибки.
- Неотмеченные акции. Признак: модель «предсказывает» всплески там, где их больше не будет. Лечение: признак акции и календарь событий.
- Нет мониторинга. Признак: о деградации узнают из жалоб склада. Лечение: регулярная сверка прогноза с фактом и оповещение при росте ошибки.
Термины
- Горизонт — на сколько периодов вперёд строится прогноз.
- Базовый прогноз — простой метод, с которым сравнивают все остальные модели.
- Бэктест — проверка модели на истории с имитацией реального использования по времени.
- MAE, средняя абсолютная ошибка — среднее модуля разницы между прогнозом и фактом, в единицах ряда.
- MAPE — средняя процентная ошибка по наблюдениям; неустойчива при нулевых и малых значениях.
- WAPE — сумма абсолютных ошибок, делённая на сумму факта; устойчивее для рядов разного масштаба.
- Смещение — систематическое завышение или занижение прогноза.
- Утечка — использование при обучении информации, недоступной в момент прогноза.
- Прерывистый спрос — ряд, в котором большинство периодов без продаж.
- Интервал прогноза — диапазон, в который факт должен попадать с заданной вероятностью.
Чек-лист прогноза спроса
- 01Записаны решение, горизонт, гранулярность и цена ошибки в обе стороны.
- 02Собран календарь праздников, событий и акций на историю и горизонт.
- 03Дни дефицита отмечены и исключены или восстановлены.
- 04Разовые события помечены признаком или исключены.
- 05Построен базовый прогноз, с которым сравниваются все модели.
- 06Выбор между статистикой и ML сделан по проверке, а не по моде.
- 07Каждый признак проверен на доступность в момент прогноза.
- 08Все лаги и скользящие признаки сдвинуты минимум на горизонт.
- 09Проверка — скользящим окном по времени, без случайного разбиения.
- 10Метрика ошибки выбрана под решение, смещение отслеживается отдельно.
- 11Прогноз выдаётся с интервалом, интервалы проверены на истории.
- 12Прогнозы разных уровней согласованы между собой.
- 13После запуска прогноз регулярно сверяется с фактом, ручные правки сохраняются отдельно.
Итог
Хороший прогноз спроса — это не самая сложная модель, а честно проверенная. Начните с решения и цены ошибки, приведите продажи к спросу, постройте базовый прогноз и добавляйте сложность только тогда, когда она обыгрывает простой метод на проверке по времени. Тщательно ищите утечку будущего, показывайте неопределённость и оставьте языковой модели роль помощника, а не вычислителя.
Частые вопросы
Начните с простого базового прогноза с учётом сезонности. Переходите к машинному обучению, только если оно стабильно лучше базового уровня на проверке по времени.
Для самого расчёта — не стоит: результат не воспроизводим и не проверяем. Языковая модель полезна для написания кода, объяснения результатов и подготовки признаков из текстов.
Это использование при обучении информации, которой не будет в момент реального прогноза. Из-за неё модель хорошо выглядит на проверке и плохо работает в жизни.
Бэктестом скользящим окном по времени: обучение на прошлом, прогноз на рабочий горизонт, сдвиг окна. И обязательно сравнение с базовым прогнозом на тех же окнах.
Ту, что соответствует решению. Для рядов разного масштаба обычно удобнее WAPE, чем MAPE, а смещение нужно отслеживать отдельно от средней ошибки.
По аналогам: похожим товарам, той же категории и ценовому сегменту. Общая ML-модель на признаках товара справляется с этим лучше, чем модели, построенные на каждом ряду отдельно.