Lees ons artikel over

.

Hoe u de juiste visualisaties kunt kiezen en implementeren in Streamlit om uw voorspellingsmodellen beter te debuggen

TL; DR

Wanneer u te maken hebt met voorspellingsmodellen, is de beste aanpak vaak om continu te itereren, door enkele data bronnen toe te voegen, de feature engineering te verbeteren, modelparameters te tweaken... Meestal worden Data Scientists gefixeerd op slechts één KPI (D.w.z. RMSE, Voorspellingsnauwkeurigheid...). Achter deze KPI's zit vaak veel meer informatie die geanalyseerd moet worden om de voorspelling te verbeteren. Het ontwikkelen van een geschikte visualisatietool is een geweldige manier om diep in het gedrag van het model te duiken, snel de pijnpunten van uw model te vinden en zo efficiënt aan nauwkeurigheid te winnen.

In dit artikel worden de belangrijkste vragen uitgewerkt die men zichzelf zou moeten stellen bij het evalueren van een voorspellingsmodel, vervolgens worden de onmisbare visualisaties gepresenteerd om deze vragen te beantwoorden en tot slot wordt een snelle implementatie voorgesteld onder een uniform hulpmiddel om al deze visualisaties te verzamelen met behulp van Streamlit.

Context

Dit artikel vat samen wat we hebben geleerd van het bouwen van een uniforme visualisatietool om Data Scientists, Software Engineers, Product Owners & Demand Planner (bedrijfsexperts) te helpen bij het ontwikkelen van sell-in prognosemodellen voor 10+ business units in een voedingsmiddelen- & drankenbedrijf. Onze modellen maakten prognoses op het niveau van Dagelijks x Magazijn x Product, voor de komende 14 weken. Deze werden ontwikkeld met behulp van boostingmethoden en houden rekening met productkenmerken, historische verkopen, evenementen en promotionele data.

De belangrijkste vragen bij het evalueren van een prognosemodel

1. Is het model goed vergeleken met de basislijn?
Het is erg nuttig om toegang te hebben tot actuele voorspellingen (bijvoorbeeld voorspellingen van de vraagplanner) op hetzelfde gebied. Hierdoor krijgt u een goed inzicht in het gedrag van de business in een bepaalde periode, voor een bepaald product of op een bepaalde locatie. Hoe meer u de Business interviewt, hoe meer inzichten u krijgt en hoe meer u de juiste functies kunt implementeren.

2. Over- of ondervoorspellingen en dalingen in de voorspellingsnauwkeurigheid achtervolgen
Vragen die u moet stellen zijn: Vang ik de globale trend? Vangt het model bekende terugkerende gebeurtenissen op zoals vakanties, sluiting van magazijnen, schoolvakanties? Daalt de nauwkeurigheid in bepaalde perioden?
Waarom is het belangrijk?

  • Als het model te hoge voorspellingen doet, leidt dit tot een toename van de voorraad en dus tot voorraadkosten.
  • Als het model te lage voorspellingen doet, leidt dit tot perioden met uitverkochte voorraden, waardoor verkoopkansen gemist worden en de klanttevredenheid afneemt.

Het opsporen van dergelijke gebeurtenissen is een geweldige manier om efficiënt nauwkeurigere voorspellingen te doen. Deze zijn vaak goed bekend bij vraagplanners en vrij eenvoudig in uw model te implementeren als u over de informatie beschikt. Bijvoorbeeld, in veel van onze business units werden sommige producten verkocht voor schoollunches. Het introduceren en voorbereiden van een kenmerk dat schoolvakanties weergeeft, leidde tot een grote toename in onze nauwkeurigheid voor deze specifieke periodes.

