Predikce zásob pomocí AI

9. Predikce krátkých položek

Shrnutí

V předchozím díle jsem poprvé trénoval model na celém sortimentu – tedy nejen na položkách s plnou 36měsíční historií, ale i na těch, které mají jen několik málo měsíců dat, případně žádnou historii.

  • pouze položky s plnou historií
  • položky s alespoň jedním měsícem historie 
  • celý dataset včetně položek bez jakékoli minulosti

Varianta min. 1 měsíc historie přinesla nejvyšší stabilitu – model dokázal využít co nejvíc dat, aniž by se učil na „prázdných“ řádcích. Při detailní validaci se ale ukázalo, že největší slabinou zůstávají položky s méně než 6 měsíci historie.

  • Položky s alespoň 6 měsíci historie model zvládá relativně spolehlivě.
  • Pod touto hranicí, a zejména u zcela nových SKU, chyby prudce rostou.
  • Nejčastější problém: model netrefí ani základní scale – neví, jestli predikovat 10, 100 nebo 1000 kusů.

Feature engineering III - Skupinové features

V pátém díle jsem ukázal, jak dodatečné features promění syrová čísla v „mapu“, ve které se neurální síť zorientuje a předpoví poptávku s užitečnou přesností. Tentokrát ale cílím na položky s krátkou historií, teré v sobě nemají dost informací, aby je model dokázal sám dobře odhadnout.

Co je cílem?

  • Najít podobné položky – sdílejí stejný druh, sezónnost, promo-chování.
  • Využít embeddingy skupin – každý segment dostane svůj vektor, který zachycuje podobnost poptávky.
  • Spočítat skupinové průměry – pokud položka nemá vlastní historii, model použije průměry z její skupiny.
  • Přidat tyto hodnoty jako nové features – síť se učí, že může „přelít“ informaci z bohatých sérií do chudých.

 

Proč to funguje:

  • Nový produkt z kategorie „nářadí“ okamžitě těží z historie „elektro-příslušenství“, pokud mají dlouhodobě podobný tvar poptávky.
  • Model lépe rozezná jednorázové špičky od běžného sezónního vzoru.
  • Krátké série přestávají padat k nule, aniž by to poškodilo predikce položek s dlouhou historií.

Nové Group-features

Stejné typy features, které jsem poprvé použil na individuální obrat, jsem teď aplikoval na úrovni skupin:

  • Relativní (poměrové) features – porovnání položky vůči průměru skupiny.
  • Lag & Rolling okna – zpožděné hodnoty a průměry pro zachycení trendu.
  • Wavelet signály – zachycení periodických vzorů.
  • Trendové ukazatele – sklon a směr vývoje obratu.
  • Absolutní i log-transformované hodnoty – pro lepší škálování napříč objemy.


Pro každou položku navíc počítám
poměrové log-features, které dávají modelu jemnější měřítko, o kolik se konkrétní položka liší od své skupiny – což je přesně ten chybějící signál u produktů s krátkou historií.

Výsledky podle délky historie

Opět jsem pro detailnější pohled validaci rozdělil do pěti částí podle délky historie. Validace běžela na modelu trénovaném na položkách s minimálně jedním měsícem historie + přidanými group features.

MetrikaCelá historie36 měsíců12-35 měsíců
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE32.404555.296930.305640.970335.653341.0825
RMSE39.906220.702441.442121.161125.448214.6151
0.87450.88620.7558
MAPE60.659955.21662.2879
ROBUST0.507169.69460.507855.82210.56761.2863
STABLE0.39690.36950.4645
Metrika6-12 měsíců1-6 měsícůbez historie
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE43.643758.813553.867959.459495.8109522.2663
RMSE22.938615.958348.472433.335944.672327.5461
0.75510.647-0.0372
MAPE63.481173.2619373.445
ROBUST0.503864.56020.562875.33690.3612550.8374
STABLE0.45370.45941.0963
  • Plná historie (36 měsíců): Metriky prakticky beze změny, group features modelu neuškodily.
  • Středně dlouhé série (12–35 měsíců): Výsledky zůstávají srovnatelné s baseline, žádný pokles výkonu.
  • Krátké série (≤ 6 měsíců): Viditelné zlepšení R² i MAPE, model se lépe trefuje do velikosti obratu.
  • Žádná historie (0 měsíců): Zlepšení z absolutní katastrofy na „stále nepoužitelné“, ale je vidět, že model už dokáže odhadnout tvar křivky z embeddings a skupinového kontextu.

Syntetická data – kdy je (ne)vpustit do modelu

Krátké a nulové historie jsou pro predikci největší problém – model často netrefí ani základní měřítko (scale). Aby tyto položky dostaly alespoň náznak „minulosti“, nahradil jsem chybějící obrat syntetickými hodnotami. Tyto hodnoty vznikají jako vážený průměr prodejů podobných položek, přičemž:

  • Váhy podobnosti jsou odvozené z embeddingů napříč kombinací skupin (druh × sezóna × …).
  • Na rozdíl od feature-engineering přístupu, kde se vytváří více samostatných hodnot pro různé skupiny, zde vzniká jen jedna výsledná hodnota pro daný časový bod.


Další otázku, kterou jsem řešil, kdy syntetiku použít:

