Misurare il Successo nel Machine Learning
Costruire un modello di Machine Learning è solo metà del lavoro. L’altra metà, altrettanto cruciale, consiste nel valutare quanto bene quel modello stia effettivamente performando nel fare le sue previsioni. Per i modelli di classificazione – quelli che assegnano un’istanza a una specifica categoria (es. “sì” o “no”, “Classe A”, “Classe B”, “Classe C”) – esistono diverse metriche per misurare le performance. La più semplice, la più comune e spesso la prima a essere considerata è l’Accuracy, o Precisione Complessiva.
Ma cosa misura esattamente l’Accuracy? Quando è una metrica affidabile e quando invece può trarci in inganno? Questo articolo pillar esplorerà a fondo il concetto di Accuracy, spiegando la sua definizione, il suo calcolo, i suoi vantaggi, ma soprattutto i suoi limiti, ponendo le basi per comprendere la necessità di altre metriche di valutazione.
Cos’è l’Accuracy? La Definizione Fondamentale
In termini semplici, l’Accuracy misura la proporzione di previsioni corrette effettuate dal modello rispetto al numero totale di previsioni. Se un modello cerca di classificare 100 istanze e indovina la classe corretta per 90 di esse, la sua Accuracy è del 90% (o 0.90).
È la metrica più intuitiva perché rispecchia direttamente la percentuale di volte in cui il modello “ci ha azzeccato” nella sua previsione binaria o multiclasse.
I Blocchi Costitutivi: Veri Positivi, Veri Negativi, Falsi Positivi e Falsi Negativi
Per capire a fondo l’Accuracy e i suoi limiti, dobbiamo scomporre i possibili risultati di una previsione binaria in quattro categorie, rappresentate visivamente nella Matrice di Confusione:
- Veri Positivi (True Positives – TP): Il modello ha predetto la classe positiva e l’istanza era effettivamente positiva. (Esempio: Il modello predice “Clicca” e l’utente ha cliccato).
- Veri Negativi (True Negatives – TN): Il modello ha predetto la classe negativa e l’istanza era effettivamente negativa. (Esempio: Il modello predice “Non Clicca” e l’utente non ha cliccato).
- Falsi Positivi (False Positives – FP): Il modello ha predetto la classe positiva ma l’istanza era in realtà negativa. Questo è un errore di Tipo I. (Esempio: Il modello predice “Clicca” ma l’utente non ha cliccato).
- Falsi Negativi (False Negatives – FN): Il modello ha predetto la classe negativa ma l’istanza era in realtà positiva. Questo è un errore di Tipo II. (Esempio: Il modello predice “Non Clicca” ma l’utente ha cliccato).
Il numero totale di istanze è semplicemente la somma di queste quattro categorie: [math]\text{Totale} = \text{TP} + \text{TN} + \text{FP} + \text{FN}[/math].
Le previsioni corrette sono la somma dei Veri Positivi e dei Veri Negativi ([math]\text{TP} + \text{TN}[/math]).
La Formula dell’Accuracy
Basandoci sulle definizioni precedenti, la formula matematica per l’Accuracy è:
[math] \text{Accuracy} = \frac{\text{Numero di classificazioni corrette}}{\text{Numero totale di istanze}} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}} [/math]
Il valore dell’Accuracy è sempre compreso tra 0 (0% di previsioni corrette) e 1 (100% di previsioni corrette).
Come si Calcola l’Accuracy nella Pratica
Per calcolare l’Accuracy di un modello, si segue tipicamente questo processo:
- Addestramento: Il modello viene addestrato su un set di dati di addestramento (training set).
- Previsione: Il modello addestrato viene utilizzato per fare previsioni su un set di dati separato, chiamato set di test (test set), che non è stato utilizzato durante l’addestramento. Il set di test deve contenere le classi reali per ogni istanza.
- Confronto: Per ogni istanza nel set di test, la previsione del modello viene confrontata con la sua classe reale.
- Conteggio: Si contano le previsioni corrette (TP + TN) e il totale delle istanze.
- Calcolo: Si applica la formula dell’Accuracy.
Questo processo garantisce che la valutazione sia fatta sulla capacità del modello di generalizzare a dati mai visti prima, fornendo una stima più realistica delle sue performance future.
Interpretare il Valore di Accuracy: Alto vs Basso
Un valore di Accuracy più alto indica generalmente una migliore performance del modello nel fare previsioni corrette.
- Un’Accuracy pari a 1.0 (100%) significa che il modello ha classificato correttamente ogni singola istanza nel set di test. Questo accade raramente con dati reali e potrebbe persino indicare overfitting (il modello ha memorizzato i dati di addestramento invece di imparare a generalizzare).
- Un’Accuracy pari a 0.5 (50%) in un problema di classificazione binaria bilanciato (dove le due classi hanno circa lo stesso numero di istanze) è equivalente a tirare a indovinare casualmente.
- Un’Accuracy pari a 0.0 (0%) significa che il modello ha sbagliato ogni singola previsione.
Esempio: Accuracy 0.75
Se in un problema di classificazione ottieni un’Accuracy di 0.75 sul set di test (come nell’articolo sulla Regressione Logistica per il Marketing), significa che il tuo modello ha classificato correttamente il 75% delle istanze in quel set di dati. Il restante 25% è stato classificato in modo errato.
Questo valore ti dice che il modello “indovina” correttamente 3 volte su 4. Intuitivamente sembra buono, ma come vedremo, questo valore da solo non basta a definire l’utilità pratica del modello.
Vantaggi: Perché l’Accuracy è così Popolare?
Nonostante i suoi limiti (che esploreremo a breve), l’Accuracy è ampiamente utilizzata per diversi motivi:
- Semplicità: Il concetto è estremamente facile da capire: è semplicemente la percentuale di “risposte giuste”.
- Intuitività: Fornisce un numero unico che dà un’idea immediata e comparabile della performance complessiva.
- Facilità di Calcolo: È semplice da calcolare una volta ottenute le previsioni e le classi reali.
È un ottimo punto di partenza per valutare un modello e per avere una prima impressione delle sue capacità.
Nonostante la sua semplicità e popolarità, è fondamentale essere consapevoli dei limiti cruciali dell’Accuracy:
Limitazioni Cruciali: Quando l’Accuracy Inganna
Il limite più grande dell’Accuracy emerge in contesti reali, dove i dati spesso presentano caratteristiche che questa metrica non riesce a catturare adeguatamente.
-
Dataset Sbilanciati: Il Problema Maggiore
Questo è il limite più critico. Un dataset è sbilanciato quando il numero di istanze in una classe è significativamente diverso dal numero di istanze nell’altra (o nelle altre) classi.
- Esempio: Prevedere frodi con carta di credito. Le transazioni fraudolente sono rarissime (magari 1 su 1000). Un modello che prevede sempre “Non Frode” per ogni transazione avrebbe un’Accuracy del 99.9% (classificherebbe correttamente tutte le transazioni non fraudolente)! Ma questo modello sarebbe completamente inutile per il nostro scopo, in quanto non identificherebbe mai una frode reale.
- Esempio Medico: Prevedere una malattia rara. Se solo l’1% dei pazienti ha la malattia, un modello che predice sempre “Sano” avrebbe un’Accuracy del 99%. Di nuovo, inutile per diagnosticare la malattia.
In questi casi, un’alta Accuracy è fuorviante perché il modello sta semplicemente indovinando correttamente la stragrande maggioranza di istanze appartenenti alla classe maggioritaria, fallendo completamente nel compito più importante: identificare le istanze della classe minoritaria (le frodi, i malati, i cliccatori rari ma preziosi). L’Accuracy non distingue tra indovinare un “Non Frode” e un “Frode”.
-
Ignorare i Costi Diversi degli Errori
L’Accuracy tratta allo stesso modo i Falsi Positivi (FP) e i Falsi Negativi (FN). Tuttavia, nel mondo reale, i costi o le conseguenze di questi due tipi di errore sono spesso molto diversi:
- Esempio Medico: Un Falso Positivo (dire a un paziente sano che è malato) causa ansia e test aggiuntivi costosi. Un Falso Negativo (dire a un paziente malato che è sano) può avere conseguenze fatali. In questo caso, un Falso Negativo è molto peggio di un Falso Positivo. L’Accuracy non riflette questa differenza di gravità.
- Esempio Marketing (Email): Un Falso Positivo (prevedere che un utente cliccherà e inviargli un’offerta costosa, quando non avrebbe cliccato) comporta uno spreco di budget. Un Falso Negativo (prevedere che un utente non cliccherà e non inviargli l’offerta, quando avrebbe cliccato) comporta una perdita di opportunità di conversione. A seconda del costo/valore, uno di questi errori potrebbe essere più accettabile dell’altro.
Poiché l’Accuracy somma semplicemente TP e TN, non ci dice nulla sulla distribuzione degli errori e sull’impatto pratico di FP e FN.
Quando l’Accuracy è una Buona Metrica?
Nonostante i suoi limiti, l’Accuracy rimane una metrica valida e utile quando:
- Le classi sono ragionevolmente bilanciate (il numero di istanze in ciascuna classe è simile).
- I costi o le conseguenze dei Falsi Positivi e dei Falsi Negativi sono approssimativamente equivalenti o non è fondamentale distinguerli per l’obiettivo di business.
Anche in questi casi, è comunque buona pratica affiancarla ad altre metriche per avere un quadro più completo.
Oltre l’Accuracy: Metriche Complementari Indispensabili
Per superare le limitazioni dell’Accuracy, soprattutto in presenza di dataset sbilanciati o costi degli errori differenti, è fondamentale utilizzare metriche aggiuntive. Queste metriche si basano sempre sui quattro componenti (TP, TN, FP, FN) della Matrice di Confusione:
- Precisione (Precision): Risponde alla domanda: “Tra tutti quelli che il modello ha predetto come Positivi, quanti lo erano veramente?”. È utile quando minimizzare i Falsi Positivi è cruciale (es. evitare di classificare email legittime come spam). [math] \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} [/math]
- Richiamo (Recall) o Sensibilità (Sensitivity): Risponde alla domanda: “Tra tutti quelli che erano veramente Positivi, quanti il modello è riuscito a identificare?”. È cruciale quando minimizzare i Falsi Negativi è l’obiettivo (es. identificare tutti i malati, non perdere potenziali frodi). [math] \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} [/math]
- Specificità (Specificity): Complementare al Richiamo. Risponde alla domanda: “Tra tutti quelli che erano veramente Negativi, quanti il modello è riuscito a identificare?”. [math] \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} [/math]
- F1-Score: È la media armonica di Precision e Recall. Fornisce un singolo punteggio che bilancia l’esigenza di avere pochi FP e pochi FN, utile specialmente su dataset sbilanciati. [math] \text{F1-Score} = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} [/math]
- Area Under the ROC Curve (AUC): Valuta la capacità del modello di distinguere tra le classi positive e negative per tutte le possibili soglie di classificazione. È una metrica robusta per dataset sbilanciati e indica l’efficacia generale del modello indipendentemente dalla soglia scelta. (Come spiegato nell’articolo sulla Regressione Logistica).
L’analisi della Matrice di Confusione stessa è il primo passo fondamentale, poiché mostra la distribuzione esatta di TP, TN, FP e FN, permettendo di capire dove il modello sta sbagliando.
Esempi di Codice Python: Calcolare le Metriche di Classificazione con Scikit-learn
Dopo aver compreso la teoria dietro l’Accuracy, la Matrice di Confusione e altre metriche fondamentali per valutare i modelli di classificazione, come Precisione, Richiamo e F1-Score, vediamo ora come calcolarle facilmente in pratica usando Python e la popolare libreria scikit-learn.
La maggior parte delle funzioni di valutazione disponibili nel modulo sklearn.metrics richiede due input principali:
y_true: Una lista, un array NumPy o una Serie Pandas contenente le etichette di classe reali (la “verità”) per le istanze che stiamo valutando.y_pred: Una lista, un array NumPy o una Serie Pandas contenente le etichette di classe predette dal tuo modello per le stesse istanze.
Questi y_true e y_pred provengono tipicamente dalla valutazione del modello sul set di test (come visto nell’articolo sulla Regressione Logistica): y_true sarà il set di test reale (y_test), e y_pred saranno le previsioni del modello su quel set ottenute tramite model.predict(X_test).
Vediamo come calcolare le metriche principali con un semplice esempio pratico in Python:
Calcolo delle Metriche
# Importiamo le funzioni necessarie dal modulo metrics di scikit-learn
from sklearn.metrics import (
accuracy_score, # Per l'accuratezza complessiva
precision_score, # Per la precisione
recall_score, # Per il richiamo (sensibilità)
f1_score, # Per l'F1-Score
confusion_matrix # Per la matrice di confusione
)
import numpy as np # Importiamo numpy per creare array di esempio
# --- Dati di esempio: etichette reali (y_true) e predizioni del modello (y_pred) ---
# Assumiamo un problema di classificazione binaria dove 0 è la classe Negativa
# e 1 è la classe Positiva (es. 1 = Clicca sull'email, 0 = Non Clicca)
# Etichette reali (la verità del dataset) per 10 istanze
y_true = np.array([0, 1, 0, 0, 1, 1, 0, 1, 0, 0])
# Etichette predette dal nostro modello per le stesse 10 istanze
y_pred = np.array([0, 1, 0, 1, 1, 0, 0, 1, 1, 0])
print("--- Dati di Esempio ---")
print(f"Etichette Reali (y_true): {y_true}")
print(f"Etichette Predette (y_pred): {y_pred}")
print("-" * 25) # Riga separatrice per chiarezza
# --- Calcolo delle Metriche di Classificazione ---
# 1. Matrice di Confusione
# Calcola la matrice di confusione. È una tabella che riassume le performance.
# Le righe rappresentano le classi reali (True), le colonne le classi predette (Predicted).
# Per classificazione binaria (0, 1), la matrice sarà 2x2:
# [[True Negatives (TN), False Positives (FP)],
# [False Negatives (FN), True Positives (TP)]]
conf_matrix = confusion_matrix(y_true, y_pred)
print("\n--- Matrice di Confusione ---")
print(conf_matrix)
# Interpretazione per i dati di esempio:
# [[4, 2], (4 istanze reali 0 predette come 0, 2 istanze reali 0 predette come 1)
# [1, 3]] (1 istanza reale 1 predetta come 0, 3 istanze reali 1 predette come 1)
# Totale istanze = 4 + 2 + 1 + 3 = 10 (corrisponde alla lunghezza di y_true/y_pred)
print("-" * 25)
# 2. Accuracy (Accuratezza Complessiva)
# Misura la proporzione di previsioni corrette sul totale delle istanze.
# Formula: (TP + TN) / Totale
accuracy = accuracy_score(y_true, y_pred)
print(f"\nAccuracy: {accuracy:.2f}")
# Calcolo manuale per l'esempio: (3 TP + 4 TN) / 10 Totale = 7 / 10 = 0.70
# 3. Precisione (Precision)
# Risponde alla domanda: "Tra tutte le istanze che il modello ha predetto come Positive (Classe 1), quante erano realmente Positive?"
# Formula (per la classe Positiva): TP / (TP + FP)
# Per problemi binari, dobbiamo specificare 'average='binary'' per calcolare la metrica per la classe positiva (di default la classe 1).
precision = precision_score(y_true, y_pred, average='binary')
print(f"Precision (per Classe 1): {precision:.2f}")
# Calcolo manuale dalla matrice: 3 TP / (3 TP + 2 FP) = 3 / 5 = 0.60
# 4. Richiamo (Recall) o Sensibilità (Sensitivity)
# Risponde alla domanda: "Tra tutte le istanze che erano realmente Positive (Classe 1), quante sono state correttamente identificate dal modello?"
# Formula (per la classe Positiva): TP / (TP + FN)
recall = recall_score(y_true, y_pred, average='binary')
print(f"Recall (per Classe 1): {recall:.2f}")
# Calcolo manuale dalla matrice: 3 TP / (3 TP + 1 FN) = 3 / 4 = 0.75
# 5. F1-Score
# È la media armonica di Precision e Recall. Fornisce una singola metrica che bilancia entrambe.
# È utile quando si cerca un equilibrio tra Precision e Recall, specialmente con classi sbilanciate.
# Formula (per la classe Positiva): 2 * (Precision * Recall) / (Precision + Recall)
f1 = f1_score(y_true, y_pred, average='binary')
print(f"F1-Score (per Classe 1): {f1:.2f}")
# Calcolo manuale: 2 * (0.60 * 0.75) / (0.60 + 0.75) = 2 * 0.45 / 1.35 ≈ 0.667
# Nota sull'argomento 'average' nelle funzioni precision_score, recall_score, f1_score:
# - 'binary': per problemi binari, calcola la metrica solo per la classe positiva.
# - 'macro': calcola la metrica per ciascuna classe e ne fa la media (non ponderata).
# - 'weighted': calcola la metrica per ciascuna classe e ne fa la media ponderata per il numero di istanze in quella classe (utile per dataset sbilanciati).
# - 'micro': calcola la metrica globalmente contando i totali veri positivi, falsi negativi e falsi positivi. Per classificazione multi-classe, è uguale all'accuracy.
Spiegazione del Codice:
Analizziamo brevemente i passaggi chiave dello snippet di codice Python:
- Abbiamo importato le funzioni di valutazione necessarie direttamente dal modulo
sklearn.metrics. - Abbiamo definito due array NumPy,
y_trueey_pred. Questi rappresentano le etichette di classe reali e quelle prodotte dal nostro modello. Questo formato (array o lista) è quello atteso dalla maggior parte delle funzioni di metriche in scikit-learn. - Abbiamo calcolato la Matrice di Confusione usando la funzione
confusion_matrix(y_true, y_pred). L’output è un array NumPy 2×2 (per classificazione binaria) che mostra come le istanze sono state classificate nelle quattro categorie: Veri Negativi (TN), Falsi Positivi (FP), Falsi Negativi (FN), e Veri Positivi (TP), disposte in un ordine standard ([ [TN, FP], [FN, TP] ] per classi 0 e 1). - Abbiamo calcolato l’Accuracy usando
accuracy_score(y_true, y_pred). Questa è la metrica più semplice e calcola direttamente la proporzione totale di previsioni corrette rispetto al numero totale di istanze. - Abbiamo calcolato la Precisione, il Richiamo, e l’F1-Score usando le rispettive funzioni:
precision_score(),recall_score(), ef1_score(). Un aspetto importante qui è l’uso dell’argomentoaverage='binary'. Questo indica a scikit-learn di calcolare queste metriche focalizzandosi specificamente sulla “classe positiva” (che, per convenzione, è la classe etichettata come 1 nei problemi binari). Per problemi con più di due classi, useresti opzioni diverse come'macro'o'weighted'. - Infine, abbiamo stampato tutti i risultati ottenuti, formattandoli per una migliore leggibilità. Il confronto con i calcoli manuali (come mostrato nei commenti del codice) aiuta a verificare la correttezza e a consolidare la comprensione delle formule sottostanti.
Questo snippet di codice fornisce un esempio pratico e replicabile di come ottenere le metriche di valutazione chiave in Python partendo dai risultati del tuo modello (y_pred) confrontati con la verità (y_true). Puoi facilmente sostituire gli array di esempio con i risultati reali ottenuti dal tuo modello sul set di test per valutare le sue performance.
Conclusione: Accuracy, un Punto di Partenza non di Arrivo
L’Accuracy è una metrica di valutazione fondamentale e un ottimo punto di partenza per farsi un’idea generale delle performance di un modello di classificazione. La sua semplicità e intuitività la rendono uno standard nel reportistica iniziale.
Tuttavia, un professionista di dati esperto sa che l’Accuracy da sola raramente basta, soprattutto in contesti complessi con dati sbilanciati o costi degli errori asimmetrici. È cruciale comprenderne i limiti e integrarla sempre con un’analisi più approfondita basata sulla Matrice di Confusione e altre metriche complementari come Precisione, Richiamo, F1-Score e AUC, per ottenere un quadro completo e prendere decisioni informate sull’efficacia reale e l’applicabilità pratica del modello.





