Predikce zásob pomocí AI

5. Feature engineering I, skok v přesnosti

Výběr DL modelu

V minulém díle padlo rozhodnutí opřít další vývoj o deep-learningové architektury. Aby byly budoucí vizualizace lépe čitelné, budu dál soustředit pozornost především na Temporal Fusion Transformer (TFT). K této volbě mě přivedly tři zásadní argumenty:

  1. Škálování s komplexitou – čím bohatší a členitější je datová sada (desítky featur, promo příznaky, sezónnost, relativní ukazatele), tím markantněji TFT překonává ostatní modely.
  2. Limity DeepAR u long-tailu – DeepAR má tendenci stahovat položky s nízkým nebo řídkým obratem k nule; tím deformuje plán nákupu pomaloproudých, ale důležitých položek.
  3. Attention = inteligentní výběr featur – TFT dokáže automaticky určit, které vstupní sloupce jsou v daném okamžiku klíčové, a zároveň tuto volbu interpretovat. To je při 100+ features nezanedbatelná výhoda.

Na začátku se sice zdálo, že model DeepAR dosahuje srovnatelných metrik při nižších výpočetních nárocích, ale jakmile jsme rozšířili vstupy o složitější sezónní, promo a relativní signály, rozdíl se otočil: výkon TFT začal škálovat, zatímco DeepAR narážel na své limity.

Scénář 1 - proč je špatně

V průběhu dalšího testování se velmi rychle ukázala nevýhoda prvního scénáře – tedy kdy tréninkové a validační data byli shodné.

V grafech lze vidět, že Scénáři 1 sleduje predikce pro realitu velmi dobře po celou dobu, protože model měl možnost „budoucnost“ vidět. Jakmile dostal zcela nové 3 měsíce (Scénář 2), rozdíl se projevil velmi rychle. Na posledním grafe se sezónním zboží lze vidět, že model totálně selhával.

MetrikaScenario 1Scenario 2
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE32.163245.795953.117766.9848
RMSE62.065525.274683.149345.7434
0.86030.7754
MAPE63.949495.889
ROBUST0.479666.01290.418498.0722
STABLE0.38190.4615

Při kontrole výsledků scénáře 2 je vidět, že model vykazuje určitou schopnost predikce, zejména u položek s dlouhou a stabilní historií. Výsledky ale byly stále výrazně pod očekáváním. Ukázalo se, že model zásadně selhává ve třech klíčových oblastech:

  • Položky s nízkým obratem – predikce klesala k nule; riziko předzásobení long-tailu.
  • Promo špičky – bez explicitní informace o slevě modely zvýšený prodej jen částečně reprodukovali.
  • Sezónní cykly – u vysoce sezónních položek modely podhodnocovaly amplitude letních a vánočních vrcholů.


Bylo zřejmé, že model potřebuje další vstupy, z nichž vyčte kontext, který v surových číslech chybí – feature engineering.

Co jsou to features

Při práci s AI nad časovými řadami má každý řádek v datech podobu:
Produkt × Časový okamžik (např. položka A v březnu 2024).

Vše ostatní na řádku – jako je segment, druh, obrat, cena nazýváme features. Tyto sloupce dávají modelu potřebné souvislosti – pomáhají pochopit chování produktu v čase, jeho podobnost s ostatními a vliv okolních faktorů jako jsou promo akce nebo sezóna.

Proč?

  • Holé číslo obratu říká jen kolik se prodalo.
  • Features dodají kontext proč se to stalo: byl srpen, běžela sleva, položka je novinka, zrovna vrcholí sezóna.
  • Díky nim model rozpozná vzorce, které by z čisté řady prodejů nikdy nezískal.

Jak model pracuje s features

Jak bylo řečeno, v našem datasetu tvoří každý řádek dvojici Produkt (ID) × Měsíc (time_idx).
Vše ostatní nazýváme features.

Seznam features pro dataset projektu
ID, seasonality, category, type, segment, segment 1, segment 2, name, turnover, date, time_idx, weight, SALE, SALE_INTENSITY, product_volume__bin

3 typy features
Základní rozdělení je na statické a dynamické, tedy jestli se  hodnoty mění v čase.
Typ zboží je pro všechny měsíce stejný, naopak slevová akce je pouze v několika měsících.

Typ featurePříkladJak pomáhá modelu
StatickéTyp, ID, kategorie, segmentSíť sdílí vzory napříč sortimentem a pomáhá novinkám, které mají málo historie. Hodnoty jsou stejné pro všechny měsíce.
Dynamické známéKalendář, slevaHodnoty se mění v každém měsíci, známe je i pro budoucí měsíce.
Dynamické neznáméobratHodnoty se mění v každém měsíci, neznáme je pro budoucí měsíce. Jedná se většinou o veličiny, které chceme předpovědět.