VariantaVýhodyNevýhody
1️⃣ Syntetika už v tréninku• Model se hned učí scale novinky → menší sklouzávání k nule.• Učí se na hodnotách, které nikdy neexistovaly → hrozí šum.
• Více „plných“ řad = lepší stabilita• Připravené vzory mohou přežít i poté, co reálný prodej začne vypadat jinak (přeučení na syntetiku).
• Menší riziko šumu způsobených prázdnými položkami
2️⃣ Syntetika až při validaci• Trénink zůstává „čistý“, bez rizika šumu.• Model nevidí tyto vzory při učení → může syntetiku ignorovat nebo špatně škálovat.
• Snadno otestuju, co syntetika skutečně přináší.• Možnost zmatení modelu (proč předtím byli nuly a teď ne)
• Kdykoli lze syntetická pravidla vyměnit bez re-tréninku modelu.

Vyhodnocení jsem znovu rozdělil do pěti částí podle délky historie. Modely již obsahují rozšíření o group-features.

Varianta 1 – Syntetika už v tréninku
MetrikaCelá historie33 měsíců13-32 měsíců
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE32.186271.201930.007943.247143.569651.4367
RMSE39.814120.165641.792320.651837.020718.3537
0.87510.88430.7773
MAPE71.348862.889766.1173
ROBUST0.513687.46980.518264.07480.467365.5932
STABLE0.39730.36860.544
Metrika7-12 měsíců1-6 měsícůbez historie
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE66.81591721.728852.156955.7443109.8849788.7963
RMSE42.614922.113147.994832.827343.008731.3547
0.49990.61550.0386
MAPE271.815379.4936605.8361
ROBUST0.43461021.12670.477586.10180.4294853.5104
STABLE0.8040.63871.2805
  • Téměř všechny metriky se zhoršily, včetně položek s delší historií.
  • Model začal brát syntetické hodnoty stejně vážně jako reálná data → šum ze syntetiky přetlačil skutečné signály.
  • U položek bez historie došlo k mírnému zlepšení tvaru predikce, ale cena za to byla pokles výkonu u zbytku sortimentu.
Varianta 2 – Syntetika jen při validace
MetrikaCelá historie33 měsíců13-32 měsíců
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE32.4858.131930.318740.910340.653346.0825
RMSE40.080820.771139.442122.878441.448219.6151
0.87340.88640.7558
MAPE61.262653.18862.8778
ROBUST0.506872.69010.508352.81410.563960.4654
STABLE0.39770.36080.471
Metrika7-12 měsíců1-6 měsícůbez historie
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE42.868558.883656.096458.591118.9845885.2588
RMSE22.650915.702157.751136.316244.705834.277
0.75870.6433-368.2597
MAPE63.757667.9023632.3944
ROBUST0.502964.97120.552670.35210.3759937.0026
STABLE0.44610.48161.3776
  • Metriky se prakticky nelišily od výsledků s čistými group-features.
  • U položek bez historie došlo naopak k mírnému zhoršení skóre – syntetika při validaci model spíše zmátla, protože se s podobnými hodnotami v tréninku nesetkal.

Vizuální analýza

Po čistě číselném srovnání se nabízí otázka, zda má kombinace group-features a syntetických dat vůbec přidanou hodnotu, nebo jde jen o šum v rámci běžné stochastické odchylky? Odpověď na tuto otázku ukáže až vizuální analýza – a právě ta odhalila detaily, které v agregovaných metrikách snadno zaniknou.

Zobrazené modely:

  • 🔴 Červená – model pouze s položkovými (ID) features.
  • 🟢 Zelená – model s přidanými group features.
  • 🟣 Fialová – model s validací nad syntetickými daty (syntetika jen ve validaci).
  • 🟠 Oranžová – model s tréninkem i validací nad syntetickými daty.


Dlouhá historie prodeje položky

  • U položek s kompletní historií je vliv group-features minimální – model má dost informací z vlastních dat.
  • Přínos skupinových informací roste úměrně s tím, jak historie zkracuje – čím méně vlastních dat, tím víc rozhoduje znalost vzorů v rámci celé skupiny.

Krátká historie prodeje položky

  • Group-features (🟢 zelená) drží úroveň i trend výrazně blíže reálným prodejům než čistě ID-model (🔴 červená).
  • Syntetika jen ve validaci (🟣 fialová) má podobný přínos jako čisté group-features, ale občas škáluje méně přesně.
  • Trénink na syntetice (🟠 oranžová) častěji stahuje predikci zpět k průměru segmentu a tím potlačuje odchylky.

Bez historie prodeje položky

  • I zde group-features drží trend a scale mnohem lépe než červený model.
  • Bez nich model sklouzne k průměru celé skupiny, což u některých SKU znamená dramatické podstřelení nebo přestřelení.
  • Syntetika v tréninku sice dodá tvar křivky, ale ztrácí reálnou variabilitu – výsledky působí „vyhlazeně“ a méně reagují na potenciální výkyvy.
  • Celkově ale predikce položek bez historie zůstává nepoužitelná – bez jediného reálného prodejního bodu model nedokáže odhadnout správnou úroveň obratu.

Skupinové features mají největší přínos pro krátké historie, kde dokážou udržet trend i scale blízko realitě. Syntetická data v tréninku naopak často predikci „vyhladí“ a ztratí variabilitu. Bez reálného prodejního bodu ale zůstává predikce nepoužitelná – model nemá z čeho odvodit skutečný obrat.