Не секрет, что методы машинного обучения стали повсеместно проникать в различные сферы бизнеса, оптимизируя, совершенствуя и даже создавая новые бизнес процессы. Одна из важных областей — это вопрос установления цены на товар и здесь, при достаточном количестве данных, МО помогает сделать то, что раньше было трудно достижимо – восстановить многофакторную кривую спроса из данных. Благодаря восстановленной кривой спроса стало возможным построить динамические системы ценообразования, которые позволяют провести оптимизацию цены в зависимости от цели ценообразования – увеличить выручку или прибыль. Данная статья представляет собой компиляцию моей диссертационной работы, в которой была разработана и опробована на практике в течении 4 недель модель динамического ценообразования LSTM-ANN для одного из товаров ретейлера товаров для дома.

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

Предпосылки


На рынке ретейла товаров для дома существует ценовой лидер – Леруа Мерлен. Объемы продаж данной сети позволяют им поддерживать стратегию минимальной цены на весь товарный ассортимент, что приводит к ценовому давлению на прочих игроков рынка.

Выручка и прибыль основных ретейлеров в Санкт-Петербурге по состоянию на 31.12.2017

image

В связи с этим, в Ретейлере используется другой подход к ценообразованию:

  • Цена выставляется на уровне самой низкой из конкурентов;
  • Ограничение на цену снизу: закупочная цена + минимальная надбавка, отражающая примерные расходы на единицу товара.

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

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

Данные


Для исследования компанией были предоставлены данные с января 2015 по июль 2017 (920 дней / 131 неделя). Эти данные включали в себя:

  • Дневные продажи, включая выходные дни, по 470 товарам (16 номенклатурных групп);
  • Дни проведения рекламных акций в магазине;
  • Дни в которых предоставлялись скидки на товар;
  • Цены на каждый из 470 товаров;
  • Дневные данные по количеству чеков по всей сети в Санкт-Петербурге;
  • Цены основных конкурентов на большинство из 470 товаров (данные снимались раз в неделю).

Дополнительно к этим данным я также добавил календарные дамми переменные:

  • Сезон года (осень/зима/лето/весна);
  • Месяц;
  • Квартал;
  • День недели;
  • Праздничные дни;

А также, погодные переменные:

  • Осадки – дамми;
  • Температура;
  • Отклонение температуры от средней в сезоне.

Непосредственно проанализировав дневные продажи товаров, я обнаружил, что:
Только около 30% товаров продавались все время, все остальные товары либо вводились в продажу позже, чем 2015, либо снимались с продажи раньше, чем 2017, что привело к существенному ограничению на выбор товара для исследования и ценового эксперимента. Это также приводит нас к тому, что за счет постоянной смены товаров в линейке магазина становится трудно создать комплексную потоварную систему ценообразования, однако, есть некоторые способы обойти эту проблему, о которых будет сказано позже.

Система рекомендации цены


Для построения системы рекомендации цены для товара на следующий период времени на основе модели, предсказывающей спрос, мною была придумана следующая схема:

image

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

То, что не получилось
После выбора одного из товаров для исследования, я использовал XGBoost, перед тем как непосредственно перейти к LSTM модели.

Сделал я это в расчете на то, что XGBoost поможет мне отбросить множество ненужных факторов (это происходит автоматически), и уже оставшиеся использовать для LSTM модели. Такой подход я использовал осознанно, поскольку, во избежание лишних вопросов на защите диссертации я хотел получить сильное и, при этом, простое обоснование выбора факторов для модели с одной стороны, а с другой – упрощение разработки. К тому же, я получал готовую, черновую, модель, на которой можно было быстро опробовать разные идеи в исследовании. И после этого, выйдя на конечное понимание того, что будет работать, а что нет, делать итоговую LSTM модель.

Для понимания задачи прогнозирования, приведу график дневных продаж первого выбранного товара:

image

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

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

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

Первоначальный список факторов, которые, предположительно, влияют на продажи:

  • Данные по дневным продажам других товаров из данной группы, общих продаж в группе в штуках и количестве чеков по всем магазинам сети в Санкт-Петербурге с лагами 1, 2, 3, 7, 14, 21, 28;
  • Данные по ценам других товаров из группы;
  • Соотношение цены на исследуемый товар с ценами других товаров из группы;
  • Наименьшая цена среди всех конкурентов (данные снимались раз в неделю, и я сделал допущение, что такие цены будут действовать и на следующую неделю);
  • Соотношение цены на исследуемый товар с наименьшей ценой у конкурентов;
  • Лаги продаж по группе (в штуках);
  • Простое среднее и RSI на основе лагов продаж товаров группы, общих продаж в группе и количестве чеков.

