Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Сделал я это в расчете на то, что XGBoost поможет мне отбросить множество ненужных факторов (это происходит автоматически), и уже оставшиеся использовать для LSTM модели.
Наилучший результат, которого я смог добиться, используя greed search выглядит следующим образом
Итоговые результаты поубавили мою веру в успех, потому что результат R^2-adj 0.4 означал только то, что система предсказания не сможет предсказывать спрос на следующий день достаточно хорошо, а рекомендация на цену будет мало отличаться от системы «пальцем в небо».
После этого я, уже традиционно, использовал XGBoost, чтобы отсечь прочие не значимые факторы. В последствии я дополнительно отсек еще несколько факторов, на основе LSTM модели, просто поочередно исключая факторы, обучая модель заново и сравнивая результаты.
- Соотношение цены за килограмм исследуемого товара и грунтовки CERESIT СТ 17 10 л.;
- Соотношение цены исследуемого товара и товара и грунтовки CERESIT СТ 17 10 л;
Итоговая LSTM модель была написана с использованием Keras, включала в себя 2 скрытых слоя (25 и 20 нейронов соответственно), и активатор – сигмоиду.
В итоге мы получаем двоякую картину: совершенно не реалистичные предсказания по объему продаж, но, при этом, сугубо положительные результаты по экономическим показателям (как по прибыли, так и выручке).
Главная проблема этой работы в том, что когда вы создавали модель, вы работали с одним конкретным рядом. Затюнить модель так, чтобы она более-менее хорошо предсказывала спрос на один товар, можно. Но на практике ретейлеру обычно нужно предсказывать спрос сразу на все товары, а вот тут сложные модели типа бустингов и сетей становится куда сложнее настраивать, а также появляется необходимость в более сложном feature engineering (например, нельзя сделать dummy-переменные под конкретные акции, потому что у каждого товара может быть свой набор скидок в разные моменты времени, которые комбинируются произвольным образом, и приходится из этих данных строить какие-то новые, более общие фичи). Кроме того, редко ретейлеру реально нужно предсказывать спрос на день вперёд для менеджмента закупок, да и для оптимизации цен это, наверное, не вполне корректно. Поэтому я, честно говоря, сомневаюсь в том, насколько построенная модель способна принести пользу заказчику в реальной жизни (помимо того, что она в целом демонстрирует практическую жизнеспособность работы с price elasticity с помощью ML-алгоритмов).
Почему вы считаете, что так корректно делать? Деревянные модели работают с признаками совсем не так, как сети. Фичи, которые бустингу показались полезными, могут не взлететь в сети, и наоборот. И уж точно фичи, подаваемые на вход бустингу, надо обрабатывать совсем не так, как фичи, подаваемые на вход сети.
Вообще-то нет, такое значение нельзя интерпретировать подобным образом для временного ряда, и, пожалуй, вообще нельзя говорить, хороший это показатель или плохой, не сравнив с хотя бы какими-то примитивными бейзлайновыми моделями.
Если вы делали это, валидируясь на той же части датасета, которую вы называете тестовой (а судя по графикам и коду, вы это делали), поздравляю — вы оверфитнулись.
• Соотношение цены за килограмм исследуемого товара и грунтовки CERESIT СТ 17 10 л.;
• Соотношение цены исследуемого товара и товара и грунтовки CERESIT СТ 17 10 л;
Разве вторая фича не получается из первой линейным преобразованием?
С одной стороны, сигмоида на конце — это удобно. С другой стороны, таким образом вы практически лишаете модель возможности экстраполировать, что довольно важно для построения кривой эластичности, не так ли?
Позволю себе не согласиться. Если сравнить даже 2016 и 2015 годы, можно увидеть огромный естественный прирост (очевидно, связанный с тем, что ретейлер работает в плюс и расширяется), так что ваш эксперимент абсолютно не показателен и, вполне вероятно, мог не принести повышения прибыли (во всяком случае, ваши данные этого не подтверждают).
Кроме того, то, насколько сильно ваша модель ошибалась в предсказаниях (намного сильнее, чем на тестовой части датасета), ещё раз свидетельствует о том, о чём я писал выше — настраивая параметры под тестовую часть, вы сильно заоверфитились.
В целом, вроде и хороший пример использования ML в бизнесе, но при этом недочётов столько, что результаты вызывают огромное сомнение.
На сколько показывает мой опыт, который также описан в статье, все ровно да наоборот:
Тяжело предсказывать спрос на отдельно взятый товар, гораздо легче на спрос по группе товаров или даже по сети в целом (в моем случае я описал предсказание дневного количества чеков по всей сети с высоким уровнем точности, данные можно посмотреть в статье).
Я пробовал предсказывать спрос как в штуках, так и по сумме продаж по группам товаров и все выходило гораздо лучше, чем по индивидуальному товару, как на уровне дней, так и на более продолжительных масштабах времени (дальше месяца не смотрел потому что данных мало).
Потому что предсказание +-50% (например) от факта продаж сводит на нет всю адекватность системы установления цены соразмерно ожидаемому спросу. Если систематически ошибаться в предсказании и достаточно сильно, то какой смысл в таких рекомендациях? Поэтому, я не говорю, что само по себе значение 0.4 плохо, я говорю лишь о том, что оно не достаточно.
Не знаю, с чего вы это взяли, графики построены, включая всю историю для визуального восприятия информации. Обучение происходило на тренировочной части, затем обученная модель предсказывала спрос на тестовой выборке. После этого обучения никакого не происходило.
По нескольким строчкам кода судить о чем то не совсем корректно (вы же не знаете что там в неопубликованной части кода).
Первое:
(Цена исследуемого товара / литры в упаковке этого товара) / (Цена «CERESIT СТ 17» / 10 литров)
Второе:
Цена исследуемого товара / цена грунтовки «CERESIT СТ 17»
Эти два фактора несут разную информацию, потому что в исследуемом товаре 5л, а в «CERESIT СТ 17» – 10 литров
Возможно метод был действительно экстравагантен, однако, на тот момент, когда я использовал грубое отсечение факторов таким вот образом, мне было необходимо понять, какие товары-соседы из группы вообще стоит учитывать, а какие нет (их было много и очень много, поэтому один плюс, другой минус, не меняло бы картины в целом, поскольку по факту внутри группы очень мало продаж товаров было коррелировано – это я смотрел, но это не вошло в статью).
Какой именно прирост вы увидели (в деньгах, в штуках?)
Насчет промаха в предсказании спроса: про оверфит я уже ответил, что ни заглядывания в будущее, ни обучения на тестовой выборке не было.
Опять таки, суть замечания была не в этом. Вы говорите о предсказании с большим шагом (например, недельные предсказания, которые вы делали во второй части), а я говорю о предсказании на несколько шагов, которое, опять таки, как раз и нужно ретейлерам. В вашем же примере, если у товара срок годности 5 дней, то вам нужен не прогноз на день вперёд или на неделю вперёд, а, вероятнее всего, daily prediction примерно на пять дней.
Так, может, вам надо было MAPE мерять, а не R^2? Объясните мне, как вы по значению R^2_adj=0.4 сделали вывод о качестве предсказания, если оно практически не интерпретируемо? И даже по MAPE как бы вы делали вывод, если вы не задали себе нужные значения метрик?


Я и не говорил про обучение на тестовой части. Я говорил про тюнинг гиперпараметров, который вы, очевидно, делали на тестовой части, потому что отдельной валидационной у вас просто не было. Простите, что кидаю ссылки на видео из курсов по ML, но объяснять самому у меня плохо получается.
Вы путаете data leakage и overfitting.
То, что у вас модель хорошо работает на трейне и отвратительно в продакшене — это симптом оверфита по определению.
Динамическое ценообразование на основе LSTM — ANN в ретейле товаров для дома