Какой ваш прогноз спроса?
Какой ваш прогноз спроса?

Всем привет! Представьте себе ситуацию: ваша уютная маленькая команда Data Science занимается прогнозированием спроса для пары десятков дарксторов с помощью какого-нибудь коробочного Prophet. И в один прекрасный день к ней приходит бизнес. Бизнес садится, закидывает ногу на ногу, закуривает сигару и говорит:

«Мы хотим максимально автоматизировать закупки. Нам нужно, чтобы вы умели строить прогноз по всем товарам, старым и новым, для всех дарксторов, старых и новых. А их будет много, их будут сотни, тысячи, миллионы. А ещё у нас будет миллион видов скидок и разные типы ценообразования, и ещё куча промо-механик и конкурсов интересных. Мы хотим, чтобы прогноз обязательно адекватно на всё это реагировал». (с) Типичный Бизнес

Хорошо, думаем мы, кажется, что это звучит нетрудно… 

С этой задачи и начинается наша история о прогнозе спроса в Самокат. Меня зовут Мария Суртаева, я Data Scientist и расскажу о концепции прогноза спроса, его практических задачах и роли градиентного бустинга.


Для начала сделаю краткое отступление, почему мы вообще заговорили об этом. Самокат растёт и развивается, складов (дарксторов) и поставщиков появляется всё больше, растёт ассортимент. В таких условиях необходимость в оптимизации закупок становится постоянной. Напрашивающийся способ оптимизировать их работу – это автоматический заказ и прогнозирование спроса.

Когда бизнес пришёл к нам с задачей «максимальной автоматизации закупок», мы первым делом прикинули, сколько прогнозов нужно будет строить.

Если принять за прогнозную точку единицу спроса на товар, на одном дарксторе за один день, то нам нужно было строить прогноз по 2 миллионам точек с горизонтом прогнозирования шесть недель. Это более 87 миллионов прогнозов ежедневно. Понятно, что для того, чтобы справляться с этими объёмами, нужно было либо растить команду закупок теми же темпами, какими растёт сеть Самоката, либо выстраивать автоматизированный процесс. 

Перед тем, как мы перейдём к нашим трудностям и как мы их решали, у меня есть для вас небольшая задачка. Все персонажи вымышлены, совпадения случайны, поэтому это определённо не подсолнечное масло из заголовка.

Представим, что у нас есть временной ряд некоторого подсолнечного масла: он характеризует динамику продаж на одном дарксторе, и у него есть недельные средние значения. Вы – закупщик, и вам нужно предположить, сколько нужно закупить этого масла на следующие две недели, опираясь на историю продаж.

 

На графике представлены восстановленные продажи, т.е. с учётом доступности товара (об этом речь пойдет далее); планируемые и исторические продажи являются регулярными
На графике представлены восстановленные продажи, т.е. с учётом доступности товара (об этом речь пойдет далее); планируемые и исторические продажи являются регулярными
Ответ

На самом деле в следующие две недели произошла ситуация, похожая на ту, что приключилась с Берлиозом: что-то пошло не так

Мы увидели “прекрасные” продажи – более 150 бутылей в день, которые, конечно, очень понравились наши маркетологам, и вообще не понравились нам. 

Раньше бутылки в принципе не продавались больше 15 штук в день
Раньше бутылки в принципе не продавались больше 15 штук в день

Вот пример временного ряда, с которым приходится работать в реальном прогнозе спроса – от таких сюрпризов никто не застрахован.

Ниже речь пойдёт о временных рядах, так что на всякий случай вспомним основы. 

Задача прогнозирования временных рядов 

В зависимости от конкретной предметной области задача формулируется по-разному, но, как правило, звучит она так.

У вас есть последовательные точки процесса в определённые моменты времени t, вам нужно предсказать, где эти точки будут в последующие моменты времени, по возможности извлекая информацию из временной зависимости от t. 

Базовые подходы к извлечению этой информации, как правило, строятся на разных скользящих статистиках и сглаживаниях (например, модель Хольта-Винтерса). Туда же можно отнести выявление авторегрессионных и сезонных компонент – семейство алгоритмов ARIMA, SARIMA, SARIMAX и другие. 

Но мы хотим учитывать очень много разных факторов. Это достаточно однозначное пожелание бизнеса, мы не можем от него просто отмахнуться.

Можно посмотреть на Prophet, но как быть тогда с прогнозированием новых товаров и временных рядов без истории? Да и Prophet – не рекордсмен по скорости прогноза, простые тесты показались нам вечностью… У него есть прокачанный собрат, NeuralProphet, но и тут промах: нам нужно сохранять интерпретируемость для закупщиков и бизнеса.

Есть ещё семейство подходов MCMC, которые с некоторыми оговорками позволяют нам строить прогноз даже без исторических данных. Но будем честны, это очень тяжело поддерживать и масштабировать. 

Через такие размышления мы пришли к методам классического машинного обучения, а именно: моделям градиентного бустинга. Они позволяют нам получать неплохой прогноз по большой сети, легко масштабироваться и учитывать много-много факторов. Вроде бы всё круто. На первый взгляд.

Бустинг: хороший, плохой, наш

Естественно, бустинг не может быть идеален, и у него есть ряд известных ограничений математической модели. 

  • Мы не можем сразу получить хороший прогноз на коротком временном ряду или на отсутствующей истории (пока ещё нет). 

  • Слабые экстраполирующие способности бустинга – это тоже проблема, потому что мы уже заранее знаем, что сеть и обороты будут расти и мы можем просто не успевать за растущим трендом. 

  • Прерывистый временной ряд — это всегда проблемно для прогнозирования.

Всё это больно, но вот что смертельно. На самом деле бизнесу не нужен хороший прогноз по всей сети, бизнесу важен отличный прогноз по 5-10% самым маржинальным и самым важным для клиента товарам. От этой постановки меняется всё. 

Это значит, что бизнесу не очень интересно, как классно мы опустили MAPE, или WAPE, или sMAPE или что угодно ещё  по целой сети в Подмосковье. Бизнесу важно болеть за главного героя – за самый любимый продукт, за самый маржинальный и оборотистый товар. Потому что если его доступность или выручка упадёт на одном или двух дарксторов в Санкт-Петербурге, для бизнеса это будет критичнее, чем если мы просто не закупим целые категории в Наро-Фоминске (простите, ребята из Наро-Фоминска). Жестоко, но правдиво: товары не равнозначны с точки зрения ошибки модели

Поэтому очень важно перестать смотреть на абстрактные цифры, которые позволяют нам сравнивать модели между собой, а начать задавать правильные вопросы к бизнес-процессам. Именно это позволит нам правильно найти золотую середину между перепрогнозом и недопрогнозом. Это позволит нам понять, какие цены ошибок нам нужно назначать, в каком направлении, для каких товаров. Возможно, понимание ответов приведёт нас к выводу о том, что нам нужна совсем другая базовая модель. Но мы этому выводу пока сопротивляемся, поэтому сейчас я буду рассказывать про четырёх злейших врагов прогноза спроса, если у вас в продакшене живёт градиентный бустинг.

Четыре всадника прогноза спроса

Новые товары

Первое очевидное препятствие на пути автоматизации – это прогнозирование того, о чём вы ещё ничего не знаете. Я начну с новых товаров, потому что это кейс, который в случае градиентного бустинга довольно просто нивелируется количеством и многообразием факторов в датасете. Важно добавить максимальное число факторов, которые не зависят от продаж товаров. Это категориальные признаки группы товаров: категории, подкатегории и их характеристики.

Также важно включать информацию о динамике продаж в категориях. Мы здесь исходим из предположения, что товары объединены в категории по некоторым общим свойствам, которые также могут отражать спрос на них. Поэтому если мы предполагаем, что доминант в этих категориях нет, то спрос на новый товар будет стремиться к некоторому обобщённому спросу на усреднённый товар в категории. В целом это даёт уже неплохое приближение в случае, если мы ещё не видели вообще никаких продаж. 

Если ваш новый товар стартует с промо, это тоже обязательно нужно учесть в факторах, а также добавить информацию о ценовой категории, о средней цене в категориях и подкатегориях и о соотношениях между ними. 

Всё это очень подробный способ сказать вашей обобщающей модели о том, что если у вас есть какой-то новый товар в категории "Йогурты", который выглядит как йогурт и который стоит как йогурт, скорее всего, его можно прогнозировать как некоторый усреднённый уже известный йогурт, который вы уже умеете прогнозировать. 

Но что делать, если новых товаров много или вообще всё? Как быть, если даркстор только открывается, и вы ещё не знаете, как там вообще всё будет продаваться? На самом деле, здесь мы тоже используем подход с метаинформацией, с характеристиками даркстора, которые не зависят от продаж. В частности, мы можем использовать информацию о том, что это вообще за даркстор, как далеко он находится от центра, какая у него плотность населения, какая у него зона покрытия и так далее. 

Эти характеристики позволяют вам построить многомерное пространство признаков дарксторов и натравить хотя бы наивный метод K ближайших соседей. Таким образом, вы можете найти K наиболее похожих дарксторов, и предположить, что спрос на них будет в целом походить на ваш новый даркстор. Тогда в качестве прогноза можно использовать статистики продаж за последний период на реальных самых похожих дарксторах. Иными словами, если вы не знаете, как будут продаваться все товары в новом спальнике в Казани, посмотрите на три других спальника в Казани. Это работает.

Ещё здесь нужно упомянуть о том, что если ассортимент товаров от даркстора к даркстору сильно варьируется, у вас, оказывается, много товаров, по которым у вас нет статистик, в том числе на наиболее похожих дарксторах. В этом случае можно использовать уже упомянутый мной подход с усреднением статистик в динамике категорий. 