Číselné vs. kategorické

  • Číselné features (obrat, průměry, slevy) – předávají se přímo do modelu
  • Kategorické features (typ zboží, segment) – se převádějí na embeddingy – krátké vektory, které se učí spolu s modelem.

 

Proč embeddings fungují

Dva vektory uložené „blízko sebe“ = dvě kategorie, jejichž poptávka se chová podobně. Nový produkt z „nářadí“ tak okamžitě těží z historie „elektro-příslušenství“, pokud je jejich prodejní profil příbuzný.

Jaké features jsem použil

V této fázi tréninku jsem se zaměřil na features, které pomáhají modelu pochopit vztah mezi obratem v jednotlivých měsících. Každá skupina těchto vstupů doplňuje jiný typ informace: sezónní rytmus, vývoj v čase, vliv promoakcí i relativní chování vůči ostatním položkám.


🗓️ Date-encoding

Model nepracuje s měsíci, ale s číselným pořadím (time_idx je 0 – 36). Pomocí těchto features mu tyto vazby identifikujeme.

  • Harmonické kódování měsíce (sin / cos) → model pozná, že po prosinci následuje leden a celý rok se točí v cyklu.
  • Pomůže zachytit periodické vztahy v prodeji (kvartály, roky, letní sezóna)

 

📊 Relativní (poměrové) features

  • Určí odchylku nebo podíl prodeje vůči širšímu celku (průměr skupiny, maximum sezóny, long-term trend …).
  • Model tak snadno pozná, kdy je položka nad nebo pod svým normálem a rychleji reaguje na nečekané výkyvy.

 

🌀 Lag & Rolling okna

  • Předá podrobnou informaci, jaký byl nedávný vývoj.
  • Pomáhá rychleji zachytit momentum (zpomaluje se nebo zrychluje prodej).
  • Rolling mean / std odfiltrují šum a ukážou, zda je aktuální prodej nad / pod svým klouzavým průměrem.

 

🌊 Wavelet signály

  • Rozloží křivku na krátké vlnky vs. dlouhé trendy.
  • Síť tak vidí jemné promo skoky i pomalé, víceleté cykly najednou.

 

📈 Trend

  • Doplní směr a sklon prodeje.
  • Informace o kolísání prodeje kolem svého průměru.

 

🔢 Absolutní i log-hodnoty

Většinu features jsem vytvořil jak v absolutních hodnotách, tak i v logaritmické hodnotě.
Proč logaritmus?

  • Zkomprimuje extrémy → nezadusí malé položky.
  • Stabilizuje rozptyl, křivky jsou blíž normálu → model se učí rychleji.
  • Převádí poměrové skoky (×2, ×3) na lineární posun, který model snadno zachytí.

Výsledek

Pomocí této kombinaci vstupů model nejen předpovídá obrat, ale chápe i kontext jednotlivých měsíců: co je běžný trend, co je výkyv, a co znamená promo.
Po sérii iterací jsem skončil na cca 75 featurách — tato sada přinesla největší zlepšení metrik vůči nárokům na čas a paměť. Další navyšování features už výsledek zlepšovalo jen minimálně, zatímco trénink výrazně zpomalovalo. Kombinace více features pak také vedla ke vzájemnému ovlivňování.

Grafy porovnávají odezvu tří verzí modelu:

  • Červená křivka původní predikce bez dodatečných features.
  • Zelená křivka model obohacený o harmonické date-encoding features (sin/cos měsíce).
  • Fialová křivka stejný model dále rozšířený o relativní a rolling features odvozené z obratu.

Kontrast mezi křivkami ukazuje, jak každý balík features zlepšuje (nebo mění) schopnost modelu sledovat reálný prodej.

Metriky ukazují, jak přidané informace posunují kvalitu modelu:

Metrikabez featuresdatumové featuresobratové features
Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)Hodnota (ALL)Hodnota (Item)
WAPE53.117766.984832.065146.771130.260844.5829
RMSE83.149345.743472.17525.135446.142722.3537
0.77540.81110.9012
MAPE95.88962.966560.0505
ROBUST0.418498.07220.490765.26970.494862.2027
STABLE0.46150.38390.365

Vliv features na rychlost

Na testovacím vzorku jsem změřil, jak rostoucí počet featur zatěžuje zdroje (13 featur = základ).

FeaturesČas tréninkuGPU memory
120x 7x 2,5
444x 26x 6