Pull to refresh

Comments 17

Прошу прощения, а не из-за этого нововведения, примерно начиная с Нового Года, из уже сформированной и заказанной (а, иногда, и предоплаченной) корзины «пропадают» товары с формулировкой: «К сожалению, не будет доставлен следующий товар: xxx»?
Система, для которой мы сделали пилотное исследование, как раз должна так прогнозировать спрос, чтобы товары были на складе всегда в оптимальном количестве.
Как и что устроено в системе заказа у магазина сейчас, к сожалению, никак не могу прокомментировать.
В случае «пропажи» важна синхронизация сайта с бд склада, а не столько наличие товара на складе.
Странновато выглядит график с продажами в день прогноза, как топовой фичей. Вы уверены, что у вас модель не «протекала»? А то выглядит, будто вы частично на ответе обучались.
И еще вопрос — а почему не исключить сезонность и тренд из данных простой моделью, а уже по остаткам от нее пройтись RandomForest'ом? Он же тренд не сможет поймать.
Я не думаю, что там есть утечка. В рамках имитации обучения «на послезавтра» условное «будущее» модели не показывалось. Плюс исключение фичи «продажи в день прогноза» делает прогноз более точным на некоторых временных промежутках (но на некоторых нет). В основном она помогает в периоды, когда активно применяются маркетинговые акции: заметное увеличение проданного сегодня может указывать на сместившийся спрос с послезавтра.

Тренд на общее возрастание числа продаж мы постарались учесть при генерации фич для RandomForest'а, добавив туда в том числе общие продажи по товару за предыдущие периоды от дня прогноза.
почему лес не сможет отследить тренд?
Вот статьи, где на примерах показывают ограничения:
freerangestats.info/blog/2016/12/10/extrapolation
medium.com/datadriveninvestor/why-wont-time-series-data-and-random-forests-work-very-well-together-3c9f7b271631

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

1. Пилотом обычно называют все же тестовое внедрение, а у Вас я из текста так и не понял, пошел ли Ваш прогноз в заказ. Это очень важно, тк моментально дает Вам кучу фидбека, гордости за себя и тикетов для работы ;)
2. Не указан горизонт и уровень прогнозирования, а это очень важно, для понимания цифр. Одно дело, прогнозировать ближайшую неделю и суммарно товарную группу, другое — один товар на пару месяцев вперед.
3. Касаемо фичи «продажи в день прогноза», если прогноз на будущее. Обычно делают каскад фич: продажи предыдущего дня, продажи предыдущего того же дня недели (пн к пн и т.д.), месяца, года. Не уверен, что здесь это сработает, но все же. И тогда прогноз на много дней надо запускать итеративно, на дальнейших днях либо подменяя факт прогнозом, либо используя модель без фичи.
4. Не очень понятно, подавали ли флаги дней недели в RF. Банально, логарифмировали ли целевую переменную. Дни недели должны быть в топе!
5. Такое чувство, что фичу «дней до Курбан-байрам» RF просто использовал как некий идентификатор дня или восходящий тренд.

С тз индикативности, хотелось бы увидеть прогноз по каким-нибудь шоколадкам, кофе или бытовой химии. Они куда лучше должны показать качество модели, чем спокойное 45 недель в году куриное яйцо.
Спасибо за комментарии!
1. У нас пилотным исследованием (пилотом) обычно называется именно исследование, до внедрения, о нем эта история. А дальнейшие действия заказчика комментировать не можем.
2. Мы моделировали ежедневный прогноз (на один конкретный день — послезавтра) для одного товара (конкретный SKU, не группа).
3. Да, у нас были некоторые из перечисленных вами фичей для RandomForest плюс некоторые другие (вроде изменения цены товара относительно этих периодов). Думаю, что можно наинженерить еще и подобрать оптимум, но в данном случае для нас было важно показать принципиальную возможность улучшения первых результатов.
4. Флаг дня недели — это «день недели для продаж» (в смысле, что день, когда будут происходить продажи, а не когда мы строим прогноз), он пятая по важности фича для RandomForest.
5. У нас было в числе фичей некоторое число других праздников как флагов и как дней, оставшихся до них (например, Пасха и Новый год), они тоже оказывали влияние для отдельных товаров, хотя и не вошли в топ-5. Скорее всего, это все же шум какой-то природы, но для того, чтобы установить это точно, — стоит еще поисследовать возможные фичи. Например, я бы проверила, нет ли такого, что от мая к концу лета мясо просто покупают больше/меньше благодаря выездам на шашлыки, а Курбан-байрам к концу лета близок.