Ещё нюанс. На самом деле не каждое открытие – такое уж открытие. Очень часто бывает так, что новый даркстор открывается с переездом и отнимает часть зоны от уже существовавшего даркстора. Эта зона может занимать разный процент от территории к территории: от 1% до 99%. В этом случае это чисто дело техники хранения данных. Если вы заранее можете перенести часть заказов из общей зоны к обоим дарксторам, то есть создать дубликаты заказов для ещё не открывшегося дакрстора, то у вас уже имеется история продаж для этого переезда ещё до начала прогнозирования. 

Таким образом, мы можем совместить прогноз, построенный на реальных данных с “общей” территории дарксторов, с усреднённым прогнозом от наиболее похожих соседей пропорционально долям этих территорий в зоне открывающегося даркстора. Этот “правдивый вклад” позволит дополнительно улучшить прогноз.

Заниженная доступность / уценка

Следующее препятствие – это злополучный баланс между перепрогнозированием и недопрогнозированием. Есть ловушка, в которую можно попасть, если смотреть только на сырые данные продаж. Предположим, что вы заказали мало товаров для даркстора, недопрогнозировали, и товар быстро закончился. Его, конечно, купили, но купили не так много, как могли бы. Модель увидела низкие продажи, построила на этом заниженные статистики и снова даёт низкий прогноз.

ЦФЗ – центр формирования заказов
ЦФЗ – центр формирования заказов

Возмутительно, но так. Это называется «ловушка заниженной доступности», и любой закупщик знает, как с этим бороться. Мы применяем к нашему таргету преобразование под волшебным названием «восстановление спроса с учётом доступности». 

Доступность – это очень важный фактор, который присутствует в любом ритейле; он отражает реальную причину того, почему продажи товара низкие. Либо на товар существует в действительности низкий спрос, и товар просто никто не хочет; либо в дарксторе присутствует постоянный недостаток товара на полках. Это супер-нежелательная ситуация для бизнеса – ведь вы не максимизируете выручку, и необходимо искусственно увеличить эти продажи. 

На картинке показываю, как преобразуется линия фактических продаж с учётом доступности. Понятно, что если вы хотите максимизировать выручку с даркстора, вам нужно стремиться к жёлтой линии, а не к розовой. 

Преобразование нужно проводить аккуратно. Функция должна быть подобрана достаточно нежно, потому что вы не можете просто огульно завысить продажи, так как они получатся слишком большими – такими, как никогда не могли бы быть в реальности. 

Поэтому не заигрываемся с преобразованием таргета и всегда добавляем информацию о том, насколько таргет изменён, насколько он достоверен в вашем датасете. Чтобы модель могла взвешивать, в какой мере это истинный ответ, а в какой мере – наши домыслы и целевые показатели бизнеса. 

Есть также противоположная ловушка, с перепрогнозами. В Самокате есть система автоуценки: если вы заказали слишком много, и срок годности товаров скоро истекает, то назначаются большие скидки автоматически. Это то, что вы можете видеть в блоке "Распродажа" в нашем приложении – всегда с большими скидками на товар. 

Люди любят большие скидки, люди покупают много товара. Но этот процесс не является нормальным, и товар продаётся в убыток бизнесу. Модель видит при этом большие продажи, строит завышенные статистики, и такая: «Классно, давайте я буду прогнозировать ещё больше, почему бы нет?» 

Выход из этой ловушки получается чуть более техническим. Скорее всего у вас достаточно накопленных данных, чтобы не продумывать преобразование таргета в этом случае, просто исключайте его. В системе хранения данных обязательно должен быть однозначный источник скидки, который отражает, насколько эта продажа соответствует запланированному процессу. Важно показывать модели те данные и такое поведение, к которым вы стремитесь, то есть доступность порядка 90-100% и исключительно запланированные промоакции, никакой самодеятельности. 

Плохая экстраполяция и нечувствительность к трендам

Другой частый камень в огород градиентного бустинга – это слабые экстраполирующие свойства. На самом деле бо́льшая часть моделей машинного обучения построена таким образом, чтобы обобщать и интерполировать, а не экстраполировать; с экстраполяцией у них довольно плохо. В частности, если мы рассматриваем деревья решений, то кусочно-линейное приближение с постоянным ответом в областях разбиения нам закономерно не помогает приближаться к ответу вне примеров обучающей выборки. В случае с прогнозом спроса, когда у вас таргет неотрицательный, это ещё значит, что ваша модель будет склонна недопрогнозировать. 

На практике существует три способа этого избежать. 

Первый способ – это бизнес-решение и замечание к логистике. У вас всегда должны быть страховые запасы. Они позволяют вам не сильно обращать внимание на ошибку с товарами с низким оборотом – всегда есть какой-то минимальный запас, который хранится на дарксторе. Но при этом в случае со скоропортящимися товарами и высокооборотистыми товарами страховые запасы довольно сильно влияют на доступность и на другие бизнес-показатели. Поэтому вам нужно как можно глубже интегрировать эти данные в прогноз скоропорта.