В общей сложности получилось 380 факторов. (2,42 наблюдения на фактор). Таким образом, проблема отсечения не значимых факторов действительно была высока, однако XGBoost помог справиться с этим, значительно обрезав количество факторов до 23 (40 наблюдений на фактор).

Наилучший результат, которого я смог добиться, используя greed search выглядит следующим образом:

image
R^2-adj = 0.4 на тестовой выборке

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

Итоговые результаты поубавили мою веру в успех, потому что результат R^2-adj 0.4 означал только то, что система предсказания не сможет предсказывать спрос на следующий день достаточно хорошо, а рекомендация на цену будет мало отличаться от системы «пальцем в небо».

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

Продажи по группе товаров:

image
R^2-adj = 0.71

Чеки:

image
R^2-adj = 0.86

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

Для того, чтобы окончательно убедиться в тои, что предсказывать спрос на один день вперед бессмысленное занятие, я использовал модель SARIMAX (пакет statsmodels для python) для дневных продаж:

image

image

Фактически результаты никак не отличаются от полученных с помощью XGBoost, что наводит на мысль о том, что применение сложной модели в данном случае не оправдано.

При этом, хочу также отметить, что ни для XGBoost ни для SARIMAX погодные факторы оказались не значимы.

Построение итоговой модели


Решение проблемы качества предсказания заключалось в агрегировании данных на недельный уровень. Это позволило сократить влияние случайных факторов, однако, существенно сократило количество наблюдаемых данных: если дневных данных было 920, то недельных только 131. Ситуация ухудшилась тем, что количество факторов осталось практически неизменным (исключались дамми на дни недели), а вот количество наблюдений целевой переменной сократилось сильно.

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

Смена товара произошла на товар с ярко выраженной сезонностью:

image

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

Конечный список факторов выглядит следующим образом:

  • Соотношение цены за килограмм исследуемого товара и грунтовки CERESIT СТ 17 10 л.;
  • Соотношение цены исследуемого товара и товара и грунтовки CERESIT СТ 17 10 л;
  • Соотношение цены исследуемого товара и грунтовки EURO PRIMER 3 л;
  • Соотношение цены на исследуемый товар и минимальной цены у конкурентов;
  • Дамми переменные на три рекламные акции на уровне сети;
  • Дамми переменные весеннего, летнего, осеннего сезонов;
  • Лаги 1 – 5 недельных продаж исследуемого товара.

Всего 15 факторов (по 9 наблюдений на фактор).

Итоговая LSTM модель была написана с использованием Keras, включала в себя 2 скрытых слоя (25 и 20 нейронов соответственно), и активатор – сигмоиду.

Код конечной LSTM модели с использованием Keras:

model = Sequential()
model.add(LSTM(25, return_sequences=True, input_shape=(1, trainX.shape[2])))
model.add(LSTM(20))
model.add(Dense(1, activation=’sigmoid’))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=40, batch_size=1, verbose=2)
model.save('LSTM_W.h5')

Результат:

image

image

Качество предсказания на тестовой выборке выглядело достаточно убедительно по метрике, однако, на мой взгляд, все-таки, до идеала не дотягивало, поскольку, не смотря на достаточно точное определение среднего уровня продаж, всплески в отдельно взятые недели могли быть довольно сильно отклоняться от «среднего» уровня продаж, что давало сильно отклонение прогноза продаж от реальности в отдельные дни (вплоть до 50%). Тем не менее, я использовал эту модель уже непосредственно для эксперимента на практике.

Интересно также увидеть, как выглядит восстановленная кривая спроса по цене. Для этого я прогнал модель по диапазону цен и, на основе предсказанных продаж, построил кривую спроса:

image

Эксперимент


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

Максимизация прибыли проводилась с ограничениями: минимальная цена составляла закупочную цену + фикс. надбавку, максимальная цена была ограничена ценой грунтовки того же производителя, только в упаковке 10л.

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

Предсказание объема продаж:

image

Предсказание прибыли:

image

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

Сводные результаты за 4 недели:

image

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

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

