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?
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?
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?
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 :

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:
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:
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:
| ├── config.py | ||
| ├── forecasting_studio | ||
| │ ├── voorspelling_analyse | ||
| │ │ └── fig_forecast_analysis.py | ||
| │ └── pagina's | ||
| │ └── forecast_analysis.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:
Conclusie:
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.

BLOG







