Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus
Mittaatte demografisen pariteetin eron ja yhtäläisen mahdollisuuden eron lainahyväksyntämallissa sekä tunnistatte, asettaako malli suojatut ryhmät epäedulliseen asemaan.
Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Miksi reiluus on tärkeää koneoppimisessa
Historialliseen dataan koulutetut koneoppimismallit voivat ylläpitää ja voimistaa yhteiskunnassa jo olemassa olevia vinoumia. Aiempiin hyväksyntöihin perustuva lainanmyöntömalli saattaa systemaattisesti evätä luoton suojatuilta ryhmiltä, ei heidän luottokelpoisuutensa vuoksi vaan koulutusdatan syrjivien historiallisten käytäntöjen takia. Reiluusmittarit ilmaisevat, missä määrin malli kohtelee eri väestöryhmiä eri tavoin, ja auttavat tarkastajia ja insinöörejä havaitsemaan ja korjaamaan syrjivän toiminnan.
Suojatut ominaisuudet ja ryhmät
Suojattu ominaisuus on väestöön liittyvä ominaisuus, jonka ei pitäisi vaikuttaa merkittäviä seurauksia sisältäviin päätöksiin – tyypillisesti rotu, sukupuoli, ikä, uskonto tai vammaisuus. Suojattu ryhmä on niiden esimerkkien osajoukko, joilla on sama tämän ominaisuuden arvo (esimerkiksi naispuoliset hakijat). Reiluusanalyysissä verrataan mallin tuloksia näiden ryhmien välillä. Vaikka suojattu ominaisuus poistettaisiin piirrejoukosta, sijaispiirteet (kuten postinumero) voivat silti koodata sen.
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())Demografinen yhdenvertaisuus
Demografinen yhdenvertaisuus (josta käytetään myös nimitystä tilastollinen yhdenvertaisuus) edellyttää, että positiivisten ennusteiden osuus on sama kaikissa väestöryhmissä. Jos malli hyväksyy 70 % mieshakijoista mutta vain 55 % naishakijoista, demografinen yhdenvertaisuus ei toteudu. Demografisen yhdenvertaisuuden ero on ryhmien positiivisten ennusteosuuksien absoluuttinen ero; nolla tarkoittaa täydellistä yhdenvertaisuutta.
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}')Yhdenvertaiset mahdollisuudet
Yhdenvertaiset mahdollisuudet edellyttävät, että tosipositiivinen osuus (recall) on sama kaikissa ryhmissä – toisin sanoen pätevillä hakijoilla on kaikissa ryhmissä sama todennäköisyys tulla hyväksytyiksi oikein. Toisin kuin demografinen pariteetti, yhdenvertaiset mahdollisuudet perustuvat todelliseen luokkaan, joten ep pätevien hakijoiden hyväksymistä ei edellytetä pariteetin saavuttamiseksi. Kriteeri kohdistuu erityisesti virheeseen, jossa suojatun ryhmän ansaitsevat jäsenet jäävät hyväksymättä.
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 unfairnessYhtäläiset oddsit
Yhtäläiset oddsit ovat tiukempi kriteeri, joka edellyttää, että sekä tosipositiivinen osuus ETTÄ väärien positiivisten osuus ovat samat kaikissa ryhmissä. Näin estetään tilanne, jossa malli samanaikaisesti hyväksyy liian harvoin päteviä vähemmistöhakijoita (matala TPR) ja liian usein epäpäteviä enemmistöhakijoita (korkea FPR). Se on vakiintunut oikeudenmukaisuuskriteeri oikeudellisissa yhteyksissä, kuten Yhdysvaltojen Equal Credit Opportunity Act -laissa.
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}')Oikeudenmukaisuuden ja tarkkuuden kompromissit
Oikeudenmukaisuusrajoitteiden täyttäminen heikentää usein kokonaistarkkuutta tai tuottoa. Tätä kutsutaan oikeudenmukaisuuden ja tarkkuuden kompromissiksi. Mahdottomuustulokset (Chouldechova 2017, Kleinberg 2016) osoittavat, että demografista pariteettia, yhdenvertaisia mahdollisuuksia ja kalibrointia ei voida saavuttaa samanaikaisesti, kun ryhmien perusasteet poikkeavat toisistaan. Sen määrittäminen, mitä oikeudenmukaisuuskriteeriä optimoidaan, on siksi arvovalinta, johon on osallistettava toimialan asiantuntijoita ja vaikutusten kohteena olevia yhteisöjä – ei ainoastaan datatieteilijöitä.
# 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}')
breakfairlearn-kirjasto
Microsoftin fairlearn-kirjasto tarjoaa oikeudenmukaisuusmittareita ja vinouman lieventämisalgoritmeja scikit-learn-yhteensopivalla rajapinnalla. Laske MetricFrame-luokan avulla mikä tahansa mittari ryhmittäin yhdellä kutsulla. Näin havaitset erot koko mittarijoukossa ilman manuaalista indeksointia. Asenna kirjasto komennolla 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))Kalibrointi ryhmissä
Kalibrointi edellyttää, että kaikista hakijoista, joille annetaan ennustetuksi todennäköisyydeksi X %, noin X % kuuluu todellisuudessa positiiviseen luokkaan – ja tämän on toteuduttava erikseen jokaisessa demografisessa ryhmässä. Ryhmien heikko kalibrointi tarkoittaa, että malli on suojatun ryhmän kohdalla järjestelmällisesti liian varma tai liian epävarma, mikä vääristää riskiperusteisia päätöksiä, kuten luottopisteytystä. Tarkista tämä käyttämällä luotettavuuskaavioita tai sklearn.calibration.calibration_curve-funktiota ryhmittäin.
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)Risteävä oikeudenmukaisuus
Risteävä oikeudenmukaisuus tarkastelee suojattujen ominaisuuksien yhdistelmiä samanaikaisesti. Malli voi saavuttaa demografisen pariteetin sukupuolen ja etnisen taustan osalta erikseen, mutta silti syrjiä alaryhmänä mustia naisia. fairlearn-kirjaston MetricFrame käsittelee tämän automaattisesti, kun välität useita arkaluonteisia sarakkeita DataFrame-objektina. Se laskee mittarit jokaiselle (sukupuoli × etninen tausta) -yhdistelmälle.
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())Oikean oikeudenmukaisuuskriteerin valitseminen
Eri sovellukset edellyttävät erilaisia oikeudenmukaisuuskriteerejä. Uusintarikollisuuden ennustamisessa yhdenvertaiset mahdollisuudet (recall-arvon yhtäläistäminen niiden keskuudessa, jotka eivät syyllisty uudelleen) ovat ensisijaisia. Rekrytointityökaluissa demografinen pariteetti ehkäisee järjestelmällistä aliedustusta. Lääketieteellisessä seulonnassa yhtäläiset oddsit varmistavat, ettei mitään ryhmää jää suhteettoman usein tunnistamatta. Käytetyn kriteerin ja sen perustelujen dokumentointi on keskeinen osa vastuullista tekoälyä ja model cards -dokumentaatiota.
# 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}')Oikeudenmukaisuusmittareiden rajoitukset
Oikeudenmukaisuusmittarit mittaavat tilastollisia eroja, eivät niiden perimmäisiä syitä. Malli voi täyttää demografisen pariteetin vaatimukset ja silti tehdä yksilöitä koskevia päätöksiä suojattujen ominaisuuksien perusteella korreloivien sijaismuuttujien avulla. Lisäksi kaikki nämä mittarit olettavat, että arkaluonteiset ominaisuudet ja tulokset ovat binäärisiä; todellisen maailman oikeudenmukaisuus on monimutkaisempaa. Mittareita tulee täydentää laadullisilla menetelmillä, kuten yhteisöjen osallistamisella, prosessien auditoinneilla ja vaikutustenarvioinneilla ennen käyttöönottoa.
# 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}')Pikatarkistus
Testaa, miten hyvin ymmärrät tämän oppitunnin Pythonia hyödyntävän koneoppimisen käsitteet.
Oppitunnin kertaus
Tässä oppitunnissa opit, että demografinen pariteetti edellyttää samaa positiivisten ennusteiden osuutta kaikissa ryhmissä, yhdenvertaiset mahdollisuudet edellyttävät samaa recall-arvoa (tosipositiivista osuutta) ja yhtäläiset oddsit edellyttävät lisäksi samoja väärien positiivisten osuuksia. Näit myös, ettei kaikkia näitä kriteerejä voida täyttää samanaikaisesti, kun perusasteet poikkeavat ryhmien välillä, ja että fairlearn-kirjasto tekee ryhmätason mittareiden laskemisesta suoraviivaista. Seuraavaksi tutustumme konkreettisiin strategioihin näiden mittareiden paljastaman vinouman lieventämiseksi.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus” ilmainen?
Kyllä – oppitunnin ”Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus”?
Mittaatte demografisen pariteetin eron ja yhtäläisen mahdollisuuden eron lainahyväksyntämallissa sekä tunnistatte, asettaako malli suojatut ryhmät epäedulliseen asemaan. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?
Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- SHAP-arvot: piirteiden globaali ja paikallinen tärkeys
- LIME: paikalliset, tulkittavat ja mallista riippumattomat selitykset
- Reiluusmittarit: demografinen pariteetti ja yhtäläinen mahdollisuus
- Vinouman lieventämisstrategiat: esikäsittely, käsittelyn aikainen ja jälkikäsittely