Menu
CoddyTech

La matrice di confusione

Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 21 di 58.

La precisione conta gli errori, non il loro tipo. Per un test dell’influenza, mandare a casa un paziente malato è molto peggio di un falso allarme. Una matrice di confusione conta ciascun tipo:

Una griglia 2 per 2 per un test dell’influenza su 100 pazienti. Le righe rappresentano la verità: sano, poi ha l’influenza; le colonne rappresentano la risposta: detto sano, poi detto che ha l’influenza. Risposte corrette in blu: 50 veri negativi, 42 veri positivi. Errori in arancione: 3 falsi positivi, 5 falsi negativi

L'influenza è la classe positiva, 1. Gli errori si trovano fuori dalla diagonale: falsi positivi (falsi allarmi) e falsi negativi (casi non rilevati).

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

cm = confusion_matrix(y_test, pred)  # prima i valori reali
print(cm)
print(cm[1, 0])  # riga 1: ha l'influenza, colonna 0: classificato come sano
ConfusionMatrixDisplay.from_predictions(y_test, pred, display_labels=["healthy", "flu"],
                                        ax=ax, colorbar=False)  # nessuna barra dei colori: i conteggi parlano da soli

Stampa:

[[50  3]
 [ 5 42]]
5

Questo capitolo parla di ridurre quella cella dei casi mancati. Si conclude con un test di screening che non si lascia sfuggire quasi nessuno.

challenge icon

Sfida

Medio

I bagnini ricevono un avviso mattutino quando potrebbe formarsi una corrente di risacca. Il codice iniziale addestra il modello di avviso e riempie pred per le mattine di test (1 significa corrente di risacca).

  1. Crea la matrice di confusione e stampa i quattro conteggi come mostrato di seguito.
  2. Disegnala su ax, con le etichette calm e rip, e visualizzala.

Per un altro modello:

Rips caught: 30
Rips missed: 2
False alarms: 9
Calm days cleared: 59

Coddy descrive il tuo grafico. Dovrebbe assomigliare a questo, relativo a un allarme per una perdita in una tubatura:

Una matrice di confusione intitolata Avvisi di perdite. Le righe rappresentano l'etichetta reale, prima asciutto e poi perdita; le colonne rappresentano l'etichetta prevista. Celle: 61 e 4 nella riga asciutto, 7 e 28 nella riga perdita

Provalo tu

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

# Una riga per ogni mattina in una spiaggia da surf: 1 in rip significa che quel giorno si è formata una corrente di risacca
beach = pd.read_csv("rips.csv")
features = ["wave_height_m", "wave_period_s", "wind_kmh", "tide_change_m"]
X = beach[features]
y = beach["rip"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

# L'avviso dei bagnini per le correnti di risacca
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
pred = model.predict(X_test)

fig, ax = plt.subplots()
ax.set_title("Rip Current Alerts")

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento supervisionato

Esercitati da solo: Compilatore Python online