Predikce zásob pomocí AI
10. Finální model
Finální test – celý dataset
Chvíle pravdy: Jak se model zachová, když ho pustíme na všech 15 000 položek? Nastavení modelu a dat (podle dosavadních zjištění):
- Feature engineering, 120 features (kombinace individuálního obratu a group-features)
- Redukce extrémů
- Sloučení řídkých kategorií
- Trénink jen na položkách s alespoň 1 měsícem historie
- Délka encoderu 18 měsíců
- Architektura TFT
- Validace: poslední 3 měsíce, které nebyly v tréninku
Pro závěrečný test jsem zvolil model s group features, ale bez syntetických dat. Tento setup se ukázal jako nejstabilnější napříč celým sortimentem, i když syntetika zůstává zajímavou možností pro budoucí projekty nebo specifické subsety zboží.
| Metrika | Celá historie | 33 měsíců | 13-32 měsíců | |||
|---|---|---|---|---|---|---|
| Hodnota (ALL) | Hodnota (Item) | Hodnota (ALL) | Hodnota (Item) | Hodnota (ALL) | Hodnota (Item) | |
| WAPE | 30.1022 | 49.7127 | 28.1069 | 41.6723 | 33.4304 | 40.1634 |
| RMSE | 45.907 | 22.3895 | 50.4051 | 23.9145 | 26.3204 | 17.0358 |
| R² | 0.9232 | 0.93 | 0.7245 | |||
| MAPE | 65.5438 | 57.332 | 60.9407 | |||
| ROBUST | 0.551 | 72.2735 | 0.5498 | 58.7128 | 0.5049 | 66.3819 |
| STABLE | 0.3884 | 0.3642 | 0.5422 | |||
| Metrika | 6-12 měsíců | 1-6 měsíců | bez historie | |||
|---|---|---|---|---|---|---|
| Hodnota (ALL) | Hodnota (Item) | Hodnota (ALL) | Hodnota (Item) | Hodnota (ALL) | Hodnota (Item) | |
| WAPE | 38.5444 | 45.8518 | 44.6778 | 47.1055 | 80.7317 | 220.7146 |
| RMSE | 26.6287 | 17.1458 | 43.1306 | 27.5178 | 95.9705 | 61.587 |
| R² | 0.7529 | 0.7451 | -0.1913 | |||
| MAPE | 64.676 | 79.1142 | 186.139 | |||
| ROBUST | 0.5233 | 66.5118 | 0.5441 | 89.7998 | 0.4013 | 250.967 |
| STABLE | 0.4801 | 0.4776 | 0.9196 | |||
Výsledky podle délky historie:
- Plná historie (36 měsíců) – WAPE kolem 30 % (ALL), vysoké R² (0,92+).
- Středně dlouhá historie (12–35 měsíců) – podobné výsledky jako u plné historie, jen lehký pokles R².
- Krátká historie (6–12 měsíců) – stále solidní predikce, WAPE kolem 38 %.
- Velmi krátká historie (1–6 měsíců) – vyšší chyby, ale přesto použitelná predikce pro orientační plánování.
- Bez historie – predikce zůstává nepoužitelná, model nemá jediný bod pro určení scale.
Ve srovnání s kapitolou #9 (test na částečném datasetu) jsou metriky prakticky totožné – model drží stabilitu i při trojnásobném objemu dat. Vidět je i mírné zlepšení u SKU s krátkou historií, hlavně díky většímu počtu kategorií v rámci skupin → bohatší data pro embeddingy → lepší přenos vzorů.
Vizualizace
Porovnávám predikce modelu z částečného datasetu (minulá kapitola) s novou predikcí nad plným datasetem.
- 🔴 Červená – predikce z modelu nad částečným datasetem.
- 🟢 Zelená – predikce z finálního modelu nad celým datasetem.
Největší vizuální rozdíly jsou patrné u SKU s krátkou historií – právě tam teď hrají skupinové informace výraznější roli. U delších historií se křivky překrývají téměř dokonale, což potvrzuje, že navýšení tréninkového datasetu na plný rozsah nepoškodilo výkon u zavedených položek.
Slevové akce
Model si na plném datasetu vede velmi dobře, proto jsem ještě ověřil, jak zvládá promo kampaně. V tréninkových datech dostává informaci kdy a jak dlouho bylo konkrétní zboží ve slevě. V rámci feature engineeringu navíc přidávám kontext:
- jak často mívá položka akci
- jak dlouho promo obvykle trvá
- jaký mělo v minulosti dopad na prodeje
Vizualizace ukazuje rozdíl v predikci když položka měla plánovanou slevu vs bez slevy.
- 🔴 Červená – bez plánovaných slev
- 🟢 Zelená – sleva na poslední 3 měsíce
- Kde historie potvrzuje úspěšnost slev, predikce prodeje roste.
- Kde kampaně v minulosti nefungovaly, křivka zůstává téměř beze změny (např. C511478).
To ukazuje, že model se dokáže rozhodovat podle skutečného dopadu promo akcí v historii a sleva sama o sobě není univerzálním spouštěčem zvýšeného prodeje.
Produkční model
Abych zákazníkovi dodal plnohodnotné řešení, natrénoval jsem finální verzi modelu – tentokrát na celé historii 42 měsíců (od začátku projektu nějaké měsíce uplynuly).
Validační okno tentokrát neexistuje, takže hodnocení probíhá vizuálním porovnáním s interním forecastem zákazníka a skutečnými prodeji (které jsem dohrál zpětně). I když chybí přesná metrika, klíčové je, že zákazník je spokojený a v projektu vidí jednoznačný přínos.
Co ukazuje vizualizační aplikace:
- ⚫ Historical data – skutečné prodeje
- 🔵 POC prediction – výstup z testovacího modelu s jen základním nastavením
- 🟢 Final prediction – finální model
- 🔴 Customer forecast – interní predikce zákazníka
- Predikce modelu se ve většině případů drží velmi blízko reálným hodnotám
- Odchylky se objevují hlavně u anomálních prodejů, které se výrazně vymykají běžnému chování
- Model spolehlivě zachycuje sezónní vzorce a drží jejich tvar i při kolísání objemů
- Dokáže korigovat chyby manuálního forecastu zákazníka
- U položek s kratší historií je predikce více ovlivněná chováním skupiny, což může vést k odchýlení od reality
- Nové položky s historií kratší než 6 měsíců jsou pro model stále výzvou – přesnost zde začíná znatelně klesat
Vyzkoušejte si výsledky sami: https://demo-inventory-forecasts.streamlit.app/.
(Pokud aplikace spí, klikněte na “Yes, get this app back up!” – do minuty naskočí.)
Poznámka: všechny zobrazené údaje jsou anonymizované a lehce pozměněné.
Závěr série – Predikce zásob pomocí AI
Po deseti dílech tohoto dokumentu, tisících experimentů a terabajtech natrénovaných dat jsem se dostal k finálnímu řešení.
Během projektu jsem:
- postavil robustní pipeline pro zpracování dat a feature engineering
- zvládl práci s extrémy
- přidal položky s neúplnou historií
- otestoval desítky kombinací scénářů, modelů a nastavení
- zavedl group-features pro přenos znalostí mezi podobnými položkami,
Finální volba
TFT model s group-features, bez syntetických hodnot, trénovaný na položkách s minimálně 1 měsícem historie.
Výsledek?
Stabilní predikce napříč celým sortimentem, silné zachování sezónnosti a schopnost korigovat chyby v manuálních forecastech zákazníka.