- Je berekent accuracy en Brier per rijvenster, inclusief een onvolledige staart.
- Je onderscheidt Jensen–Shannon-divergentie, wortelafstand en gekozen alarmgrenzen van bewijs over modelkwaliteit.
Een AI-dienst kan snel blijven reageren terwijl de voorspellingen slechter worden. Andersom kan de invoer sterk veranderen terwijl het model nog steeds goed presteert. Monitoring moet daarom verschillende signalen uit elkaar houden.
Denk aan twee meetpanelen. Het ene vergelijkt voorspellingen met echte labels; het andere vergelijkt de verdeling van nieuwe waarden met een referentie. Een waarschuwing op één paneel vertelt nog niet automatisch wat de oorzaak is.
Je bouwt beide panelen en vervolgens een expliciete signaalregel. We kiezen kleine oefengrenzen om het gedrag te onderzoeken. De voorbeelden leveren geen universele alarmdrempel en bewijzen geen statistische significantie.
1. Kwaliteit vraagt echte uitkomsten
Voor accuracy heb je een juist label nodig. De Brier-score gebruikt bovendien de voorspelde kans s_i en het binaire label y_i: een zelfverzekerde verkeerde voorspelling krijgt een grote kwadratische fout. N is het aantal gelabelde rijen in het venster.
Neem labels [0, 1] en kansen [0,1; 0,8]. Beide beslissingen zijn goed bij drempel 0,5; de kwadratische fouten zijn 0,01 en 0,04, gemiddeld 0,025. Een tweede venster mag dus dezelfde accuracy hebben en toch anders gekalibreerde kansen tonen.
quality = window_quality(
[0,1,1,0,1],
[.1,.8,.4,.2,.6],window=2)
print([row['accuracy']
for row in quality['rows']])
print([round(row['brier'],3)
for row in quality['rows']])
# [1.0, 0.5, 1.0]
# [0.025, 0.2, 0.16]
De vijfde rij blijft een geldig laatste venster. Start en stop verwijzen naar rijposities, met stop exclusief; dit zijn geen kloktijden. Bewaar die grenzen zodat je kunt terugzoeken welke voorbeelden een score bepaalden.
Labels kunnen later binnenkomen of slechts voor een selectie beschikbaar zijn. Vermeld daarom welke gelabelde rijen je meet; verzin geen kwaliteit voor ontbrekende labels. De functie werkt hier met volledig aangeleverde labels.
012. Een verdeling kan veranderen zonder slechter model
Onderzoek eerst afzonderlijk de scoreverdelingen. Dezelfde twee histogramvakken worden op referentie en nieuwe data toegepast. Hun genormaliseerde vakmassa's noemen we p en q; de middenverdeling heet m.
Verander de scores of juist de labels. De histogrammen kennen de labels niet; accuracy en Brier hebben ze wel nodig. Dezelfde vakverdeling kan verschillende ruwe scores verbergen.
| Scorevak | Referentie | Huidig |
|---|---|---|
| V1: [0; 0,25) | 50% | 50% |
| V2: [0,25; 0,5) | 0% | 0% |
| V3: [0,5; 0,75) | 0% | 0% |
| V4: [0,75; 1] | 50% | 50% |
- Accuracy referentie
- 100%
- Accuracy huidig
- 0%
- Brier huidig
- 0,725
- JS-divergentie (ln)
- 0
- Wortelafstand
- 0
| Rijen [start; stop) | Accuracy | Brier |
|---|---|---|
| [0; 2) | 0% | 0,725 |
| [2; 4) | 0% | 0,725 |
Gekozen grenzen overschreden: accuracy ja, Brier ja, verdeling nee. Hier verslechtert de kwaliteit terwijl het histogram gelijk blijft.
Vier vaste onderwijsvoorbeelden, rijvensters en gekozen grenzen: accuracy minimaal 0,8; Brier maximaal 0,25; divergentie maximaal 0,1. Dit zijn onderzoekssignalen, geen universele alarmen, significantietoets of automatische hertraining.
Jensen–Shannon-divergentie J vergelijkt beide verdelingen met dat midden. D staat voor KL-divergentie; we gebruiken natuurlijke logaritmen. Een term met nul massa draagt nul bij, zodat ook lege vakken geldig blijven.
Bij referentie [0, 0] en nieuwe scores [1, 1] liggen alle massa's in tegengestelde vakken. Het midden heeft in ieder vak massa 0,5. Beide KL-termen zijn ln(2), dus J is ongeveer 0,693.
| Scorevak | p | q | |---|---:|---:| | [0; 0,5) | 1 | 0 | | [0,5; 1] | 0 | 1 |
shift = histogram_shift(
[0,0],[1,1],[0,.5,1])
print(round(shift['divergence'],3))
print(round(shift['distance'],3))
# 0.693
# 0.833
De wortelafstand is een andere grootheid: onze tweede uitvoer is de wortel van J, zoals de afstand in de SciPy-bron. Geef de divergentie aan de latere signaalfunctie door. Met natuurlijke log blijft J tussen nul en ln(2).
Histogrammen vergeten ook details binnen ieder vak. Twee verschillende verzamelingen kunnen dezelfde vakmassa's hebben. Interne grenzen horen bij het rechtervak, terwijl de uiterste bovengrens in het laatste vak blijft.
same_bins = histogram_shift(
[.1,.2,.8,.9],
[.15,.25,.75,.95],[0,.5,1])
print(same_bins['divergence'])
# 0.0
023. Houd signalen gescheiden
Bij dezelfde scores en omgekeerde labels kan de kwaliteit volledig instorten terwijl het scorehistogram gelijk blijft. Omgekeerd kunnen nieuwe perfecte voorspellingen een ander histogram hebben doordat de verhouding tussen klassen verandert. Bekijk dus zowel gelabelde fouten als de verschuiving.
scores = [0,0,1,1]
old = window_quality(
[0,0,1,1],scores,window=4)
new = window_quality(
[1,1,0,0],scores,window=4)
print(old['rows'][0]['accuracy'])
print(new['rows'][0]['accuracy'])
print(histogram_shift(
scores,scores,[0,.5,1])
['divergence'])
# 1.0
# 0.0
# 0.0
Maak aparte booleans voor te lage accuracy, te hoge Brier en te hoge divergentie. Needs_review is hun gezamenlijke of: er is iets om te onderzoeken. Gelijkheid aan een gekozen grens telt als toegestaan.
on_edge = monitor_flags(.8,.25,.1)
bad = monitor_flags(0,1,0)
print(on_edge['needs_review'])
print(bad['accuracy'])
print(bad['distribution'])
# False
# True
# False
Een signaal is geen opdracht om automatisch een nieuw model te publiceren. Onderzoek meetfouten, selectie, veranderde omstandigheden en de concrete mislukkingen. Pas daarna kun je een onderbouwde vervolgstap testen.
03Wat neem je mee?
- Accuracy en Brier meten kwaliteit met echte labels.
- Histogramverschil meet een gekozen, grof gemaakte verdeling.
- Bewaar beide signalen en hun meetcontext bij iedere conclusie.
Hierna bepaal je welke bestanden en meetprofielen bij een lokaal apparaatbudget passen.