Второй способ – несимметричные лоссы. Если вы будете штрафовать модель за недопрогноз больше (потому что бизнесу, как правило, недопрогнозы обходятся дороже, чем перепрогнозы), то модель будет больше обращать внимания на недопрогнозы – результаты улучшатся, бизнес удовлетворится.

Третий способ, на мой взгляд, самый эффективный – это дополнительный модуль управления уже готовым прогнозом. О нём поговорим подробнее.  

Мы построили модуль статистических корректировок, чтобы напрямую влиять на экстраполирующие свойства градиентного бустинга и подталкивать нашу модель. Статистический блок смотрит на последние сформированные прогнозы, на исторические продажи за последний период и строит распределение ошибок.

Если мы видим, что ошибки сохраняют знак на протяжении длительного времени, если они увеличиваются в абсолюте, то мы добавляем смещение. Смещение, естественно, вычислено в зависимости от направления ошибки и в зависимости от её величины. Бонусом у нас идёт детектор тренда. Это могут быть разные математические инструменты его обнаружения, но в нашем случае довольно неплохо справляются базовые линейные подходы. Если мы видим тренд, мы также можем добавить смещение. В итоге у нас получается более корректный прогноз и ускоренная реакция модели на изменение поведения временного ряда. Примеры таких прогнозов приведены ниже.

Если у нас сохраняется ошибка, постоянная по направлению, или детектирован тренд (ряд снизу), то мы добавляем смещение к готовому прогнозу. На примере с перепрогнозом (сверху) видно, что спрос снижается, в то время как исходный прогноз остаётся на прежнем уровне, корректировки улучшают ситуацию
Если у нас сохраняется ошибка, постоянная по направлению, или детектирован тренд (ряд снизу), то мы добавляем смещение к готовому прогнозу. На примере с перепрогнозом (сверху) видно, что спрос снижается, в то время как исходный прогноз остаётся на прежнем уровне, корректировки улучшают ситуацию

И что мы в итоге имеем? У нас есть бустинг, который учится на хорошем таргете – преобразованном или исключённом. У нас есть дополнительный модуль, добавляющий смещение к нашему прогнозу, чтобы модель реагировала оперативнее и лучше экстраполировала. У нас также есть дополнительный блок с kNN, позволяющий получать прогнозы на новых дарксторах. 

В целом, эта система уже даёт хороший прогноз по большей части сети. Поэтому сейчас самое время встретиться с нашим главным злодеем – с препятствиями, которые  не позволяют нам отлично предсказывать вообще всё. 

Выбросы и шумы

Это те пики продаж при невероятном маркетинге из примера в начале статьи, любые ошибки и внешние обстоятельства. Всё то, что отличает модели машинного обучения от ясновидящих, кроме того, что машинное обучение не берёт денег за прогноз

Здесь уже знакомый нам временной ряд с выбросами: при обычных колебаниях продаж в пределах 20 штук ежедневно у нас внезапно появляются выбросы больше 60, и даже больше 150 штук в день. В нижнем ряду – пример волатильного временного ряда
Здесь уже знакомый нам временной ряд с выбросами: при обычных колебаниях продаж в пределах 20 штук ежедневно у нас внезапно появляются выбросы больше 60, и даже больше 150 штук в день. В нижнем ряду – пример волатильного временного ряда

Помимо зашумлённых рядов есть суперволатильные временные ряды, где подневные продажи варьируются от 2 до 35 штук, что тоже довольно неприятно. 

У нас есть мистические исчезновения товара из продаж на нехарактерный период. Причиной может служить почти что угодно: внезапный вывод товара из ассортимента, разрыв отношений с поставщиком, массовое разочарование в чипсиках и так далее, нужное подчеркнуть.

В верхнем ряду временное прекращение поставок делает характер спроса гораздо более прерывистым, чем это есть в действительности – получаем сильный недопрогноз. Внизу пример того, что в юридической литературе называется внешними обстоятельствами непреодолимой силы 
В верхнем ряду временное прекращение поставок делает характер спроса гораздо более прерывистым, чем это есть в действительности – получаем сильный недопрогноз. Внизу пример того, что в юридической литературе называется внешними обстоятельствами непреодолимой силы 

