Cursus
Voetbal voorspellen is lastig. Het is een sport met weinig doelpunten, waarin één van richting veranderde schot de uitslag kan kantelen, en een flinke portie van elke wedstrijd neerkomt op geluk. Internationaal voetbal is nog moeilijker: nationale teams spelen maar een handvol serieuze wedstrijden per jaar, waardoor er veel minder data is om van te leren dan in clubcompetities.
Alsof dat nog niet genoeg was, maakte de FIFA de taak dit jaar nóg lastiger. Het uitgebreide WK met 48 teams introduceert een nieuw format waarin de beste twee van elk van de twaalf groepen doorgaan, plus acht van de twaalf beste nummers drie, waardoor groepslotingen onvoorspelbaar worden. Omdat ik wel hou van een uitdaging (en van voetbal), is dat precies wat ik ben gaan voorspellen.
Dit is een vervolg op mijn EURO 2024-voorspellingsproject, vrijwel vanaf de grond opnieuw opgebouwd. Vorige keer werkte ik volledig in Jupyter-notebooks en voorspelde ik per wedstrijd één meest waarschijnlijke uitslag. Dit keer bouwde ik een end-to-end MLOps-pijplijn die verse resultaten inleest, zichzelf hertraint en een Monte Carlo-simulatie van het hele toernooi 10.000 keer draait, waarmee voorspellingen op wedstrijdniveau worden omgezet in kansen voor hoe ver elk team komt.
In dit artikel neem ik je op hoofdlijnen mee door het project: de data en features, de MLOps-praktijken die het reproduceerbaar houden, de pijplijnarchitectuur, en welk model nationaal teamvoetbal uiteindelijk het best voorspelt. De volledige code vind je in de projectrepo. En natuurlijk vertel ik je wie het model denkt dat zal winnen. (Spoiler: het is gecharmeerd van Spanje en Argentinië met elk rond de 16%, maar het interessante is vooral hoe het daar komt.)
Als je hierdoor in de stemming komt voor het toernooi, kijk dan vooral naar onze Data & AI World Cup-week, een serie sessies over hoe data en AI het voetbal veranderen, gratis live te bekijken of on demand.
In een notendop
- Dit is een end-to-end MLOps-pijplijn die het WK 2026 voorspelt, verse interlandresultaten ophaalt en automatisch hertraint op Google Cloud, elke twee uur tijdens het toernooi.
- Data van API-Football en Elo-ratings wordt verwerkt via een Bronze-Silver-Gold-medallionarchitectuur en geversioneerd met DVC voor volledige reproduceerbaarheid.
- Tien modellen uit vijf families zijn vergeleken op een holdout van 347 wedstrijden; XGBoost won nipt, de top vijf was vrijwel niet van elkaar te onderscheiden, en het Elo-verschil tussen teams doet het meeste voorspellende werk.
- Een Monte Carlo-simulatie speelt het volledige toernooi 10.000 keer, en zet doelvoorspellingen per wedstrijd om in de kansen dat elk team doorgaat en wint.
- Per 10 juni 2026 zijn de favorieten van het model Spanje en Argentinië, elk met ongeveer 16%. De livevoorspellingen zijn te volgen op een bijbehorend Streamlit-dashboard dat elke twee uur ververst.
De data achter de voorspellingen
Een voorspelling is nooit beter dan wat je erin stopt, dus het loont om bij de grondstoffen te beginnen. Het model leert van twee live databronnen en zet die om in één, nette featuretabel.
Waar de data vandaan komt
Alles is gebouwd uit twee bronnen. API-Football levert het speelschema en statistieken per wedstrijd: wie tegen wie speelde, wanneer, waar en hoe het eindigde. eloratings.net levert Elo-ratings voor elk nationaal team.
Een Elo-rating is één getal dat weergeeft hoe sterk een team is. Elk team staat ergens op de schaal, en na elke wedstrijd wordt de rating bijgewerkt: win van een sterkere tegenstander en je wint veel; verlies van een zwakkere en je daalt fors. Het idee komt uit het schaken en past goed bij voetbal. Wil je de volledige intuïtie, dan loopt dit eerdere DataCamp-stuk erdoorheen in de context van het WK 2022.
Samen leveren de twee bronnen een Gold-dataset op van grofweg 6.900 interlands sinds 2018 om van te leren.
Wat het model voorspelt
Hier komt de eerste belangrijke ontwerpkeuze. In plaats van de uitkomst direct te voorspellen als winst, gelijkspel of verlies, voorspelt het model iets fijnermazigs: het aantal doelpunten dat elk team in een wedstrijd maakt. Doelpuntenaantallen in voetbal volgen bij benadering een Poissonverdeling, de standaardmanier om te modelleren hoe vaak een relatief zeldzame gebeurtenis in een vaste tijdsperiode plaatsvindt.
Doelpunten in plaats van resultaten voorspellen is wat alles later mogelijk maakt. Zodra het model voor elke matchup een plausibele uitslag kan produceren, kun je de vragen waar iedereen eigenlijk om geeft — wie overleeft de groep en wie tilt de beker — beantwoorden door die scorelijnen duizenden keren te simuleren.
De features die ertoe doen
Elke wedstrijd wordt beschreven door een kleine, zorgvuldig gekozen set features:
- Elo-verschil: het gat in rating tussen de twee teams. Dit is veruit de belangrijkste feature in het model, met een belang dat ongeveer twee ordes groter is dan de eerstvolgende. Dat past bij de intuïtie: het krachtsverschil tussen de twee ploegen vertelt je meer over de waarschijnlijke uitslag dan bijna alles anders.
- Elo-som: de twee ratings bij elkaar opgeteld, als aanduiding voor de algehele kwaliteit van de wedstrijd. Het verschil alleen kan Argentinië tegen Spanje niet onderscheiden van San Marino tegen Andorra: twee gelijkwaardige duels op totaal verschillend niveau, en de som brengt die informatie terug.
- Rollende Elo-verandering (laatste 5 wedstrijden): hoeveel de rating van elk team recent is verschoven. Dit vangt vorm (form) terwijl het al rekening houdt met de sterkte van de tegenstanders.
- Rollende doelpunten voor en tegen (laatste 5 wedstrijden): recente aanvallende en verdedigende output in absolute termen, berekend per team.
- Wedstrijdcontext: het competitieniveau (een WK-duel weegt anders dan een kwalificatiewedstrijd of Nations League-pot), of de wedstrijd knock-out is, en of er op neutraal terrein wordt gespeeld.
Elke feature is strikt lekvrij, wat betekent dat er alleen informatie is gebruikt die vóór de aftrap beschikbaar was. Dat klinkt vanzelfsprekend, maar het is één van de makkelijkste manieren om per ongeluk een model te bouwen dat in tests briljant oogt en in de echte wereld instort.
Eén idee haalde de eindstreep niet: ik had een set "speelstijl"-features gepland door teams te clusteren op basis van hun in-game-statistieken, een stap met onbegeleid leren. In de praktijk clusterden teams niet in betekenisvolle groepen, dus in plaats van het model ruis te voeren, heb ik het laten vallen. Negatieve resultaten zijn ook resultaten.
De data reproduceerbaar houden
Met data die doorlopend uit twee bronnen binnenkomt, moet het pad van ruwe bestanden naar modelklare features elke keer identiek zijn. Dat is wat een medallionarchitectuur biedt. Die organiseert data in drie lagen:
- Bronze: de ruwe data, precies zoals die binnenkomt, onaangeroerd.
- Silver: opgeschoond en gestandaardiseerd. Hier koppel ik teamnamen tussen de twee bronnen (ze zijn het zelden eens over spellingen), valideer ik het schema, voeg ik de Elo-ratings toe aan de wedstrijdrecords en behandel ik alles wat ontbreekt of misvormd is.
- Gold: de modellingslaag, één nette rij per wedstrijd met alle berekende features, klaar om op te trainen.
Elke laag voedt de volgende, zodat ik als er iets vreemd lijkt, het stap voor stap kan terugzoeken in plaats van alles in één keer te moeten ontwarren. Om het hele pad reproduceerbaar te maken gebruik ik DVC (Data Version Control). Telkens als verse resultaten binnenkomen, bouwt één dvc repro Silver en Gold opnieuw op vanaf Bronze, waarbij een stap alleen wordt herhaald als de input is veranderd, en worden de resulterende datasets geversioneerd zodat elke eerdere staat exact kan worden teruggezet.
Het beste model kiezen
Doelpunten voorspellen is een goed bestudeerd probleem, en er is geen eenduidig beste tool. Dus in plaats van vooraf één aanpak te kiezen, bouwde ik er tien en liet ze concurreren.
De kanshebbers
De tien modellen beslaan vijf families plus een eenvoudige baseline. Je hoeft de interne werking van elk niet te kennen; het punt is dat ze heel andere aannames maken over hoe doelpunten tot stand komen.
| Familie | Modellen | Het kernidee |
|---|---|---|
| Baseline | Mean-rate Poisson | Veronderstelt dat elk team simpelweg een langjarig gemiddelde scoort, alle features negerend. De ondergrens die de rest moet verslaan. |
| Statistisch | Bivariate Poisson, Negative Binomial | Modelleert de twee doelpuntenaantallen rechtstreeks met kansverdelingen die zijn gebouwd voor telgebeurtenissen. |
| Bayesiaans | Bayesiaanse Poisson (MCMC) | Hetzelfde telidee, maar het levert een volledig onzekerheidsbereik rond elke schatting op. Veel zwaarder te berekenen: ongeveer 100 keer trager om te fitten dan de rest. |
| Tijdreeks | SARIMAX | Behandelt de resultaten van een team als een sequentie in de tijd en projecteert die reeks vooruit. |
| Machine learning | Ridge, Random Forest, XGBoost | Leert patronen rechtstreeks uit de features zonder vast te zitten aan een vaste vergelijking. |
| Deep learning | LSTM, 1D CNN | Neurale netwerken die op zoek gaan naar sequentiële en lokale patronen in de data. |
Hoe ze zijn beoordeeld
Met tien kandidaten ging een winnaar met het blote oog kiezen nooit lukken. In plaats daarvan doorloopt elk model drie fasen, en de code besluit of het door mag. Dit is wat code-based deployment betekent: modellen worden van de ene omgeving naar de volgende gepromoveerd door geautomatiseerde checks in plaats van handmatig tunen, zodat de hele selectie reproduceerbaar en eenvoudig te auditen blijft.
- Experiment. Elk model is uitsluitend getraind op interlands die vóór het WK 2022 zijn gespeeld. Niet al die wedstrijden tellen even zwaar: recentere duels en wedstrijden met hogere inzet krijgen meer gewicht (tijdsverval en wedstrijdimportance-weighting), zodat een recente serieuze uitslag het model meer vormt dan een oude oefenpot. De instellingen van elk model worden vervolgens getuned om de Poisson negative log-likelihood (NLL) te minimaliseren via cross-validatie. NLL is simpelweg een score voor hoe goed de voorspelde doelpuntenrates overeenkomen met de doelpunten die teams uiteindelijk maakten, waarbij lager beter is. Het resultaat is de best getunede versie van elk model.
- Kwaliteitsborging. Die getunede modellen worden daarna getest op wedstrijden die ze nooit hebben gezien: het WK 2022 plus zes grote toernooien sindsdien (het EK, twee Afrika Cups, de Copa América, de Azië Cup en de Gold Cup), in totaal 347 wedstrijden. Hier schakelt de maatstaf over naar de ranked probability score (RPS), die meet hoe goed een probabilistische voorspelling is wanneer uitkomsten een natuurlijke volgorde hebben, zoals verlies, gelijk, winst, en die beloont als je met vertrouwen ongeveer de juiste kant op zit. Lager is opnieuw beter. Het sterkste model hier wordt de uitdager. RPS is de juiste maatstaf omdat het echte doel is te voorspellen hoe ver teams komen, niet alleen doeltotalen.
- Uitrollen. De uitdager wordt vergeleken met de regerend kampioen. Als die wint, wordt hij gepromoveerd en opnieuw gefit op alle beschikbare wedstrijden, zodat hij het toernooi ingaat met alle data in het geheugen.
Wat er won
Welke aanpak kwam er dan als beste uit? Hier is het volledige holdout-klassement, beoordeeld met RPS (lager is beter):
| Model | Holdout RPS |
|---|---|
| XGBoost | 0.18289 |
| Bayesian Poisson | 0.18316 |
| Negative Binomial | 0.18373 |
| Bivariate Poisson | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| 1D CNN | 0.20916 |
| Mean-rate Poisson (baseline) | 0.22872 |
Vier dingen vallen op uit deze resultaten:
- XGBoost won, maar nipt. De top vijf modellen (XGBoost, Bayesiaanse Poisson, Negative Binomial, Bivariate Poisson en Random Forest) eindigden binnen ongeveer 0,0011 RPS van elkaar. Als vijf zeer verschillende benaderingen zo dicht bij elkaar eindigen, betekent dat meestal dat het plafond wordt bepaald door de data en features, niet door het model. Hier doet het Elo-verschil zoveel van het werk dat de modelkeuze nauwelijks meetbaar verschil maakt.
- Eén feature domineert. Elo-verschil was met afstand de belangrijkste voorspeller, grofweg honderd keer invloedrijker dan de volgende feature. Dat is geruststellend eerder dan verrassend: in een enkele wedstrijd is het krachtsverschil tussen twee teams echt het grootste deel van het verhaal.
- Deep learning eindigde laatste, op de baseline na. De 1D CNN en LSTM waren de zwakste modellen afgezien van de naïeve baseline. Met slechts zo'n 7.000 wedstrijden om van te leren is er simpelweg niet genoeg data om netwerken met zoveel parameters te voeden; klassieke methoden gaan veel beter om met kleine, gestructureerde datasets.
- Geen teken van overfitting in de klassieke modellen. Normaal doet een model het op onzichtbare data iets slechter dan tijdens training. Hier scoorde bijna elk model (behalve de LSTM) beter op de apart gehouden toernooien dan in cross-validatie. De waarschijnlijke reden is dat toernooivoetbal voorspelbaarder is dan de alledaagse interlandkalender: hogere inzet, sterkere en bekendere teams en neutrale locaties halen wat willekeur uit het spel.
Voor het live toernooi draai ik niet alle tien. Ik houd een kleinere selectie aan: de mean-rate-baseline als referentiepunt, plus de drie beste presteerders. XGBoost en Bayesiaanse Poisson pakken de bovenste twee plekken.
De derde plek is feitelijk een gelijkspel: de Negative Binomial en Bivariate Poisson eindigen binnen 0,0002 RPS van elkaar en wisselen van plek afhankelijk van de random seed. Tussen twee statistisch ononderscheidbare modellen koos ik voor de Bivariate Poisson, waarvan de formulering sterker verankerd is in de voetbalvoorspellingsliteratuur (Karlis en Ntzoufras, 2004).
Dat laat een selectie over van XGBoost (machine learning), Bivariate Poisson (klassieke statistiek) en Bayesiaanse Poisson (Bayesiaanse inferentie). In de volgende sectie lees je hoe die modellen draaien, hertrainen en voorspellingen per wedstrijd omzetten in een toernooivoorspelling.
Naar productie brengen
Een model dat in een notebook leeft is alleen nuttig zolang je ervoor zit. Om wedstrijden gedurende een maandlang toernooi te voorspellen, moet het geheel zelfstandig draaien: nieuwe resultaten ophalen, hertrainen, opnieuw simuleren en de voorspelling verversen zonder dat iemand iets hoeft aan te raken. Dat is het werk van de pijplijn.
De tweeuurlijkse pijplijn op GCP
Het hele project draait als één geplande job op Google Cloud Run. Voor het toernooi wordt het eenmaal per dag wakker; vanaf de openingswedstrijd op 11 juni draait het elke twee uur. Elke run volgt dezelfde cyclus:
- Check op nieuwe data. Als er sinds de vorige run geen wedstrijden zijn afgelopen, is er niets te doen en stopt de job vroegtijdig.
- Inlezen en herbouwen. Als er nieuwe uitslagen zijn binnengekomen, worden ze uit de databronnen opgehaald en bouwt één
dvc reprode Silver- en Gold-lagen opnieuw op zodat de features actueel zijn. - Hertrainen, voorspellen, simuleren. De geselecteerde modellen worden bijgewerkt (straks meer over hoe), elke komende matchup wordt voorspeld en het volledige toernooi wordt gesimuleerd.
- Scoren. Zodra een wedstrijd is beslist, worden de daarvoor gemaakte voorspellingen beoordeeld, wat de monitoring hieronder voedt.
Omdat elke stap door code op schema wordt getriggerd, is er tijdens het toernooi geen handmatig knopgedruk. Nieuwe uitslag erin, ververste voorspelling eruit.
Twee modi: bevroren vs. per ronde
Hier fungeert het project ook als experiment. Tijdens het toernooi draaien de modellen in twee parallelle modi, en het verschil ertussen is de vraag die ik met de data hoop te beantwoorden: maakt hertrainen terwijl het toernooi vordert de voorspellingen beter?
- Bevroren. De modellen worden vergrendeld op het moment dat het toernooi begint en nooit hertraind. Ze reageren nog steeds op uitslagen, omdat elke simulatie start vanuit het geüpdatete schema, maar de modelparameters zelf veranderen niet.
- Per ronde. De hyperparameters (de instellingen op hoog niveau) blijven vast, maar de parameters die het model leert worden opnieuw gefit op alle beschikbare data na elke voltooide speeldag in de groep en elke knock-outronde, zodat de modellen blijven leren van het toernooi terwijl het gebeurt.
Beide naast elkaar laten draaien stelt me in staat ze achteraf op twee fronten te vergelijken: ruwe voorspellingsnauwkeurigheid en hoe snel de onzekerheid van elk model afneemt naarmate het veld uitdunt. Als per ronde wint, is regelmatig hertrainen de moeite waard; als bevroren zich staande houdt, is de extra machine misschien niet nodig.
Van voorspellingen naar een toernooi: de Monte Carlo-simulatie
Eén wedstrijd voorspellen is één ding. Dat omzetten naar "wat is de kans dat elk team het toernooi wint" is waar de Monte Carlo-simulatie om de hoek komt kijken.
Eerst de inferentie. In plaats van alleen de reeds bekende affiches te voorspellen, voorspelt het model elke mogelijke matchup tussen de 48 teams. Dat klinkt overdreven, maar in een toernooi kan elk team in de knock-outs tegen elk ander uitkomen, dus er moet voor elk koppel een voorspelling klaarstaan.
Vervolgens moeten de regels worden gecodeerd, en het format van 2026 maakt dat extra lastig. In de 12 groepen gaan de beste twee automatisch door, maar ook de acht beste nummers drie, en welke knock-outplek elk van die acht krijgt hangt af van uit welke groepen ze komen.
Er zijn 495 manieren om acht kwalificerende groepen uit twaalf te kiezen (twaalf boven acht), en elke combinatie levert een andere set affiches voor de ronde van 32 op. Er is geen nette formule voor; de FIFA publiceert simpelweg een tabel. Dus ik (of beter gezegd mijn zeer capabele collega Cursor) heb alle 495 combinaties hardgecodeerd in een mapping, met de officiële tabel als bron.
"best_third_mappings": {
"EFGHIJKL": {
"74": "3F",
"77": "3G",
"79": "3E",
"80": "3K",
"81": "3I",
"82": "3H",
"85": "3J",
"87": "3L"
},
"DFGHIJKL": ...
Elke key, zoals EFGHIJKL, geeft aan welke acht groepen de doorstromende nummers drie leverden, en de values plaatsen elk van die teams (3E, 3F, enzovoort) in een specifiek wedstrijdnummer van de ronde van 32. Dat is één entry; de volledige mapping herhaalt dit 495 keer, één per combinatie.
De drie gastlanden (de Verenigde Staten, Canada en Mexico) krijgen één extra stukje afhandeling. Wanneer een gastland een wedstrijd speelt in het eigen land, past de simulatie voor die wedstrijd een thuisvoordeelcorrectie toe, terwijl de rest van het toernooi als neutraal terrein wordt behandeld.
Met de voorspellingen en de regels op hun plek draait de simulatie het hele toernooi 10.000 keer. In elke run volgt het deze procedure:
- Trek een uitslag voor elke wedstrijd door thuis- en uitdoelpunten te sampelen uit de door het model voorspelde verdelingen
- Speel de groepsfase uit volgens de echte punten- en tiebreakregels
- Los de best-derde-tabel op
- Vul het knock-outsysteem in volgens de mappings hierboven
- Speel door tot er één kampioen is.
Over 10.000 gesimuleerde toernooien wordt het aandeel runs waarin een team de finale haalt of de beker pakt, de kans van dat team. Eén run is een gok; tienduizend runs is een voorspelling.
Alles bijhouden met MLflow
Elke run tot nu toe, in beide modi, wordt gelogd in MLflow (gehost op DagsHub). Experimenttracking betekent het systematisch vastleggen van de inputs, instellingen, resultaten en outputs van elke run, zodat ze onderling vergeleken of exact gereproduceerd kunnen worden. Een paar zaken die het vastlegt zijn het noemen waard:
- Reproduceerbaarheid. De simulatie gebruikt een vaste random seed afgeleid van de toernooironde, en dezelfde seed wordt gedeeld door de bevroren en per-ronde-modus. Dat betekent dat elk verschil tussen de twee voortkomt uit de modellen zelf, niet uit de geluksfactor binnen de simulatie. Elke run logt ook de exacte datasnapshot die hij zag (het aantal Gold-rijen en een timestamp), zodat resultaten altijd naar hun input zijn terug te herleiden.
- Het experiment. Elke run is getagd met zijn modus (bevroren of per ronde) en zijn fase in de levenscyclus, van experimenteel en QA tot de live inferentie- en refit-runs, in lijn met de promotieflow uit de vorige sectie.
- Vergelijking. Holdout RPS wordt gelogd als selectiecriterium, samen met een verwijzing naar de huidige kampioenrun voor herkomst. Ook de fittingtijd wordt vastgelegd; daar zie je zwart op wit dat het Bayesiaanse model ongeveer 100 keer langzamer traint.
De getrainde modellen en de voorspellingbestanden zelf (de toernooikansen, groepsstanden en wedstrijdfuncties) worden opgeslagen als run-artifacts, en precies die files leest het live dashboard. Daarmee is de cirkel rond: van ruwe uitslagen, via training en simulatie, naar de cijfers die je online ziet.
Monitoren op drift
Het laatste onderdeel draait zodra wedstrijden zijn beslist. Als echte uitslagen binnenkomen, worden de daarvoor gemaakte voorspellingen beoordeeld en vergeleken met de eenvoudige mean-rate-baseline. Als de volledige modellen terrein beginnen te verliezen tegen een model dat niets van de teams weet, is dat een waarschuwingssignaal voor drift: de patronen die vóór het toernooi zijn geleerd, sluiten mogelijk niet meer aan bij wat er op het veld gebeurt.
Hierop letten is standaardpraktijk voor elk systeem dat live voorspellingen doet, en je kunt meer lezen over hoe het wordt gedetecteerd in deze gids over datadrift en modeldrift.
Dus, wie wint het WK?
Na al die machinekamer, hier is waar het voor dient.
De favorieten
Per 10 juni 2026, de dag voor de openingswedstrijd, is het oordeel van het model aan de top duidelijk en vlak daarachter dicht op elkaar. Spanje en Argentinië voeren het veld aan, elk met grofweg 16% kans om de beker te pakken. Dat de regerend wereldkampioen (Argentinië) en de regerend Europees kampioen (Spanje) bovenaan eindigen is een geruststellende sanity check dat het model in de realiteit geworteld is.
Daarachter volgt een compacte achtervolgende groep: Frankrijk, Engeland, Brazilië en Colombia maken de meest waarschijnlijke winnaars compleet. Dit zijn live cijfers, en ze bewegen zodra echte uitslagen binnenkomen, dus behandel ze als een momentopname van 10 juni in plaats van een vaste profetie. Het dashboard toont altijd de actuele cijfers, met maximaal twee uur vertraging.
Het live dashboard
Daarover gesproken: elk cijfer in dit artikel komt uit een live Streamlit-app die automatisch bijwerkt terwijl de pijplijn draait. Je kunt hem openen op wc2026-predictions.streamlit.app en het toernooi volgen. Er zijn vier hoofdweergaven:
- Toernooioverzicht: in één oogopslag hoe ver elk team naar verwachting komt.
- Groepsstanden: per groep de kans voor elk team om eerste, tweede, derde (opgesplitst in derde-en-door versus derde-en-uit, dankzij de best-derde-regel) of vierde te eindigen.
- Wedstrijdvoorspellingen: per groepsduel de kans op thuiswinst, gelijkspel of uitwinst, plus het meest waarschijnlijke knock-outschema.
- Meest voorkomende knock-outaffiches: de koppelingen die de simulatie het vaakst oplevert.
Eén eigenaardigheid om te benoemen in de wedstrijdweergave: een paar teams verschijnen tegelijk in twee mogelijke plekken voor de ronde van 32. Dat is geen bug. Het gebeurt als een groep zo in balans is dat het model niet met vertrouwen kan zeggen welke kwalificatiepositie een team pakt. Gecombineerd met de onzekerheid rond de beste derdes leiden de twee uitkomsten tot verschillende knock-outplekken. In het geval van Turkije leidde het er zelfs toe dat ze twee keer in de achtste finales stonden.
De volgende grafiek toont de eindrondes (kwartfinales tot en met de finale) die het XGBoost-model projecteert vóór de aftrap van het toernooi:

Het muntje-op team: Verenigde Staten
De lol van een model als dit zit in de teams die het oogtestbeeld tarten, en het duidelijkste voorbeeld zijn de Verenigde Staten. Als je naar het toernooioverzicht op het dashboard gaat, valt meteen op dat de VS in kleur uitspringt.
Als co-gastheer voor eigen publiek verwacht je misschien een comfortabele start, maar het model is veel voorzichtiger: het geeft ze slechts ongeveer 54,6% kans om de groep te overleven, de 13e laagste in het hele veld (bedenk dat twee derde van de teams doorgaat!), omdat hun groep met Australië, Paraguay en Turkije uitzonderlijk in balans is.
Het interessante komt daarna. Eenmaal nipt door, hangen de VS vervolgens in elke ronde rond grofweg een muntje-op. Tel die coinflips bij elkaar op en ze komen uit op zo'n 2% kans om het hele toernooi te winnen, wat de 13e hoogste is van alle 48 teams.
Een ploeg die 13e van onderen staat qua kans om uit de groep te komen en 13e van boven om het toernooi te winnen, is zo ongeveer de perfecte definitie van een muntje-op team: nooit de favoriet, nooit kansloos.
Slotgedachten
Dit project was een hoop werk, en het beslaat veel meer dan in één artikel past. De repo bevat veel wat hier niet in paste: de volledige set kandidaatmodellen, de feature-engineering en de orkestratie die alles draaiende houdt, om maar wat te noemen.
Voor nu heeft het model zijn keuzes gemaakt, en het toernooi zal de rechter zijn. Of je nu voor de MLOps of voor het voetbal kwam, ik hoop dat je net zo geniet van het verloop als ik. Je kunt de livevoorspelling volgen zodra de wedstrijden binnenkomen en zien hoe goed de voorspellingen standhouden.
Wil je wat dieper in een paar van de concepten duiken die ik noemde, dan raad ik onze cursus MLOps Concepts aan.
Tom is data scientist en technisch docent. Hij schrijft en beheert de data science-tutorials en blogposts van DataCamp. Eerder werkte Tom in data science bij Deutsche Telekom.

