Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Metriche | Confronto tra Modelli
Classificazione con Python

Metriche

Scorri per mostrare il menu

Fino a questo punto, è stata utilizzata l'accuratezza come principale metrica per valutare le prestazioni del modello. Tuttavia, l'accuratezza presenta alcune limitazioni. Verranno ora discussi i suoi svantaggi e introdotte diverse metriche aggiuntive - basate su TP, TN, FP e FN - che aiutano a risolvere questi problemi.

ConfusionMatrix

Accuratezza

L'accuratezza rappresenta la proporzione di previsioni corrette:

accuracy=correctcorrect+incorrect=TP+TNTP+TN+FP+FN\text{accuracy} = \frac{\text{correct}}{\text{correct} + \text{incorrect}} = \frac{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}}}{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} + \textcolor{red}{\text{FN}}}

Tuttavia, l'accuratezza presenta delle limitazioni. Ad esempio, immagina di dover prevedere se un paziente ha una malattia rara. Il dataset contiene 99,9% di pazienti sani e solo 0,1% con la malattia. In questo caso, prevedere sempre che il paziente sia sano porterebbe a un'accuratezza di 0,999 – anche se un modello del genere sarebbe completamente inutile.

Dataset di questo tipo sono detti sbilanciati e, in questi casi, la balanced accuracy è una metrica migliore da utilizzare.

Balanced accuracy

La balanced accuracy calcola separatamente la proporzione di predizioni positive corrette e la proporzione di predizioni negative corrette, quindi le media. Questo approccio attribuisce uguale importanza a ciascuna classe, indipendentemente da quanto il dataset sia sbilanciato.

balanced_accuracy=12TPP+12TNNaccuracy=TP+TNP+N\begin{aligned} \text{balanced\_accuracy} &= \frac12 \cdot \frac{\textcolor{green}{\text{TP}}}{\text{P}} + \frac12 \cdot \frac{\textcolor{green}{\text{TN}}}{\text{N}}\\ \text{accuracy} &= \frac{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}}}{\text{P} + \text{N}} \end{aligned}

Dove

  • P=TP+FN\text{P} = \textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}} - numero totale di istanze positive (classe 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} - numero totale di istanze negative (classe 0).

Nell'esempio della malattia rara, la balanced accuracy di un modello che prevede sempre "sano" sarebbe 0,5 – evidenziando efficacemente il problema. Quindi, questo problema viene affrontato.

Tuttavia, la balanced accuracy ancora non distingue tra errori di tipo 1 ed errori di tipo 2 – proprio come l'accuratezza tradizionale. È qui che entrano in gioco precision e recall.

Precision

La metrica precision indica quante delle istanze che il modello ha previsto come positive erano effettivamente positive. È la proporzione di veri positivi sul totale delle previsioni positive effettuate dal modello:

precision=TPTP+FP\text{precision} = \frac{\textcolor{green}{\text{TP}}}{\textcolor{green}{\text{TP}} + \textcolor{red}{\text{FP}}}

Utilizzando la metrica precision, è possibile comprendere con quale frequenza si verifica un errore di tipo 1. Un valore elevato di precision indica che gli errori di tipo 1 sono rari, mentre un valore basso suggerisce che tali errori sono frequenti.

Recall

La metrica recall mostra la proporzione di casi positivi reali che il modello ha previsto correttamente:

recall=TPTP+FN\text{recall} = \frac{\textcolor{green}{\text{TP}}}{\textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}}}

La metrica recall aiuta a comprendere con quale frequenza si verifica un errore di tipo 2. Un valore elevato di recall indica che gli errori di tipo 2 sono rari, mentre un valore basso significa che si verificano frequentemente.

Tuttavia, sia la precision che la recall presentano delle limitazioni. Ad esempio, un modello che predice solo la classe positiva (1) otterrà un recall perfetto, ma la sua precision sarà scarsa. Al contrario, un modello che predice correttamente solo un'istanza positiva e classifica tutto il resto come negativo avrà una precision perfetta, ma una recall pessima.

Questo dimostra che, sebbene sia facile costruire un modello con precision perfetta o recall perfetta, è molto più difficile crearne uno che abbia buoni risultati in entrambe. Per questo motivo è importante considerare entrambe le metriche – e fortunatamente esiste una metrica che le combina.

F1 Score

L'F1 score è la media armonica di precision e recall. La media armonica è preferita rispetto alla media aritmetica perché penalizza le situazioni in cui uno dei valori (precision o recall) è basso, rendendola una misura più equilibrata delle prestazioni di un modello.

F1=21precision+1recall=2precisionrecallprecision+recall\text{F1} = \frac{2}{\frac{1}{\text{precision}} + \frac{1}{\text{recall}}} = \frac{2 \cdot \text{precision} \cdot \text{recall}}{\text{precision} + \text{recall}}

L'F1 score combina sia precision che recall in un'unica metrica. Sarà elevato solo se sia precision che recall sono relativamente alti, rendendolo una misura utile quando è necessario bilanciare entrambi i tipi di errore.

La scelta della metrica appropriata dipende dal compito specifico. Accuratezza (o accuratezza bilanciata per dataset sbilanciati) è intuitiva e fornisce una valutazione generale delle prestazioni complessive del modello. Se è necessario un approfondimento sui tipi di errori commessi dal modello, la precisione aiuta a identificare gli errori di tipo 1, mentre il recall evidenzia gli errori di tipo 2. Il punteggio F1 mostra quanto il modello sia bilanciato rispetto agli errori di tipo 1 e di tipo 2.

MetricsSummary
Note
Approfondisci

Un'altra metrica comunemente utilizzata è ROC/AUC, di cui puoi leggere nell' questo articolo.

Metriche in Python

Scikit-learn fornisce implementazioni per tutte queste metriche nel modulo sklearn.metrics:

from sklearn.metrics import accuracy_score, balanced_accuracy_score, precision_score, recall_score, f1_score

accuracy = accuracy_score(y_true, y_pred)
balanced_accuracy = balanced_accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)

Se si desidera ottenere metriche come precision, recall e F1-score tutte insieme, sklearn mette a disposizione la funzione classification_report():

12345678910111213
import pandas as pd import seaborn as sns from sklearn.metrics import classification_report from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/titanic.csv') X, y = df.drop('Survived', axis=1), df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) random_forest = RandomForestClassifier().fit(X_train, y_train) y_pred = random_forest.predict(X_test) # Display a classification report print(classification_report(y_test, y_pred))
Note
Nota

Support indica il numero di occorrenze effettive di ciascuna classe nel set di test. Macro avg calcola la media di ciascuna metrica (precision, recall, F1) su tutte le classi in modo uguale, senza considerare lo sbilanciamento tra le classi. Weighted avg calcola la media delle metriche su tutte le classi, ma attribuisce un peso maggiore alle classi con più istanze (in base al loro support).

question mark

Quale metrica di valutazione fornisce un equilibrio tra precisione e richiamo, offrendo un unico punteggio che riflette entrambi?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 2

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 5. Capitolo 2
some-alt