Но не стоит также и забывать, что 4 недели – это краткосрочный период и эксперимент был проведен только на одном товаре. На долгосрочном периоде, завышение цены на товары в магазине приводит, как правило, к падению продаж в целом по магазину. Чтобы подтвердить свою догадку на этот счет, я решил, используя XGBoost проверить, есть ли у потребителей «память» на цены за предыдущие периоды (если в прошлом было дороже «в целом» чем у конкурентов, потребитель уходит к конкурентам). Т.е. будет ли оказывать на продажи по группам товаров средний уровень цен по группе за последние 1, 3 и 6 месяцев.

image

Действительно, догадка подтвердилась: так или иначе, средний уровень цен за предыдущие периоды влияет на продажи в текущем периоде. Это значит, что проводить оптимизацию цены в текущем периоде по отдельно взятому товару мало – необходимо учитывать также общий уровень цен в долгосрочном периоде. Что, в целом, приводит к ситуации, когда тактика (максимизация прибыли сейчас) противоречит стратегии (выживание в конкурентной борьбе). Это, однако, уже лучше отдать на откуп маркетологам.

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

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

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

> На основе проделанной работы, я подготовил проект в моем репозитории

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

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

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


  1. madcat1991
    27.08.2018 23:45

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

    Не думал, что напишу это, но куда полезнее распознать процессы, влияющие на изменение цены, чем предсказание следующего значения в последовательности. Ведь на подобной последовательности модель сломается: www.ino.com/img/sites/ino/email/6155.jpg


    1. Mentalitet Автор
      28.08.2018 22:26

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


  1. roryorangepants
    28.08.2018 09:44

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


    1. Mentalitet Автор
      28.08.2018 22:21

      Постараюсь ответить на все обстоятельно:

      Главная проблема этой работы в том, что когда вы создавали модель, вы работали с одним конкретным рядом. Затюнить модель так, чтобы она более-менее хорошо предсказывала спрос на один товар, можно. Но на практике ретейлеру обычно нужно предсказывать спрос сразу на все товары, а вот тут сложные модели типа бустингов и сетей становится куда сложнее настраивать, а также появляется необходимость в более сложном feature engineering (например, нельзя сделать dummy-переменные под конкретные акции, потому что у каждого товара может быть свой набор скидок в разные моменты времени, которые комбинируются произвольным образом, и приходится из этих данных строить какие-то новые, более общие фичи). Кроме того, редко ретейлеру реально нужно предсказывать спрос на день вперёд для менеджмента закупок, да и для оптимизации цен это, наверное, не вполне корректно. Поэтому я, честно говоря, сомневаюсь в том, насколько построенная модель способна принести пользу заказчику в реальной жизни (помимо того, что она в целом демонстрирует практическую жизнеспособность работы с price elasticity с помощью ML-алгоритмов).

      На сколько показывает мой опыт, который также описан в статье, все ровно да наоборот:
      Тяжело предсказывать спрос на отдельно взятый товар, гораздо легче на спрос по группе товаров или даже по сети в целом (в моем случае я описал предсказание дневного количества чеков по всей сети с высоким уровнем точности, данные можно посмотреть в статье). Я пробовал предсказывать спрос как в штуках, так и по сумме продаж по группам товаров и все выходило гораздо лучше, чем по индивидуальному товару, как на уровне дней, так и на более продолжительных масштабах времени (дальше месяца не смотрел потому что данных мало). Поэтом я сходу и в цепился в дневные продажи, пытаясь провалиться на самый минимально возможный таймфрейм (чего делать оказалось не нужно). Насчет дневных продаж не соглашусь, потому что, во первых, существуют продуктовые ретейлеры, у которых продаются товарыс ограниченным сроком использования (например, 5 дней) и предсказать, продадим мы остатки товаров с подходящим к концу сроком использования или нет, очень может быть кстати. Другое дело что для товаров для дома это не актуально и менять цены каждый день по всем тысячам номенклатур еще и очень накладно окажется. Однако динамическое ценообразование оно на то и динамическое, что хоть когда-то но цены менять надо :)
      Почему вы считаете, что так корректно делать? Деревянные модели работают с признаками совсем не так, как сети. Фичи, которые бустингу показались полезными, могут не взлететь в сети, и наоборот. И уж точно фичи, подаваемые на вход бустингу, надо обрабатывать совсем не так, как фичи, подаваемые на вход сети.

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

      Здесь я исходил из того, что для того, чтобы изменять цену перед эти предсказывая спрос, делать это надо достаточно точно. Потому что предсказание +-50% (например) от факта продаж сводит на нет всю адекватность системы установления цены соразмерно ожидаемому спросу. Если систематически ошибаться в предсказании и достаточно сильно, то какой смысл в таких рекомендациях? Поэтому, я не говорю, что само по себе значение 0.4 плохо, я говорю лишь о том, что оно не достаточно.
      Если вы делали это, валидируясь на той же части датасета, которую вы называете тестовой (а судя по графикам и коду, вы это делали), поздравляю — вы оверфитнулись.

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

      • Соотношение цены за килограмм исследуемого товара и грунтовки CERESIT СТ 17 10 л.;
      • Соотношение цены исследуемого товара и товара и грунтовки CERESIT СТ 17 10 л;
      Разве вторая фича не получается из первой линейным преобразованием?

      Первое:
      (Цена исследуемого товара / литры в упаковке этого товара) / (Цена «CERESIT СТ 17» / 10 литров)
      Второе:
      Цена исследуемого товара / цена грунтовки «CERESIT СТ 17»

      Эти два фактора несут разную информацию, потому что в исследуемом товаре 5л, а в «CERESIT СТ 17» – 10 литров

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


      С этим сложно спорить, но не ошибается тот, кто ничего не делает)

      Позволю себе не согласиться. Если сравнить даже 2016 и 2015 годы, можно увидеть огромный естественный прирост (очевидно, связанный с тем, что ретейлер работает в плюс и расширяется), так что ваш эксперимент абсолютно не показателен и, вполне вероятно, мог не принести повышения прибыли (во всяком случае, ваши данные этого не подтверждают).
      Кроме того, то, насколько сильно ваша модель ошибалась в предсказаниях (намного сильнее, чем на тестовой части датасета), ещё раз свидетельствует о том, о чём я писал выше — настраивая параметры под тестовую часть, вы сильно заоверфитились.

      Какой именно прирост вы увидели (в деньгах, в штуках?)
      Я вижу лишь прирост в штуках незначительный, +8% и +13%, который вполне можно списать на случайные колебания (все таки применения модели длилось 4 недели, а не год) и если вы посмотрите график продаж с 2015 в статье, то увидите, что никакого повышения продаж в штуках нет и более того, есть тенденция снижения продаж в целом (это уже со слов маркетолога). Реальный же прирост по выручке и прибыли за время применения модели объясняется только одним фактором: повышение цены. Насчет того стоит ли слепо верить таким вещам и повышать цены без оглядки на что либо я тоже написал – повышение цены пройдет на краткосрочном периоде, но долгосрочно фирма проиграет и тут при оптимизации цен надо вводить уже оптимизацию «сквозь периоды».
      Насчет промаха в предсказании спроса: про оверфит я уже ответил, что ни заглядывания в будущее, ни обучения на тестовой выборке не было. Тем не менее, промах в предсказании – неприложный факт. Я думаю, тут сыграло свою роль два фактора как минимум (недостаточно качественная модель это по умолчанию) 1) Сильные выбросы в отдельные недели по продажам, которые не удалось достаточно хорошо предсказывать, 2) То, что магазин поменял выкладку по товару, на котором проводился тест модели. Про это я, действительно, забыл упомянуть в статье (добавлю в статью чуть позже)

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


      Почувствовал себя вновь как на защите :) Вопросы конструктивные, спасибо за проявленный интерес!


      1. roryorangepants
        29.08.2018 09:27

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

        Вы неправильно поняли мой поинт. Вы говорите о предсказаниях для групп товаров, а я говорю о том, что предсказания нужны для каждого товара в отдельности, поскольку как supplies management, так и dynamic pricing в конечном итоге делаются на уровне товаров.
        Я пробовал предсказывать спрос как в штуках, так и по сумме продаж по группам товаров и все выходило гораздо лучше, чем по индивидуальному товару, как на уровне дней, так и на более продолжительных масштабах времени (дальше месяца не смотрел потому что данных мало).

        Опять таки, суть замечания была не в этом. Вы говорите о предсказании с большим шагом (например, недельные предсказания, которые вы делали во второй части), а я говорю о предсказании на несколько шагов, которое, опять таки, как раз и нужно ретейлерам. В вашем же примере, если у товара срок годности 5 дней, то вам нужен не прогноз на день вперёд или на неделю вперёд, а, вероятнее всего, daily prediction примерно на пять дней.

        Потому что предсказание +-50% (например) от факта продаж сводит на нет всю адекватность системы установления цены соразмерно ожидаемому спросу. Если систематически ошибаться в предсказании и достаточно сильно, то какой смысл в таких рекомендациях? Поэтому, я не говорю, что само по себе значение 0.4 плохо, я говорю лишь о том, что оно не достаточно.

        Так, может, вам надо было MAPE мерять, а не R^2? Объясните мне, как вы по значению R^2_adj=0.4 сделали вывод о качестве предсказания, если оно практически не интерпретируемо? И даже по MAPE как бы вы делали вывод, если вы не задали себе нужные значения метрик?
        Не знаю, с чего вы это взяли, графики построены, включая всю историю для визуального восприятия информации. Обучение происходило на тренировочной части, затем обученная модель предсказывала спрос на тестовой выборке. После этого обучения никакого не происходило.
        По нескольким строчкам кода судить о чем то не совсем корректно (вы же не знаете что там в неопубликованной части кода).

        Я и не говорил про обучение на тестовой части. Я говорил про тюнинг гиперпараметров, который вы, очевидно, делали на тестовой части, потому что отдельной валидационной у вас просто не было. Простите, что кидаю ссылки на видео из курсов по ML, но объяснять самому у меня плохо получается.

        Первое:
        (Цена исследуемого товара / литры в упаковке этого товара) / (Цена «CERESIT СТ 17» / 10 литров)
        Второе:
        Цена исследуемого товара / цена грунтовки «CERESIT СТ 17»

        Эти два фактора несут разную информацию, потому что в исследуемом товаре 5л, а в «CERESIT СТ 17» – 10 литров

        Занимательная арифметика.
        x — цена товара
        y — цена CERESIT
        f1 = x / y
        f2 = (x/5) / (y/10) = x*2 / y
        f2 = 2*f1
        Если вычисления выше верны, то эта фича добавляет ноль новой информации в модель.


  1. Mentalitet Автор
    29.08.2018 21:55

    Опять таки, суть замечания была не в этом. Вы говорите о предсказании с большим шагом (например, недельные предсказания, которые вы делали во второй части), а я говорю о предсказании на несколько шагов, которое, опять таки, как раз и нужно ретейлерам. В вашем же примере, если у товара срок годности 5 дней, то вам нужен не прогноз на день вперёд или на неделю вперёд, а, вероятнее всего, daily prediction примерно на пять дней.


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

    Так, может, вам надо было MAPE мерять, а не R^2? Объясните мне, как вы по значению R^2_adj=0.4 сделали вывод о качестве предсказания, если оно практически не интерпретируемо? И даже по MAPE как бы вы делали вывод, если вы не задали себе нужные значения метрик?

    image
    image
    У одной модели R2adj 0,41, у другой 0,77
    Угадайте, где какая и на основе какой стоит пытаться рекомендовать цену, а на основе которой нет. В моем понимании задача рекомендации цены требует прогноз на спрос высокой точности, от сюда и выбор наиболее качественной модели. При этом выбор R2adj я уже описывал, в данном случае мне было важнее донести идею, а не сделать все кристально чисто с точки зрения теории.

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

    Я и не говорил про обучение на тестовой части. Я говорил про тюнинг гиперпараметров, который вы, очевидно, делали на тестовой части, потому что отдельной валидационной у вас просто не было. Простите, что кидаю ссылки на видео из курсов по ML, но объяснять самому у меня плохо получается.

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

    Вы путаете data leakage и overfitting.

    Не путаю, добавил просто из-за того, что не совсем был уверен, что вы имели ввиду в своем комментарии. Но теперь мы с этим разобрались

    То, что у вас модель хорошо работает на трейне и отвратительно в продакшене — это симптом оверфита по определению.

    Не спорю, однако, это не единственный возможный вариант.
    1) Про валидацию уже написал.
    2) Основное — выкладка. Лично видел как продажи на калоши выросли одномоментно в 10 раз, потому что выкладку товара поменяли. Такое в модель не заложишь, как минимум, потому что никто изменения выкладки вообще никак не фиксировал в данных, хотя, уверен, это сильно бы помогло.