Cursus
Voetbal voorspellen is lastig. Het is een sport met weinig doelpunten, waar één van richting veranderd schot de uitslag kan kantelen, en een flink deel van elke wedstrijd op geluk aankomt. Internationaal voetbal is nog lastiger: nationale teams spelen maar een handvol competitieve duels per jaar, dus er is veel minder data om van te leren dan in clubcompetities.
Alsof dat nog niet genoeg was, heeft FIFA het dit jaar nog ingewikkelder gemaakt. 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 de kansen in de groepsfase onvoorspelbaar worden. Omdat ik wel houd van een uitdaging (en van voetbal), is dat precies wat ik ben gaan voorspellen.
Dit is een vervolg op mijn EURO 2024-voorspellingsproject, bijna volledig opnieuw opgebouwd. Vorige keer werkte ik uitsluitend in Jupyter-notebooks en voorspelde ik per wedstrijd één meest waarschijnlijke score. Dit keer bouwde ik een end-to-end MLOps-pijplijn die nieuwe uitslagen ophaalt, zichzelf hertraint en een Monte Carlo-simulatie van het hele toernooi 10.000 keer draait, zodat wedstrijdvoorspellingen worden omgezet in kansen op 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 uiteindelijk internationale wedstrijden het best voorspelt. Je vindt de volledige code in de projectrepo. En natuurlijk vertel ik je wie het model als winnaar aanwijst. (Spoiler: het is gecharmeerd van Spanje en Argentinië met elk zo’n 16%, maar het interessante is vooral hoe het daar komt.)
Ben je nu in toernooistemming, bekijk dan de opnames van onze sessies van de Data & AI World Cup, of doe mee aan onze FIFA World Cup 2026 Prediction-competitie. De winnaar ontvangt niet alleen een officieel WK-shirt, maar ook een abonnement van 3 maanden op Claude Enterprise. Blijf op de hoogte via het live klassement.
FIFA World Cup 2026-voorspelling
In een notendop
- Dit is een end-to-end MLOps-pijplijn die het WK 2026 voorspelt, actuele interlanduitslagen 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 bijna niet van elkaar te onderscheiden, en het Elo-verschil tussen teams doet het grootste deel van het voorspellende werk.
- Een Monte Carlo-simulatie speelt het hele toernooi 10.000 keer, en zet wedstrijdniveau-doelpuntenvoorspellingen om in de kansen per team om door te gaan en te winnen.
- Op 10 juni 2026 zijn de favorieten van het model Spanje en Argentinië, met elk 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 maar zo goed als wat je erin stopt, dus het is de moeite waard om te beginnen bij de grondstoffen. Het model leert van twee live databronnen en zet die om in één nette featuretabel.
Waar de data vandaan komt
Alles is opgebouwd uit twee bronnen. API-Football levert het speelschema en wedstrijdstatistieken: wie tegen wie, wanneer, waar en hoe het eindigde. eloratings.net levert Elo-ratings voor elk nationaal team.
Een Elo-rating is één getal dat aangeeft hoe sterk een team is. Elk team staat ergens op die schaal, en na elke wedstrijd wordt de rating bijgewerkt: win van een sterkere tegenstander en je wint veel; verlies van een zwakkere en je zakt flink. Het idee komt uit het schaken en past goed op 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 ongeveer 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, gelijk of verlies, voorspelt het model iets fijnmazigers: het aantal doelpunten dat elk team in een wedstrijd maakt. Doelpuntentellingen in voetbal volgen, bij benadering, een Poissonverdeling, de standaardmanier om te modelleren hoe vaak een relatief zeldzame gebeurtenis plaatsvindt in een vaste tijdsperiode.
Doelpunten in plaats van uitslagen voorspellen maakt alles wat volgt mogelijk. Zodra het model een plausibele score kan produceren voor elke matchup, kun je de vragen waar het iedereen om te doen is — 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 ratingverschil tussen de twee teams. Dit is veruit de belangrijkste feature in het model, met een belangrijkheid grofweg twee ordes groter dan de volgende. Dat past bij de intuïtie: het krachtsverschil tussen de twee ploegen zegt meer over de waarschijnlijke uitslag dan bijna alles anders.
- Elo-som: de twee ratings bij elkaar opgeteld, als maat voor de algehele kwaliteit van de wedstrijd. Het verschil alleen kan Argentinië tegen Spanje niet onderscheiden van San Marino tegen Andorra: twee evenwichtige affiches op totaal verschillend niveau; de som herstelt die informatie.
- Rollende Elo-verandering (laatste 5 wedstrijden): hoeveel de rating van elk team recent is verschoven. Dit vangt vorm, en houdt al rekening met de sterkte van de tegenstanders.
- Rollende doelpunten voor en tegen (laatste 5 wedstrijden): recente aanvallende en verdedigende output in absolute termen, per team berekend.
- Wedstrijdcontext: het competitieniveau (een WK-duel weegt anders dan een kwalificatiewedstrijd of Nations League-duel), of het een knock-out is en of er op neutraal terrein wordt gespeeld.
Elke feature is strikt lekvrij, wat betekent dat elke alleen informatie gebruikt die vóór de aftrap beschikbaar was. Dat klinkt vanzelfsprekend, maar het is een van de makkelijkste manieren om per ongeluk een model te bouwen dat in tests briljant oogt en in de praktijk instort.
Eén idee haalde het niet: ik had een set "speelstijl"-features gepland, gebouwd door teams te clusteren op basis van hun in-game statistieken, een stap met unsupervised learning. In de praktijk scheidden de teams zich niet in betekenisvolle groepen, dus in plaats van het model met ruis te voeden, heb ik het geschrapt. Negatieve resultaten zijn ook resultaten.
De data reproduceerbaar houden
Omdat data 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 deze binnenkomt, onaangeroerd.
- Silver: opgeschoond en gestandaardiseerd. Hier koppel ik teamnamen tussen de twee bronnen (ze zijn zelden eensgezind in spelling), valideer ik het schema, voeg ik de Elo-ratings aan de wedstrijdrecords toe en verwerk ik alles wat ontbreekt of misvormd is.
- Gold: de modellingslaag, één nette rij per wedstrijd met alle features berekend en klaar om op te trainen.
Elke laag voedt de volgende, zodat ik, wanneer iets vreemd lijkt, het stap voor stap kan terugtraceren in plaats van alles in één keer te moeten ontwarren. Om het hele pad reproduceerbaar te maken, gebruik ik DVC (Data Version Control). Telkens wanneer nieuwe uitslagen binnenkomen, bouwt één dvc repro Silver en Gold opnieuw op uit Bronze, voert een stap alleen opnieuw uit als de inputs zijn gewijzigd en versieert de resulterende datasets zodat elke eerdere staat exact kan worden teruggehaald.
Het beste model kiezen
Doelpunten voorspellen is een goed bestudeerd probleem en er is geen één evident hulpmiddel voor. Dus in plaats van vooraf één aanpak te kiezen, bouwde ik er tien en liet ik ze concurreren.
De kanshebbers
De tien modellen bestrijken vijf families plus een eenvoudige baseline. Je hoeft de interne werking van elk model niet te kennen; het punt is dat ze heel verschillende aannames maken over hoe doelpunten tot stand komen.
| Familie | Modellen | Het kernidee |
|---|---|---|
| Baseline | Poisson met gemiddeld tempo | Neemt aan dat elk team simpelweg een langetermijngemiddelde scoort en negeert alle features. Een ondergrens voor de anderen om te verslaan. |
| Statistisch | Bivariate Poisson, Negatieve binomiaal | Modelleer de twee doelpuntentellingen direct met kansverdelingen voor telgebeurtenissen. |
| Bayesiaans | Bayesiaanse Poisson (MCMC) | Hetzelfde telidee, maar dan met een volledig onzekerheidsbereik rond elke schatting. Veel zwaarder om te berekenen: grofweg 100 keer trager te fitten dan de rest. |
| Tijdreeks | SARIMAX | Behandelt de resultaten van een team als een sequentie in de tijd en projecteert die door. |
| Machine learning | Ridge, Random Forest, XGBoost | Leert patronen rechtstreeks uit de features zonder zich te binden 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 beoordeeld zijn
Met tien kandidaten was een winnaar met het blote oog kiezen onbegonnen werk. In plaats daarvan doorloopt elk model drie fases, en de code bepaalt of het door mag. Dit is wat codegebaseerde deployment betekent: modellen worden gepromoveerd van de ene omgeving naar de volgende door geautomatiseerde checks in plaats van handmatige afstemming, zodat de hele selectie reproduceerbaar en goed te auditen blijft.
- Experiment. Elk model wordt alleen getraind op interlands die zijn gespeeld vóór het WK 2022. Niet al die wedstrijden tellen even zwaar: recente duels en duels met hogere inzet krijgen meer gewicht (tijdsverval en belang van de wedstrijd), zodat een recente competitieve uitslag het model meer vormt dan een oude oefenpot. De instellingen van elk model worden vervolgens afgestemd om de Poisson negative log-likelihood (NLL) te minimaliseren met cross-validatie. NLL is simpelweg een score voor hoe goed de voorspelde doelpuntensnelheden overeenkomen met de doelpunten die teams uiteindelijk maakten, waarbij lager beter is. Het resultaat is de best afgestelde versie van elk model.
- Kwaliteitscontrole. Die afgestelde modellen worden vervolgens 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 metriek over naar de ranked probability score (RPS), die meet hoe goed een probabilistische voorspelling is wanneer de uitkomsten een natuurlijke volgorde hebben, zoals verlies, gelijk, winst, en die beloont dat je zelfverzekerd 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 het aantal doelpunten.
- Deploy. De uitdager wordt vergeleken met de regerend kampioen. Als hij 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 als beste uit de bus? Hier is het volledige holdout-leaderboard, beoordeeld met RPS (lager is beter):
| Model | Holdout RPS |
|---|---|
| XGBoost | 0.18289 |
| Bayesiaanse Poisson | 0.18316 |
| Negatieve binomiaal | 0.18373 |
| Bivariate Poisson | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| 1D CNN | 0.20916 |
| Poisson met gemiddeld tempo (baseline) | 0.22872 |
Vier dingen vallen op aan deze resultaten:
- XGBoost won, maar nipt. De top vijf modellen (XGBoost, Bayesiaanse Poisson, Negatieve binomiaal, Bivariate Poisson en Random Forest) eindigden binnen circa 0,0011 RPS van elkaar. Wanneer vijf heel 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 zó veel werk dat de modelkeuze nauwelijks verschil maakt.
- Eén feature domineert. Elo-verschil was met afstand de belangrijkste voorspeller, ongeveer 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 als laatste, de baseline uitgezonderd. De 1D CNN en LSTM waren de zwakste modellen naast 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 kunnen veel beter overweg met kleine, gestructureerde datasets.
- Geen teken van overfitting bij de klassieke modellen. Normaal gesproken doet een model het op onzichtbare data wat slechter dan tijdens training. Hier scoorde bijna elk model (behalve de LSTM) beter op de achtergehouden toernooien dan in cross-validatie. De waarschijnlijke reden is dat toernooivoetbal voorspelbaarder is dan de doorsnee interlandkalender: hogere inzet, sterkere en meer bekende teams, en neutraal terrein halen een deel van de willekeur weg.
Voor het live toernooi draai ik niet alle tien. Ik houd een kleinere selectie aan: de baseline met gemiddeld tempo als referentiepunt, plus de drie beste presteerders. XGBoost en Bayesiaanse Poisson pakken de bovenste twee plekken.
De derde plek is feitelijk een gelijkspel: de Negatieve binomiaal en Bivariate Poisson eindigen binnen 0,0002 RPS van elkaar en wisselen van plek afhankelijk van de random seed, dus tussen twee statistisch niet te onderscheiden 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 staat hoe die modellen draaien, hertrainen en voorspellingen per wedstrijd omzetten in een toernooiverwachting.
Naar productie brengen
Een model dat in een notebook leeft, is alleen nuttig zolang je ervoor zit. Om wedstrijden gedurende een toernooi van een maand te voorspellen, moet alles uit zichzelf draaien: nieuwe uitslagen ophalen, hertrainen, opnieuw simuleren en de verwachting verversen zonder dat iemand iets hoeft te doen. 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 één keer per dag wakker; vanaf de openingswedstrijd op 11 juni draait het elke twee uur. Elke run volgt dezelfde cyclus:
- Controleer 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. Wanneer er nieuwe uitslagen zijn, worden ze opgehaald uit de databronnen en bouwt één
dvc reprode Silver- en Gold-lagen opnieuw op zodat de features actueel zijn. - Hertrainen, voorspellen, simuleren. De geselecteerde modellen worden bijgewerkt (zo meteen meer), elke komende matchup wordt voorspeld en het volledige toernooi wordt gesimuleerd.
- Scoren. Zodra een wedstrijd is beslist, worden de daarvoor gemaakte voorspellingen gescoord, 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, vernieuwde verwachting eruit.
Twee modi: bevroren vs. per ronde
Hier fungeert het project ook als experiment. Tijdens het toernooi draaien de modellen parallel in twee modi, en het verschil ertussen is de vraag die ik met data wil beantwoorden: Maakt hertrainen terwijl het toernooi vordert de voorspellingen beter?
- Bevroren. De modellen worden op het moment van de aftrap vastgezet en niet meer hertraind. Ze reageren nog wel op uitslagen, omdat elke simulatie start vanuit het geüpdatete schema, maar de modelparameters zelf veranderen niet.
- Per ronde. De hyperparameters (de instellingen op hoofdlijnen) blijven vast, maar de parameters die het model leert worden na elke voltooide groepsspeeldag en elke knock-outronde opnieuw gefit op alle beschikbare data, zodat de modellen blijven leren van het toernooi terwijl het plaatsvindt.
Beide naast elkaar laten lopen maakt het mogelijk ze achteraf op twee fronten te vergelijken: de ruwe voorspellende nauwkeurigheid 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 machinekamer misschien niet nodig.
Van voorspellingen naar 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 binnenkomt.
Eerst inferentie. In plaats van alleen de al bekende affiches te voorspellen, voorspelt het model elke mogelijke matchup tussen de 48 teams. Dat klinkt overdreven, maar in een toernooi kan elk team elk ander treffen in de knock-outs, dus er moet voor elke koppeling 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; FIFA publiceert simpelweg een tabel. Dus heb ik (of beter gezegd mijn zeer capabele collega Cursor) 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 sleutel, zoals EFGHIJKL, geeft aan uit welke acht groepen de doorgeschoven nummers drie kwamen, en de waarden plaatsen elk van die teams (3E, 3F, enzovoort) in een specifiek wedstrijdnummer in de ronde van 32. Dat is één item; de volledige mapping herhaalt dit 495 keer, één per combinatie.
De drie gastlanden (de Verenigde Staten, Canada en Mexico) krijgen nog een extra behandeling. Als een gastland speelt in 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 scorelijn voor elke wedstrijd door thuis- en uitdoelpunten te sampelen uit de voorspelde verdelingen van het model
- Speel de groepsfase af volgens de echte punten- en tiebreakregels
- Los de tabel met beste nummers drie op
- Vul het knock-outsysteem in op basis van bovenstaande mappings
- 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 voor dat team. Eén run is een gok; tienduizend runs is een voorspelling.
Alles traceren met MLflow
Elke run tot nu toe, in beide modi, wordt gelogd in MLflow (gehost op DagsHub). Experimenttracking betekent dat je de inputs, instellingen, resultaten en outputs van elke run systematisch vastlegt, zodat ze met elkaar 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 uit de modellen zelf komt, niet uit het toeval binnen de simulatie. Elke run logt ook de exacte datasnapshot die hij zag (het aantal Gold-rijen en een timestamp), zodat resultaten altijd zijn terug te voeren op hun inputs.
- Het experiment. Elke run is getagd met de modus (bevroren of per ronde) en de fase in de levenscyclus, van experimenteel en QA tot de live inferentie- en refitruns, in lijn met de promotiefase uit de vorige sectie.
- Vergelijking. Holdout-RPS wordt gelogd als selectie-metriek, samen met een verwijzing naar de huidige kampioensrun voor lineage. Ook de fittijd wordt vastgelegd, waar het grofweg 100 keer tragere trainen van het Bayesiaanse model zwart-op-wit zichtbaar wordt.
De getrainde modellen en de voorspellingsbestanden zelf (de toernooikansen, groepsstanden en wedstrijdvoorspellingen) worden opgeslagen als run-artifacts, en precies die bestanden 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 gescoord en vergeleken met de eenvoudige baseline met gemiddeld tempo. Als de volledige modellen terrein verliezen ten opzichte van een model dat niets weet over de teams, is dat een waarschuwingssignaal voor drift: de patronen die vóór het toernooi zijn geleerd, sluiten mogelijk niet meer aan op wat er op het veld gebeurt.
Hierop letten is standaardpraktijk voor elk systeem dat live voorspellingen doet, en je kunt meer lezen over hoe dit wordt gedetecteerd in deze gids over datadrift en modeldrift.
Dus, wie wint het WK?
Na al die machinekamer, hier is waar het om draait.
De favorieten
Op 10 juni 2026, de dag voor de openingswedstrijd, is het oordeel van het model aan de top duidelijk en daarachter dicht op elkaar. Spanje en Argentinië gaan aan de leiding, elk met ongeveer 16% kans om de beker te pakken. Dat de regerend wereldkampioen (Argentinië) en de regerend Europees kampioen (Spanje) bovenaan staan, is een geruststellende sanity check dat het model in de realiteit geworteld is.
Daarachter zit een compact jagend peloton: Frankrijk, Engeland, Brazilië en Colombia maken de meest waarschijnlijke winnaars compleet. Dit zijn live cijfers en ze bewegen zodra echte resultaten binnenkomen, dus beschouw ze als een momentopname van 10 juni en niet als een vaststaand orakel. Het dashboard toont altijd de huidige cijfers, met maximaal twee uur vertraging.
Het live dashboard
Daarover gesproken: elk getal in dit artikel komt uit een live Streamlit-app die automatisch bijwerkt terwijl de pijplijn draait. Je opent hem op wc2026-predictions.streamlit.app en kunt 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 beste-derde-regel) of vierde te worden.
- Wedstrijdvoorspellingen: per groepsduel de kans op thuiswinst, gelijkspel of uitwinst, plus het meest waarschijnlijke knock-outsysteem.
- Meest voorkomende knock-outaffiches: de koppelingen die de simulatie het vaakst oplevert.
Eén eigenaardigheid om te noemen in de wedstrijdweergave: een paar teams verschijnen tegelijk op twee mogelijke plekken in de ronde van 32. Dat is geen bug. Het gebeurt wanneer een groep zo in balans is dat het model niet met vertrouwen kan zeggen welke kwalificatiepositie een team inneemt. In combinatie 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 finale stonden.
De volgende grafiek toont de laatste rondes (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 dit soort model zit in de teams die de oogtest tarten, en het duidelijkste voorbeeld zijn de Verenigde Staten. Als je op het dashboard naar het toernooioverzicht gaat, valt meteen op dat de VS er qua kleur uitspringt.
Als co-hosts voor eigen publiek verwacht je misschien een comfortabele start, maar het model is een stuk voorzichtiger: het geeft ze slechts zo’n 54,6% kans om de groep te overleven, de dertiende-laagste van het hele veld (bedenk dat twee derde van de teams doorgaat!), omdat hun groep met Australië, Paraguay en Turkije uitzonderlijk gelijkwaardig is.
Het interessante komt daarna. Als ze erdoorheen glippen, hangen de VS in elke volgende ronde rond grofweg een muntje-op. Stapel die muntjes op en ze komen uit op zo’n 2% kans om het hele toernooi te winnen, wat de dertiende-hoogste is van alle 48 teams.
Een ploeg die 13e van onder staat om uit de groep te komen en 13e van boven om alles te winnen, is zo’n beetje de perfecte definitie van een muntje-op team: nooit de favoriet, nooit kansloos.
Slotgedachten
Dit project was een hoop werk en bestrijkt veel meer dan in één artikel past. De repo bevat genoeg dat 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 kwam of voor het voetbal, ik hoop dat je net zo geniet van het verloop als ik. Je kunt de live verwachting volgen terwijl de wedstrijden binnendruppelen en zien hoe goed de voorspellingen standhouden.
Wil je een paar van de genoemde concepten van dichterbij bekijken, dan raad ik onze cursus MLOps Concepts aan.
Veelgestelde vragen over de voorspelling van de winnaar van het WK 2026
Wie wint het FIFA Wereldkampioenschap 2026?
Op 10 juni 2026, vlak voor de start van het toernooi, maakt het model Spanje en Argentinië gezamenlijke favorieten, elk met ongeveer 16% kans om te winnen, gevolgd door Frankrijk, Engeland, Brazilië en Colombia. Er is geen enkel team dat er mijlenver bovenuit steekt, wat de openheid van het toernooi weerspiegelt. Dit zijn live cijfers die meebewegen met de resultaten; het dashboard toont altijd de actuele nummers.
Hoe accuraat kan een machinelearningmodel voetbal voorspellen?
Internationaal voetbal is lastig te voorspellen: er vallen weinig doelpunten en teams spelen weinig competitieve wedstrijden, dus zelfs een sterk model laat veel aan het toeval over. In dit project eindigden de top vijf modellen allemaal binnen ongeveer 0,001 RPS van elkaar, wat suggereert dat het nauwkeurigheidsplafond vooral wordt bepaald door de beschikbare data en features in plaats van het algoritme. De grootste drijver van de voorspellingen was het Elo-ratingverschil tussen de twee teams.
Waarom het aantal doelpunten voorspellen in plaats van de uitslag?
Door het aantal doelpunten per team te voorspellen in plaats van direct winst, gelijk of verlies, krijg je een volledige kansverdeling over scorelijnen. Dat maakt het mogelijk een heel toernooi te simuleren: zodra je plausibele scorelijnen kunt sampelen, kun je de groepsfase en het knock-outsysteem duizenden keren naspelen en voor elk team de kans op doorgaan of winnen aflezen.
Doelpuntentellingen volgen bovendien redelijk goed een Poissonverdeling, wat bij deze modelleerstijl past.
Wat is een Monte Carlo-simulatie en waarom er 10.000 draaien?
Een Monte Carlo-simulatie speelt een willekeurig proces herhaaldelijk af om kansen te schatten die lastig direct te berekenen zijn. Hier trekt elke run een scorelijn voor elke wedstrijd uit de modelvoorspellingen en speelt het toernooi uit tot een winnaar; dit 10.000 keer doen zet wedstrijdvoorspellingen om in stabiele percentages zoals "Spanje wint ongeveer 16% van de tijd." Eén gesimuleerd toernooi is maar één mogelijke uitkomst, maar tienduizend ervan benaderen de echte spreiding aan mogelijkheden.
Welke tools heb je nodig om zo’n MLOps-pijplijn te bouwen?
De kernonderdelen zijn dataversiebeheer (dit project gebruikt DVC), experimenttracking (MLflow), een manier om jobs op schema te draaien (Google Cloud Run met Cloud Scheduler) en een manier om de resultaten te tonen (een Streamlit-dashboard).
De modellen zelf leunen op een mix van Python-bibliotheken: scikit-learn (Ridge en random forest), XGBoost (de kampioen), statsmodels en SciPy (de Poisson-, bivariate Poisson- en negatieve binomiaalregressies, plus SARIMAX), PyMC (het Bayesiaanse model) en Keras (de LSTM en CNN), met pandas en NumPy voor de data.
Geen van deze is strikt noodzakelijk voor een eenmalig model, maar samen maken ze de pijplijn reproduceerbaar en in staat zichzelf te hertrainen en te verversen zonder handwerk
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.