3. Omgaan met productspecifieke kenmerken
Zijn mijn prestaties homogeen voor mijn productmerken/families? Zijn er andere verschillen tussen mijn producten (producten die alleen tijdens promotieperiodes worden verkocht, bestsellers vs. producten met lage volumes, producten )?
Waarom is het belangrijk?

  • Het goede gedrag van het model over het hele bereik validerenAfhankelijk van de bedrijfsbehoefte kan een minimale nauwkeurigheid voor het hele bereik vereist zijn.
  • Om kritieke producten te identificeren, die nauwkeuriger geanalyseerd kunnen worden en dus aan nauwkeurigheid winnen.

Deze vragen helpen u om het bedrijf nauwkeuriger te begrijpen. Het opsplitsen van modellen op basis van het belang van de producten in termen van volume leidt bijvoorbeeld vaak tot betere prestaties. De vraag naar gewone producten is namelijk heel anders dan de vraag naar promotionele producten of minder gebruikelijke producten, die sterk gecorreleerd kunnen zijn met promotieperiodes of een zeer schaars verkoopprofiel kunnen hebben. In de meeste van onze gevallen hebben we verschillende modellen getraind voor deze verschillende soorten producten.

4. Wordt er correct rekening gehouden met de constitutieve effecten?
Houdt het model promotie-effecten correct bij? Zijn er kannibalisatie-effecten? Past het model zich goed aan aan exogene fenomenen (bijv. stakingen)?
Waarom is het belangrijk?

  • In de meeste gevallen zijn promoties een belangrijk onderdeel om de vraag te stimuleren en kunnen ze leiden tot grote pieken in de verkoop data.
  • Dit kan leiden tot grote verspillingen / uitverkochte voorraden.
  • Een realistischer model dat rekening houdt met geavanceerde effecten zal eerder worden aangenomen door uw toekomstige gebruikers.

Raadpleeg gerust het vorige artikel van onze Voorspellingsserie om promotie data aan te pakken: 5 tips om beter rekening te houden met promotionele data

Hoe u uw prognosemodel kunt analyseren: van macro-KPI's tot de evaluatie op een specifiek gebied

Wat zijn de onmisbare visualisaties?
Om uw evaluatietool te bouwen, moet u twee elementen combineren :

  • Een filteronderdeel om de prestaties op een specifiek bereik te evalueren
  • Een reeks visualisaties om snel verbeterassen te vinden

Het filtergedeelte moet het mogelijk maken om op verschillende assen te filteren: analyseperiode, locaties (detailhandelaar, magazijn ...), producten (een reeks producten) en tot slot productcategorieën.
Wij raden ten minste de volgende 4 visualisaties aan:

  • Ten eerste, de evolutie van voorspeld volume, met de informatie over de echte verkopen. Dit is de meest begrijpelijke en de eerste om naar te kijken. Het helpt u om uw model te begrijpen: volgt mijn model de globale trend? Voorspelt het te veel of te weinig? Vang ik de pieken en dalen?

  • Ten tweede, de evolutie van de prognosenauwkeurigheid. Afhankelijk van de manier waarop de nauwkeurigheid van de prognose wordt berekend, kan dit cijfer nodig zijn om de eerste te voltooien. Dit cijfer helpt u om snel pijnpunten in uw prognoses te vinden, en vertelt u dus op welke periode u moet verdiepen.
  • Ten derde, enkele goed vertegenwoordigde KPI's om bereken uw voorspellingsnauwkeurigheid op verschillende scopes. Wij raden u aan om uw nauwkeurigheid op te splitsen op verschillende niveaus: magazijnen, productcategorieën, producten, en zelfs om deze analyseassen te mixen (bijvoorbeeld om een heatmap te maken van de prognosenauwkeurigheid op elk magazijn x productcategorieën). Nogmaals, dit helpt u bij het vinden van kritieke lokalisatie of producten.
  • De laatste is de bijdrage-evaluatie. Om precies te begrijpen hoe uw model werkt, moet u de meest gebruikte kenmerken evalueren. Klassieke TS-modellen (ARIMA & Co., Prophet, ...) maken van nature gebruik van functiedecompositie. Voor boostingmethoden (XGBoost, CatBoost, LightGBM...) zijn er frameworks zoals SHAP zijn zeer nuttig om het gedrag van elke eigenschap nauwkeurig te modelleren. Door deze bijdrage op de perioden weer te geven, kunt u evalueren welk fenomeen uw voorspelling op welk moment stuurt.

