Salta al contenuto
Note per Studenti Esercizio - Metriche di classificazione da una matrice di confusione

Esercizio - Metriche di classificazione da una matrice di confusione

Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.

In questa pagina 6

Testo (dalle slide sulla classificazione). Tre filtri antispam sono valutati su mail con classe positiva «spam».

  • Modello 1, su 100100 mail (3333 spam e 6767 non spam): dei 3333 spam, 2727 sono previsti spam e 66 non spam; dei 6767 non spam, 1010 sono previsti spam e 5757 non spam.
  • Modello 2, su 10001000 mail (1010 spam e 990990 non spam): predice sempre «non spam».
  • Modello 3, sulle stesse 10001000 mail del modello 2: trova 99 spam su 1010 ma classifica come spam anche 190190 mail normali.

Per ciascuno: matrice di confusione, accuracy, specificità, precision, recall e F1F_1; dire quale modello è migliore per un filtro antispam. In più: metriche macro per una classificazione a tre classi.

Teoria usata: Metriche di classificazioneIn classificazione binaria ogni previsione è vero positivo (TP), vero negativo (TN), falso positivo (FP, errore di tipo I) o falso negativo (FN, errore di tipo II). Da queste quattro quantità: accuracy $=\frac{TP+TN}{TP+TN+FP+FN}$, specificità $=\frac{TN}{TN+FP}$, precision $=\frac{TP}{TP+FP}$, recall $=\frac{TP}{TP+FN}$, e la loro media armonica $F_1=\frac{2PR}{P+R}$. Con dati sbilanciati l'accuracy inganna (un modello che predice sempre la classe maggioritaria ha 99%): si usano precision, recall, F1, ROC-AUC, la cross-validation stratificata e il riequilibrio con undersampling o oversampling (non SMOTE). Cambiando la soglia sulla probabilità si ottiene la curva ROC (TPR contro FPR) e l'area AUC. Approfondimento: non nel programma di Telecomunicazioni.Metriche di classificazione →; i concetti di classe positiva e di errore sono in Classificazione e k-nearest neighborsNella classificazione l'uscita $y$ è una categoria (con $C$ classi; $C=2$ è il caso binario). Il classificatore più semplice è il k-nearest neighbors: una nuova osservazione prende la classe più frequente (voto di maggioranza) tra i suoi $k$ vicini più prossimi nel training, con distanza euclidea $\sqrt{\sum(A_i-B_i)^2}$ o di Manhattan $\sum|A_i-B_i|$ (per la regressione si fa la media dei vicini). $k$ è un iperparametro: $k$ piccolo dà bordi frastagliati e overfitting, $k$ grande underfitting. È un metodo basato su istanze e «pigro» (nessun addestramento, costo alla predizione), sensibile a scala e feature irrilevanti e alla maledizione della dimensionalità; gli ingressi categorici si codificano con one-hot. Approfondimento: non nel programma di Telecomunicazioni.Classificazione e k-nearest neighbors →.

Modello 1

Righe: classe vera; colonne: prevista. TP=27TP=27 (spam previsti spam), FN=6FN=6, FP=10FP=10 (non spam previsti spam), TN=57TN=57.

