Menu
CoddyTech

Precisione e richiamo

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

Due domande valutano le risposte del test sull'influenza. Tra i suoi allarmi di influenza, quanti erano corretti? Tra i casi reali di influenza, quanti ne ha individuati?

La matrice di confusione del test per l'influenza, mostrata due volte. A sinistra, con il titolo Precisione 42 / 45 = 0.933, è evidenziata la colonna dell'influenza: 3 falsi allarmi e 42 casi individuati. A destra, con il titolo Richiamo 42 / 47 = 0.894, è evidenziata la riga dell'influenza: 5 casi mancati e 42 casi individuati

La precisione risponde alla prima domanda: 42 allarmi su 45. Il richiamo risponde alla seconda: 42 casi su 47.

from sklearn.metrics import precision_score, recall_score

print(f"{precision_score(y_test, pred):.3f}")
print(f"{recall_score(y_test, pred):.3f}")

:.3f mostra sempre 3 cifre decimali, quindi 0.9 verrebbe stampato come 0.900. Questo stampa:

0.933
0.894

Scegli in base all’errore più costoso. Un caso di influenza non rilevato si diffonde, quindi questo test richiede un’elevata sensibilità. Un filtro antispam che nasconde le email autentiche richiede precisione.

challenge icon

Sfida

Medio

Il filtro di un negozio nasconde le recensioni che sembrano false. Il codice iniziale crea due versioni usando lo stesso modello, strict_pred e eager_pred, e legge quale errore è più grave: missed (una recensione falsa rimane visibile) oppure hidden (una recensione vera scompare).

  1. Stampa la precisione e il richiamo di ciascun filtro, con 3 decimali.
  2. Stampa il filtro che commette meno errori di quel tipo, come sotto (per missed: Fewer fakes missed: ...).

Per un altro negozio e hidden:

Strict: precision 0.900, recall 0.450
Eager: precision 0.640, recall 0.800
Fewer real reviews hidden: strict

Provalo tu

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score

# Quale errore è più dannoso: missed (una recensione falsa rimane visibile) o hidden (una recensione autentica viene nascosta)?
worse = input()

# Una riga per recensione: 1 in fake significa che la recensione è stata scritta su commissione
reviews = pd.read_csv("reviews.csv")
features = ["words", "exclamations", "account_days", "user_reviews", "stars", "photo"]
X_train, X_test, y_train, y_test = train_test_split(reviews[features], reviews["fake"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]

# Due filtri dello stesso modello: strict nasconde una recensione quando la probabilità che sia falsa è 0.7, eager quando è 0.3
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3

# 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