Hoe begint u met het bouwen van uw voorspellingsstudio dashboard met Streamlit?

Streamlit is een open source pythonbibliotheek om in enkele minuten deelbare webapps te maken en wint nog steeds aan populariteit in de Data Science gemeenschap. In dit artikel zullen we niet de tool presenteren, aangezien er al veel artikelen over dit onderwerp beschikbaar zijn, maar zullen we ons richten op de eenvoudige implementatie van één visualisatie.
De keuze om Streamlit te gebruiken voor dit type project werd gemotiveerd door verschillende voorwaarden:

  • Streamlit maakt het instellen van een MVP dashboard heel eenvoudig.
  • Volledig integreerbaar in een Data wetenschapsproject. Aangezien uw Streamlit-pagina's in Python geschreven worden, kunt u de functies van uw kernproject gebruiken. Als u bijvoorbeeld een lib hebt ontwikkeld om toegang te krijgen tot uw data-bereidingen, referentietabellen en voorspellingen, dan kunt u deze direct in uw dashboardcode gebruiken.
  • Deelbaar voor veel gebruikers, door uw dashboard bloot te stellen op een poort van uw externe machine of het te implementeren op oplossingen zoals App Engine, Cloud Run ...

1. Globale structuur van uw prognosedashboard
Voordat u in de implementatie duikt, is de eerste vereiste bij het bouwen van een dashboard het tekenen van de onderdelen van uw toepassing.

Om schoon te zijn in uw implementatie, kunt u uw code opdelen in verschillende delen:

  • Het kerndashboard dat u kunt starten met streamlit run voorspelling_studio_app.py
  • De verschillende pagina's (eenvoudige EDA op uw training dataset, voorspellingsanalyse, bijdrage aan kenmerken,...)
  • Lib-scripts om uw data-voorbereiding / cijfers voor elke pagina te verzamelen

├── config.py
├── forecasting_studio
│ ├── voorspelling_analyse
│ │ └── fig_forecast_analysis.py
│ └── pagina's
│ └── forecast_analysis.py
└── forecasting_studio_app.py

De hoofdpagina stelt de globale structuur van uw app in, d.w.z. de globale lay-out van uw app: in ons geval een brede lay-out, en een zijbalk om de naam van uw app en de beschikbare pagina's weer te geven.

importeer streamlit als st
van voorspelling_studio.pagina's importeer voorspelling_analyse
PAGINA =
def schrijf_pagina(pagina):
pagina.schrijf()
def hoofdpagina():
st.zijbalk.titel("Forecasting Studio")
selectie = st.zijbalk.selectievak("", lijst(PAGINA.toetsen()))
pagina = PAGINA[selectie]
schrijf_pagina(pagina)
als __name__ == "__main__":
st.set_pagina_config(lay-out="breed")
hoofdpagina()

Het configuratiebestand, waarin we de kleuren en verschillende configuraties voor al uw Plotly-figuren verzamelen.

