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

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

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

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


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

Почему вы считаете, что так корректно делать? Деревянные модели работают с признаками совсем не так, как сети. Фичи, которые бустингу показались полезными, могут не взлететь в сети, и наоборот. И уж точно фичи, подаваемые на вход бустингу, надо обрабатывать совсем не так, как фичи, подаваемые на вход сети.

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

Наверное, всё же grid search.

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

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

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

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

  • Соотношение цены за килограмм исследуемого товара и грунтовки CERESIT СТ 17 10 л.;
  • Соотношение цены исследуемого товара и товара и грунтовки CERESIT СТ 17 10 л;


Разве вторая фича не получается из первой линейным преобразованием?

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

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

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

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

В целом, вроде и хороший пример использования ML в бизнесе, но при этом недочётов столько, что результаты вызывают огромное сомнение.
Постараюсь ответить на все обстоятельно:
Главная проблема этой работы в том, что когда вы создавали модель, вы работали с одним конкретным рядом. Затюнить модель так, чтобы она более-менее хорошо предсказывала спрос на один товар, можно. Но на практике ретейлеру обычно нужно предсказывать спрос сразу на все товары, а вот тут сложные модели типа бустингов и сетей становится куда сложнее настраивать, а также появляется необходимость в более сложном 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 в бизнесе, но при этом недочётов столько, что результаты вызывают огромное сомнение.


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

Вы неправильно поняли мой поинт. Вы говорите о предсказаниях для групп товаров, а я говорю о том, что предсказания нужны для каждого товара в отдельности, поскольку как 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
Если вычисления выше верны, то эта фича добавляет ноль новой информации в модель.


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

Дело в том, что это не экстравагантно, а не вполне корректно. Ещё раз повторю, что бустинг и LSTM — это модели абсолютно разной природы, и с фичами они работают по-разному. То же самое и с отбором фич по скоррелированности продаж, который вы упомянули: полагаться на корреляцию при отборе признаков для таких сложных моделей нельзя.
Гиперболизированный пример.
Ваша целевая переменная — y.
У вас есть признак
f1 = abs(y)
Корреляция околонулевая, а между тем f1 — идеальный предиктор y.


Какой именно прирост вы увидели (в деньгах, в штуках?)

В выручке и прибыли в сводной таблице, очевидно. У вас выручка в 2016 была на 28% больше, чем за год до этого, а в 2017 (с моделью) — на 13%.
А ведь именно выручка или прибыль в конечном итоге являлась для вас оптимизируемой бизнес-метрикой.

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

Вы путаете data leakage и overfitting. То, что у вас модель хорошо работает на трейне и отвратительно в продакшене — это симптом оверфита по определению.
Опять таки, суть замечания была не в этом. Вы говорите о предсказании с большим шагом (например, недельные предсказания, которые вы делали во второй части), а я говорю о предсказании на несколько шагов, которое, опять таки, как раз и нужно ретейлерам. В вашем же примере, если у товара срок годности 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 раз, потому что выкладку товара поменяли. Такое в модель не заложишь, как минимум, потому что никто изменения выкладки вообще никак не фиксировал в данных, хотя, уверен, это сильно бы помогло.

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

Публикации

Истории