
La Matrice di Confusione
La matrice di confusione è uno strumento di valutazione ampiamente utilizzato nel machine learning per misurare le prestazioni di un modello di classificazione. Fornisce una panoramica dettagliata delle previsioni fatte dal modello rispetto alle classi reali dei dati. La matrice di confusione è particolarmente utile quando si lavora con problemi di classificazione in cui le classi possono essere più di due.
La matrice di confusione è organizzata in una tabella, in cui ogni riga rappresenta la classe reale e ogni colonna rappresenta la classe prevista dal modello. La diagonale principale della matrice rappresenta le previsioni corrette (veri positivi e veri negativi), mentre le celle fuori dalla diagonale rappresentano gli errori di classificazione (falsi positivi e falsi negativi).
Ecco come funziona la matrice di confusione:
- Veri Positivi (TP): Numero di casi in cui il modello ha previsto correttamente una classe positiva.
- Veri Negativi (TN): Numero di casi in cui il modello ha previsto correttamente una classe negativa.
- Falsi Positivi (FP): Numero di casi in cui il modello ha erroneamente previsto una classe positiva quando in realtà era negativa (falso allarme).
- Falsi Negativi (FN): Numero di casi in cui il modello ha erroneamente previsto una classe negativa quando in realtà era positiva (mancato rilevamento).
La matrice di confusione può aiutarti a comprendere quale tipo di errori il tuo modello sta commettendo e quale classe sta avendo prestazioni migliori o peggiori. A partire da questi valori, puoi calcolare diverse metriche di valutazione come l’accuratezza, la precisione, il richiamo e il punteggio F1.
La matrice di Confusione come strumento di analisi
La matrice di confusione è uno strumento importante per valutare le prestazioni di un modello di classificazione in dettaglio. Oltre a calcolare i valori di base come veri positivi, veri negativi, falsi positivi e falsi negativi, puoi utilizzare questi valori per calcolare diverse metriche di valutazione che forniscono una visione più completa delle prestazioni del modello. Ecco alcune delle metriche più comuni calcolate dalla matrice di confusione:
1. Accuratezza (Accuracy): L’accuratezza misura la proporzione di previsioni corrette rispetto al numero totale di previsioni. È la metrica più semplice ma può essere fuorviante quando le classi sono sbilanciate.
2. Precisione (Precision): La precisione rappresenta la proporzione di veri positivi rispetto al totale delle previsioni positive effettuate dal modello. Misura quanto il modello è preciso quando fa previsioni positive.
3. Richiamo (Recall o Sensibilità): Il richiamo rappresenta la proporzione di veri positivi rispetto al totale delle istanze positive effettive. Misura la capacità del modello di identificare tutte le istanze positive.
4. Punteggio F1 (F1 Score): Il punteggio F1 è la media armonica tra precisione e richiamo. È utile quando si desidera trovare un equilibrio tra precisione e richiamo.
5. Specificità (Specificity): La specificità rappresenta la proporzione di veri negativi rispetto al totale delle istanze negative effettive. Misura quanto il modello è bravo a identificare le istanze negative.
6. ROC Curve (Receiver Operating Characteristic Curve): La curva ROC è un grafico che mostra la relazione tra il tasso di veri positivi e il tasso di falsi positivi al variare della soglia di classificazione. A mano a mano che la soglia varia, i punti ROC vengono disegnati e collegati, e l’area sotto la curva ROC (AUC) può essere utilizzata come misura dell’efficacia del modello.
Queste metriche possono fornire un’analisi più approfondita delle prestazioni del modello rispetto a una semplice percentuale di accuratezza. È importante selezionare le metriche che sono più rilevanti per il tuo problema e per l’equilibrio tra precisione e richiamo desiderato.
Ricorda che queste metriche sono strumenti utili per valutare i modelli, ma dovresti sempre considerare il contesto del problema e la natura delle tue classi prima di trarre conclusioni sulla qualità del modello.
Un esempio pratico
Ecco un esempio di come utilizzare la matrice di confusione in Python:
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import plot_confusion_matrix
# Carica il dataset Iris
iris = load_iris()
X = iris.data
y = iris.target
# Dividi il dataset in set di addestramento e di test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crea e addestra un modello di classificazione (Random Forest)
model = RandomForestClassifier()
model.fit(X_train, y_train)
# Visualizza la matrice di confusione
plot_confusion_matrix(model, X_test, y_test)
plt.show()
In questo esempio, stiamo utilizzando il metodo plot_confusion_matrix()
da scikit-learn
per visualizzare la matrice di confusione del modello di classificazione (Random Forest) addestrato sul dataset Iris. La matrice di confusione ci darà informazioni sulla precisione del modello per ciascuna classe e ci aiuterà a identificare eventuali errori di classificazione.
Valutazione delle metriche dalla Matrice di Confusione
Ecco degli esempi di come calcolare e visualizzare alcune delle metriche di valutazione utilizzando la matrice di confusione in Python:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, roc_curve, roc_auc_score
# Carica il dataset Iris
iris = load_iris()
X = iris.data
y = iris.target
# Dividi il dataset in set di addestramento e di test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crea e addestra un modello di classificazione (Random Forest)
model = RandomForestClassifier()
model.fit(X_train, y_train)
# Effettua previsioni sul set di test
predictions = model.predict(X_test)
# Calcola la matrice di confusione
cm = confusion_matrix(y_test, predictions)
# Calcola la precisione
precision = precision_score(y_test, predictions, average='weighted')
# Calcola il richiamo
recall = recall_score(y_test, predictions, average='weighted')
# Calcola il punteggio F1
f1 = f1_score(y_test, predictions, average='weighted')
# Calcola l'area sotto la curva ROC (AUC)
y_prob = model.predict_proba(X_test)[:, 1] # Probabilità della classe positiva
roc_auc = roc_auc_score(y_test, y_prob)
# Visualizza la matrice di confusione come una heatmap
plt.figure(figsize=(8, 6))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.title("Matrice di Confusione")
plt.colorbar()
plt.xticks(np.arange(len(iris.target_names)), iris.target_names, rotation=45)
plt.yticks(np.arange(len(iris.target_names)), iris.target_names)
plt.ylabel("Valori Effettivi")
plt.xlabel("Previsioni")
plt.show()
# Visualizza la curva ROC
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label="Curva ROC (AUC = {:.2f})".format(roc_auc))
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('Tasso di Falsi Positivi')
plt.ylabel('Tasso di Veri Positivi')
plt.title('Curva ROC')
plt.legend(loc="lower right")
plt.show()
print("Precisione:", precision)
print("Richiamo:", recall)
print("Punteggio F1:", f1)
print("Area sotto la curva ROC (AUC):", roc_auc)
In questo esempio, stiamo calcolando e visualizzando la matrice di confusione, la curva ROC e calcolando le metriche di precisione, richiamo e punteggio F1 per un modello di classificazione (Random Forest) addestrato sul dataset Iris.