Fairness-metrics: demographic parity en equal opportunity
U meet het verschil in demographic parity en het verschil in equal opportunity voor een model dat leningaanvragen goedkeurt, en bepaalt of het model beschermde groepen benadeelt.
Fairness-metrics: demographic parity en equal opportunity is een gratis Machine Learning Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Machine Learning Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Machine Learning Academy bevat in totaal 4 lessen.
Waarom eerlijkheid in ML belangrijk is
Machine-learningmodellen die op historische gegevens zijn getraind, kunnen bestaande maatschappelijke vooroordelen in stand houden en versterken. Een model voor kredietgoedkeuring dat op eerdere goedkeuringen is getraind, kan beschermde groepen systematisch krediet weigeren, niet vanwege hun kredietwaardigheid, maar vanwege discriminerende historische patronen in de trainingsgegevens. Eerlijkheidsmaatstaven kwantificeren in hoeverre een model verschillende demografische groepen verschillend behandelt, zodat auditors en engineers discriminerend gedrag kunnen opsporen en corrigeren.
Beschermde kenmerken en groepen
Een beschermd kenmerk is een demografische eigenschap die geen invloed zou mogen hebben op beslissingen met grote gevolgen — meestal ras, gender, leeftijd, religie of een beperking. Een beschermde groep is de deelverzameling voorbeelden die dezelfde waarde van dat kenmerk hebben (bijvoorbeeld vrouwelijke aanvragers). Bij een eerlijkheidsanalyse vergelijk je de modeluitkomsten voor deze groepen. Zelfs als het beschermde kenmerk uit de kenmerkset is verwijderd, kunnen proxykenmerken (zoals een postcode) het nog steeds coderen.
import pandas as pd
import numpy as np
# Toy loan dataset
np.random.seed(42)
df = pd.DataFrame({
'income': np.random.normal(50000, 15000, 1000),
'credit_score': np.random.normal(650, 80, 1000),
'gender': np.random.choice(['M', 'F'], 1000),
'approved': np.random.choice([0, 1], 1000, p=[0.4, 0.6])
})
# Simulate a biased approval: female applicants approved 10% less
df.loc[df['gender'] == 'F', 'approved'] = (
df.loc[df['gender'] == 'F', 'approved'] * 0.85
).round().astype(int).clip(0, 1)
print(df.groupby('gender')['approved'].mean())Demografische pariteit
Demografische pariteit (ook statistische pariteit genoemd) vereist dat het aandeel positieve voorspellingen in alle demografische groepen gelijk is. Als een model 70% van de mannelijke aanvragers goedkeurt, maar slechts 55% van de vrouwelijke aanvragers, is de demografische pariteit geschonden. Het verschil in demografische pariteit is het absolute verschil tussen de percentages positieve voorspellingen van de groepen; een waarde van nul betekent perfecte pariteit.
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
features = ['income', 'credit_score']
X = df[features].values
y = df['approved'].values
g = df['gender'].values
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = LogisticRegression()
model.fit(X_scaled, y)
y_pred = model.predict(X_scaled)
# Demographic parity difference
rate_M = y_pred[g == 'M'].mean()
rate_F = y_pred[g == 'F'].mean()
print(f'Approval rate M: {rate_M:.3f}')
print(f'Approval rate F: {rate_F:.3f}')
print(f'Demographic parity difference: {abs(rate_M - rate_F):.3f}')Gelijke kansen
Gelijke kansen vereisen dat het percentage echte positieven (recall) in alle groepen gelijk is — met andere woorden: gekwalificeerde aanvragers uit elke groep moeten dezelfde kans hebben om terecht te worden goedgekeurd. In tegenstelling tot demografische gelijkheid houdt gelijke kansen rekening met het werkelijke label. Daarom hoeven ongekwalificeerde aanvragers niet te worden goedgekeurd om gelijkheid te bereiken. Het criterium richt zich specifiek op de fout waarbij verdienstelijke leden van een beschermde groep over het hoofd worden gezien.
from sklearn.metrics import recall_score
# True positive rate per group (recall among actually qualified)
mask_M = g == 'M'
mask_F = g == 'F'
tpr_M = recall_score(y[mask_M], y_pred[mask_M])
tpr_F = recall_score(y[mask_F], y_pred[mask_F])
print(f'True positive rate M (recall): {tpr_M:.3f}')
print(f'True positive rate F (recall): {tpr_F:.3f}')
print(f'Equal opportunity difference: {abs(tpr_M - tpr_F):.3f}')
# A value > 0.05 is often flagged as meaningful unfairnessGelijkgetrokken kansen
Gelijkgetrokken kansen vormen een strenger criterium waarbij zowel het percentage echte positieven ALS het percentage valse positieven in alle groepen gelijk moet zijn. Dit voorkomt dat het model gekwalificeerde aanvragers uit minderheidsgroepen tegelijk te weinig goedkeurt (laag percentage echte positieven) en ongekwalificeerde aanvragers uit meerderheidsgroepen te veel goedkeurt (hoog percentage valse positieven). Dit is het gebruikelijke eerlijkheidscriterium in juridische contexten zoals de Amerikaanse Equal Credit Opportunity Act.
from sklearn.metrics import confusion_matrix
def false_positive_rate(y_true, y_pred):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
return fp / (fp + tn) if (fp + tn) > 0 else 0.0
fpr_M = false_positive_rate(y[mask_M], y_pred[mask_M])
fpr_F = false_positive_rate(y[mask_F], y_pred[mask_F])
print(f'FPR M: {fpr_M:.3f} TPR M: {tpr_M:.3f}')
print(f'FPR F: {fpr_F:.3f} TPR F: {tpr_F:.3f}')
print(f'Equalized odds: TPR diff={abs(tpr_M-tpr_F):.3f}, FPR diff={abs(fpr_M-fpr_F):.3f}')Afwegingen tussen eerlijkheid en nauwkeurigheid
Het voldoen aan eerlijkheidsbeperkingen gaat vaak ten koste van de algehele nauwkeurigheid of winst. Dit is de afweging tussen eerlijkheid en nauwkeurigheid. Onmogelijkheidstellingen (Chouldechova 2017, Kleinberg 2016) laten zien dat demografische gelijkheid, gelijke kansen en kalibratie niet allemaal tegelijkertijd kunnen worden bereikt wanneer de basispercentages tussen groepen verschillen. De keuze van het te optimaliseren eerlijkheidscriterium is daarom een waardekeuze waarbij domeinexperts en betrokken gemeenschappen moeten worden betrokken, niet alleen datawetenschappers.
# Visualise trade-off: adjust threshold per group
import numpy as np
proba = model.predict_proba(X_scaled)[:, 1]
# Without fairness: single 0.5 threshold
y_single = (proba >= 0.5).astype(int)
# With equal opportunity: lower threshold for F to equalise TPR
# Find threshold for F that gives same TPR as M
tpr_target = recall_score(y[mask_M], y_single[mask_M])
print(f'Target TPR from M group: {tpr_target:.3f}')
for thresh in np.arange(0.3, 0.7, 0.01):
y_adj = proba[mask_F] >= thresh
if recall_score(y[mask_F], y_adj) >= tpr_target:
print(f'Threshold for F to achieve equal opportunity: {thresh:.2f}')
breakDe bibliotheek fairlearn
De bibliotheek fairlearn van Microsoft biedt eerlijkheidsmaten en algoritmen voor biasbeperking via een API die compatibel is met scikit-learn. Gebruik MetricFrame om een willekeurige maat in één aanroep per groep uit te splitsen. Zo worden verschillen in de volledige reeks maten zichtbaar zonder handmatige indexering. Installeer de bibliotheek met pip install fairlearn.
from fairlearn.metrics import MetricFrame, demographic_parity_difference
from fairlearn.metrics import equalized_odds_difference
from sklearn.metrics import accuracy_score, precision_score, recall_score
mf = MetricFrame(
metrics={
'accuracy': accuracy_score,
'precision': precision_score,
'recall': recall_score
},
y_true=y,
y_pred=y_pred,
sensitive_features=g
)
print(mf.by_group)
print('Demographic parity diff:', demographic_parity_difference(y, y_pred, sensitive_features=g))
print('Equalized odds diff:', equalized_odds_difference(y, y_pred, sensitive_features=g))Kalibratie tussen groepen
Kalibratie vereist dat van alle aanvragers aan wie een voorspelde kans van X% is toegekend, ongeveer X% daadwerkelijk tot de positieve klasse behoort — en dit moet afzonderlijk binnen elke demografische groep gelden. Slechte kalibratie binnen een groep betekent dat het model voor een beschermde groep systematisch te veel of te weinig zekerheid heeft, waardoor risicogestuurde beslissingen zoals kredietbeoordeling worden vertekend. Gebruik betrouwbaarheidsdiagrammen of sklearn.calibration.calibration_curve per groep om dit te controleren.
from sklearn.calibration import calibration_curve
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
for group in ['M', 'F']:
mask = g == group
prob_true, prob_pred = calibration_curve(
y[mask], proba[mask], n_bins=5
)
ax.plot(prob_pred, prob_true, marker='o', label=f'gender={group}')
ax.plot([0, 1], [0, 1], 'k--', label='Perfect calibration')
ax.set(xlabel='Mean predicted probability', ylabel='Fraction of positives')
ax.legend()
plt.title('Calibration curves by gender')
plt.tight_layout()
plt.savefig('calibration_by_group.png', dpi=150)Intersectionele eerlijkheid
Intersectionele eerlijkheid houdt tegelijkertijd rekening met combinaties van beschermde kenmerken. Een model kan afzonderlijk demografische gelijkheid voor gender en ras bereiken, maar toch zwarte vrouwen als subgroep discrimineren. fairlearn MetricFrame handelt dit automatisch af wanneer je meerdere gevoelige kolommen als een DataFrame doorgeeft. Het berekent dan maten voor elke combinatie (gender × ras).
import pandas as pd
from fairlearn.metrics import MetricFrame
from sklearn.metrics import accuracy_score
# Add a second protected attribute
df['race'] = np.random.choice(['A', 'B'], len(df))
sensitive_df = df[['gender', 'race']]
mf_intersect = MetricFrame(
metrics={'accuracy': accuracy_score},
y_true=y,
y_pred=y_pred,
sensitive_features=sensitive_df
)
print(mf_intersect.by_group)
print('Worst accuracy subgroup:', mf_intersect.by_group.min())Het juiste eerlijkheidscriterium kiezen
Verschillende toepassingen vragen om verschillende eerlijkheidscriteria. Voor voorspelling van recidive zijn gelijke kansen (gelijke recall onder mensen die niet opnieuw de fout ingaan) van het grootste belang. Voor hulpmiddelen bij werving voorkomt demografische gelijkheid systematische ondervertegenwoordiging. Voor medische screening zorgen gelijkgetrokken kansen ervoor dat geen enkele groep onevenredig vaak wordt gemist. Vastleggen welk criterium is gekozen en waarom, is een belangrijk onderdeel van verantwoorde AI-praktijk en modelkaarten.
# Decision guide: which metric to use
criteria_guide = {
'hiring / college admission': 'Demographic parity — equal representation',
'medical screening': 'Equal opportunity — equalise recall (catch all sick patients)',
'fraud / recidivism': 'Equalized odds — control both FPR and TPR',
'credit scoring': 'Calibration — predicted risk reflects actual risk per group'
}
for use_case, criterion in criteria_guide.items():
print(f'{use_case}: {criterion}')Beperkingen van eerlijkheidsmaten
Eerlijkheidsmaten meten statistische verschillen, niet de onderliggende oorzaken. Een model kan demografische gelijkheid bereiken en toch individuele beslissingen nemen op basis van beschermde kenmerken via gecorreleerde surrogaatkenmerken. Bovendien gaan al deze maten uit van binaire gevoelige kenmerken en binaire uitkomsten; eerlijkheid in de echte wereld is complexer. Maten moeten worden aangevuld met kwalitatieve methoden: betrokkenheid van de gemeenschap, controles van processen en effectbeoordelingen vóór ingebruikname.
# Summary of limitations
limitations = [
'Proxy features (zip code, surname) can encode protected attributes even when removed',
'Satisfying one fairness criterion can violate another (impossibility theorem)',
'Metrics are group-level averages; individual unfairness can persist',
'Binary group splits may hide variation within groups',
'Historical data reflects past discrimination; fair training data is often unavailable'
]
for i, lim in enumerate(limitations, 1):
print(f'{i}. {lim}')Kennischeck
Toets je begrip van de concepten uit deze les over Machine Learning met Python.
Samenvatting van de les
In deze les heb je geleerd dat demografische gelijkheid gelijke percentages positieve voorspellingen in alle groepen vereist, dat gelijke kansen gelijke recall (percentages echte positieven) vereisen en dat gelijkgetrokken kansen daarnaast gelijke percentages valse positieven vereisen. Je hebt ook gezien dat deze criteria niet allemaal tegelijkertijd kunnen worden bereikt wanneer de basispercentages verschillen, en dat de bibliotheek fairlearn het berekenen van maten op groepsniveau eenvoudig maakt. Hierna bekijken we concrete strategieën om de bias te beperken die deze maten zichtbaar maken.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Fairness-metrics: demographic parity en equal opportunity” gratis?
Ja — de volledige tekst van “Fairness-metrics: demographic parity en equal opportunity” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Machine Learning Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Machine Learning Academy bevat in totaal 4 lessen.
Wat leer ik in “Fairness-metrics: demographic parity en equal opportunity”?
U meet het verschil in demographic parity en het verschil in equal opportunity voor een model dat leningaanvragen goedkeurt, en bepaalt of het model beschermde groepen benadeelt. Je oefent met Machine Learning Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Machine Learning Academy te beginnen?
Ervaring vooraf is niet nodig. Machine Learning Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Fairness-metrics: demographic parity en equal opportunity”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Machine Learning Academy?
Ja. Elke les over Machine Learning Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- SHAP-waarden: globale en lokale feature importance
- LIME: lokale, interpreteerbare modelagnostische verklaringen
- Fairness-metrics: demographic parity en equal opportunity
- Strategieën voor biasbeperking: pre-processing, in-processing en post-processing