- Je telt TP/FP/TN/FN per expliciete groep en berekent drie verschillende conditionele maten.
- Je onderscheidt demographic parity, equal opportunity en equalized odds en bewaart ontbrekende groepsinformatie.
Een helpdeskmodel kiest welke meldingen extra aandacht krijgen. Het team wil weten of groepen op dezelfde manier worden behandeld. Welke fouten moet je daarvoor vergelijken?
Denk aan twee bakken met kaartjes: urgente en gewone meldingen. Je kunt tellen hoeveel kaartjes worden geselecteerd, hoeveel urgente kaartjes worden gevonden, of hoeveel gewone kaartjes onterecht worden geselecteerd. Die vragen hebben verschillende noemers.
Je gebruikt uitsluitend verzonnen groepen a en b met volledige, gedeclareerde binaire labels. Een groepsmaat beschrijft dit voorbeeld; hij bepaalt niet zelfstandig wat maatschappelijk eerlijk is. Eerst maak je zichtbaar wat je eigenlijk vergelijkt.
1. Bewaar de vier soorten beslissingen
Een echte positieve beslissing (true positive, TP) vindt een urgent kaartje. Een foutpositieve beslissing (false positive, FP) selecteert een gewoon kaartje. TN en FN tellen respectievelijk terecht overgeslagen gewone kaartjes en gemiste urgente kaartjes.
Groep a heeft twee urgente en twee gewone meldingen. Het model vindt één urgente melding en selecteert daarnaast één gewone. Groep b heeft één urgente en drie gewone meldingen; daar worden alle vier correct behandeld.
| Groep | TP | FP | TN | FN | |---|---:|---:|---:|---:| | a | 1 | 1 | 1 | 1 | | b | 1 | 0 | 3 | 0 |
y = [1,1,0,0,1,0,0,0]
p = [1,0,1,0,1,0,0,0]
g = ['a']*4 + ['b']*4
counts = group_confusions(
y,p,g,['a','b'])
for row in counts:
print(row['tp'],row['fp'])
# 1 1
# 1 0
Een expliciet gevraagde groep blijft ook zonder waargenomen rijen aanwezig, met vier nullen. Zo verdwijnt ontbrekende informatie niet stilletjes uit het verslag. De groepsvolgorde blijft de volgorde die jij hebt opgegeven.
012. Kies de juiste bak als noemer
De selectieratio deelt geselecteerde meldingen door alle meldingen. Het vindpercentage voor positieven (true positive rate, TPR) kijkt alleen naar urgente meldingen. Het foutpositieve percentage (false positive rate, FPR) kijkt juist alleen naar gewone meldingen.
Kies welke kaartjes in de noemer horen. Bekijk ook een groep zonder positieve labels en gelijke TPR/FPR bij verschillende base rates.
TPR: gevonden positieven deelt door werkelijke positieven. De balk toont alleen een percentage als die noemer positief is.
Groep a4 rijen
- TP
- 1
- FP
- 1
- TN
- 1
- FN
- 1
50%1 / 2 werkelijke positieven
Accuracy ter context: 50%. Accuracy heeft alle rijen als noemer.
Groep b4 rijen
- TP
- 1
- FP
- 0
- TN
- 3
- FN
- 0
100%1 / 1 werkelijke positieven
Accuracy ter context: 100%. Accuracy heeft alle rijen als noemer.
Grootste verschil voor deze maat: 0,5. Dit verschil kiest zelf geen acceptabele grens.
Alle groepen en rijen zijn verzonnen. Dit zijn empirische maten op gedeclareerde labels, geen causaal oordeel of algemene fairnessgarantie. Een ontbrekende maat is onbekend, geen gemeten nul.
Noem het aantal meldingen in groep g n_g. TP_g, FP_g, TN_g en FN_g zijn de vier tellingen uit die groep. In de volgende breuken bepaalt de noemer welke kaartjes mogen meetellen.
Bij a worden twee van vier kaartjes geselecteerd, één van twee urgente gevonden en één van twee gewone verkeerd geselecteerd. Alle drie fracties zijn een half. Bij b zijn die fracties een kwart, één en nul.
rates = conditional_rates(counts)
for row in rates:
print(row['selection_rate'],
row['tpr'],row['fpr'])
# 0.5 0.5 0.5
# 0.25 1.0 0.0
Bewaar de noemers naast de fracties. Een TPR van nul betekent dat aanwezige urgente meldingen allemaal zijn gemist. Zonder urgente meldingen kun je die TPR helemaal niet berekenen: de code geeft dan None.
023. Verschillende maten stellen verschillende eisen
Gelijke selectieratio’s heten demographic parity. Equal opportunity vergelijkt TPR; equalized odds vergelijkt zowel TPR als FPR. Dat zijn afzonderlijke empirische criteria, geen uitwisselbare definities van algemene eerlijkheid.
Voor een bekende groepsmaat r_g gebruik je het grootste verschil tussen groepen. Noem dat verschil Δr; max en min nemen de hoogste en laagste waarde. Voor equalized odds neem je het grootste van het TPR-verschil en het FPR-verschil.
In ons handvoorbeeld is het selectieverschil een kwart. Beide conditionele verschillen zijn een half, dus de equalized-odds-gap is ook een half. De functie rapporteert die verschillen, zonder zelf een moreel acceptabele grens te kiezen.
gaps = fairness_gaps(rates)
print(gaps['selection_gap'])
print(gaps['equalized_odds_gap'])
# 0.25
# 0.5
Een andere verhouding urgente en gewone meldingen heet een andere base rate. Daardoor kunnen gelijke TPR en FPR toch samengaan met verschillende totale accuracy en selectieratio’s. Kijk dus niet alleen naar een mooie gelijkheid, maar ook naar de populatie en de gekozen noemers.
03Wat als een groep niet te beoordelen is?
Ontbreekt voor één gevraagde groep een benodigde maat, dan blijft de bijbehorende gap onbekend. De ontbrekende groep laten vallen zou de vergelijking gunstiger kunnen laten lijken. Het verslag bewaart daarom welke groepen informatie missen.
sparse = group_confusions(
[1,0],[1,0],['a','b'],['a','b','c'])
missing = conditional_rates(sparse)
print(missing[1]['tpr'])
print(fairness_gaps(missing)[
'equalized_odds_gap'])
# None
# None
De gapfunctie controleert aangeleverde samenvattingen, niet hun herkomst of de kwaliteit van labels. Verkeerde labels, kleine steekproeven en niet-gemeten groepen verdwijnen niet door een kleine gap. Een causaal oordeel of juridische beoordeling vraagt meer dan deze tabel.
Wat je nu kunt
- Je telt beslissingen per expliciete groep en bewaart ontbrekende groepen.
- Je kiest de juiste noemer voor selectie, TPR en FPR.
- Je onderscheidt criteria en behandelt ontbrekende informatie als onbekend.
Hierna verander je beslisdrempels: welke fouten verschuiven, welk criterium kies je en wat blijft overeind op andere gegevens?