Introduzione.
Voglio ritornare sull'importante tema relativo alle metriche che si utilizzano per valutare le prestazioni di un modello di classificazione.
In un articolo precedente ho definito metriche quali: precision, recall ed F1 score. In questo articolo voglio definire alcune metriche che sono utilizzate sopratutto in campo medico: la Sensibilità, la Specificità, il PPV ed NPV, il C-index.
Sensibilità e specificità sono, ad esempio, termini molto usati nel campo dell'epidemiologia, ad esempio per caratterizzare un test diagnostico nei confronti dei positivi e negativi al test.
Un esempio concreto.
Immaginiamo di voler sviluppare un modello per prevedere la probabilità che un paziente abbia una certa malattia. Abbiamo a disposizione una serie di informazioni (età, sesso, informazioni cliniche ottenute da esami medici) e vogliamo prevedere la probabilità che il paziente sia ammalato (disease) oppure no (normal). Un modello di questo tipo si utilizza per supportare la diagnosi.
Un problema di questo tipo lo possiamo affrontare in numerosi modi differenti. Se abbiamo a disposizione i dati giusti lo possiamo affrontare come un problema di Machine Learning e, più precisamente, di classificazione binaria.
Supponiamo allora di avere un dataset con un numero sufficientemente ampio di campioni, ognuno dei quali rappresenta un paziente che ha preso parte ad un precedente studio statistico. Per ognuno dei pazienti abbiamo un insieme di caratteristiche (feature) ed in più abbiamo una colonna che registra se il paziente ha realmente la malattia (o meno) come stabilito, ad esempio, da un pool di medici.
Possiamo dunque seguire un approccio di "Supervised Learning" e sviluppare un modello che fornisce la probabilità dell'evento positivo (il paziente ha la malattia). Questa probabilità la possiamo dunque considerare come una valutazione del rischio.
Oggi giorno vi sono tantissimi algoritmi che possono essere utilizzati per implementare un tale modello. Ovviamente dobbiamo decidere, anche tenendo conto del problema e del dominio di interesse, qual è la metrica o quali sono le metriche più adatte per rispondere alla domanda: "Tra i vari modelli qual è il migliore?".
Training e test set.
Assumiamo di aver suddiviso il dataset in due dataset, di cui il secondo è riservato per il test, e di aver successivamente suddiviso il primo dataset in un effettivo train set + un validation set. Questi ultimi due sono utilizzati per l'addestramento del modello ed il tuning degli iper-parametri. Utilizzeremo soltanto il test set per quantificare le prestazioni del modello.
L'accuratezza del modello.
Dopo aver addestrato il modello, possiamo utilizzarlo sul test set per prevedere la probabilità dell'evento positivo ed ovviamente possiamo poi confrontare questa probabilità con l'effettiva occorrenza. Dobbiamo definire una soglia che, per semplicità, assumiamo eguale al valore tipicamente utilizzato come default: 0.5.
Utilizzando una delle tante librerie (es: Python) a disposizione, possiamo quindi calcolare:
- TP: numero di casi true positive
- TN: true negative
- FP: false positive
- FN: false negative
L'accuratezza (ACC) del modello è in generale definita come la percentuale di casi su cui il nostro modello ha dato la previsione corretta.
ACC = # casi correttamente previsti / # numero totale di casi
Previsione corretta vuol dire: il paziente ha effettivamente la malattia ed il modello ha previsto positivo (+).
Ma qui ci rendiamo subito conto di un problema che in campo medico è particolarmente sentito: gli errori, che inevitabilmente il modello può fare e farà, non sono tutti eguali.
In altre parole, se ci mettiamo nell'ottica di un medico che sta esaminando un paziente potenzialmente a rischio, il medico vuole capire, sulla base dei dati a sua disposizione, quanto è elevato questo rischio e, di conseguenza, quale deve essere la forza con cui deve raccomandare al paziente di fare ulteriori esami ed eventualmente anche di intraprendere terapie che possono essere non agevoli, magari costose e di non immediato beneficio. Da questo punto di vista un "falso negativo" (FN), come errore, è ovviamente molto più costoso in termini umani di un falso positivo.
Probabilità condizionata, SENS e SPEC.
In campo medico, per caratterizzare meglio quanto bene si comporta il modello sulle due classi (malati e non malati) si utilizzano spesso la Sensibilità (SENS) e la Specificità (SPEC).
Il modo più semplice di definire SENS e SPEC è attraverso la probabilità condizionata.
Piuttosto che considerare la probabilità (non condizionata) che il paziente abbia la malattia poniamoci un'altra domanda: nell'ipotesi che il paziente sia effettivamente malato, qual è la probabilità che il modello lo classifichi come positivo?
Questa seconda probabilità è una probabilità condizionata e si indica convenzionalmente con P(+|disease). Tale probabilità, che andiamo a valutare sul dataset di test, è la Sensitività.
Quindi, per definizione, la Sensibilità del modello (o del test) è definita come:
SENS = P(+|disease) = numero di casi previsti positivi e malati/numero di casi malati
Invece, la Specificità considera i pazienti non malati (normali):
SPEC = P(-|normal) = numero di casi previsti negativi e normali/numero di casi normali
Se definiamo la Prevalenza della malattia (valutata sul campione) come la frazione di pazienti effettivamente malati nel campione
PREV = numero di casi effettivamente malati/numero totale di campioni nel dataset
si può abbastanza facilmente dimostrare (vedi dopo) che esiste questa relazione che lega accuratezza, sensitività e specificità
ACC = SENS * PREV + SPEC * (1- PREV) [eq. 1]
In sintesi, mentre l'accuratezza si limita a distinguere tra previsioni corrette e sbagliate, la sensibilità si occupa di quantificare quanto è bravo il modello a fare previsioni corrette sui pazienti malati e specificità quanto è bravo il modello ad identificare come negativi i pazienti non malati (normal).
Relazioni con la matrice di confusione.
La matrice di confusione, per un problema di classificazione binario, raccoglie i quattro valori: TP, TN, FP ed FN.
Confusion Matrix
Valori | predetti | ||
+ | - | ||
Valori | disease | TP | FN |
reali | normal | FP | TN |
Se diamo uno sguardo alla collocazione dei quattro valori (TP, TN, FP, FN) all'interno della matrice, ci rendiamo subito conto che:
- per calcolare la SENS devo calcolare quante previsioni corrette sono definite all'interno della classe "disease" e quindi devo considerare la prima riga della matrice
- per calcolare la SPEC dobbiamo considerare solo i casi "normal" e, quindi, dobbiamo considerare la seconda riga
Pertanto:
SENS = TP/(TP + FN)
SPEC = TN/(FP + TN)
Verifichiamo la relazione tra ACC, SENS e SPEC.
Possiamo utilizzare la matrice di confusione per verificare la relazione, espressa nell'eq. n. 1, tra ACC, SENS e SPEC.
Se esprimiamo ACC, SENS e SPEC e PREV in funzione delle quattro componenti della matrice di confusione abbiamo:
ACC = (TN + TP)/ (TN + FN + FP + FP)
PREV = TP + FN/(TN + TP + FN + FP)
SENS = TP/(TP + FN)
SPEC = TN/(FP + TN)
Per comodità, nel seguito indichiamo con
N = (TN + TP + FN + FP)
Risulta
SENS * PREV = TP/N
SPEC * (1 - PREV) = (TN/(FP + TN)) * (1- (TP + FN)/N ) = (TN/(FP + TN)) * (TN + FP) / N = TN/N
quindi, il secondo membro risulta:
SENS * PREV + SPEC * (1 - PREV) = TP/N + TN/N = (TP + TN)/N = ACC
PPV ed NPV.
Ad un medico a cui è fornito un modello predittivo potrebbero però interessare di più le metriche che andiamo a definire ora: PPV ed NPV.
PPV è il Positive Predictive Value. NPV è il Negative Predictive Value.
PPV per definizione, è la probabilità, condizionata, che un paziente sia effettivamente malato se il modello ha predetto +.
NPV, sempre per definizione, è la probabilità che un paziente sia non malato (normal) se il modello ha predetto -.
Si tratta ancora di probabilità condizionate e quindi, usando la solita notazione, possiamo indicare con:
PPV = P(disease|+)
NPV = P(normal|-)
Anche in questo caso, se abbiamo i quattro valori (TP, TN, FP, FN) della matrice di confusione, possiamo calcolare PPV ed NPV. Questa volta, invece delle righe dobbiamo focalizzarci sulle colonne della matrice.
PPV = TP/(TP + FP)
NPV = TN/(FN + TN)
Anche in questo caso potremmo dimostrare una semplice relazione algebrica che lega PPV, NPV, SENS e SPEC.
Dipendenza dalla soglia di classificazione.
Come ho fatto cenno prima, il numero di veri e falsi positivi e negativi dipendono da come è settata la soglia di classificazione (che in genere dimentichiamo, lasciandola al valore 0.5). Ovviamente alzando la soglia riduciamo il numero di falsi positivi, ma rischiamo di perdere casi positivi.
C-index.
Un'altra metrica utilizzata in campo medico è il cosidetto C-index.
L'obiettivo del C-index è di quantificare quanto il modello è bravo nel discriminare tra gli appartenenti alle due classi. E' sempre un valore compreso tra 0 (modello pessimo) ed 1 (perfetto).
Per calcolare il C-index dobbiamo introdurre un minimo di nomenclatura.
Consideriamo, nell'ambito del TEST set, tutte le possibili coppie di pazienti (A, B) per i quali i risultati dei test sono differenti (es: A malato, B non malato). Le coppie di questo tipo sono dette "permissible pair".
Poi, per ogni coppia A, B andiamo a considerare le probabilità previste dal modello (P(A) e P(B)).
Si dice "concordant pair" una qualsiasi coppia per cui, se A è malato e B no, p(A) > p(B).
Una coppia per cui p(A) < p(B) si definisce "non concordant pair".
Una coppia per cui p(A) = p(B) si definisce "tie".
Avendo posto queste definizioni:
C-index = (# concordant pair + 0.5 * #tie)/# permissible pair
Ovvero:
- ad ogni concordant pair si attribuisce punteggio 1
- ad ogni tie attribuiamo punteggio 0.5
- ad ogni non concordant pair punteggio 0