X_AS_SJABLOON = dict(showline=Echt,
showrooster=Vals,
showticklabels=Echt,
lijnkleur=“grijs”,
lijnbreedte=2,
teken=“buiten”,
tickfont=dict(familie=“Arial”, maat=12, kleur=“rgb(82, 82, 82)”))
Y_AS_SJABLOON = dict(showline=Echt,
showrooster=Echt,
lijnkleur=“grijs”,
rasterkleur=“lichtgrijs”)
LEGEND = dict(oriëntatie=“h”, yanchor=“bodem”, y=1.02, xanchor=“juist”, x=1)
COLORDISCRETE = [“#002244”, “#ff0066”, “#66cccc”.”, “#ff9933”, “#337788”,
“#429e79”, “#474747”, “#f7d126”, “#ee5eab”.”, “#b8b8b8”.”]

2.Gebouw “Evolutie van visualisatie van prognosenauwkeurigheid”.”
Eerst zullen we onze Plotly-figuren in één script verzamelen:

importeer panda's als pd
van typen importeer Lijst
importeer plotly.grafiek_objecten als Ga naar
van config importeer COLORDISCRETE, LEGEND, X_AS_SJABLOON, Y_AS_SJABLOON
def fig_evolutie_van_fa(voorspellingen_per_doel_datum: pd.DataFrame,
evenementen: Lijst = Geen) -> Ga naar.Afbeelding:
“Figuur die de evolutie van de Voorspellingsnauwkeurigheid weergeeft
op de backtestperiode
Parameters
----
prognoses_per_doel_datum : pd.DataFrame
Prognose dataset met ten minste 3 kolommen :
- ‘target_date’ : de datum waarvoor u voorspelt
- ‘voorspelling_nauwkeurigheid’ : uw nauwkeurigheid KPI
- week_nb‘ : week-ID (van 0 tot 52)
- (optioneel) ‘demand_planner_forecast_accuracy’ : uw basisprognose
Primaire sleutel : ‘doel_datum’
gebeurtenissen : Lijst, optioneel
een lijst met een aantal datums, die perioden voorstellen, standaard Geen
“””
fig_fa_score = Ga naar.Afbeelding()
fig_fa_score.spoor toevoegen(
Ga naar.Strooi(
naam=“Modelvoorspellingsnauwkeurigheid”,
x=voorspellingen_per_doel_datum[‘streefdatum’],
y=voorspellingen_per_doel_datum[‘voorspelling_nauwkeurigheid’],
hovertext=voorspellingen_per_doel_datum[‘week_nb’],
marker_kleur=COLORDISCRETE[0]))
# Als u een basislijn hebt, kunt u een extra kolom toevoegen aan uw
# dataset om het op een lijnplot weer te geven
als ‘vraag_planner_voorspelling_nauwkeurigheid’ in voorspellingen_per_doel_datum.kolommen:
fig_fa_score.spoor toevoegen(
Ga naar.Strooi(
naam=“Nauwkeurigheid prognoses vraagplanners”,
x=voorspellingen_per_doel_datum[‘streefdatum’],
y=voorspellingen_per_doel_datum[‘vraag_planner_voorspelling_nauwkeurigheid’],
hovertext=voorspellingen_per_doel_datum[‘week_nb’],
marker_kleur=COLORDISCRETE[2]))
fig_fa_score.update_assen(bereik=(min(voorspellingen_per_doel_datum[‘streefdatum’]),
max(voorspellingen_per_doel_datum[‘streefdatum’])))
fig_fa_score.update_sporen(modus=‘lijnen+markeringen’, lijnvorm=‘spline’)
fig_fa_score.update_layout(
xas_titel=“Streefdatum”.”,
yaxis_titel=“FA Score”.”,
plot_kleur=‘wit’,
legende=LEGEND,
xas=X_AS_SJABLOON,
yas=Y_AS_SJABLOON)
als evenementen:
fig_fa_score.update_layout(
vormen=[get_vertical_filled_area(segment[0], segment[1], ‘rgb(102, 204, 204)’)
voor segment in evenementen])
terugkeren fig_fa_score
def get_vertical_filled_area(start: zweven, einde: zweven, kleur: str = “blauw”) -> dict:
“””Geef een plotachtig verticaal vormdictaat terug, gebruikt om gebeurtenissen op figuren te markeren”””
terugkeren dict(type=“rect”,
xref=“x”,
yref=“papier”,
x0=start,
y0=0,
x1=einde,
y1=1,
vulkleur=kleur,
laag=“onder”,
lijnbreedte=0,
opaciteit=0.5)

Uiteindelijk implementeren we onze voorspellingsanalysepagina, die onze dataset laadt, onze cijfers over verschillende kolommen verdeelt, ...

importeer panda's als pd
importeer streamlit als st
van voorspelling_studio.voorspelling_analyse.fig_voorspelling_analyse importeer fig_evolutie_van_fa
def schrijf() -> Geen:
st.titel(‘Prognose-analyse’)
df = pd.lezen_csv(‘uw_dataset.csv’.’)
# U kunt hier enkele aangepaste gebeurtenissen laden om weer te geven
# ex : events = [(‘2019-07-01’, ‘2019-09-01’), (‘2020-07-01’, ‘2020-09-01’)]
evenementen = Geen
evo_cont1, evo_cont2 = st.beta_kolommen(2)
evo_cont1.subheader(‘Evolutie van prognosenauwkeurigheid’)
fig_evo_fa = fig_evolutie_van_fa(df, evenementen)
evo_cont1.plolty_fig(fig_evo_fa)
als __name__ == “__main__”:
schrijf()

Tadam ! Hier is onze app :

Laten we eens kijken naar de gepresenteerde figuur. Met betrekking tot de vorige punten die we hebben besproken, zijn hier de belangrijkste punten van onze figuur:

  • Ten eerste kunnen we zo snel zien voor welke weken ons model niet nauwkeurig is: December lijkt een ingewikkelde maand te zijn om te voorspellen. Het einde van onze backtestperiode is ook een probleem voor ons model. We moeten met het bedrijf overleggen om te begrijpen welke effecten die weken bepalen, en het model dienovereenkomstig aanpassen.
  • De figuur heeft ook een parameter genaamd “gebeurtenissen”, een lijst van datumparen, die globale gebeurtenissen vertegenwoordigen en ons in staat stellen om gebeurtenissen zoals schoolvakanties te markeren. We kunnen snel zien dat onze slechtste week een vakantieweek is. Misschien zijn sommige magazijnen tijdens deze periode gesloten, of hebben klanten meer besteld dan normaal om het begin van het jaar voor te bereiden... Nogmaals, bedrijfseigenaren kunnen zeker een extern oog op deze weken toevoegen.
  • Zoals u kunt zien, worden er twee reeksen weergegeven. In ons geval geeft het de nauwkeurigheid weer van ons model en dat van Demand Planners voor dezelfde periode. In de figuur kunnen we zien dat de slechtste weken ook ingewikkelde weken voor Demand Planners zijn. De grootste daling in april is goed voorspeld door ons model. Het einde van de backtestperiode lijkt ingewikkelder voor ons model, terwijl de nauwkeurigheid van Demand Planners stabiel lijkt.

Conclusie:

  • EDA is de sleutel bij het evalueren van uw voorspellingsmodel
  • Groepeer al uw cijfers in een uniek dashboard, zodat u zich kunt concentreren op iteraties en zo efficiënter kunt werken
  • Met het dashboard kunt u zich richten op de belangrijkste scopes en snel verbeterpunten vinden.
  • U hebt zojuist de kernstructuur van uw dashboard geïmplementeerd, ga uw gang en voeg nieuwe cijfers toe!

Zodra u uw visualisatiehulpmiddel hebt gebouwd, is het tijd om het te implementeren. Hier is een geweldige bron om uw app te delen: Hoe uw Streamlit App in GCP implementeren en beveiligen?

Bedankt voor het lezen tot nu toe, aarzel niet om contact met ons op te nemen als u vragen hebt. U kunt meer over onze projecten te weten komen door onze blog.

Medium Blog bij Artefact.

Dit artikel werd oorspronkelijk gepubliceerd op Medium.com.
Volg ons op ons medium Blog !