Equità e bias algoritmico#
Nel 2018 un’inchiesta di Reuters rivela che Amazon aveva accantonato in silenzio, un anno prima, uno strumento sperimentale di selezione del personale [Das18]. L’idea era seducente: dare in pasto a un modello i curriculum degli ultimi dieci anni e lasciargli imparare a riconoscere i candidati «bravi», quelli che in passato erano stati assunti. Il modello imparò benissimo: troppo bene. Poiché quei dieci anni di assunzioni erano stati dominati da uomini, il sistema dedusse che essere uomo fosse un buon segnale: penalizzava i curriculum che contenevano la parola «women’s», cioè «femminile», come nella riga «capitana della squadra di scacchi femminile», e declassava chi aveva studiato in due college per sole donne. Nessuno aveva scritto una regola contro le donne. La regola era stata appresa, letta nel passato dell’azienda e riproposta come profezia.
Bias, qui, vuol dire pregiudizio: quello della storia di Amazon, un trattamento sistematicamente peggiore riservato a un gruppo di persone. Basta questo per leggere la sezione.
Gli altri due significati riguardano chi ha già letto i capitoli precedenti, e restano distinti: non è il bias del neurone (il termine \(b\) che nel capitolo sulle reti neurali si somma ai pesi e sposta la soglia), e non è il bias del compromesso bias-varianza (l’errore sistematico di un modello troppo semplice, nella sezione su overfitting e validazione). Il secondo in particolare è vicino abbastanza da confondere, e non lo è: un modello troppo semplice non per questo discrimina, e un modello che discrimina può essere complicato quanto si vuole.
Torniamo al pregiudizio. Un modello non lo inventa: lo eredita. E per governarlo servono due cose che affronteremo in ordine: prima capire da dove entra il pregiudizio, poi imparare a misurarlo con precisione, riusando la tabella a quattro caselle già vista nel capitolo di Machine Learning ma compilandola gruppo per gruppo. Alla fine ci imbatteremo in una sorpresa scomoda: alcune richieste di equità, per quanto ragionevoli, non possono valere tutte insieme.
Da dove entra il bias#
Il pregiudizio algoritmico non nasce dal codice, che è cieco e indifferente: nasce prima, nei dati, e nelle scelte con cui li abbiamo raccolti e poi etichettati, cioè con cui accanto a ogni esempio abbiamo scritto la risposta che il modello doveva imparare a dare («questo candidato era bravo», «questa persona ha commesso un reato»).
Fig. 37.1 Il bias non attraversa il modello e si ferma: torna indietro. Le decisioni di oggi diventano i dati di domani, e il giro seguente parte da una disparità un po’ più marcata.#
La freccia di ritorno in Fig. 37.1 è la ragione per cui il problema non si risolve una volta sola. Un sistema che seleziona candidati genera i dati sulle assunzioni future: se ha escluso un gruppo, il prossimo addestramento troverà davvero meno esempi di successo in quel gruppo, e ne diffiderà a ragion veduta. Sui dati avrà ragione; sulle persone no. Il pregiudizio si fabbrica le proprie prove. Gli studi su questo argomento (per esempio la rassegna di Mehrabi e colleghi [MMS+21]) distinguono alcune sorgenti ricorrenti.
Un apprendista impara il mestiere guardando solo le decisioni prese in passato dai suoi capi, e non chiede mai se fossero giuste. Erediterà la loro bravura, e anche le loro storture. Con i dati succede lo stesso, e le storture arrivano da quattro porte.
Il passato è ingiusto. Se per anni i prestiti sono andati soprattutto agli abitanti di certi quartieri, un modello addestrato su quello storico imparerà a dire di sì agli stessi e di no agli altri: non perché siano meno affidabili, ma perché storicamente hanno avuto meno occasioni.
Il campione non rappresenta tutti. Se le foto per allenare un riconoscitore di volti ritraggono in gran parte persone dalla pelle chiara, il sistema funzionerà peggio su tutti gli altri: non li ha quasi mai visti.
Le etichette sono distorte. Spesso la «risposta giusta» che diamo in pasto al modello non è la verità, ma una sua approssimazione imperfetta: «è stato arrestato» al posto di «ha commesso un reato», e l’arresto dipende anche da dove e chi la polizia controlla di più.
Il modello si morde la coda. Se un sistema manda più pattuglie in un quartiere, lì si registreranno più reati, il che convince il sistema a mandarcene ancora di più. Il pregiudizio si auto-conferma.
Due di queste porte si chiudono lavorando sui dati: si fotografano più volti per il campione, e si smette di mandare le pattuglie dove le si è già mandate. Le altre due no. Mille prestiti in più dello stesso storico raccontano la stessa ingiustizia con qualche decimale in più, e «arrestato» scritto dove serviva «ha commesso un reato» resta la domanda sbagliata, per quante risposte si raccolgano.
Il riassunto sta in un adagio: bias in, bias out. Un modello impeccabile allenato su dati storti produce risultati storti.
Conviene distinguere le sorgenti, perché richiedono rimedi diversi [MMS+21].
Bias storico. I dati riflettono fedelmente un mondo già iniquo. Anche con campionamento perfetto ed etichette perfette, la regolarità che il modello apprende è la disuguaglianza. Nessuna quantità di dati aggiuntivi la corregge, perché quella disuguaglianza è il fenomeno, non un errore di misura.
Bias di rappresentazione (campionamento). La distribuzione dei dati di addestramento \(P_{\text{train}}\) differisce dalla popolazione bersaglio \(P_{\text{test}}\), e in particolare sotto-rappresenta alcuni gruppi. È il caso di Gender Shades citato nell’apertura del capitolo: pochi volti scuri nei set di addestramento, quindi errore molto più alto su quel gruppo.
Bias di misura (etichette). L’etichetta osservata è un proxy del costrutto d’interesse: si misura «arresto» per «reato», «voto del manager» per «rendimento». Se il proxy è più rumoroso o più severo per un gruppo, il bias entra dalle etichette prima ancora del modello.
Bias di feedback (loop). Le decisioni del modello alterano i dati futuri su cui il modello successivo verrà addestrato. La polizia predittiva è l’esempio da manuale: più controlli dove il modello prevede reati \(\Rightarrow\) più reati registrati lì \(\Rightarrow\) previsioni ancora più concentrate. Il segnale si auto-rinforza indipendentemente dal tasso reale.
La distinzione operativa è netta: campionamento e feedback si possono attaccare raccogliendo o correggendo i dati; il bias storico e quello di misura no, perché il difetto è nella definizione stessa dell’obiettivo.
Misurare l’equità guardando i gruppi#
Per parlare di equità con rigore serve un vocabolario, e quattro cose da tenere distinte: il gruppo a cui una persona appartiene, l’esito reale (quello che poi è successo davvero), la decisione del modello, e il punteggio da cui quella decisione si ricava fissando una soglia. Punteggio e decisione non sono la stessa cosa, e la differenza tornerà utile: il punteggio è un numero fra zero e uno, la decisione è il sì o il no che si ottiene tagliandolo a una certa altezza.
Su questi ingredienti si contano gli errori, e le misure sono le stesse due del
capitolo di Machine Learning. Il tasso di veri positivi è la quota di casi
veri che il modello prende; il tasso di falsi positivi è la quota di falsi
allarmi su chi non c’entrava nulla. Nelle figure e in letteratura si scrivono
abbreviati, TPR e FPR, dalle iniziali inglesi, e le quattro caselle della
tabella si chiamano VP, FP, FN, VN. «Tasso» vuol dire soltanto «quanti
su cento», scritto però come numero fra zero e uno: \(0{,}80\) sta per ottanta su
cento. La differenza rispetto a quel capitolo è una sola, ed è decisiva: qui i
conti si fanno separatamente per ciascun gruppo e poi si confrontano
(Fig. 37.2).
Fig. 37.2 Lo stesso modello, gli stessi conti, due gruppi. Nel Gruppo A, su cento persone a cui l’esito è poi capitato davvero il modello ne aveva individuate \(80\): \(80\) su \(100\), cioè \(0{,}80\). Nel Gruppo B solo \(60\), cioè \(0{,}60\). E i falsi allarmi sono \(10\) su \(100\) nel primo gruppo contro \(30\) su \(100\) nel secondo. Quando le due coppie di numeri non coincidono, il modello sbaglia in modo diverso a seconda del gruppo.#
«Sì» vuol dire il modello ha detto la cosa che stavamo prevedendo, e quella cosa non è per forza bella. Nel prestito il «sì» è «te lo diamo»; nel software dei tribunali è «questa persona è ad alto rischio». E «l’esito è accaduto» vuol dire che è successo davvero quel che il modello prevedeva, buono o brutto che sia. Parole neutre, per un conto che si fa uguale nei due casi.
Ci sono tre modi diversi di chiedere «il modello è equo?», e portano a tre richieste distinte.
Stessa quota di sì, in gergo parità demografica. Il modello dice «sì» alla stessa percentuale di persone in ogni gruppo. Se approva il 40% degli uomini, deve approvare il 40% delle donne: a prescindere da tutto il resto. E il «a prescindere» va preso alla lettera: la richiesta resta soddisfatta anche scegliendo i migliori fra gli uomini e tirando a sorte fra le donne.
Stessi errori per tutti, in gergo equalized odds (che si potrebbe rendere con «pari probabilità di sbagliare»: gli odds sono il modo in cui gli scommettitori dicono una probabilità, il rapporto fra le volte che una cosa capita e quelle che non capita). Sono due condizioni in una: il modello deve prendere la stessa quota di persone a cui l’esito è poi capitato davvero, e dare la stessa quota di falsi allarmi su chi non c’entrava nulla. È la richiesta che la Fig. 37.2 mostra violata: stesso modello, due comportamenti. Chi teme soprattutto di lasciare indietro qualcuno può pretendere la sola parità sulle persone a cui l’esito è capitato, in gergo equal opportunity.
Stesso significato del punteggio, in gergo calibrazione. Il punteggio è una previsione di probabilità e non un voto. «70» non vuol dire «bravo sette su dieci», vuol dire «di persone come questa, secondo me, l’esito capita a settanta su cento». Calibrato vuol dire che quella promessa viene mantenuta, e mantenuta allo stesso modo per tutti: se fra gli uomini con punteggio 70 l’esito capita davvero al 70%, lo stesso deve valere fra le donne.
Sembrano tre modi di dire la stessa cosa. Non lo sono affatto, e metterle d’accordo è impossibile più spesso di quanto chiunque si aspetterebbe.
Fissiamo la notazione: \(A\) è l’attributo protetto che identifica il gruppo (per esempio \(A=a\) e \(A=b\)), \(Y \in \{0,1\}\) è l’esito reale, \(\hat{Y}\) è la decisione del modello e \(S \in [0,1]\) il punteggio da cui la decisione si ottiene fissando una soglia. Un criterio enunciato su \(S\) e lo stesso criterio enunciato su \(\hat{Y}\) sono affermazioni diverse, e la distinzione fra i due torna a ogni risultato di impossibilità.
Le definizioni di equità di gruppo si organizzano attorno a tre criteri statistici, nella terna di Barocas, Hardt e Narayanan [BHN23].
Parità demografica (independence, \(\hat{Y} \perp A\)): la quota di esiti positivi non dipende dal gruppo,
È il selection rate uguale fra i gruppi. Limite noto: ignora del tutto \(Y\), quindi è compatibile con l’assurdo di selezionare i candidati giusti in un gruppo e a caso nell’altro.
Equalized odds (separation, \(\hat{Y} \perp A \mid Y\)), introdotta da Hardt, Price e Srebro [HPS16]: a parità di esito reale la predizione non dipende dal gruppo,
Per \(y=1\) questa è l’uguaglianza dei TPR, per \(y=0\) quella dei FPR: il modello deve avere lo stesso tasso di veri positivi e lo stesso tasso di falsi positivi in ogni gruppo. La Fig. 37.2 illustra una violazione: \(\text{TPR}_a=0{,}80 \neq \text{TPR}_b=0{,}60\) e \(\text{FPR}_a=0{,}10 \neq \text{FPR}_b=0{,}30\). La versione più debole equal opportunity impone la sola uguaglianza dei TPR (solo su \(y=1\)), appropriata quando il costo asimmetrico ricade su chi meritava l’esito positivo e viene mancato.
Calibrazione per gruppo (sufficiency, \(Y \perp A \mid S\)): a parità di punteggio la probabilità reale dell’esito è la stessa,
Qui \(s\) è il valore del punteggio; la condizione dice che uno stesso \(s\) «significa» la stessa cosa in ogni gruppo. Si noti che è una proprietà di \(S\), non di \(\hat{Y}\): cambiare la soglia non tocca la calibrazione.
Accanto va tenuta una quarta condizione, che le somiglia e non coincide: la parità del valore predittivo (predictive parity), che riguarda la decisione,
cioè l’uguaglianza fra i gruppi del valore predittivo positivo \(\text{VPP}=P(Y=1\mid\hat{Y}=1)\), che è la precision del capitolo di Machine Learning. È il criterio che Northpointe rivendicava a difesa di COMPAS [DMB16], ed è il perno dei risultati di impossibilità.
I risultati di impossibilità#
Arriviamo al nodo, e alle tre richieste viste finora va affiancata una quarta. Somiglia moltissimo alla calibrazione e non è la stessa cosa: quando il modello dice sì, ci prende ugualmente spesso in ogni gruppo, e in gergo si chiama parità del valore predittivo. La differenza con la calibrazione è sottile e conta: la calibrazione riguarda il punteggio, il «70» che deve voler dire settanta su cento per tutti; questa riguarda il sì e il no che si ottengono tagliando quel punteggio a una certa altezza. È quest’ultima, non la calibrazione, quella che l’azienda di COMPAS rivendicava.
Queste quattro richieste non entrano in conflitto per caso: alcune di esse sono matematicamente incompatibili ogni volta che i gruppi partono da tassi di base diversi, cioè ogni volta che l’esito, nei dati, è più frequente in un gruppo che nell’altro.
Conviene però dire subito una cosa che si legge di continuo detta male. Non c’è un teorema di impossibilità: ce ne sono tre, dimostrati da persone diverse, e riguardano combinazioni diverse di criteri. Assomigliano abbastanza da essere scambiati l’uno per l’altro, e quando si scambiano si finisce per affermare cose false. Cominciamo dal primo, che è quello del caso COMPAS, e prendiamoci lo spazio per vederlo succedere invece di annunciarlo.
Mettiamoci due gruppi veri e contiamo, perché è l’unico modo di vedere perché il muro c’è. In tutti e due l’esito che vogliamo prevedere capita a cinquanta persone; la differenza è che il Gruppo A è fatto di cento persone e il Gruppo B di duecento. Quindi nel Gruppo A l’esito riguarda una persona su due, nel Gruppo B una su quattro: sono i tassi di base diversi da cui parte tutto.
Pretendiamo due cose sensate, e per il momento otteniamole. La prima: che il modello prenda la stessa quota di persone a cui l’esito è poi capitato. Diciamo il settanta per cento, cioè 35 delle 50 in tutti e due i gruppi. La seconda: che quando dice sì ci prenda ugualmente spesso, sempre il settanta per cento.
E qui succede la cosa che conta: il numero dei falsi allarmi non lo scegliamo più noi. Perché 35 sì giusti siano il settanta per cento dei sì, i sì totali devono essere 50; e se i sì sono 50 e quelli giusti 35, i falsi allarmi sono 15. In tutti e due i gruppi, per forza, perché in tutti e due abbiamo preteso gli stessi due settanta per cento.
Ecco il punto, ed è aritmetica da terza media. Quei 15 falsi allarmi sono lo stesso numero, ma non sono presi dallo stesso mucchio. Nel Gruppo A le persone a cui l’esito non è capitato sono 50, quindi 15 su 50: tre su dieci si prendono un’accusa ingiusta. Nel Gruppo B quelle stesse persone sono 150, quindi 15 su 150: uno su dieci. Tre volte più spesso, e nessuno l’ha voluto: il tre viene dal 50 contro 150, cioè da quante sono di qua e di là le persone che un falso allarme lo possono ricevere.
Il teorema dice esattamente questo, in generale: quando i tassi di base sono diversi, tre richieste non stanno insieme. Sono la parità del valore predittivo, la parità del tasso di falsi allarmi (non del numero: il numero, come si è appena visto, può benissimo coincidere) e la parità di quelli che sfuggono. Quest’ultima è la pretesa di prendere la stessa quota, girata al contrario: se delle cinquanta persone a cui l’esito è capitato il modello ne prende trentacinque, le altre quindici gli sfuggono, e pretendere l’una è pretendere l’altra. Qualunque due tu scelga di assicurare, la terza salta. È un vincolo dell’aritmetica, che né codice migliore né più dati possono togliere.
E la richiesta rimasta fuori dal conto, dire sì alla stessa quota di persone in ogni gruppo, non si salva da sola. Se l’esito capita a una persona su due di qua e a una su quattro di là, l’unico modo di avere insieme la stessa quota di sì e gli stessi due tassi di errore è che il modello dica i suoi sì a caso, cioè che non serva a niente.
Ed è il cuore della disputa su COMPAS. L’inchiesta di ProPublica guardava i falsi allarmi e li trovava molto più alti fra gli imputati neri: la colonna dei 15 su 50. L’azienda guardava quanto spesso il suo «alto rischio» ci prendeva davvero e lo trovava uguale nei due gruppi: la riga del settanta per cento. Avevano ragione entrambe, ed è proprio questo il punto.
Teoremi di questa famiglia ce ne sono altri due, e nei giornali finiscono regolarmente scambiati con questo. Uno guarda i punteggi invece dei sì: la calibrazione non convive con il dare lo stesso punteggio medio, di qua e di là, a chi l’esito lo ha avuto e a chi non lo ha avuto, salvo che i due gruppi partano dalla stessa frequenza o che il modello non sbagli mai. L’altro dice che calibrazione ed errori pari possono stare insieme, ma pareggiando un errore alla volta: o i falsi allarmi o le persone che sfuggono, non tutti e due. Nessuno dei tre dice «non si può essere equi»: dicono quali garanzie si possono comprare insieme, e quale bisogna lasciare andare.
Primo teorema: Chouldechova (2017), parità del valore predittivo. La chiave è un’identità algebrica esatta che lega, all’interno di un gruppo, quattro grandezze: la prevalenza \(p = P(Y=1)\), il valore predittivo positivo \(\text{VPP}\) (la precision del capitolo di Machine Learning), il tasso di falsi negativi \(\text{FNR}=1-\text{TPR}\) e il tasso di falsi positivi [Cho17b]:
Qui \(p\) è la frazione reale di positivi nel gruppo, \(\text{VPP}=P(Y=1\mid\hat{Y}=1)\) è la probabilità che un positivo predetto sia davvero positivo, e \(\text{FNR}\) e \(\text{FPR}\) sono i due tassi di errore. L’identità si ricava contando i quattro pezzi della matrice di confusione e vale sempre. La sua conseguenza è drastica: fissati \(\text{VPP}\) e \(\text{FNR}\) uguali fra due gruppi, se le prevalenze \(p_a \neq p_b\) differiscono, allora i \(\text{FPR}\) sono per forza diversi, fuori dai casi degeneri in cui il prodotto si annulla (\(\text{VPP}=1\), cioè nessun falso positivo da nessuna parte, oppure \(\text{FNR}=1\), cioè nessun positivo preso).
Un esempio numerico lo rende palpabile. Siano due gruppi con prevalenze \(p_a=0{,}50\) e \(p_b=0{,}25\), e supponiamo un modello con lo stesso valore predittivo \(\text{VPP}=0{,}70\) e la stessa quota di positivi mancati \(\text{FNR}=0{,}30\) (dunque anche \(\text{TPR}=0{,}70\): perfino l’equal opportunity è rispettata). Applicando l’identità:
Stesso valore predittivo, stesso tasso di veri positivi, eppure il tasso di falsi positivi è tre volte più alto nel gruppo con prevalenza maggiore: \(0{,}30\) contro \(0{,}10\). È esattamente la forma del caso COMPAS [ALMK16]. Si noti che cosa non compare in questo enunciato: la calibrazione. Il teorema di Chouldechova parla di \(\text{VPP}\), che è una proprietà della decisione \(\hat{Y}\), non di \(S\).
Secondo teorema: Kleinberg, Mullainathan e Raghavan (2017), calibrazione. Il risultato gemello, indipendente e quasi simultaneo (i due preprint escono a un mese di distanza, nel settembre e nell’ottobre del 2016), riguarda i punteggi continui [KMR17]. Le tre condizioni in gioco sono la calibrazione e i due bilanciamenti di classe: che il punteggio medio ricevuto dai positivi sia lo stesso nei due gruppi, e che lo stesso valga per i negativi. Coesistono solo nei casi degeneri (prevalenze identiche o predizione perfetta). È un enunciato sui punteggi medi, non sui tassi della matrice di confusione: il bilanciamento della classe positiva non è l’uguaglianza dei TPR, e chiamarlo «bilanciamento dei falsi negativi» significa cambiarlo.
Terzo teorema: Pleiss e colleghi (2017), calibrazione più equalized odds. Resta la domanda che i due precedenti lasciano aperta: calibrazione ed equalized odds possono valere insieme? La risposta è nel lavoro di Geoff Pleiss e colleghi [PRW+17], e non è né sì né no: stanno insieme solo con un vincolo d’errore alla volta, o i falsi positivi o i falsi negativi, non entrambi, salvo prevalenze uguali o predittore perfetto. Sull’ipotesi conviene essere precisi, perché non è quella che verrebbe da immaginare: non si chiede affatto che il classificatore sia uno solo, dato che nel loro impianto ce n’è già uno per gruppo, e il rimedio che propongono ne fabbrica un terzo. Si chiede che il classificatore di cui si pareggiano gli errori sia esso stesso calibrato, e che quegli errori siano generalizzati, cioè medie del punteggio che quel classificatore restituisce e non conteggi di decisioni binarie.
Che peso abbiano quelle ipotesi si vede lasciandole cadere: l’incompatibilità sparisce. Si prendano due gruppi con un punteggio calibrato per costruzione in entrambi (l’etichetta estratta con probabilità pari al punteggio, quindi \(P(Y=1\mid S=s, A=a)=s\) esattamente) e punteggi distribuiti come due Beta, \(\text{Beta}(3;\,3)\) e \(\text{Beta}(2{,}7;\,3{,}3)\), la cui media (che qui è la prevalenza) vale \(0{,}50\) e \(0{,}45\). Con una soglia per gruppo, \(0{,}584\) e \(0{,}537\), si ottiene \(\text{TPR}=0{,}489\) e \(\text{FPR}=0{,}202\) in tutti e due, cioè equalized odds pieno, con la calibrazione intatta perché le soglie non toccano \(S\). A divergere è il valore predittivo, \(0{,}708\) contro \(0{,}664\): esattamente come impone l’identità di Chouldechova. Non è una smentita di Pleiss, e capire perché è la parte che insegna. Calibrato, qui, è il punteggio \(S\); il classificatore di cui abbiamo pareggiato gli errori è il sì o no che si ottiene tagliandolo, e quello calibrato non è, perché quando dice sì ci prende nel \(70{,}8\%\) dei casi in un gruppo e nel \(66{,}4\%\) nell’altro, mentre un sì o no calibrato dovrebbe prenderci sempre, cioè essere perfetto. L’ipotesi non è caduta: l’abbiamo aggirata cambiando oggetto, e il prezzo si vede subito nel valore predittivo. Il post-processing di Hardt, Price e Srebro vive proprio in questo spiraglio.
Quei numeri si rifanno in forma chiusa, senza bisogno di simulare: per \(S \sim \text{Beta}(\alpha,\beta)\) la massa di punteggio sopra la soglia vale
dove \(t\) è la soglia e \(\mathbb{1}\{\cdot\}\) vale \(1\) quando la condizione è vera e \(0\) altrimenti. Da lì il TPR si ottiene dividendo quella massa per la prevalenza \(p\); il FPR sottraendola da \(P(S \ge t)\) e dividendo per \(1-p\); il VPP dividendola per \(P(S \ge t)\).
E la terna dei criteri statistici. Per independence, separation e sufficiency il risultato è più severo, come riassumono Barocas, Hardt e Narayanan [BHN23]: sono incompatibili già a due a due, fuori dai casi degeneri. Independence e separation coesistono solo se \(A \perp Y\) oppure \(\hat{Y} \perp Y\); independence e sufficiency solo se \(A \perp Y\); separation e sufficiency solo se \(A \perp Y\) o la predizione è perfetta. Qui però le tre condizioni sono enunciate sullo stesso predittore: è la ragione per cui il controesempio con le due Beta non le contraddice, dato che lì la calibrazione riguarda \(S\) e l’equalized odds riguarda un \(\hat{Y}\) ottenuto con due soglie.
Quel che i teoremi non dicono: i tassi di base sono misure#
Tutti e tre i risultati partono dallo stesso presupposto, ed è il punto in cui il ragionamento fatto finora rischia di dare una mano proprio a ciò che ha appena denunciato. Il conflitto si accende quando i tassi di base differiscono. Ma «tasso di base» è la frequenza di un esito così come lo abbiamo misurato, e non un dato di natura: è esattamente la grandezza che il bias di misura, quello delle etichette storte, può distorcere. In COMPAS il tasso di base non è la frequenza dei reati: è la frequenza dei riarresti. Se gli arresti dipendono anche da dove passano le pattuglie, allora la difesa «il nostro punteggio è affidabile allo stesso modo rispetto a quel tasso di base» è una difesa rispetto a un numero che porta dentro il problema che si voleva misurare.
Questo non rende falso nessuno dei tre teoremi: sono catene di uguaglianze, e restano vere qualunque sia l’esito che si è deciso di misurare. Cambia però cosa se ne può concludere. Il teorema dice che, dati quei numeri, non si possono avere tutte le garanzie; non dice che quei numeri siano i numeri giusti, e non dice quale garanzia tenere. Fermarsi a «tanto è una scelta di valori» è vero e insufficiente, perché lascia credere che almeno le premesse del conflitto siano solide. Una di esse non lo è.
È la domanda che viene naturale e che di solito non si trova scritta: e se i due gruppi hanno tassi di base diversi perché il mondo è ingiusto, il teorema che cosa dimostra?
Dimostra esattamente quello che dice, né più né meno: che con quei numeri lì non puoi avere tutte le garanzie insieme. Non dice che quei numeri fotografino la realtà. Prendi due quartieri in cui succedono esattamente gli stessi reati, dieci per uno. Nel primo passano molte pattuglie e ne vengono registrati nove; nel secondo ne passano poche e ne vengono registrati cinque. I reati sono gli stessi, i due «tassi di base» no: nove contro cinque. Il teorema continua a valere, e continua a costringerti a scegliere; ma il divario che lo fa scattare l’ha prodotto il metro, non il mondo.
La conseguenza pratica è che ci sono due domande, non una. La prima è «quale garanzia di equità pretendo?», ed è la domanda che il teorema mette sul tavolo. La seconda viene prima e si dimentica quasi sempre: «l’esito che sto prevedendo è davvero quello che mi interessa, o è solo quello che qualcuno ha registrato?». Un capitolo che facesse solo la prima insegnerebbe a scegliere bene dentro un problema mal posto.
L’osservazione viene da dentro la letteratura, ed è di Chouldechova stessa. Fogliato, G’Sell e Chouldechova [FGSellC20] studiano la valutazione dell’equità quando l’etichetta osservata è una versione rumorosa e sistematicamente distorta di quella d’interesse, ed è precisamente il caso dell’arresto usato come proxy del reato. La conclusione è che anche piccole distorsioni nell’etichetta osservata possono rovesciare le conclusioni di un’analisi condotta su di essa.
Il meccanismo si vede con una costruzione minima. Si prendano due gruppi con tasso di base vero identico e una sola differenza, la probabilità che il fatto venga rilevato (\(0{,}90\) nel primo, \(0{,}50\) nel secondo). Il punteggio resta calibrato per costruzione sull’etichetta osservata in entrambi. Le prevalenze vere coincidono; le prevalenze osservate no, e a quel punto il teorema, che legge la riga «arresto», dichiara inevitabile un divario che è interamente prodotto dalla misura.
Da cui una regola di lettura per tutta la sezione: ogni volta che si scrive \(P(Y=1)\) conviene ricordarsi che \(Y\) è un dato raccolto da qualcuno, in un posto, con un criterio. La formalizzazione è onesta a patto di non far passare \(Y\) per il fenomeno invece che per la sua registrazione.
Attenuare il bias: tre punti di intervento#
Se una cura definitiva non esiste, restano comunque leve per ridurre il divario, e si distinguono per il momento in cui agiscono. Prima dell’addestramento si può intervenire sui dati; durante, su quello che stiamo chiedendo al modello di minimizzare (un modello impara aggiustando i propri numeri per far scendere una misura del proprio errore, e a quella misura si può aggiungere una penale per le disparità); dopo, sulle decisioni già prodotte.
In una gara di corsa un gruppo parte più indietro. Puoi intervenire in tre momenti. Prima della gara, sistemando la linea di partenza: correggi i dati, ripesando gli esempi finché nel mucchio pesato l’esito e il gruppo smettono di andare insieme, o raccogliendone altri, e la linea sistemata vale per tutte le gare che verranno. Durante la gara, cambiando le regole: al modello si chiede di sbagliare il meno possibile, e gli si aggiunge una penale ogni volta che sbaglia più su un gruppo che sull’altro, come un giudice che toglie punti a chi taglia la strada; quanti punti togliere lo decidiamo noi, ed è la manopola con cui si sceglie quanta accuratezza spendere. Dopo la gara, spostando il traguardo: il modello resta com’è, ma il punteggio oltre il quale si dice sì viene fissato più in alto per un gruppo e più in basso per l’altro, finché i due tassi di errore coincidono.
Nessuno dei tre è gratis. Riequilibrare i dati può abbassare l’accuratezza per tutti. Spostare il traguardo pareggia gli errori senza toccare il punteggio, che resta onesto com’era; a pagare è il «sì», che dopo vale di più in un gruppo che nell’altro. Ed è delicato per una ragione che si sente subito: vuol dire trattare due persone in modo diverso proprio in base al gruppo, che è la cosa da cui eravamo partiti. C’è chi lo considera l’unico rimedio serio e chi una discriminazione a sua volta, e la discussione è aperta anche fra i giuristi.
Pre-processing. Si trasforma il dataset prima dell’addestramento: reweighting (pesi \(w_i\) per esempio, calcolati così da rendere \(Y\) indipendente da \(A\) nel campione pesato; l’effetto sperato a valle è un classificatore più vicino alla parità demografica), ricampionamento dei gruppi sotto-rappresentati, o rimozione/decorrelazione delle feature che fungono da proxy dell’attributo protetto. Vantaggio: agnostico al modello a valle.
In-processing. Si modifica l’obiettivo di addestramento aggiungendo un vincolo o un termine di regolarizzazione di equità, per esempio minimizzare \(\mathcal{L}_{\text{pred}} + \lambda\,\mathcal{L}_{\text{fair}}\) dove \(\mathcal{L}_{\text{fair}}\) penalizza il divario di TPR/FPR fra i gruppi e \(\lambda\) regola il compromesso equità-accuratezza. Adversarial debiasing e ottimizzazione vincolata rientrano qui.
Post-processing. Si lascia intatto il modello e si aggiustano le soglie: Hardt, Price e Srebro [HPS16] mostrano come derivare soglie per-gruppo (eventualmente randomizzate) che raggiungono l’equalized odds a partire da un qualsiasi punteggio già addestrato (una costruzione geometrica sulle curve ROC dei due gruppi).
I risultati di impossibilità restano sullo sfondo, e il post-processing è il posto in cui si vede meglio che cosa comprano davvero queste tecniche. Le soglie per gruppo raggiungono l’equalized odds senza toccare il punteggio, quindi senza toccarne la calibrazione; ciò che non possono fare è tenere fermo anche il valore predittivo, che si separa fra i gruppi non appena le prevalenze differiscono. Nessuna delle tre leve annulla il conflitto: sposta quale criterio privilegiare, e quel «quale» non è una scelta tecnica.
Equità individuale#
Le definizioni viste finora guardano ai gruppi in media. Una famiglia alternativa sposta l’obiettivo sul singolo: due persone che si somigliano devono ricevere lo stesso trattamento, e poco importa da quale gruppo vengano. È la strada aperta da Cynthia Dwork e colleghi [DHP+12] con un titolo che è già una tesi, fairness through awareness, «equità attraverso la consapevolezza»: contro l’idea diffusa che per non discriminare basti nascondere al modello a quale gruppo appartiene una persona. Non basta, perché il gruppo si indovina da tutto il resto.
L’idea è intuitiva: due persone simili devono ricevere esiti simili. Se due candidati hanno percorso, competenze ed esperienza quasi identici, il modello non può approvarne uno e bocciare l’altro solo perché appartengono a gruppi diversi. E la pretesa cresce con la somiglianza: due candidati lontanissimi possono ricevere esiti lontanissimi, due che distano un soffio devono ricevere esiti che distano un soffio, e il modello non ha il diritto di allontanarli più di quanto li allontani il metro con cui li misuriamo. È un principio di coerenza, non di media: non dice «tratta bene i gruppi», dice «non fare distinzioni ingiustificate fra individui vicini».
Il problema è tutto in quella parola, simili. Simili rispetto a cosa? Due curriculum possono sembrare vicini per titoli di studio e lontani per esperienza: chi decide il metro? Definire la somiglianza «giusta» è difficile quanto il problema di equità di partenza, e spesso nasconde, dentro il metro, le stesse distorsioni che volevamo eliminare.
Formalmente, dato un metro di distanza fra individui \(d(\mathbf{x}_i, \mathbf{x}_j)\) e una distanza fra distribuzioni di esito \(D\), il classificatore (che a ogni individuo associa una distribuzione sugli esiti) deve essere Lipschitz [DHP+12]:
dove \(M(\mathbf{x})\) è la distribuzione di esito assegnata a \(\mathbf{x}\). In parole: individui vicini secondo \(d\) ricevono esiti vicini secondo \(D\); il modello non può «strappare» a piacere due punti che il metro dichiara simili. È una garanzia più forte e più fine dell’equità di gruppo, ma sposta l’intera difficoltà su \(d\): la metrica di somiglianza specifica del compito è assunta data, mentre in pratica sceglierla è precisamente il giudizio di valore che si voleva rendere oggettivo. Per questo l’equità individuale è teoricamente elegante ma di rado applicabile tale e quale.
Il conflitto, coi numeri#
Chiudiamo il cerchio con un esperimento riproducibile. Inventiamo due gruppi di persone e diamo a ciascuna un punteggio di rischio onesto per costruzione: se il punteggio dice \(0{,}7\), l’esito accade davvero sette volte su dieci, in entrambi i gruppi allo stesso modo (è la calibrazione di prima). L’unica differenza è che l’esito è complessivamente più frequente in un gruppo che nell’altro: i tassi di base diversi da cui parte il teorema. Poi applichiamo la stessa soglia a tutti e contiamo gli errori gruppo per gruppo.
Il punteggio fa da dado truccato: se una persona ha punteggio \(0{,}7\), tiriamo un dado che dice sì sette volte su dieci, e quello che esce diventa il suo esito reale. Il dado funziona nello stesso modo per tutti; a cambiare fra i due gruppi è soltanto quanti punteggi alti girano.
L’etichetta reale è estratta con probabilità pari al punteggio, \(P(Y=1\mid S=s)=s\), identica nei due gruppi: il punteggio è calibrato per costruzione. A differire è la sola distribuzione marginale di \(S\) (due Beta di media \(0{,}50\) e \(0{,}33\)), e con essa la prevalenza \(p=\mathbb{E}[S]\).
Il programma sorteggia i due gruppi e poi stampa, riga per riga, gli errori che il modello fa in ciascuno. Sono quei numeri, e non il programma, quelli di cui parla il commento.
import numpy as np
rng = np.random.default_rng(0)
def genera_gruppo(n, alpha, beta):
# Il punteggio è calibrato per costruzione: P(Y=1 | S=s) = s
s = rng.beta(alpha, beta, size=n) # punteggio in [0,1]
y = (rng.random(n) < s).astype(int) # etichetta vera: 1 con probabilità s
return s, y
# I due numeri decidono quanti punteggi alti girano nel gruppo: piu' il primo
# supera il secondo, piu' il gruppo e' spostato verso i punteggi alti.
# Gruppo A: rischio di base più alto; Gruppo B: più basso
sA, yA = genera_gruppo(20000, 3.0, 3.0) # media score ~0,50
sB, yB = genera_gruppo(20000, 2.0, 4.0) # media score ~0,33
soglia = 0.5
def tassi(s, y, t):
yhat = (s >= t).astype(int)
sel = yhat.mean() # selection rate: quota di sì
tpr = yhat[y == 1].mean() # veri positivi / positivi reali
fpr = yhat[y == 0].mean() # falsi positivi / negativi reali
ppv = y[yhat == 1].mean() # valore predittivo positivo (precision)
return sel, tpr, fpr, ppv
for nome, s, y in [("A", sA, yA), ("B", sB, yB)]:
sel, tpr, fpr, ppv = tassi(s, y, soglia)
print(f"Gruppo {nome}: base={y.mean():.3f} selection={sel:.3f} "
f"TPR={tpr:.3f} FPR={fpr:.3f} VPP={ppv:.3f}")
# Calibrazione per gruppo: in ogni fascia di punteggio, quante volte
# l'esito e' accaduto davvero. Se il punteggio non mente, i due numeri
# di una stessa fascia coincidono, e coincidono col punteggio medio.
bins = np.linspace(0, 1, 6)
print("\nCalibrazione (fascia di punteggio -> quante volte l'esito e' accaduto):")
for nome, s, y in [("A", sA, yA), ("B", sB, yB)]:
idx = np.clip(np.digitize(s, bins) - 1, 0, len(bins) - 2)
riga = [f"[{bins[b]:.1f},{bins[b+1]:.1f})->{y[idx == b].mean():.2f}"
for b in range(len(bins) - 1)]
print(f" Gruppo {nome}:", " ".join(riga))
# Seconda prova: una soglia diversa per ciascun gruppo. Le due soglie non
# hanno niente di magico: si fanno scorrere finche' i due tassi di errore
# non coincidono, ed e' cosi' che sono stati trovati 0,72 e 0,57.
# Il punteggio non viene toccato, quindi resta calibrato.
print("\nCon una soglia per gruppo (0,72 per A e 0,57 per B):")
for nome, s, y, t in [("A", sA, yA, 0.72), ("B", sB, yB, 0.57)]:
sel, tpr, fpr, ppv = tassi(s, y, t)
print(f" Gruppo {nome}: TPR={tpr:.3f} FPR={fpr:.3f} VPP={ppv:.3f}")
Gruppo A: base=0.500 selection=0.502 TPR=0.658 FPR=0.346 VPP=0.656
Gruppo B: base=0.329 selection=0.188 TPR=0.348 FPR=0.110 VPP=0.607
Calibrazione (fascia di punteggio -> quante volte l'esito e' accaduto):
Gruppo A: [0.0,0.2)->0.16 [0.2,0.4)->0.31 [0.4,0.6)->0.50 [0.6,0.8)->0.69 [0.8,1.0)->0.85
Gruppo B: [0.0,0.2)->0.13 [0.2,0.4)->0.29 [0.4,0.6)->0.48 [0.6,0.8)->0.67 [0.8,1.0)->0.81
Con una soglia per gruppo (0,72 per A e 0,57 per B):
Gruppo A: TPR=0.215 FPR=0.056 VPP=0.795
Gruppo B: TPR=0.219 FPR=0.055 VPP=0.660
Le colonne dicono, per ciascun gruppo: quanto è frequente davvero l’esito
(base) e a quante persone il modello dice sì (selection). Poi vengono
TPR e VPP, che sono la stessa frazione guardata da due parti diverse, e
siccome è su quella differenza che poggia tutto il teorema, rallentiamo. Il
TPR parte dalle persone: prendi tutte quelle a cui l’esito è poi
capitato davvero, e conta a quante il modello aveva detto sì. Il VPP (sta
per valore predittivo positivo) parte dai sì: prendi tutti i sì che il
modello ha detto, e conta a quanti di quelli l’esito è poi capitato davvero.
Lo stesso mucchietto di persone al numeratore, due mucchi diversi al
denominatore: il primo numero dice quanti ne prendi, il secondo quanto vale la
sua parola quando dice sì. In mezzo c’è il FPR, la quota di falsi allarmi
fra chi non c’entrava niente.
Le due righe della calibrazione si leggono così: [0.0,0.2)->0.16 vuol dire
che alle persone con punteggio fra zero e zero virgola due l’esito è poi
capitato nel \(16\%\) dei casi. Sono essenzialmente identiche: in ogni
fascia di punteggio la frazione è pressoché la stessa nei due gruppi, e
coincide con la media dei punteggi delle persone che stanno in quella fascia
(non con il centro della fascia: nella prima, che va da zero a zero virgola
due, le persone si addensano verso l’alto, ed è per questo che si legge
\(0{,}16\) e non \(0{,}10\)). La calibrazione, cioè, vale. Restano briciole di
differenza fra i due gruppi, tutte nello stesso verso, e non sono un difetto:
dentro una stessa fascia il Gruppo B ha più punteggi appoggiati al bordo basso,
e la media di quella fascia lo segue. È la fascia a essere larga, non il
punteggio a mentire. Eppure, con la soglia unica, la
quota di falsi allarmi è tre volte più alta nel Gruppo A (\(0{,}346\) contro
\(0{,}110\)) e diverge nettamente anche il TPR (\(0{,}658\) contro \(0{,}348\)): le
due metà dell’equalized odds saltano entrambe.
Attenzione però a non trarne la conclusione sbagliata, che è quella che si legge più spesso. Non è che quei tassi non si possano allineare: le ultime tre righe stampate fanno esattamente questo, con una soglia diversa per gruppo, e li allineano bene (\(0{,}215\) contro \(0{,}219\) e \(0{,}056\) contro \(0{,}055\)), senza toccare il punteggio e senza toccare le frequenze di base, che restano \(0{,}50\) e \(0{,}33\). Quel che si sposta, e che con la soglia unica passava inosservato, è il valore predittivo: \(0{,}795\) nel Gruppo A contro \(0{,}660\) nel Gruppo B. Cioè: quando il modello dice sì, ci prende molto più spesso in un gruppo che nell’altro.
È il teorema, nella sua forma esatta: tre garanzie, due alla volta. Un esperimento non dimostra un’impossibilità (un esempio non è una prova), ma questo mostra la forma del vincolo, e mostra soprattutto che la scelta è una scelta vera: si può decidere di pareggiare gli errori accettando che il «sì» valga meno in un gruppo, oppure di pareggiare l’affidabilità del sì accettando tassi di errore diversi. Quello che non esiste è la scelta che le tiene entrambe.
E qui il cerchio si chiude sull’inchiesta da cui era partito il capitolo, ma
con una precisazione che i numeri della simulazione impongono. Nella disputa
vera su COMPAS le due parti guardavano due colonne diverse della stessa
tabella, e
nessuna delle due mentiva. Nella nostra simulazione a soglia unica, invece,
nemmeno la colonna dell’azienda è pari: il VPP vale \(0{,}656\) e \(0{,}607\),
vicini ma non uguali. Per vedere la disputa nella sua forma pura bisogna
guardare le tre righe con le due soglie, quelle in cui gli errori sono
davvero pareggiati e la differenza si sposta tutta sul valore del «sì»:
\(0{,}795\) contro \(0{,}660\). È lì che le due parti hanno ragione entrambe.
Una differenza però resta. Qui la frequenza dell’esito nei due gruppi l’abbiamo decisa noi; su persone vere qualcuno deve andarla a contare, e la conta come può.
La configurazione a soglia unica riproduce la struttura del caso COMPAS [ALMK16]: divario nei tassi di errore con punteggio calibrato. Quella a due soglie riproduce il post-processing di Hardt, Price e Srebro [HPS16], e mostra il prezzo che si paga a valle, la separazione del VPP, che è il criterio rivendicato da Northpointe [DMB16]. Resta il caveat sui tassi di base come grandezze misurate, e vale anche qui: nella simulazione sono noti per costruzione, mentre su dati veri sono stimati da etichette che possono essere a loro volta distorte.
Nessuna metrica è «quella giusta»#
Se c’è una lezione da portare via, è questa: la domanda «questo modello è equo?» è mal posta finché non specifichiamo secondo quale criterio. Parità demografica, equalized odds, calibrazione ed equità individuale sono definizioni diverse e in tensione, e non approssimazioni successive di un’unica verità nascosta: ciascuna è sensata in certi contesti e inaccettabile in altri. In un esame di massa per una malattia grave conta non mancare i malati, e allora si pretende lo stesso tasso di veri positivi; nella concessione di un mutuo conta che un punteggio significhi lo stesso per tutti, e allora si pretende la calibrazione. Sono due risposte diverse alla stessa domanda, e sono diverse perché diverso è ciò che costa di più sbagliare.
Quel che la statistica può fare lo fa fino in fondo: elenca le opzioni, quantifica cosa costa ciascuna, smaschera quelle che si escludono a vicenda. Poi si ferma, e la scelta va fatta in chiaro da qualcuno che se ne assume la responsabilità, invece che finire dentro una riga di codice che non legge nessuno. Con lo stesso spirito affronteremo, nelle sezioni successive, la privacy e la robustezza dei modelli; e chi vuole lo strumento che rende queste scelte ispezionabili lo trova in Interpretabilità.
Da ricordare
Qui bias vuol dire pregiudizio: non è il numero dentro il neurone né l’errore di un modello troppo semplice, che nel libro portano lo stesso nome.
Il pregiudizio non nasce nel codice, entra prima, da quattro porte: il passato è ingiusto; di qualche gruppo ci sono pochi esempi; quello che è scritto nei dati non è la cosa che credevamo («arrestato» al posto di «ha commesso un reato»); e il modello si morde la coda, perché le sue decisioni di oggi diventano i dati di domani.
Per misurarlo si usa la tabella a quattro caselle del capitolo di Machine Learning, compilata un gruppo alla volta, e si confrontano due numeri: quanti dei casi veri il modello prende, e quanti falsi allarmi dà.
Ci sono più idee di equità, tutte ragionevoli: stessa quota di sì per tutti; stessi errori per tutti; stesso significato del punteggio, che non è un voto ma una previsione di probabilità; e che quando il modello dice sì ci prenda ugualmente spesso in ogni gruppo. Quando l’esito è più frequente in un gruppo che nell’altro, non si possono avere tutte insieme, e il muro è preciso: fra l’affidabilità del sì, il tasso di falsi allarmi e la quota di persone che sfuggono se ne comprano due alla volta, mai tre.
Il conto che lo mostra si fa a mano, ed è quello dei due gruppi da cento e duecento persone. Se pretendi di prendere la stessa quota di persone a cui l’esito è poi capitato e di avere la stessa affidabilità quando dici sì, i falsi allarmi ti vengono 15 in tutti e due i gruppi: stesso numero, ma da una parte sono 15 innocenti su 50 e dall’altra 15 su 150. Il tasso di falsi allarmi è tre volte più alto, e non l’hai scelto tu.
E quella frequenza è un numero misurato da qualcuno, non un dato di natura: se è la frequenza degli arresti invece che dei reati, il conto che ti costringe a scegliere è stato fatto su una misura storta.
Si può attenuare, non risolvere, e si può farlo in tre momenti: prima della gara (sistemando i dati), durante (cambiando le regole dell’addestramento) o dopo (usando una soglia diversa per gruppo).
Quale garanzia pretendere è una decisione e non un calcolo, e va presa alla luce del sole.
Da ricordare
Il bias non nasce nel codice ma a monte, nei dati: passato iniquo, campione non rappresentativo, etichette-proxy distorte e feedback loop che si auto-conferma. Bias in, bias out [MMS+21].
L’equità di gruppo si misura riusando la matrice di confusione del capitolo di Machine Learning, ma separatamente per gruppo. Tre criteri: parità demografica (stessa quota di sì), equalized odds (stessi TPR e FPR) [HPS16], calibrazione (stesso significato del punteggio, proprietà di \(S\) e non di \(\hat{Y}\)).
Tre risultati di impossibilità distinti, da non confondere: Chouldechova [Cho17b], parità del valore predittivo più i due tassi d’errore, due su tre; Kleinberg, Mullainathan e Raghavan [KMR17], calibrazione più i due bilanciamenti di classe (punteggi medi, non tassi); Pleiss e colleghi [PRW+17], calibrazione più equalized odds, ma con un solo vincolo d’errore alla volta e sotto l’ipotesi che il classificatore di cui si pareggiano gli errori sia esso stesso calibrato. È il nodo del caso COMPAS [ALMK16], dove ProPublica e Northpointe [DMB16] avevano ragione entrambe.
I tassi di base che accendono il conflitto sono grandezze misurate: su COMPAS sono riarresti, non reati, e il bias di misura le tocca [FGSellC20]. Il teorema resta vero; quel che non è dato è che le sue premesse siano neutrali.
Si può attenuare, non risolvere, intervenendo in pre-processing (riequilibrio dei dati), in-processing (vincoli/regolarizzazione di equità) o post-processing (soglie per gruppo: raggiungono l’equalized odds lasciando intatta la calibrazione, al prezzo di separare il VPP).
L’equità individuale [DHP+12] chiede esiti simili per individui simili, ma sposta la difficoltà sul definire «simile».
Nessuna metrica è «quella giusta»: scegliere il criterio di equità è una decisione di valore, non un calcolo.