Prognoza stocurilor face parte din familia analizei predictive, fiind folosită pentru a prezice necesarul de produse și pentru a optimiza lanțul de comenzi și activităţile operaţionale. Incluzând metode bazate pe date istorice, ea este strâns legată și de prognoza cererii și ofertei dar și de prognoza producției, acestea fiind folosite pentru dimensionarea capacității de stocare sau pentru decizii legate de intrarea în piețe noi.
Pentru a facilita prognoza stocurilor pentru companiile din zona de producție, în cadrul echipei R&D, am explorat soluții pentru prognoză folosind serviciul Amazon Forecast din suita AWS. Cele ce urmează au la bază experiența acumulată în urma implementării unui asemenea proiect pentru un client din zona industrială de producție.
Amazon Forecast este un serviciu cloud care face parte din platforma cloud Amazon AWS prin intermediul căruia pot fi generate prognoze utilizând serii de timp şi date adiţionale. Prin integrarea datelor adiționale pot fi generate predicții de până la 50% mai precise decât în cazul analizei seriilor de timp simple [1].
În cadrul acestui articol vor fi prezentate următoarele: în prima parte sunt prezentate câteva consideraţii generale în ceea ce privește algoritmii de predicţie pentru serii de timp şi serviciul Amazon Forecast, iar în partea a doua este expusă o implementare experimentală a unui predictor, utilizând un set de date de tip open source.
O serie de timp sau serie temporală este o serie de puncte ce reprezintă date dependente de timp, dar care, de regulă, nu constituie o serie în strict sens matematic. Un exemplu potrivit de serie temporală este cursul de valori de la o bursă de schimb. O secvență de puncte ale unei serii de timp are punctele spațiate prin intervale egale de timp.
Fiecare predictor Amazon Forecast utilizează un algoritm pentru a antrena un model, apoi folosește modelul pentru a face o previziune folosind un grup de date de intrare. Amazon Forecast oferă următorii algoritmi:
Modelul de tip autoregresiv cu medie mobilă, ARIMA este un algoritm utilizat frecvent pentru prognozarea seriilor de timp. ARIMA caută structuri temporale standard în setul de date de intrare.
Partea AR a ARIMA indică faptul că variabila în evoluție a interesului este regresată pe baza propriilor valori întârziate (adică anterioare).
Partea MA indică faptul că eroarea de regresie este de fapt o combinație liniară de termeni de eroare ale căror valori au apărut în momentul curent și în diferite momente din trecut.
Scopul fiecăreia dintre aceste caracteristici este de a face modelul să se potrivească cât mai bine datelor.
Amazon Forecast DeepAR + este un algoritm de învățare supervizat pentru prognoza unor serii de timp scalare (unidimensionale) folosind rețele neuronale recurente (RNN). Metodele de prognoză clasică, cum ar fi modelele de tip autoregresiv cu medie mobilă (ARIMA) sau netezirea exponențială (ETS), se potrivesc unui singur model pentru fiecare serie de timp individuală, apoi utilizează acel model pentru extrapolarea seriei de timp în viitor. Cu toate acestea, în numeroase aplicații există multe serii de timp similare ce prezintă caracteristici de corelație. În acest caz, poate fi benefic să se instruiască un singur model în comun pentru toate seriile de timp. DeepAR + adoptă această abordare. Când setul de date conține sute de serii de timp, algoritmul DeepAR + depășește metodele standard ARIMA și ETS. De asemenea, se poate utiliza modelul instruit pentru a genera prognoze pentru serii de timp noi, care sunt similare celor pe care a fost instruit.
Netezirea exponențială (ETS) este utilă în special pentru seturi de date cu sezonalitate și alte presupuneri anterioare despre date. ETS calculează o medie ponderată pentru toate observațiile din setul de date din seria de timp de intrare ca predicție. Ponderile scad exponențial în timp, mai degrabă decât constant ca în metode mai simple precum ARIMA. Ponderile depind de un parametru constant, care este cunoscut sub numele de parametru de netezire.
Algoritmul NPTS (Amazon Time Series Non Parametric Time Series) este un predictor scalabil și probabilistic. Acesta prezice distribuția valorii viitoare a unei serii de timp date prin eșantionare din observații anterioare. Predicțiile sunt delimitate de valorile observate. NPTS este util mai ales atunci când seria de timp este intermitentă (sau rară, care conține multe zerouri) și valori mari și sporadice. De exemplu, prognozarea cererii pentru articole individuale în care seria de timp are numeroase numere mici. Amazon Forecast oferă variante de NPTS care diferă prin eșantionarea observațiilor anterioare, luând sau nu în considerare existența unor sezonalități.
Prophet este un model popular Bayesian local de serie temporală. Algoritmul Amazon Forecast Prophet folosește implementarea Python a Prophet de către cei de la Facebook.
Prophet este util în special pentru seturile de date care:
conțin o perioadă de timp extinsă (luni sau ani) de observații istorice detaliate (pe oră, zilnic sau săptămânal);
în care există multiple sezonalități puternice;
care includ evenimente importante cunoscute anterior, dar neregulate;
Prophet este un model de regresie aditivă, folosind trenduri de creștere liniară sau creștere de tip curbă logistică. Acesta include o componentă sezonieră modelată folosind serii Fourier și o componentă sezonieră săptămânală modelată folosind variabile dummy (variabile binare).
Amazon Forecast împarte seturile de date pentru antrenare în domenii: Retail, Invetory Planning, EC2 Capacity, Work Force, Web Traffic, Metrics, Custom. Pentru prognoza stocurilor se recomandă domeniul Invetory Planning ce folosește trei tipuri pentru seturile de date, după cum urmează:
Target Time Series - are trei câmpuri obligatorii: item_id, timestamp și demand. Un al patrulea câmp, location poate fi folosit pentru o granularitate mai mare a rezultatelor;
Related Time Series - are două câmpuri obligatorii: item_id și timestamp. Câmpurile opționale pot fi item price, promotion, și weather. Această serie temporală este opțional folosită în antrenarea modelelor Prophet și DeepAR+;
De obicei, pentru primul antrenament este recomandat să se folosească AutoML pentru a determina cel mai bun model în conformitate cu următoarele metrici:
Rădăcina medie a erorii pătrate, RMSE - este diferența dintre valoarea țintă reală, yi, t și valoarea prevăzută (prognozată), ŷi, t, unde i este indicele elementului cuprins între 1 și total numărul de articole, n și t este indicele de timp al seriei de timp cuprins între 1 și ultima dată în perioada de evaluare, T. Metrica RMSE favorizează un model ale cărui erori individuale sunt de o magnitudine constantă, deoarece variații mari de eroare cresc RMSE. Din cauza erorii pătrate, câteva valori slab prezise într-o altfel de prognoză bună pot crește RMSE.
Cuantilele de predicție - exprimă incertitudinea în prognoze. Prin calcularea cuantilelor de predicție, modelul arată câtă incertitudine este asociată cu fiecare prognoză. Fără a fi însoțite cuantilele de predicție, prognozele punctuale au o valoare limitată. Prezicerea prognozelor la diferite cuantile este deosebit de utilă atunci când costurile previziunii substocare și suprastocare diferă. Amazon Forecast oferă previziuni probabilistice la trei cuantile distincte - 10%, 50% și 90% - și calculează pierderea (eroarea) asociată la fiecare cuantilă. Pierderea cuantilă ponderată (wQuantileLoss, notată wQL) calculează cât de departe este prognoza de cererea reală în ambele direcții. Aceasta se calculează ca procent din cerere în medie pentru fiecare cuantilă. Această metrică ajută la captarea biasului inerent al fiecărei cuantile, care nu poate fi capturată printr-un calcul precum MAPE (medie absolută în procente de eroare), unde ponderile sunt egale. Ca și în cazul MAPE și RMSE, erorile mai scăzute pentru wQL indică o precizie generală mai bună a prognozelor.
wQuantileLoss [0.1]: Pentru predicția P10, valoarea reală este de așteptat să fie mai mică decât valoarea prevăzută în 10% din cazuri. De exemplu, să presupunem că sunteți un vânzător cu amănuntul și doriți să prognozați cererea de produse pentru mănuși de iarnă care se vând bine numai toamna și iarna. Dacă nu aveți mult spațiu de depozitare și costul capitalului investit este mare sau dacă vă preocupă supra-aprovizionarea mănușilor de iarnă, este posibil să utilizați cuantumul P10 pentru a comanda un număr relativ redus de mănuși de iarnă. Știți că prognoza P10 supraestimează cererea pentru mănușile dvs. de iarnă doar 10% din timp, deci 90% din timp veți vinde toate mănușile de iarnă.
wQuantileLoss [0.5]: Pentru predicția P50, valoarea reală este de așteptat să fie mai mică decât valoarea prevăzută în 50% din cazuri. De cele mai multe ori, previziunile pe care le generați intern folosind metode tradiționale de analiză predictivă sau cu alte instrumente de prognoză ar trebui să se potrivească cu prognozele P50. Continuând exemplul mănușilor de iarnă, dacă știți că va exista o cerere moderată pentru mănuși și nu sunteți preocupați să fiți supra-aprovizionați, este posibil să alegeți să utilizați cantilul P50 pentru a comanda mănuși.
În Figura 1 este prezentat fluxul standard pentru generarea unui model de predicţie și aplicarea acestuia utilizând serviciul Amazon Forecast. Modelele Amazon Forecast se obțin folosind următoarea serie de operațiuni:
Figura 1 - Obţinerea unui predicţii utilizând Amazon Forecast.
Pentru implementarea experimentală se va utiliza setul de date train.csv (Figura 2) pus la dispoziție de către Kaggle în cadrul competiției Store Item Demand Forecast Challange [2] . Setul de date cuprinde înregistrări cu privire la vânzarea de articole din magazine pentru 50 de articole în 10 magazine pe o perioadă de 5 ani.
Figura 2 - Datele inițiale, primele cinci intrări
În cadrul fișierului train.csv se redenumesc capetele de coloane pentru a fi conforme cu Target Time Series. Așadar, date devine timestamp, store devine location, item devine item_id și sales devine demand. Datele încărcate au următoarea schemă pentru Amazon Forecast:
Figura 3 - Schema JSON pentru train.csv
Odată structurat, fișierul train.csv este încărcat într-un S3 bucket. Fișierul va fi accesat ulterior din Amazon Forecast prin specificarea căii complete către acesta.
După importarea datelor se începe antrenarea unui predictor. Se folosește Train new predictor, unde se specifică orizontul de prognoză, acesta fiind numărul de unități de timp pentru prognoză. În cazul acestui set de date se va utiliza ca unitate de timp ziua. Deoarece datele au câmpul pentru locații se specifică location ca forecast dimension. Algoritmul poate fi ales manual sau poate fi ales automat prin AutoML.
Pentru acest set de date, folosind AutoML, cel mai bun model a fost identificat Prophet cu următoarele metrici:
RMSE = 8,3302, wQL[0.5]/MAPE = 0,1173, wQL[0.9] = 0,0536 și wQL[0.1] = 0,0510
Dacă setul de date nu este foarte bine cunoscut se recomandă începerea antrenării cu AutoML deoarece acesta va evalua mai mulţi algoritmi și îl va returna pe cel mai bun. Acest mod de antrenare vine și cu un cost, timpul de antrenare fiind de 4 - 5 ori mai mare decât atunci când se alege manual un algoritm. Dacă pipeline-ul de predicţie este matur și este cunoscut algoritmul cel mai eficient, atunci este de preferat ca acesta să fie ales în mod manual.
Pentru a genera prognoza folosind acest model se utilizează opţiunea Create a forecast din pagina predictorului antrenat. Entitatea Forecast creată va genera prognoze în funcție de orizontul menționat în pașii anteriori. Prognozele pot fi testate din fereastra Forecast lookup conform cu Figura 4 și Figura 5.
Figura 4 - Prognoza pentru produsul 10 la locația 10 folosind Prophet
Figura 5 - Prognoza pentru produsul 10 la locația 5 folosind Prophet
Entitatea Forecast poate fi echivalată cu un back-end de predicţie ale cărui detalii de infrastructură sunt invizibile programatorului. Entitatea Forecast poate fi accesată în mod programatic în două moduri:
Prin exportarea predicţiilor într-un fișier CSV;
Diagrama UML de componente din Figura 6 prezintă structura generală a unei posibile aplicații client pentru vizualizarea predicţiilor.
Figura 6 - Diagrama de componente UML aplicatie client.
Tehnologiile propuse sunt Spring Framework pentru componenta back-end și React pentru componenta front-end. Baza de date "locală" este utilizată pentru a stoca datele istorice utilizate pentru antrenarea modelului și datele de test. Aceste date pot fi utilizate pentru a afișa comparativ, pentru un orizont de timp, în paralel, datele prognozate și datele reale istorice de test în vederea evaluării performanţelor algoritmului de predicție.
Figura 7- Implementarea aplicației client, cu vizualizarea datelor din anul anterior suprapusă
Un screenshot din aplicația client este prezentat în Figura 7. Pentru a evalua performanțele modelului de predicție, datele reale sunt afișate în paralel cu datele prezise. Valorile P90 și P10 sunt limitele intervalului de încredere de 80%, valoarea reală fiind în 10% din cazuri sub valoarea prognozată P10 și în 90% din cazuri sub valoarea prognozată P90.
Pentru proiectul prezentat anterior în implementarea experimentală datele sunt structurate, respectă perioada de eșantionare și sunt complete având date zilnice pentru fiecare produs, pentru fiecare locație, partea de pre-procesare fiind minimală. În proiectele din viața reală datele disponibile de cele mai multe ori nu au fost adunate cu scopul de a fi folosite în algoritmi de predicție. Pentru pregătirea acestor date a fi folosite cu Amazon Forecast apare o nouă etapă de analiză și pre-procesare, fiind și cea mai cronofagă etapă. Datele pot avea eșantioane lipsă pentru zilele în care produsele nu s-a vândut. Pentru a gestiona asemenea situații se utilizează metode pentru a umple golurile din setul de date precum re-eșantionarea săptămânală, adunarea cumulativă sau umplerea datelor cu valori nule [4]. Fiecare din aceste metode de pre-procesare induc efort ulterior. În cazul re-eșantionării avem de-a face cu reducerea granularității prognozei. În cazul adunării cumulative este necesară în post-procesare operațiunea inversă, de scădere. Pentru cazul pre-procesării prin umplere cu valori nule apar rezultate nesatisfăcătoare din cauza tabelei de date sparse.
[1] https://aws.amazon.com/forecast/
[2] https://www.kaggle.com/c/demand-forecasting-kernels-only
[3] https://docs.aws.amazon.com/forecast/latest/dg/API_forecastquery_QueryForecast.html
[4] "Introduction to Time-Series Forecsting with Python", Jason Brownlee, 2020