Metriche di fairness: parità demografica e pari opportunità
Misurerà la differenza di parità demografica e la differenza di pari opportunità su un modello per l'approvazione di prestiti e individuerà se il modello svantaggia gruppi protetti.
Metriche di fairness: parità demografica e pari opportunità è una lezione Machine Learning Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Machine Learning Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Machine Learning Academy include 4 lezioni in totale.
Perché la fairness nel ML è importante
I modelli di machine learning addestrati su dati storici possono perpetuare e amplificare i bias già presenti nella società. Un modello per l'approvazione dei prestiti addestrato sulle approvazioni passate può negare sistematicamente il credito a gruppi protetti, non a causa della loro affidabilità creditizia, ma per via di schemi storici discriminatori presenti nei dati di addestramento. Le metriche di fairness quantificano in quale misura un modello tratta diversamente i diversi gruppi demografici, consentendo ad auditor e ingegneri di rilevare e correggere i comportamenti discriminatori.
Attributi e gruppi protetti
Un attributo protetto è una caratteristica demografica che non dovrebbe influenzare le decisioni ad alto impatto, in genere razza, genere, età, religione o disabilità. Un gruppo protetto è il sottoinsieme di esempi che condividono un valore di tale attributo (ad esempio, le candidate). L'analisi della fairness confronta gli esiti del modello tra questi gruppi. Anche se l'attributo protetto viene rimosso dall'insieme delle feature, le feature proxy (ad esempio, il codice postale) possono comunque codificarlo.
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())Parità demografica
La parità demografica (chiamata anche parità statistica) richiede che la proporzione di predizioni positive sia uguale in tutti i gruppi demografici. Se un modello approva il 70% delle richieste presentate da uomini, ma solo il 55% di quelle presentate da donne, la parità demografica è violata. La differenza di parità demografica è il divario assoluto tra i tassi di predizioni positive dei gruppi; un valore pari a zero indica una parità perfetta.
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}')Pari opportunità
Le pari opportunità richiedono che il tasso di veri positivi (recall) sia uguale tra i gruppi: in altre parole, le persone candidate idonee di ogni gruppo devono avere la stessa probabilità di essere approvate correttamente. A differenza della parità demografica, le pari opportunità condizionano il risultato all'etichetta reale e quindi non richiedono di approvare persone candidate non idonee per raggiungere la parità. Mirano in particolare a evitare l'errore di escludere persone meritevoli appartenenti a un gruppo protetto.
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 unfairnessOdds equalizzate
Le odds equalizzate sono un criterio più rigoroso che richiede che sia il tasso di veri positivi SIA il tasso di falsi positivi siano uguali tra i gruppi. In questo modo si impedisce al modello di approvare contemporaneamente troppo poche persone candidate appartenenti a minoranze e idonee (TPR basso) e troppe persone candidate appartenenti alla maggioranza e non idonee (FPR alto). È il criterio standard di equità utilizzato in contesti giuridici come l'Equal Credit Opportunity Act statunitense.
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}')Compromessi tra equità e accuratezza
Soddisfare i vincoli di equità spesso comporta un costo in termini di accuratezza complessiva o di profitto. Questo è il compromesso tra equità e accuratezza. I teoremi di impossibilità (Chouldechova 2017, Kleinberg 2016) mostrano che parità demografica, pari opportunità e calibrazione non possono essere soddisfatte simultaneamente quando i tassi di base differiscono tra i gruppi. La scelta del criterio di equità da ottimizzare è quindi un giudizio di valore che deve coinvolgere esperti del settore e le comunità interessate, non soltanto chi si occupa di data science.
# 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}')
breakLa libreria fairlearn
La libreria fairlearn di Microsoft fornisce metriche di equità e algoritmi di mitigazione tramite un'API compatibile con scikit-learn. Utilizzi MetricFrame per calcolare con una sola chiamata qualsiasi metrica suddivisa per gruppo, mettendo in evidenza le disparità nell'intero insieme di metriche senza dover gestire manualmente gli indici. Installi la libreria con 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))Calibrazione tra i gruppi
La calibrazione richiede che, tra tutte le persone candidate a cui viene assegnata una probabilità prevista pari a X%, circa X% appartenga effettivamente alla classe positiva; questo deve valere separatamente all'interno di ciascun gruppo demografico. Una calibrazione insufficiente tra i gruppi significa che il modello è sistematicamente troppo o troppo poco sicuro per un gruppo protetto, distorcendo decisioni basate sul rischio come la valutazione del merito creditizio. Per verificarla, utilizzi diagrammi di affidabilità oppure sklearn.calibration.calibration_curve per ogni gruppo.
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)Equità intersezionale
L'equità intersezionale considera simultaneamente le combinazioni di attributi protetti. Un modello può raggiungere la parità demografica per il genere e per l'etnia singolarmente, ma discriminare comunque le donne nere come sottogruppo. MetricFrame di fairlearn gestisce automaticamente questo caso quando si passano più colonne sensibili sotto forma di DataFrame, calcolando le metriche per ogni combinazione (genere × etnia).
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())Scegliere il criterio di equità appropriato
Applicazioni diverse richiedono criteri di equità diversi. Per la previsione della recidiva, le pari opportunità (rendere uguale il recall tra le persone che non commetteranno nuovamente un reato) sono fondamentali. Per gli strumenti di selezione del personale, la parità demografica previene la sottorappresentazione sistemica. Per lo screening medico, le odds equalizzate garantiscono che nessun gruppo venga escluso in misura sproporzionata. Documentare quale criterio è stato scelto e per quale motivo è una parte fondamentale delle pratiche di IA responsabile e delle model card.
# 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}')Limiti delle metriche di equità
Le metriche di equità misurano le disparità statistiche, non le cause profonde. Un modello può soddisfare la parità demografica e continuare a prendere decisioni individuali basate su attributi protetti attraverso proxy correlati. Inoltre, tutte queste metriche presuppongono attributi sensibili binari e risultati binari; l'equità nel mondo reale è più complessa. Le metriche devono essere affiancate da metodi qualitativi: coinvolgimento della comunità, audit dei processi e valutazioni dell'impatto prima della messa in produzione.
# 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}')Verifica rapida
Verifichi la Sua comprensione dei concetti di Machine Learning con Python trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che: la parità demografica richiede tassi uguali di previsioni positive tra i gruppi, le pari opportunità richiedono lo stesso recall (tasso di veri positivi) e le odds equalizzate richiedono inoltre tassi uguali di falsi positivi. Ha inoltre visto che questi criteri non possono essere soddisfatti tutti simultaneamente quando i tassi di base differiscono e che la libreria fairlearn semplifica il calcolo delle metriche a livello di gruppo. Ora esamineremo strategie concrete per mitigare i bias messi in evidenza da queste metriche.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Metriche di fairness: parità demografica e pari opportunità» è gratuita?
Sì — il testo completo di «Metriche di fairness: parità demografica e pari opportunità» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Machine Learning Academy, passa a CoddyKit PRO. Il corso Machine Learning Academy include 4 lezioni in totale.
Cosa imparerò in «Metriche di fairness: parità demografica e pari opportunità»?
Misurerà la differenza di parità demografica e la differenza di pari opportunità su un modello per l'approvazione di prestiti e individuerà se il modello svantaggia gruppi protetti. Eserciti Machine Learning Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Machine Learning Academy?
Non è richiesta alcuna esperienza precedente. Machine Learning Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Metriche di fairness: parità demografica e pari opportunità»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Machine Learning Academy?
Sì. Ogni lezione Machine Learning Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Valori SHAP: importanza globale e locale delle feature
- LIME: spiegazioni locali e interpretabili indipendenti dal modello
- Metriche di fairness: parità demografica e pari opportunità
- Strategie di mitigazione dei bias: pre-processing, in-processing e post-processing