Я не знаю, есть ли серебряные пули от всех этих корнер-кейсов. Скорее всего, решение каждой этой проблемы потребует от вас построения системы, по сложности и громоздкости сравнимой со всей остальной архитектурой прогноза. Но вот к каким мыслям это приводит:

  • Здорово, если у вас есть детектор аномалий, и вы можете скрывать вот эти ужасы от модели. В этом случае временная дестабилизация временного ряда не попортит все последующие прогнозы. 

  • Хорошо, если в модель зашиты разные виды сглаживания – либо исторических продаж, либо прогнозов, какие угодно. Вы делаете ставку на сходимость сумм продаж и прогнозов в среднем и можете прогнозировать волатильные ряды с помощью агрегаций. 

  • Прекрасно, если у вас есть механизм исключения подозрительных пробелов из данных. В нашем случае работает исключение данных с нулевой доступностью для построения статистик. 

  • Превосходно, если у вас есть механизм учёта сезонности товара, и резкое повышение спроса или снижение спроса не будет для вас сюрпризом. 

К этому моменту мы уже перечислили то, что нам пришлось провернуть для того, чтобы градиентный бустинг более или менее хорошо работал у нас в проде. Самое время подсчитать количество соломы, которое оказалось раскиданным в результате того, что в самом начале мы (возможно) немножечко неправильно приоритизировали пожелания бизнеса. 

Как жить дальше

Нам хотелось, чтобы всё было так: у нас есть данные, мы отдаём данные в модель, модель выдаёт нам прекрасный прогноз всегда и везде. Супер!

Но на практике мы быстро поняли, что нам нужно очень много данных, очень разных, из разных источников, а ещё логика преобразования таргета.

Затем у нас добавился модуль с кластерным анализом и с kNN, чтобы получать прогноз по новым товарам и для новых дарксторов. 

Далее мы решили, что наш прогноз всё ещё недостаточно идеален, и добавили модуль статистических корректировок, чтобы подталкивать его в нужном направлении изменения спроса. 

Потом у нас появился ещё детектор тренда, потому что а почему нет – чтобы корректировать прогноз ещё лучше. 

И даже это тоже не всё: есть ещё много модулей, описание которых уже никак не укладывается в рамки данной статьи.

И вот мы здесь. Сидим, смотрим на разрастающуюся схему архитектуры прогноза и доработок с чётким осознанием того, что проект призван решать гораздо больше задач, чем просто прогнозирование числа проданных товаров на дарксторах. Этот факт может остаться незамеченным при стандартной методике подсчёта ошибок прогноза, но достаточно сильно при этом влияет на бизнес-показатели и сказывается на бизнесе. 

От наивного прогноза спроса к интеллектуальной системе прогнозирования за четыре шага

Итак, что мы вынесли из этой истории? Очень важно изначально понимать суть бизнес-задачи. Это позволит от исходной наивной схемы, где есть только данные, модель и прогноз с простым установка «прогнозируем все товары на всех дарксторах», прийти к более детальной задаче о построении полноценной интеллектуальной системы. 

Чтобы эта система максимизировала выручку, нужно пройти четыре этапа:

  1. Хорошо отфильтровать данные. Фильтрация и препроцессинг – это то, с чем нельзя переборщить. 

  2. Построить упрощённые подходы для новинок. Простой подход в условиях отсутствия данных – скорее всего, лучший подход. 

  3. Восстановить спрос, преобразовав таргет там, где это необходимо. 

  4. Помочь деревьям экстраполировать и улавливать тренды. Нам нужно подталкивать нашу модель там, где она недотягивает. 

Только таким образом мы и можем растить бизнес-метрики – а значит, прогнозировать спрос, не теряя головы. 

P.S.: Костыли вокруг бустинга – увлекательное дело, но не единственное, чем мы занимаемся в команде Data Science. 

Ещё мы моделируем промо-механики и эластичность по различным факторам, изучаем эффекты перетекания спроса и каннибализации. Исследуем, как наша система прогноза спроса взаимодействует с другими продуктами из Data Science: с персонализацией, рекомендациями, минимальными чеками и всем-всем-всем. 

Напишите в комментах, если вам хотелось бы почитать о каких-нибудь из этих тем?

