Machine Learning Academy · leksjon

Rettferdighetsmål: demografisk paritet og like muligheter

Mål forskjellen i demografisk paritet og forskjellen i like muligheter for en modell som godkjenner lån, og identifiser om modellen stiller beskyttede grupper dårligere.

Leksjon 3 av 413 trinn

Rettferdighetsmål: demografisk paritet og like muligheter er en gratis leksjon i Machine Learning Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Machine Learning Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Hvorfor rettferdighet i ML er viktig

Maskinlæringsmodeller som trenes på historiske data, kan videreføre og forsterke eksisterende samfunnsmessige skjevheter. En modell for lånegodkjenning som er trent på tidligere godkjenninger, kan systematisk avslå kreditt for beskyttede grupper, ikke på grunn av kredittverdigheten deres, men på grunn av diskriminerende historiske mønstre i treningsdataene. Rettferdighetsmål kvantifiserer i hvilken grad en modell behandler ulike demografiske grupper forskjellig, slik at revisorer og utviklere kan oppdage og korrigere diskriminerende atferd.

Beskyttede attributter og grupper

Et beskyttet attributt er en demografisk egenskap som ikke bør påvirke beslutninger med store konsekvenser – vanligvis etnisitet, kjønn, alder, religion eller funksjonsnedsettelse. En beskyttet gruppe er delmengden av eksempler som deler en verdi for dette attributtet (for eksempel kvinnelige søkere). Rettferdighetsanalyse sammenligner modellens resultater på tvers av disse gruppene. Selv om det beskyttede attributtet fjernes fra egenskapssettet, kan proxy-egenskaper (for eksempel postnummer) fortsatt kode det inn.

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())

Demografisk paritet

Demografisk paritet (også kalt statistisk paritet) krever at andelen positive prediksjoner er lik i alle demografiske grupper. Hvis en modell godkjenner 70 % av mannlige søkere, men bare 55 % av kvinnelige søkere, er demografisk paritet brutt. Forskjellen i demografisk paritet er det absolutte avviket mellom gruppenes rater for positive prediksjoner. En verdi på null betyr perfekt paritet.

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}')

Like muligheter

Like muligheter krever at andelen sanne positive (recall) er lik på tvers av grupper – med andre ord skal kvalifiserte søkere fra alle grupper ha samme sannsynlighet for å bli godkjent. I motsetning til demografisk paritet tar like muligheter hensyn til den sanne etiketten, og krever derfor ikke at ukvalifiserte søkere godkjennes for å oppnå paritet. Kriteriet retter seg spesifikt mot feilen å overse kvalifiserte medlemmer av en beskyttet gruppe.

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 unfairness

Equalized odds

Equalized odds er et strengere kriterium som krever at både andelen sanne positive OG andelen falske positive er lik på tvers av grupper. Dette hindrer modellen i samtidig å godkjenne for få kvalifiserte søkere fra minoritetsgrupper (lav TPR) og godkjenne for mange ukvalifiserte søkere fra majoritetsgrupper (høy FPR). Dette er det standardiserte rettferdighetskriteriet som brukes i juridiske sammenhenger, for eksempel i den amerikanske loven US 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}')

Avveininger mellom rettferdighet og nøyaktighet

Det å oppfylle krav til rettferdighet går ofte på bekostning av den samlede nøyaktigheten eller fortjenesten. Dette kalles avveiningen mellom rettferdighet og nøyaktighet. Umulighetsteoremer (Chouldechova 2017, Kleinberg 2016) viser at demografisk paritet, like muligheter og kalibrering ikke kan oppfylles samtidig når grunnratene er forskjellige mellom grupper. Valget av hvilket rettferdighetskriterium som skal optimaliseres, er derfor en verdibasert vurdering som må involvere domeneeksperter og berørte lokalsamfunn, ikke bare dataforskere.

# 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}')
        break

Biblioteket fairlearn

Microsofts fairlearn-bibliotek tilbyr rettferdighetsmål og algoritmer for begrensning av skjevhet gjennom et scikit-learn-kompatibelt API. Bruk MetricFrame til å beregne et vilkårlig mål fordelt på grupper i ett kall. Da synliggjøres forskjeller på tvers av hele målesettet uten manuell indeksering. Installer med 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))

