Maskinlæring · prognoser og lageroptimalisering · dagligvarehandel
Etterspørselen bak den tomme hyllen
Når en ferskvare blir utsolgt, slutter salget å fortelle sannheten. Vi estimerer etterspørselen bak den tomme hyllen, med et intervall, og gjør den om til morgendagens bestilling.
Oversikt
FreshRetailNet-50K er et åpent datasett med salg av ferskvarer: 50 000 produktserier fra 898 butikker, med salg per time og et flagg per time for om produktet var på lager. I dataene er produktet utsolgt i 19,7 % av salgstimene, og 44 % av produktdagene blir utsolgt minst én gang. I de timene registrerer dataene nesten ikke noe salg. En prognose trent på registrert salg behandler derfor en tom hylle som en rolig time, og prognosene blir for lave.
Vi estimerer etterspørselen som skjules av hver utsolgtsituasjon, som et tall med et intervall på 80 %. Modellen lærer bare fra timer der vi kjenner svaret. Vi tar en dag der varen var på lager hele dagen, kopierer inn utsolgtmønsteret fra en virkelig utsolgt dag, skjuler de timene og lærer å rekonstruere dem. Den bruker resten av dagen, produktets egen historikk, rabatten, kalenderen, været og kategorien. I 167 butikker den aldri hadde sett, inneholdt intervallet den sanne verdien i 80,0 % av tilfellene. Vår første versjon traff bare i 71 % av tilfellene på dager som faktisk ble utsolgt, fordi de dagene har mer trafikk enn timene med varer på hyllen tilsier. Trening på timene med varer på lager fra utsolgte dager brakte den testen tilbake til 79,5 %. Begge testene skjuler timer der vi faktisk observerte salget. Etterspørsel etter at varen er utsolgt, kan aldri observeres, så intervallet for den hviler på én antakelse: at den oppfører seg som timene vi kan teste. Over hele datasettet legger det sentrale estimatet vårt 17 % til det registrerte salget.
Deretter gjør probabilistiske prognoser den rekonstruerte etterspørselen om til bestillinger. Vi testet dem på datasettets tilbakeholdte testuke. En påfyllingsregel bestiller så hver kveld opp til en prognosekvantil, minus lageret som fortsatt kan selges. Lageret eldes etter først inn, først ut, og holdbarheten er en antakelse på 1, 2 eller 3 dager som du selv velger. En simulert gjennomspilling av testuken viser svinnet og det tapte salget sammenlignet med bestilling ut fra registrert salg. I den gjennomspillingen koster et tapt salg dobbelt så mye som en kassert enhet, og etterspørselen inkluderer estimatet vårt. Bestilling ut fra estimatet vårt reduserte da den samlede kostnaden for svinn og tapt salg med 4,6 %, 5,6 % og 10,9 % ved en holdbarhet på 1, 2 og 3 dager. Hvis utsolgtsituasjonene ikke hadde skjult noen etterspørsel i det hele tatt, ville de to bestillingsreglene havnet innenfor 1,3 % av hverandre. Gevinsten avhenger også av at tapt salg koster mer enn svinn. Hvis et tapt salg koster det samme som en kassert enhet eller mindre, og utsolgtsituasjonene ikke skjulte noen etterspørsel, koster bestilling ut fra estimatet vårt 1 til 5 % mer. Ved en kostnad på 1 for tapt salg krymper tallet for 3 dager fra -10,9 % til -0,2 %. Ved 2 eller 3 dagers holdbarhet bestiller begge reglene på toppen av prognoseområdet vårt (P95), så de to tallene er de mest usikre. Salget er oppgitt i datasettets egne skalerte enheter. Hvert rekonstruert tall er vårt estimat, aldri en observasjon. Hyllen i filmen er en 3D-gjengivelse som spiller av dagen til ett produkt fra dataene.
Hva vi bygde
- Rekonstruksjon av sensurert etterspørsel. LightGBM-kvantilmodeller fra P10 til P90, trent ved å skjule timer der varen var på lager. De er kalibrert med split-conformal-kontroller på separate butikker og validert på 167 butikker holdt utenfor. En av disse kontrollene bruker bare virkelige utsolgte dager.
- Probabilistiske prognoser for testuken, laget én dag i forveien. De er trent på registrert salg og på rekonstruert etterspørsel, og vurdert med CRPS, pinball loss, WAPE og skjevhet mot enkle referansemodeller.
- En påfyllingsregel opp til et nivå, som følger varenes alder. Den selger etter først inn, først ut over en antatt holdbarhet på 1 til 3 dager. Bestillingskvantilen justeres på to uker med tilbaketesting for hvert kostnadsforhold, og fryses deretter for testuken.
- En simulert gjennomspilling som starter fra en tom hylle. Den avgrenser resultatet fra to sider: én gang med etterspørsel som inkluderer estimatet vårt, og én gang med bare registrert salg.
- En interaktiv gjennomspilling av 2 000 serier, alle fra butikker holdt utenfor. I nettleseren din kan du velge butikk og produkt, vise registrert eller estimert etterspørsel, flytte kostnaden for et tapt salg mot en kassert enhet og endre holdbarheten. Bestillingsregelen justeres og spilles av på nytt live.
Teknologistakk
Python, pandas, NumPy, LightGBM (kvantilregresjon), split-conformal-kalibrering · three.js (fysisk basert rendering, akkumulert dybdeskarphet og myke skygger) · ren JavaScript for optimeringen i nettleseren
Tall
Alle tall kommer fra våre egne kjøringer på FreshRetailNet-50K (Dingdong-Inc, CC BY 4.0). Salget er oppgitt i datasettets skalerte enheter.
| Tall | Slik målte vi det |
|---|---|
| 19,7 % av salgstimene utsolgt | Lagerflagg per time, 06:00–22:00, over alle 50 000 serier og 97 dager. I 44,0 % av produktdagene ble produktet utsolgt minst én gang. I 4,0 % var det utsolgt hele dagen. |
| 80,0 % intervalldekning (mål 80 %) | 444 393 produktdager fra 167 butikker holdt utenfor. Et virkelig utsolgtmønster ble kopiert inn i timer med varer på lager, de timene ble skjult, og vi kontrollerte om den sanne summen falt innenfor P10–P90-intervallet vårt. |
| 79,5 % dekning på virkelig utsolgte dager | 222 549 dager holdt utenfor som ble utsolgt kl. 12:00 eller senere. Vi skjulte de 3 timene med varer på lager som slutter 2 timer før varen ble utsolgt. Uten trening på utsolgte dager var dekningen 71,4 %, og estimatet lå 39 % for lavt. |
| 40 % feil på skjulte timer (WAPE for P50) | De samme 444 393 dagene. Å bruke de samme timene fra nylige dager med varer på lager gir 49 % feil. Å skalere timene med varer på hyllen med det vanlige timemønsteret gir 60 %. |
| +17 % etterspørsel skjult av utsolgtsituasjoner | Summen av P50-estimatene våre over alle 2,1 millioner produktdager med en utsolgtsituasjon, sammenlignet med samlet registrert salg. En sum av medianer underestimerer totalen. Summerer man i stedet P10- og P90-delene per dag, blir det 8 % og 30 %. |
| 2,4 % lavere CRPS i testuken | Prognose trent på rekonstruert etterspørsel mot samme modell trent på registrert salg: 0,192 mot 0,197 (skalert CRPS, lavere er bedre). Vurdert på de 206 562 produktdagene i testuken der varen var på lager hele dagen, slik at registrert salg er lik etterspørselen. En referansemodell med empiriske kvantiler over 28 dager får 0,240. |
| 42 % mot 56 % for lave prognoser på utsolgte dager | Andelen utsolgte dager i testuken der prognosemedianen ligger under salget som faktisk ble registrert, som er et gulv for dagens etterspørsel. Prognose ut fra rekonstruert etterspørsel mot prognose ut fra registrert salg. Denne kontrollen belønner høye prognoser, så les den sammen med skjevheten på dager med varer på lager: +3,1 % mot -6,4 %. |
| -4,6 % / -5,6 % / -10,9 % kostnad i gjennomspillingen ved holdbarhet på 1 / 2 / 3 dager | Kostnad = (2 × tapt salg + kasserte enheter) per enhet etterspørsel, over testuken for alle 50 000 serier, med start fra en tom hylle. Etterspørsel i gjennomspillingen = registrert salg pluss P50-estimatet vårt for timene med utsolgt. Vi sammenligner bestilling ut fra estimatet vårt med bestilling ut fra registrert salg. Bestillingskvantilen for hver regel ble justert på de to ukene før. Trekkes den skjulte etterspørselen i stedet fra intervallet vårt (200 trekninger), blir det -4,0 % / -7,2 % / -12,6 %. |
| Innenfor 1,3 % hvis ingenting var skjult | Samme gjennomspilling med registrert salg som eneste etterspørsel: +1,3 % / -0,3 % / +0,8 %. |
| -5 % til +5 % ved en kostnad for tapt salg på 0,5 til 1 kassert enhet | Samme gjennomspilling, andre kostnadsforhold. Med estimatet vårt som etterspørsel: -5,5 % til -0,2 %. Med bare registrert salg: +0,8 % til +5,4 %, så bestilling ut fra estimatet vårt koster mer når ingenting var skjult og tapt salg er billig. Ved holdbarhet på 2 og 3 dager ligger begge de justerte reglene i P95-taket for prognoseområdet vårt. |
| 20,4 % mot 23,0 % svinn ved 1 dags holdbarhet | Gjennomspilling som over. Bestilling ut fra estimatet vårt gir 20,4 % av etterspørselen i svinn og 7,2 % i tapt salg. Bestilling ut fra registrert salg gir 23,0 % svinn og 6,7 % tapt salg. Å bestille gårsdagens salg ganger en justert faktor koster 0,600 per enhet etterspørsel, mot 0,347 for vår regel. |
| 42 ms for å justere og spille av på nytt i nettleseren | Median av 10 kjøringer i headless Chromium på vår bærbare M1 Pro. Hver kjøring justerer 37 bestillingskvantiler × 2 regler på 14 dager med tilbaketesting, og spiller deretter av uken på 7 dager, over 2 000 serier. Telefoner vil være tregere. |
Stillbilder
Prøv det live
En interaktiv visning som kjører i nettleseren din. Ingenting lastes før du åpner den.