Комментарии (17)


  1. adeshere
    16.11.2022 15:40

    Спасибо за рассказ, но возник небольшой вопрос. А именно, я не разглядел в ваших моделях самой простой фичи, которая наиболее привычна нам, геофизикам: учета цикличности и вообще регрессии на известные внешние факторы. Наверняка ведь есть много товаров, спрос на которые растет в определенные дни недели, или в предпраздничные дни, и т.д. (как на яйца в преддверии пасхи). А также не описано, как учитывается влияние всяческих известных (либо более-менее хорошо прогнозируемых) внешних факторов вроде зависимости продаж мороженого от температуры воздуха (и вообще продаж от погоды).

    Такие квазициклы правильнее всего учитывать по исходному ряду (сразу после его препроцессинга). Например, можно рассчитать "календарную маску" особых дней, оценив вес каждого независимого фактора (такого, как день недели) статистическими методами или даже просто для начала задав вручную. Затем построить регрессию продаж на эту маску. Затем, зная коэффициенты регрессии, все такие эффекты убираются из сигнала. После чего на вход всем описанным в статье алгоритмам (моделям) подсовываются уже очищенные от квазициклов (квазизависимостей) ряды, т.е. сигналы с более простой структурой. Как кажется, это должно заметно улучшить качество экстраполяции, т.к. эффект с известными причинами и характеристиками при таком подходе описывается наиболее прямым способом, с максимальным уровнем интерпретируемости модели, а не просто тонет в числе других истинных либо артефактных закономерностей. А для наиболее критичных товаров можно еще и дополнительно подкрутить модель квазициклов (квазирегрессий), задействовав эксперта.

    После того, как основная модель отработает, в ее выходной сигнал (прогноз) вводятся поправки за квазицикличность и другие квазизависимости, убраннные из данных на первом этапе - примерно так, как вы делаете это с трендом. Априори у меня есть устойчивое подозрение, что добавление в процедуру подобного блока должно заметно улучшить качество прогноза. Или нет?

    Вопрос, собственно, именно об этом: вы делаете что-то подобное (но просто не включили в эту статью), или же этот подход в вашем случае почему-то не эффективен? Если второе (не эффективен), то было бы крайне интересно узнать, почему. Буду очень благодарен за подробный рассказ.


    1. thevlad
      16.11.2022 17:36

      Такой мульти-этапный препроцессинг входных данных, обычно ухудшает качество предсказания ML моделей. Лучше сразу строить фичи для модели забрасывая сырые входные данные и другие факторы.


      1. adeshere
        19.11.2022 02:23

        Понятно, что убирая из данных какую-то значимую связь, мы ухудшим показатели ML-модели. Но ведь потом мы ту же самую связь возвращаем обратно, плюсуя к выходу ML-модели. Просто для нее строится отдельная физически обусловленная модель вместо формальной. Причем грамотный эксперт может туда добавить априорную информацию, которой в данных либо заведомо нет в силу их ограниченности, либо, если это big data, ее почти невозможно оттуда вытащить в силу различных недостатков реальных массивов информации. (Причем у нас в геофизике, скорее, первое).

        Так вот, я всегда думал, что при хорошем качестве "физической" (причинной) модели совокупное решение от такой декомпозиции задач станет лучше. Была даже парочка частных случаев, когда это предположение вроде бы оправдывалось на практике. Получается, что для big data это так не так? Потенциально это может быть в двух ситуациях: либо связь многофакторная, и ее невозможно вычленить в виде обособленного уравнения (теряются какие-то связанные эффекты), либо нет возможности привлечь эксперта для построения достаточно качественной причинной модели, которая могла бы конкурировать с формальной. Интересно, что из двух этих факторов более важно?


        1. thevlad
          19.11.2022 11:44

          Обычно классическая статистическая ML модель(бустинги/случайные деревья и все это), построена на взаимной корреляции фичей (факторов) между собой и целевой переменной. Чем меньше различных "промежуточных звеньев" тем проще эту корреляцию "разглядеть". Если нужна научная обоснованность, то есть интерпретируемость модели, тогда да возможно декомпозиция будет иметь смысл, скорее всего при худших показателях предсказания. Но в этом случаи наверное стоит посмотреть в сторону классических байесовых сетей.

          Если надо подмешать какие-то факторы, то лучше делать это непосредственным образом. Если вы подразумеваете наличие стационарной "сезонности", то есть которую видно на преобразовании Фурье, это эквивалентное авто корреляции с некоторым заданным лагом. В этом случаи проще добавить переменную с заданным лагом, как один из факторов модели. Если нужно добавить какие-то априорные знания, то это так же проще сделать добавив новый фактор, например индикаторную/бинарную переменную {0, 1}.


    1. aweawem
      16.11.2022 18:11
      +2

      В статистике это называется "сезонность" и для этого имеется достаточно много готовых решений.


      1. adeshere
        19.11.2022 02:24

        Поэтому меня и удивило, что в статье об этом почти ничего нет.


    1. gofat
      17.11.2022 10:06
      +1

      Не скажу наверняка, как реализовано у автора.

      Но весьма вероятно, что в признаки для бустинга прокидывают исторические значения с некоторыми лагами (и это может быть как прошлый день, так и неделя, месяц, год).

      Либо используют такие же классические статистические подходы (как и детекция тренда) на этапе коррекции предсказаний в отдельном модуле.


    1. marieee Автор
      18.11.2022 18:30
      +1

      О, вы правы, в статье я довольно вскользь упоминаю сезонные и циклические изменения спроса. Отчасти это обоснованно тем, что мы пока не получили однозначного результата при учете этих факторов. Довольно успешно удается воспроизводить недельные циклы продаж включением простых скользящих статистик, но вот с годовой сезонностью и "календарными масками" все немного сложнее. В нашем случае мы разделяем эти случаи, как говорится, на две большие разницы. Первый - это сезонные продажи, условные мороженое и квас летом, цитрусовые зимой. Второй - это праздничные продажи - зачастую более тематическая история. Загуглите доклад коллег из Озона (Алексайцева, если правильно помню), там есть чудесная и очень жизненная история про то, какой длины исторические данные и какое шаманство в FE бывает необходимо, чтобы автоматически прогнозировать спрос определенных товаров под праздник.

      В первом случае есть довольно много подводных камней, когда дело доходит до практики, и с наскоку преодолеть эти проблемы классическими статистическими подходами пока не удалось. Во многом это связано с супер-сезонными товарами, которые продаются только 1-2 месяца в году или вообще не имеют историю. Отчасти со сложностью учета одновременного сезонного подъема и ввода товара с промо. Отчасти с отсутствием у товара/группы товаров достаточно долгой истории, чтобы судить о календарных эффектах вообще. Частично помогает использование длинных лагов в факторах (как прозорливо заметили в комментариях), но сложные кейсы остаются болеть.

      Очень надеюсь, что в скором времени мы поборем эти недостатки и обязательно расскажем об этом в следующих статьях :)


      1. adeshere
        19.11.2022 02:28

        Я сам немного из другой предметной области, а интересуюсь, в основном, для расширения кругозора. Но "наживка" вкусная, спасибо за интригу ;-) Буду ждать продолжения с удвоенным интересом ;-)


  1. gofat
    17.11.2022 10:01

    На слайде с детекцией тренда написано "детекция труда". Кажется, что это описка, стоит поправить.


    1. marieee Автор
      18.11.2022 18:53

      спасибо!


  1. Gromin
    17.11.2022 12:37

    А что же по итогу с точностью прогнозов? Можете показать графики реальных продаж и спрогнозированных?


  1. surVrus
    17.11.2022 19:08
    +1

    Вот пример временного ряда, с которым приходится работать в реальном прогнозе спроса – от таких сюрпризов никто не застрахован.

    День добрый!

    Вот тут собака и порылась: реальный график спроса содержит в себе "джокеры", некие существенные отклонения от средних величин.

    И все бы ничего, есть методы работы с "руслами" и "джокерами", хотя это и не совсем обычная математическая статистика, но дополнительно выплывает совсем грустная история: количественно будущие продажи не связаны с прошлыми данными по продажам.

    Это известная проблема прогноза слабо детерминированных событий. Суть: из прошлых состояний системы невозможно предсказать будущие состояния системы. Прежде всего потому, что новый состояния системы в будущем существенно зависят от изменений структуры системы. Система с данном случае - ограниченный по какому-то правилу набор элементов и связей между ними. Элементы изменяются во времени, связи тоже изменяются во времени. Поведение элементов нелинейное, поведение связей - тоже нелинейное. Структура может быть с обратными связями. Вот и приплыли.

    В Вашем случае все еще хуже: у Вас статистика продаж системы 1 за прошлый период. А предсказывать нужно результаты работы системы 2 за будущий период. Система 2 получается, как нелинейное структурное развитие системы 1. То есть во временных рядах данные о разных объектах! Это как предсказывать отклонение среднего сопротивления в партии резисторов, при том что некто подмешал через 2 часа от начала теста в эту партию 50% точно таких же по внешнему виду конденсаторов и не сказал экспериментатору об этом. Вроде в начале все получается, ведь резисторы же! А через 2 часа - что-то пошло не так в тестах...

    И нет, в описываемом случае нельзя пренебрегать изменением анализируемой системы системы ни на каком интервале времени. И нет, обычные и необычные средства анализа временных рядов тоже существенно не повысят точность предсказаний. Много чего уже пробовали, от нелинейной динамики (теории хаоса, аттракторы) до разных нейросетей, нечеткой логики и т. п. Тут ведь как: если удалось восстановить периодическое фазовое пространство для поведения системы в прошлом, и оно не существенно меняется в будущем - то да, методы нелинейной динамики криво-косо работают. Но если фазовое пространство со временем существенно изменилось - то все, опять ерунда. Нейросети и все методы их применения - по сути дают то же самое: попытка имитировать структуру кибернетического "черного ящика" сложной системы без ручного построения имитационной модели.

    Насчет имитационной модели: ее построить просто, но ее структура должна быть актуализирована и верифицирована в реальном времени. И другая проблема: очень сложно подобрать корректную структуру такой модели, чтобы результат ее работы не "рассыпались" с реальностью со временем. Модель то может и заработать, но давать результаты корректные на коротком промежутке времени. И никак не удается этот промежуток расширить, никакими ухищрениями.

    Суть: задача прогноза продаж более-менее корректно не может быть решена никак.

    Что делать: не заморачиваться только на предсказании продаж. Есть смысл работать с каждым элементов "петли управления". Ведь само предсказание - только элемент принятия решения (сколько и когда купить и поместить на склад, оптимизация части логистики, причем все это связано с кучей параметров бизнеса). Само принятие решения должно быть реализовано по принципу "проб и ошибок", который называется французским словом «бриколаж».

    Потом проанализировать систему бизнеса на "хрупкость", особенно внимания обратить на асинхронность и "антихрупкость" связей процессов продаж, логистики и закупок.

    Потом можно сделать простую имитационную модель системы и соединить ее на уровне сценариев с имеющейся программой ERP/MRP. Модель можно сделать в виде простой последовательной цепочки элементов со сложным поведением. В такой модели продажи и их предсказание - будет только одним элементом. Далее теория надежности. Производительность последовательно цепочки определяется наихудшим элементом ("бутылочное горлышко"). Потом можно оптимизировать бизнес на основе анализа продаж, конечно если "прогноз продаж" будет таким лимитирующим элементом. Но обычно это не так: чаще всего лимитирующее звено - это административная или финансовая подсистема бизнеса. И тут станут видны уже более глобальные параметры оптимизации.

    И тогда будет видно, что неточное предсказание продаж (даже джокеры) может быть нивелировано всей системой операционной деятельности бизнеса. Ну или вообще мало влияет на бизнес.

    Потом встанет во всей красе извечный ужас моделей, предсказаний и оптимизации: как изменение элемента системы или нескольких связей повлияет на работу системы в целом? Может быть уточнение прогноза продаж и корректирующие действия почему-то понизят EBITDA фирмы в целом? Почему? Потому что у меня лапки...

    Ведь "Типичный Бизнес" говорит, что хочет чего-то, это правда. Но как именно в денежном выражении изменится EBITDA компании при супер-пупер автоматизации чего-то там? Предсказать это - более важно, чем предсказание продаж. Что самое веселое: технологические и экономические модели для фирмы в целом, для нескольких отделов, для группы фирм (холдингов), для государства в целом и даже для транснациональных корпораций - структурно очень похожие. Хотя абсолютно разные по поведению.

    Что получается: можно строить относительно простые, структурно похожие модели разного масштаба. Но у них будут элементы со сложным поведением. И результаты работы таких моделей могут давать неплохие практические результаты.


    1. marieee Автор
      18.11.2022 18:46
      +1

      Спасибо за ваш удивительно развернутый комментарий! Вы довольно точно описали суть и боль страх и ненависть любого моделирования и моделей машинного обучения в частности: результат без ошибок получить НЕВОЗМОЖНО. Любой прогноз будет инструментом принятия решений, и тем более мощным, чем большее количество элементов в него включено, и сколькими из них мы можем управлять. Часто это реализуется через целевые параметры прогноза (желаемую доступность, например) или через интервальное прогнозирование, которое позволит нивелировать ошибки и подстроиться под особенности других систем, те же нюансы логистики или управление страховыми запасами. С другой стороны, можно не брать продиктованные бизнес-моделью параметры, а вычислять и задавать их самостоятельно, исходя из оценки просчитанного сценария и what-if анализа. Этот способ супер пригодится для влияния на решения внутри компании, где воздействие внешних непредвиденных факторов не так велико


      1. adeshere
        19.11.2022 02:50

        инструментом принятия решений, и тем более мощным, чем большее количество элементов в него включено

        А вот тут не все так однозначно, по-моему. Во всяком случае в нашей области (в геофизике) есть достаточно много примеров, которые показывают, что расширение модели (добавление в нее дополнительных переменных) далеко не всегда улучшает модель. Наоборот, очень часто новые признаки привносят такой дополнительный шум, что общий результат ухудшается. Поэтому одна из актуальных задач у нас - это отсев неинформативных признаков. Кстати, если Вы это еще не пробовали делать в своей работе - возможно, стоит при случае поэкспериментировать. Очень интересно, будет ли у Вас аналогичный полезный эффект, или нет.


    1. adeshere
      19.11.2022 02:39
      +1

      Суть: из прошлых состояний системы невозможно предсказать будущие состояния системы. 

      Разумеется, такая проблема есть. И вовсе не только в продажах (мне ближе прогноз землетрясений, где все очень похоже). Однако мир не бинарный, поэтому я против чрезмерной категоричности. В поведении любой системы, даже находящейся во власти детерминированного хаоса, почти всегда есть элементы как предсказуемости, так и случайности. В том числе и в продажах. Поэтому дать точный прогноз невозможно, а вот существенно улучшить результаты по сравнению со случайным угадыванием - вполне реально. И вот на этом шаге мне непонятно, почему Вы заранее откидываете целые классы моделей, как неэффективные, оставляя право на существование только самым "относительно простым"? Вопрос ведь не в сложности модели, а в ее предсказательной силе. Переобучение одинаково фатально снижает полезность любых моделей - как простых, так и сложных. У нас в геофизике есть тьма примеров и того, и другого...


  1. sanchovy
    18.11.2022 04:57

    Спасибо за интересную статью. А вы не могли бы посоветовать литературу по прогнозированию временных рядов и всего, что описано в статье?