Машинне навчання · прогнозування й оптимізація запасів · продуктовий роздріб
Попит за порожньою полицею
Коли свіжий товар розпродано, продажі перестають казати правду. Ми оцінюємо попит за порожньою полицею — з інтервалом — і перетворюємо його на завтрашнє замовлення.
Огляд
FreshRetailNet-50K — відкритий набір даних про продажі свіжих продуктів: 50 000 часових рядів товарів із 898 магазинів, з погодинними продажами й погодинною ознакою того, чи був товар у наявності. У цих даних у 19,7 % торгових годин товару немає в наявності, а в 44 % товаро-днів товар закінчується принаймні раз. У ці години дані майже не фіксують продажів. Тож прогноз, навчений на зафіксованих продажах, сприймає порожню полицю як спокійну годину, і його прогнози виходять заниженими.
Ми оцінюємо попит, прихований кожним вичерпанням запасу, — як число з інтервалом 80 %. Модель навчається лише на годинах, для яких ми знаємо відповідь. Ми беремо день, коли товар весь час був у наявності, переносимо на нього схему вичерпання запасу з реального дня, коли товар закінчився, приховуємо ці години й навчаємося їх відновлювати. Модель використовує решту того самого дня, власну історію товару, знижку, календар, погоду й категорію. На 167 магазинах, яких вона ніколи не бачила, інтервал містив справжнє значення у 80,0 % випадків. Наша перша версія в дні, коли товар справді закінчився, містила його лише в 71 % випадків, бо в ці дні попит вищий, ніж можна судити з годин наявності. Навчання на годинах наявності в дні з вичерпанням запасу повернуло цей показник до 79,5 %. В обох тестах приховано години, продажі в які ми справді спостерігали. Попит після того, як товар закінчився, спостерегти неможливо, тож його інтервал спирається на одне припущення: що він поводиться так само, як години, які ми можемо перевірити. По всьому набору даних наша центральна оцінка додає 17 % до зафіксованих продажів.
Далі ймовірнісні прогнози перетворюють відновлений попит на замовлення. Ми перевірили їх на відкладеному тижні набору даних. Потім політика поповнення щовечора замовляє до рівня квантиля прогнозу за вирахуванням запасу, який ще можна продати. Запас старіє за принципом FIFO, а його термін придатності — це припущення: 1, 2 або 3 дні, які задаєте ви. Змодельоване відтворення відкладеного тижня показує списання й втрачені продажі поруч із замовленням за зафіксованими продажами. У цьому відтворенні втрачений продаж коштує вдвічі більше за списану одиницю, а попит включає нашу оцінку. Тоді замовлення за нашою оцінкою зменшило сукупні витрати на списання й втрачені продажі на 4,6 %, 5,6 % і 10,9 % для терміну придатності 1, 2 і 3 дні. Якби вичерпання запасу не приховувало жодного попиту, дві політики відрізнялися б не більш ніж на 1,3 %. Виграш також залежить від того, що втрачені продажі коштують більше за списання. Якщо втрачений продаж коштує стільки ж, скільки списана одиниця, або менше, а вичерпання запасу не приховувало попиту, замовлення за нашою оцінкою обходиться на 1–5 % дорожче. За вартості втраченого продажу 1 показник для 3 днів зменшується з −10,9 % до −0,2 %. За терміну придатності 2 або 3 дні обидві політики замовляють на верхній межі нашого діапазону прогнозу (P95), тож ці два показники найменш надійні. Продажі наведено у власних масштабованих одиницях набору даних. Кожне відновлене число — це наша оцінка, а не спостереження. Полиця у фільмі — це 3D-рендер, що відтворює один день одного товару з даних.
Що ми створили
- Відновлення цензурованого попиту. Квантильні моделі LightGBM від P10 до P90, навчені на прихованих годинах, коли товар був у наявності. Їх відкалібровано перевірками split-conformal на окремих магазинах і валідовано на 167 відкладених магазинах. Одна з цих перевірок використовує лише реальні дні з вичерпанням запасу.
- Ймовірнісні прогнози на відкладений тиждень, зроблені на день уперед. Їх навчено на зафіксованих продажах і на відновленому попиті та оцінено за CRPS, pinball loss, WAPE і зміщенням порівняно з простими базовими моделями.
- Політика поповнення до рівня з урахуванням старіння запасу. Вона продає за принципом FIFO за прийнятого терміну придатності від 1 до 3 днів. Квантиль замовлення налаштовується на двох тижнях бектесту для кожного співвідношення витрат, а потім фіксується для відкладеного тижня.
- Змодельоване відтворення, що починається з порожньої полиці. Воно оцінює результат із двох боків: один раз із попитом, що включає нашу оцінку, і один раз лише із зафіксованими продажами.
- Інтерактивне відтворення 2 000 рядів, усі з відкладених магазинів. У вашому браузері можна вибрати магазин і товар, показати зафіксований або оцінений попит, змінювати вартість втраченого продажу відносно списаної одиниці й термін придатності. Політику повторно налаштовують і відтворюють наживо.
Стек технологій
Python, pandas, NumPy, LightGBM (квантильна регресія), калібрування split-conformal · three.js (фізично коректний рендеринг, накопичувана глибина різкості й м’які тіні) · чистий JavaScript для оптимізатора в браузері
Цифри
Усі числа отримано в наших власних запусках на FreshRetailNet-50K (Dingdong-Inc, CC BY 4.0). Продажі наведено в масштабованих одиницях набору даних.
| Показник | Як ми це виміряли |
|---|---|
| 19,7 % торгових годин без товару в наявності | Погодинні ознаки наявності, 06:00–22:00, по всіх 50 000 рядах і 97 днях. У 44,0 % товаро-днів товар закінчувався принаймні раз. У 4,0 % його не було весь день. |
| 80,0 % покриття інтервалу (ціль 80 %) | 444 393 товаро-дні зі 167 відкладених магазинів. Реальну схему вичерпання запасу перенесли на години наявності, ці години приховали й перевірили, чи потрапляє справжня сума в наш інтервал P10–P90. |
| 79,5 % покриття на реальних днях із вичерпанням запасу | 222 549 відкладених днів, коли товар закінчився о 12:00 або пізніше. Ми приховали 3 години наявності, що закінчуються за 2 години до вичерпання запасу. Без навчання на днях із вичерпанням запасу покриття становило 71,4 %, а оцінка була на 39 % заниженою. |
| 40 % похибки на прихованих годинах (WAPE для P50) | Ті самі 444 393 дні. Ті самі години в недавні дні з наявністю дають 49 % похибки. Масштабування годин наявності за звичайним погодинним профілем дає 60 %. |
| +17 % попиту, прихованого вичерпанням запасу | Сума наших оцінок P50 по всіх 2,1 мільйона товаро-днів із вичерпанням запасу порівняно із сумою зафіксованих продажів. Сума медіан занижує загальний обсяг. Якщо натомість підсумувати поденні значення P10 і P90, виходить 8 % і 30 %. |
| На 2,4 % нижчий CRPS на відкладеному тижні | Прогноз, навчений на відновленому попиті, проти тієї самої моделі, навченої на зафіксованих продажах: 0,192 проти 0,197 (масштабований CRPS, менше — краще). Оцінено на 206 562 відкладених товаро-днях, коли товар залишався в наявності й зафіксовані продажі дорівнюють попиту. Базова модель на емпіричних квантилях за 28 днів дає 0,240. |
| 42 % проти 56 % занижених прогнозів у дні з вичерпанням запасу | Частка відкладених днів із вичерпанням запасу, коли медіана прогнозу нижча за фактично зафіксовані продажі, які є нижньою межею попиту того дня. Прогноз на відновленому попиті проти прогнозу на зафіксованих продажах. Ця перевірка винагороджує завищені прогнози, тож читайте її разом зі зміщенням у дні з наявністю: +3,1 % проти −6,4 %. |
| −4,6 % / −5,6 % / −10,9 % витрат у відтворенні за терміну придатності 1 / 2 / 3 дні | Витрати = (2 × втрачені продажі + списані одиниці) на одиницю попиту, за відкладений тиждень для всіх 50 000 рядів, починаючи з порожньої полиці. Попит у відтворенні = зафіксовані продажі плюс наша оцінка P50 для годин вичерпання запасу. Ми порівнюємо замовлення за нашою оцінкою із замовленням за зафіксованими продажами. Квантиль замовлення кожної політики налаштовано на двох попередніх тижнях. Якщо натомість брати прихований попит випадково з нашого інтервалу (200 вибірок), виходить −4,0 % / −7,2 % / −12,6 %. |
| У межах 1,3 %, якщо нічого не було приховано | Те саме відтворення, де попит — лише зафіксовані продажі: +1,3 % / −0,3 % / +0,8 %. |
| Від −5 % до +5 % за вартості втраченого продажу від 0,5 до 1 списаної одиниці | Те саме відтворення, інші співвідношення витрат. З нашою оцінкою як попитом: від −5,5 % до −0,2 %. Лише із зафіксованими продажами: від +0,8 % до +5,4 %, тож замовлення за нашою оцінкою обходиться дорожче, коли нічого не було приховано, а втрачені продажі дешеві. За терміну придатності 2 і 3 дні обидві налаштовані політики впираються в стелю P95 нашого діапазону прогнозу. |
| 20,4 % проти 23,0 % списання за терміну придатності 1 день | Відтворення, як вище. Замовлення за нашою оцінкою списує 20,4 % попиту й втрачає 7,2 %. Замовлення за зафіксованими продажами списує 23,0 % і втрачає 6,7 %. Замовлення вчорашніх продажів, помножених на налаштований коефіцієнт, коштує 0,600 на одиницю попиту проти 0,347 для нашого. |
| 42 ms на повторне налаштування й відтворення в браузері | Медіана 10 запусків у headless Chromium на нашому ноутбуці з M1 Pro. Кожен запуск налаштовує 37 квантилів замовлення × 2 політики на 14 днях бектесту, а потім відтворює 7-денний тиждень для 2 000 рядів. На телефонах буде повільніше. |
Кадри
Спробуйте наживо
Інтерактивна візуалізація, що працює у вашому браузері. Нічого не завантажується, доки ви її не відкриєте.