Kalibrering på tvers av grupper

Kalibrering krever at blant alle søkere som får en predikert sannsynlighet på X %, skal omtrent X % faktisk tilhøre den positive klassen – og dette må gjelde separat innenfor hver demografiske gruppe. Dårlig kalibrering for en gruppe betyr at modellen systematisk er for sikker eller for usikker på vegne av en beskyttet gruppe, noe som forvrenger risikobaserte beslutninger som kredittscoring. Bruk reliabilitetsdiagrammer eller sklearn.calibration.calibration_curve for hver gruppe for å kontrollere dette.

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)

Interseksjonell rettferdighet

Interseksjonell rettferdighet vurderer kombinasjoner av beskyttede egenskaper samtidig. En modell kan oppnå demografisk paritet for kjønn og etnisitet hver for seg, men likevel diskriminere mot svarte kvinner som undergruppe. fairlearn MetricFrame håndterer dette automatisk når De oppgir flere sensitive kolonner som en DataFrame, og beregner mål for hver kombinasjon av (kjønn × etnisitet).

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())

Velge riktig rettferdighetskriterium

Ulike bruksområder krever ulike rettferdighetskriterier. For prediksjon av tilbakefall i kriminalitet er like muligheter avgjørende – tilbakekallingen må være lik blant dem som ikke begår nye lovbrudd. For verktøy for rekruttering hindrer demografisk paritet systematisk underrepresentasjon. For medisinsk screening sikrer equalized odds at ingen grupper blir oversett i uforholdsmessig stor grad. Å dokumentere hvilket kriterium som ble valgt, og hvorfor, er en viktig del av ansvarlig AI-praksis og model cards.

# 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}')

Begrensninger ved rettferdighetsmål

Rettferdighetsmål måler statistiske forskjeller, ikke de underliggende årsakene. En modell kan oppfylle demografisk paritet og likevel ta individuelle beslutninger basert på beskyttede egenskaper gjennom korrelerte stedfortredere. I tillegg antar alle disse målene binære sensitive egenskaper og binære utfall, mens rettferdighet i den virkelige verden er mer kompleks. Målene bør suppleres med kvalitative metoder: involvering av lokalsamfunn, prosessrevisjoner og konsekvensutredninger før utrulling.

# 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}')

Kort kontroll

Test forståelsen Deres av konseptene innen Machine Learning with Python fra denne leksjonen.

Oppsummering av leksjonen

I denne leksjonen lærte De at: demografisk paritet krever like andeler positive prediksjoner på tvers av grupper, like muligheter krever lik tilbakekalling (andeler sanne positive), og equalized odds krever i tillegg like andeler falske positive. De så også at disse kriteriene ikke kan oppfylles samtidig når grunnratene er forskjellige, og at biblioteket fairlearn gjør det enkelt å beregne mål på gruppenivå. Neste gang ser vi på konkrete strategier for å redusere skjevheten som disse målene avdekker.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Rettferdighetsmål: demografisk paritet og like muligheter» gratis?

Ja – hele teksten i «Rettferdighetsmål: demografisk paritet og like muligheter» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Machine Learning Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Rettferdighetsmål: demografisk paritet og like muligheter»?

Mål forskjellen i demografisk paritet og forskjellen i like muligheter for en modell som godkjenner lån, og identifiser om modellen stiller beskyttede grupper dårligere. Du øver på Machine Learning Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Machine Learning Academy?

Ingen tidligere erfaring er nødvendig. Machine Learning Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Rettferdighetsmål: demografisk paritet og like muligheter»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Machine Learning Academy-leksjonen?

Ja. Alle Machine Learning Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. SHAP-verdier: global og lokal funksjonsviktighet
  2. LIME: Lokale, tolkbare og modellagnostiske forklaringer
  3. Rettferdighetsmål: demografisk paritet og like muligheter
  4. Strategier for å redusere skjevhet: før-, under- og etterbehandling
← Tilbake til Machine Learning Academy