Smyslem validace je ověřit, jak si model poradí s daty, která nikdy neviděl – stejně, jako v reálném provozu. Proto je nutné dataset rozdělit na dvě části:
Ale kde stanovit hranici?
Chtěl jsem modelu poskytnout všechny možné informace – všechny SKU a všech 36 měsíců – abych zachytil co nejvíce vzorců. Část časové osy však musela zůstat skrytá; jinak by si síť jednoduše zapamatovala historii a v realitě se zhroutila.
Řešení? Vytvořil jsem tři validační scénáře, které postupně zvyšují přísnost: od „rychlé zkoušky“ (model validuje pouze na datech, jež už viděl) až po ostrý test jen na opravdu neviděných měsících.
Poznámka: Všechny metriky a grafy, které dál v článku ukazuji, pocházejí ze Scénáře 2 (pokud výslovně neuvedu jinak). Metriky jsou tedy počítány na posledních 3+3 měsíců. Vizualizace pro názornost zobrazuje 12 měsíců.
Následující graf ukazuje rozdíl mezi scénářem 1 a 2. Červený graf ukazuje Scénář 1, tedy kdy model při tréninku viděl všechny výsledky.
Zelený graf je Scénář 2, kdy poslední 3 měsíce nebyly součástí tréninku. Je zřejmé, že je nutné do validací zahrnout hned od začátku neviděná data.
Jakou metriku tedy vybrat, když není technicky možné ručně zkontrolovat každé zboží?
V praxi je běžné používat například R², RMSE nebo MAPE – proč tedy vůbec vymýšlet něco jiného? Zásadním problémem je existence nul a vysoká variabilita hodnot.
Představte si, že model predikuje pro daný měsíc obrat 2 kusy, zatímco reálný prodej byl nula. Zdánlivě chyba jen 2 kusy, ale pokud použijeme procentuální metriku (například MAPE), vyjde nesmyslně vysoká chyba, protože se dělí nulou nebo velmi malým číslem.
Podobně je tomu u RMSE – pár „menších” odchylek na položkách s velkými prodeji může nafouknout celkovou chybu a zcela zastřít výkon modelu na hlavních položkách.
| Příklad položky | Reálný obrat | Predikovaný obrat | Absolutní chyba | Relativní chyba |
|---|---|---|---|---|
| A (nízký obrat) | 5 ks | 8 ks | 3 ks | 60% |
| B (vysoký obrat) | 5 000 ks | 4 800 ks | 200 ks | –4 % |
Jedna metrika nestačí.
Vysoká variabilita položek, hodně nulových a malých položek.
Musel jsem přistoupit ke kombinaci více metrik.
| Metrika | Co vlastně měří | Poznámka | Cíl |
|---|---|---|---|
| WAPE (Vážená procentní chyba) | Kolik % celkových prodejů model „netrefil“. | Citlivost na sortiment s nulovým obratem. | ⬇️ |
| RMSE (Prům. absolutní chyba) | O kolik kusů se v průměru netrefíme. | Citlivost na sortiment s velkými obraty. | ⬇️ |
| R² (Koeficient určení) | Jak velkou část pohybů v prodejích model správně „vysvětluje“. | Hodně ovlivněn velkými obraty. | ⬆️ |
| MAPE (Průměrná absolutní procentuální chyba) | Průměrná procentní chyba každé položky. | Citlivost na sortiment s nízkými obraty. | ⬇️ |
| Robust score | Kombinace přesnosti, kontroly odchylek a shodu směru trendu. (1 = skvělé, 0 = špatné) | Zachytí stoupající/klesající trend. | ⬆️ |
| Stable score | WAPE + kontrola odchylek a relativní chyby u drobných prodejů. (nižší = lepší) | Zajišťuje, že predikce je hladká a stabilní měsíc po měsíci a není náchylná na sortiment s malými obraty. | ⬇️ |
Cíl označuje, jaké hodnoty potřebujeme (nízké ⬇️ nebo vysoké ⬆️).
Jako hlavní metriky používám WAPE, RMSE a R².
V průběhu tréninku jsem narazil na další problém v aplikaci metrik. Standardní metriky přes celý dataset jsou velmi vypovídající, ale neupozorňují na odchylky u jednotlivých položek. Z toho důvodu jsem rozšířil použité metriky na:
| Verze metriky | Jak se počítá | Na co odpovídá |
|---|---|---|
| Výpočet za celý dataset | Hodnoty ze všech položek se sloučí do jednoho vektoru a z něj spočítám metriky. | Kolik kusů se netrefí v celkovém objemu? Tedy finanční dopad na skladové zásoby. |
| Výpočet po položkách | Metrika se spočte pro každé zboží zvlášť, potom se z těchto čísel udělám průměr. | Jak přesná predikce je u typického produktu? – tedy kvalita napříč celým sortimentem. |
Příklad vypočtených metrik nad modelem s 2 vrstvami neuronových sítí a softplus normalizatorem. Významné jsou zde rozdíly mezi metrikami WAPE a MAPE. Druhá tabulka ukazuje správně natrénovaný model.
| Metrika | Hodnota (ALL) | Hodnota (Item) |
|---|---|---|
| WAPE | 50.1925 | 387.2097 |
| RMSE | 69.0821 | 31.4245 |
| R² | 0.6239 | |
| MAPE | 107.1253 | |
| ROBUST | 0.455 | 207.7031 |
| STABLE | 0.5869 |
| Metrika | Hodnota (ALL) | Hodnota (Item) |
|---|---|---|
| WAPE | 31.1611 | 44.6504 |
| RMSE | 50.2607 | 26.5974 |
| R² | 0.9084 | |
| MAPE | 75.7044 | |
| ROBUST | 0.5226 | 84.916 |
| STABLE | 0.3901 |
I přes kombinaci metrik jsem v průběhu testování zjistil, že vizuální kontrola je nutná.
Zejména u zboží s určitým rozložením hodnot, jako jsou speciální typy prodejů, mnoho nulových hodnot a sezónní prodej, jsou metriky nevypovídající – špatné výsledky se v množství schovají.
Následující příklad ukazuje tento případ. I když jeho metriky nevypadají špatně, tak predikce pro poslední měsíce je téměř nulová (červená). Tento případ nastává velmi často právě o zboží s velmi nízkými prodeji.
| Metrika | Hodnota (ALL) | Hodnota (Item) | Hodnota (ALL) | Hodnota (Item) |
|---|---|---|---|---|
| WAPE | 41.2218 | 61.4738 | 34.7262 | 51.7859 |
| RMSE | 67.3586 | 29.0839 | 48.2791 | 23.7958 |
| R² | 0.7453 | 0.8691 | ||
| MAPE | 82.3626 | 70.7658 | ||
| ROBUST | 0.4432 | 88.1001 | 0.4785 | 77.5447 |
| STABLE | 0.4872 | 0.418 | ||
| Červený graf | Zelený graf | |||
Poznámka: Ve vizuální validaci je vždy reálný prodej zobrazen černou barvou a predikce barevně.
IČO: 172 28 018
DIČ: CZ 172 28 018
Data Box ID: ykwdnxf
sales@neebile.cz
Jičínská 226/17, Praha, Žižkov, PSČ 130 00 Česká republika
(910) 658-2992
© 2025 Vytvořeno DigitalWays