prev. spam prev. non spam
spam 2727 66
non spam 1010 5757
  • accuracy =27+57100=0,84=\frac{27+57}{100}=0{,}84;
  • recall =2727+6=2733=0,818=\frac{27}{27+6}=\frac{27}{33}=0{,}818 (trova l'82%82\% dello spam);
  • specificità =5757+10=5767=0,851=\frac{57}{57+10}=\frac{57}{67}=0{,}851;
  • precision =2727+10=2737=0,730=\frac{27}{27+10}=\frac{27}{37}=0{,}730;
  • F1=2⋅0,730⋅0,8180,730+0,818=0,771F_1=\frac{2\cdot0{,}730\cdot0{,}818}{0{,}730+0{,}818}=0{,}771.

La tabella delle slide riporta «overall accuracy 83,44%83{,}44\%»: è la media delle due percentuali di riga, 81,81+85,072=83,44\frac{81{,}81+85{,}07}2=83{,}44, cioè la media di recall e specificità (balanced accuracy); l'accuracy vera è 84%84\%.

Modello 2

TP=0TP=0, FN=10FN=10, FP=0FP=0, TN=990TN=990.

  • accuracy =0+9901000=0,99=\frac{0+990}{1000}=0{,}99 (99%99\%!);
  • recall =010=0=\frac{0}{10}=0: non trova nessuno spam;
  • specificità =990990=1=\frac{990}{990}=1;
  • precision =00+0=\frac{0}{0+0}: indefinita (non ha mai previsto spam);
  • F1=0F_1=0 (per convenzione).

L'accuracy del 99%99\% è ingannevole: coincide con la frazione di non spam. Il modello è inutile per trovare lo spam: con dati sbilanciati l'accuracy non basta.

Modello 3

TP=9TP=9, FN=1FN=1, FP=190FP=190, TN=800TN=800 (i 990990 non spam: 190190 mal classificati e 800800 giusti).

  • accuracy =9+8001000=0,809=\frac{9+800}{1000}=0{,}809;
  • recall =910=0,90=\frac9{10}=0{,}90;
  • specificità =800990=0,808=\frac{800}{990}=0{,}808;
  • precision =99+190=9199=0,045=\frac{9}{9+190}=\frac9{199}=0{,}045;
  • F1=2⋅0,045⋅0,900,045+0,90=0,086F_1=\frac{2\cdot0{,}045\cdot0{,}90}{0{,}045+0{,}90}=0{,}086.

Trova quasi tutto lo spam ma sbaglia 19 volte su 20 quando dice «spam»: (190190 falsi allarmi su 199199 segnalazioni).

Confronto

modello accuracy recall specificità precision F1F_1
1 0,840{,}84 0,820{,}82 0,850{,}85 0,730{,}73 0,770{,}77
2 0,990{,}99 00 11 indef. 00
3 0,810{,}81 0,900{,}90 0,810{,}81 0,050{,}05 0,090{,}09

Il modello 2 ha la migliore accuracy ma è inutile; il modello 3 ha un buon recall ma è inutilizzabile in pratica (bloccherebbe quasi solo posta legittima). Per un filtro antispam, in cui bloccare una mail vera è molto grave, serve alta precision; il modello 1 ha il miglior equilibrio (F1=0,77F_1=0{,}77). Con modelli probabilistici si può regolare la soglia di decisione per spostare l'equilibrio tra falsi positivi e falsi negativi (curva ROC: Esercizio - Curva ROC e AUC di una foresta casuale e di un albero).

Tre classi: metriche macro

Matrice (righe vere, colonne previste) per Cat, Dog, Horse: [8112100028]\begin{bmatrix}8&1&1\\2&10&0\\0&2&8\end{bmatrix}. Totale 3232, diagonale 2626: accuracy =2632=0,8125=\frac{26}{32}=0{,}8125. Per ogni classe, contro le altre due: precision = diagonale / somma della colonna; recall = diagonale / somma della riga.

classe precision recall
Cat 88+2+0=0,800\frac8{8+2+0}=0{,}800 88+1+1=0,800\frac8{8+1+1}=0{,}800
Dog 101+10+2=0,769\frac{10}{1+10+2}=0{,}769 102+10+0=0,833\frac{10}{2+10+0}=0{,}833
Horse 81+0+8=0,889\frac8{1+0+8}=0{,}889 80+2+8=0,800\frac8{0+2+8}=0{,}800

Medie macro (media semplice): precision 0,800+0,769+0,8893=0,819\frac{0{,}800+0{,}769+0{,}889}3=0{,}819 e recall 0,800+0,833+0,8003=0,811\frac{0{,}800+0{,}833+0{,}800}3=0{,}811.

Verifica

python
import numpy as np
def metrics(TP, FN, FP, TN):
    acc = (TP + TN) / (TP + TN + FP + FN)
    rec = TP / (TP + FN); spec = TN / (TN + FP)
    prec = TP / (TP + FP) if TP + FP else float("nan")
    f1 = 2 * prec * rec / (prec + rec) if TP else 0.0
    return acc, rec, spec, prec, f1
print(metrics(27, 6, 10, 57))    # (0.84, 0.818, 0.851, 0.730, 0.771)
print(metrics(0, 10, 0, 990))    # (0.99, 0.0, 1.0, nan, 0.0)
print(metrics(9, 1, 190, 800))   # (0.809, 0.9, 0.808, 0.045, 0.086)
M = np.array([[8,1,1],[2,10,0],[0,2,8]]); tp = np.diag(M)
print(tp.sum() / M.sum(), (tp / M.sum(0)).mean(), (tp / M.sum(1)).mean())   # 0.8125 0.819 0.811

Lezioni in cui compare

Teoria collegata