Как стать автором
Обновить

Комментарии 23

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

спасибо!

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

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

День добрый!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это конечно да, все так и выглядит. В определенном аспекте, в некотором фазовом пространстве. Для "теории хаоса" (нелинейная динамика) есть очень удачные модели, все верно.

существенно улучшить результаты по сравнению со случайным угадыванием - вполне реально. 

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

И тут столкнулся с влиянием "джокеров" ("черных лебедей" по Талебу, всплесков) на результат бизнеса в целом. Если модель работает некоторое время корректно, то EVA (экономическая добавленная стоимость) бизнеса стабильна или растет, реальный результат 100 единиц за месяц (для примера). Но если модель "прошляпила" джокер - то потери за неделю могут быть 150 единиц. То есть применение модели в "русле" дает прибыль, а при "джокере" - можно все потерять. Более ярко это проявляется в моделях на разных там валютных рынках, на рынках акций.

И вот на этом шаге мне непонятно, почему Вы заранее откидываете целые классы моделей, как неэффективные,

У меня лично есть примеры таких классов моделей, есть информация и в разных отраслях во всем мире. Все работает только при "ручной" коррекции принятия решений. А это значит, что закономерности работы в реальности для модели не нашли, и ценность такой модели - малая. То есть можно взять генератор случайных чисел, как модель, и результат будет похожий. Особенно на длительном интервале. Суть: для достаточно сложных систем поиск оптимума случайным методом не хуже, чем при применении любых методов оптимизации.

Вопрос ведь не в сложности модели, а в ее предсказательной силе.

Это да, согласен.

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

Для экономики, для моделирования на уровне "предприятие", "корпорация", " отрасль" - вполне достаточно простейших структур типа "последовательное соединение" элементов. То есть структурно вся модель верхнего уровня - "елочная гирлянда" из 5-9 элементов. Каждый элемент внутри имеет точно такую же структуру из 5-9 элементов. Уровни детализации - для предприятия достаточно 2-3 уровня. Для отрасли - до 5 уровней. Идеи такой структуры брали из "Технодинамики".

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

Модель имела неплохую предсказательную силу. Прогноз развития целой отрасли для одного государства на 10-12 лет - вполне себе оправдался. Логика создания нескольких корпораций, полученная из таких моделей - тоже вполне себе удачная.

И тем не менее, если отвлечься от локальных моделей, то все упирается в связку "модель-реальность". Суть: что бы ни показала модель, она - только элемент системы управления. И более важные элементы системы управления: Постановка целей, Исполнение, Контроль за исполнением - могут лимитировать эффект от прогноза и анализа спроса.

И тут упираемся в самую интересную часть моделирования: связка детерминированной модели со слабо детерминированной реальностью. И можно ли создать модель принципиально без понимания логики работы самой не детерминированной системы? Сейчас изучаю подход, описанный у Лема (методы "выращивания" знаний), плюс smart contract, как метод хранения и работы моделей. Связь элементов модели, плюс связь "модель-реальность" - на основании методов OSI model.

То есть наверное имеет смысл поработать над методами моделирования в связке с методами имплементации и реализации воздействий в реальности.

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

Определенных книжных гигантов не приведу, для начинающего, думаю, подойдут курсы излюбленной спецификации от МФТИ и Яндекса, в практических задачах есть анализ временных рядов (сейчас на Coursera недоступен, но я видела на сайте МФТИ). Лекции от CSC тоже подойдут, как и конспекты Соколова. Для Prophet, LSTM и других изощерний есть довольно подробная документация и статьи здесь же, на Хабре. Удачи!

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

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

У себя решил, выдумав термин (хотя скорее всего уже до меня его выдумали) : "граница смены поведения ряда". Реализовал на этапах препроцессинга поиском максимальной правой значимой границы смены поведения и отрезанием ряда по этой границе : в прогнозирование идет конечная правая часть а левая - в мусорку. Ищу крайне просто по типу как задача в начальной школе "2 поезда поехали из пункта "А" и "В" навстречу друг другу, где встретятся? Только вместо поездов у меня скользящие сигмы (с окном 21 день) которые едут по временному ряду навстречу (один с конца в начало, другой от начала в конец) . 3-м вектором считаем отношение по этим двум, значимым переходом состояний считаем превышения фикс.% по модулю . Например в точке t сигма_1 отличается от сигма_2 на 85% (не важно в какую сторону) но это выше фикс. Х% порога - явно переход поведения ряда.

На все про все - 30 строк кода на R (так много за счет доп.тюнинга типа не резать границу если уж очень короткая часть останется а поискать границу чуть раньше)

Слушайте, интересный подход! Идея напоминает тюнинг changepoint'ов в Prophet, однозначно стоит попробовать, спасибо!

Мало сказано про моделирование сезонностей. Здесь можно и нужно применять компоненты ряда Фурье с периодами, соответствующими выделенным по периодограмме сезонностям. Здесь можно выделить библиотеку ETNA и ее класс FourierTransform для генерации членов ряда Фурье. Полезно создавать взаимодействия членов ряда Фурье и календарных признаков, как делается в Greykite. Если горизонт короткий, лаги помогут, если длинный (от 30 дней), их полезность снижается, для длинных горизонтов важно хорошо моделировать тренд (используем детрендеры и добавление тренда как признака) и сезонность (используем компоненты ряда Фурье и признаки даты и времени), нужно настраивать количество точек смены тренда/сезонности, расстояния между ними и расстояние между последней точкой смены тренда/сезонности и последним моментом времени обучающей выборки, если точка смены будет рядом с последним моментом (в Prophet это автоматически контролируется и не допускается), почти наверняка, пролетите с прогнозом. Ну и потом не только лаги и скользящие статистики, надо брать и групповые скользящие статистики. Хорошие результаты показало добавление в качестве признаков для градиентного бустинга результатов тройного экспоненциального сглаживания. Для обучающей выборки мы берем сглаженные значения, для тестовой выборки берем прогнозы согласно таксономии, приведенной ниже.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий