Welke incidenten doen ertoe? Ons ML-model voorspelt het β sneller dan het nieuws
Zwaailicht.nu verwerkt elke dag duizenden P2000-meldingen en detecteert daarin automatisch pieken: clusters van meldingen die samen één incident vormen. Maar niet elke piek is even belangrijk. Zes ambulanceritten naar hetzelfde zorgcentrum vormen technisch gezien een piek β maar niemand wil daar een pushmelding over. Een uitslaande brand met vier blusvoertuigen uit drie kazernes? Dat is een ander verhaal.
Tot nu toe bepaalden vuistregels en een taalmodel wat we publiceren. Vanaf vandaag draait er iets nieuws in productie: een machine learning-model dat op het moment van detectie voorspelt welke incidenten ertoe doen. Voor zover wij weten doet geen enkele andere meldingendienst in Nederland dit.
De pers als proxy
“Belangrijk” is een gevaarlijk woord om zelf in te vullen. Wat wij willen voorspellen is betekenis: raakt dit incident mensen, verstoort het iets, wil je het wΓ©ten? Dat is niet rechtstreeks te meten β maar je kunt er wel een goede graadmeter voor vinden. De onze: of er achteraf echte journalistiek over verscheen.
Nieuwsdekking is een prima afspiegeling van wat een regio belangrijk vond, en die proxy hadden we allang in huis. Zwaailicht koppelt al geruime tijd automatisch nieuwsartikelen aan gedetecteerde pieken β gebouwd voor onze verrijkte samenvattingen. Maar zo lag er al een complete trainingsset klaar: al onze historische incidenten mΓ©t de uitkomst of de pers erover schreef. Ons binaire label is dus: verscheen een incident in het nieuws?
Het mooie van deze constructie: het label is achterafkennis, maar de voorspelling is vooruitkijkend. Nieuwsdekking ontstaat uren tot een dag nΓ‘ een incident. Ons model geeft zijn oordeel binnen ongeveer twee minuten na detectie β het is dus wéér sneller dan het nieuws, ditmaal door het voor te spellen in plaats van eraan te koppelen.
De valkuil: berichten van concullega’s
Toen we de gekoppelde artikelen onder de loep namen, bleek ongeveer twee derde automatisch gegenereerd: aggregatorsites, net als zwaailicht, die elke pagermelding doorplaatsen, en β verraderlijker β grote nieuwssites die geautomatiseerde 112-berichten publiceren met koppen als “Reanimatie op [straat] in [stad]”, rechtstreeks uit de pagerfeed gegenereerd.
Je kunt het ze niet kwalijk nemen, maar een robot die over alles schrijft is geen graadmeter voor belang. Daarom filteren we op artikelen waar aantoonbaar een journalist aan te pas kwam. Daarmee veranderde het hele beeld: van de pieken die “nieuws haalden” bleef minder dan zestig procent over.
Eerlijk leren: geen achterafkennis
Een voorspelmodel is waardeloos als het stiekem in de toekomst kijkt. Daarom is het model strikt beperkt tot wat ons systeem ziet op het moment dat een piek ontstaat: de eerste handvol meldingen. Geen samenvattingen achteraf, geen kennis over hoe het incident afliep, geen piekgrootte die pas uren later vaststaat.
Uit die eerste meldingen destilleren we tientallen signalen (features), nogmaals, door gebruik te maken van alle rijke data die we al automagisch uit ruwe P2000-berichten halen. In een paar families:
- Tijdspatroon β hoe snel volgen de meldingen elkaar op?
- Diensten en eenheden β alleen ambulances, of rukken brandweer Γ©n politie samen uit? Hoeveel voertuigen, uit hoeveel kazernes?
- Prioriteit en aard β spoed met zwaailicht, GRIP-opschaling, gevaarlijke stoffen?
- Geografie β snelweg of woonwijk, grote stad of dorp, hoe verspreid?
- De tekst zelf β de ruwe meldingsteksten gaan door Nederlandse taalverwerking; woorden als “uitslaande brand” of “traumahelikopter” wegen zwaar.
De precieze features hou ik graag voor mezelf β dat is inmiddels een van de meest waardevolle onderdelen van Zwaailicht :-).
Werkt het?
We testen op een realistische manier: we trainen het model op het verleden, en evalueren het op de nieuwste week die het nooit heeft gezien. De resultaten:
- Van de tien procent hoogst scorende pieken bleek bijna negen op de tien achteraf daadwerkelijk gedekt door echte journalistiek β tegenover een basiskans van minder dan de helft.
- De voorspelling is er binnen ongeveer twee minuten na de vijfde melding van een incident, en kost milliseconden rekentijd. Geen GPU, geen externe API β het draait gewoon naast de rest van de site.
- De score voorspelt ook hoeveel aandacht een incident krijgt: pieken met drie of meer artikelen scoren systematisch hoger dan pieken met één.
Interessant detail: het model en ons taalmodel (dat samenvattingen schrijft en beoordeelt of meldingen één samenhangend incident vormen) blijken verschillende dingen te meten. Samenhang is niet hetzelfde als belang β dat zorgcentrum met zes ambulances is perfect samenhangend en doet er voor niemand toe. De twee vullen elkaar aan: het taalmodel begrijpt wat er gebeurt, het ML-model voorspelt of het ertoe doet.
Wat merk je ervan?
Vanaf vandaag het meest direct: stillere, betere notificaties. Pieken die samenhangend maar onbelangrijk zijn, posten we niet meer naar push, Bluesky en Telegram. In onze tests verdwijnt zo’n twintig procent van de posts β vrijwel allemaal incidenten waar nooit een journalist over schreef β terwijl het echte nieuws gewoon doorkomt. De score gaat de komende tijd meer aandrijven: denk aan slimmere rangschikking van pieken en een “verwacht in het nieuws”-signaal.
De stack, voor de techneuten
Python, scikit-learn en spaCy (Nederlands taalmodel) voor het ML-werk; alles draait in hetzelfde FastAPI-proces als de rest van Zwaailicht, op dezelfde bescheiden VPS. Het model wordt periodiek opnieuw getraind β en omdat onze nieuwskoppeling voor elke piek blijft draaien (ook de pieken die het model onbelangrijk vindt), controleert het systeem continu zijn eigen voorspellingen. Missers worden vanzelf trainingsdata.
Machine learning hoeft niet groot en duur te zijn. Dit model is klein, snel, uitlegbaar β en het doet één ding dat verder niemand doet: je vertellen dat iets belangrijk is, voordat het nieuws is.
Reacties
Was jij erbij? Laat weten wat je zag.