К сожалению, по разнообразию прогнозируемых SKU мы были ограничены как по постановке задачи и времени, так набором данных.
Спасибо за ответ по содержанию.
По-моему, совсем немного недоработали, чтобы добить задачу и сделать более универсальное решение.
Ваш вариант заточен на прогноз одного дня, в случае, если захотите прогнозировать даже завтра+послезавтра модель придется перестраивать основательно.
В таком случае, топ критериев вполне интерпретируем.
Во-первых, модель вполне разумно говорит, что продажи завтра очень похожи на вчера. Это логично, так она избавляется от влияния годовой сезонности и изменения ассортимента, в некотором смысле восстанавливает тренд.
Во-вторых, модель строит коэффициент продажи в (день_недели_завтра / день_недели_вчера), вернее 7 таких коэффициентов. Во сколько раз продажи в среду выше таковых в понедельник, во сколько четверг выше вторника и т.д. Так она восстанавливает недельную сезонность.
На самом деле, здесь уже сделано 95% работы, остается обработать исключительные ситуации.
В третьих, учесть цену. В идеале, было бы подавать на вход скидку а не цену, результаты бы чуть улучшились.
Ну и в-четвертых — праздники как еще неописанные всплески спроса. Их Ваша модель скорее всего видит через те самые дни до праздника.

В принципе, можно было бы построить регрессию по данным с аккуратно заведенными фичами и получить аналитическую функцию прогноза, но Ваш вариант, особенно для пилота, вполне жизнеспособен. Было бы еще интересно проверить, нет ли подозрительных выбросов переобучения, приводящих к тому, что например при повышении цены в каком-то диапазоне растет спрос.
Даты пиков покупки яиц в 2015-2016гг. обусловлены тем, что яйца красят в «чистый четверг».

Но результат в другие годы это не объясняет.
Замечательная и образцовая статья по ML! Авторы большие молодцы. Удалось уйти от шаблонов и трескотни. Для того, чтобы статью можно было использовать как пример всем (сверх искусственным интеллектам и ML), хотелось бы видеть в конце оценку результатов в виде таблички. То есть сравнение ожидаемых результатов и полученных результатов. И снова — МОЛОДЦЫ! И Джет и Утконос реально (и скажу честно неожиданно) порадовали прежде всего пониманием и подбором правильных людей и идей.

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

С большим удовольствием почитаю про ограничения регрессора случайного леса в таких случаях, если вас не затруднит сослаться на материалы по теме! Пока известные мне материалы в основном касались ошибок при генерации фичей и предупреждали про опасность попадания части целевой переменной, которая находится выше по восходящему тренду и не имеет аналогов в тренировочном наборе, в тестовый сет.
По нашему опыту, для некоторых проектов после преобразования данных из time like в feature like случайный лес дает такие же или лучше результаты (вот просто для примера работа, где Random Forest сравнивается с ARIMA в прогнозировании вспышек гриппа). Про то, как лучше учитывать специфику временного ряда при генерации фич, написано тоже немало. Например, для модели из статьи учитывать возрастающий тренд оборота магазина помогают общие фичи продаж.
Некоторое время работал с системой прогноза спроса одного российского ритейлера, так что тема статьи мне во многом близка. Правда, там было совсем мало машинного обучения, в основном старая добрая эконометрика.
Мы сталкивались с теми же самыми проблемами, что и вы. Спрос чрезвычайно чувствителен к внешним событиям, которые невозможно предсказать из данных по продажам. То есть с сезонностью ещё можно работать, а вот взмах руки коллеги из ценообразования, приводящий к кардинальному изменению спроса, предсказать просто напросто невозможно. И ладно бы, если этот взмах влиял только на один товар — но зачастую такие резкие перемены приводили к полному «переделу рынка» между разными производителями категории. На мой взгляд, невозможно добиться высокой точности даже по ходовым товарам, если отсутствует координация действий между ценообразованиями и прогнозистами. И нужно строить модели, учитывающие перекрестные эластичности спроса, иначе необъяснимые взлеты и падения будут возникать всегда.
Касательно FB Prophe — мне кажется, или он у вас цепляет сезонность там где не нужно? Например, на последнем графике с яйцами, он похоже зацепил новогодний взлет и падение, и пытался их спрогнозировать по сезонности, хотя ясно, что период там совсем не подходящий. В этом, на мой взгляд, кроется опасность «черных ящиков» — никогда не знаешь, чего от них ждать.
Спасибо, что поделились своим опытом! Цена очень важна, не знаю, как бы мы работали без нее. Думаю, что учет витринных цен тоже добавил бы нам точности. Про перекрестный спрос подумали, но исключили из пилота ради того самого оптимального соотношения результата к затраченным усилиям, а так тема очень перспективная.

Вокруг Нового года, к сожалению, в наборе часто остается после чистки мало данных, т.к. часто оказывалось, что товар на складе кончился и мы никак не можем восстановить реальный спрос. Плюс в новогодние праздники в разные года магазин, если я правильно помню, работал по-разному, что может быть внешним фактором для смещения спроса до и после — и тоже может быть дополнительной фичей.
Sign up to leave a comment.