Menu
CoddyTech

Il punteggio F1

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

Un modello può massimizzare la precisione o il richiamo sacrificando l'altro. L'F1 score combina i due e rimane basso a meno che entrambi non siano alti:

Barre per due modelli. Sbilanciato: precisione 1, richiamo 0.1, media semplice 0.55, F1 solo 0.18. Bilanciato: precisione 0.8, richiamo 0.7, media semplice 0.75, F1 0.75

Con P per la precisione e R per il richiamo, F1 è 2 * P * R / (P + R). Per un modello meteorologico:

from sklearn.metrics import f1_score, classification_report

y_test = ["sun", "sun", "rain", "rain", "snow", "sun", "rain", "snow"]
pred   = ["sun", "rain", "rain", "rain", "snow", "sun", "sun", "rain"]
print(f1_score(y_test, pred, average=None))  # uno per classe, in ordine
print(classification_report(y_test, pred))

Questo stampa:

[0.57142857 0.66666667 0.66666667]
              precision    recall  f1-score   support

        rain       0.50      0.67      0.57         3
        snow       1.00      0.50      0.67         2
         sun       0.67      0.67      0.67         3

    accuracy                           0.62         8
   macro avg       0.72      0.61      0.63         8
weighted avg       0.69      0.62      0.63         8

Il report assegna un punteggio a ogni classe; support conta le sue righe di test. La riga più debole ti indica cosa correggere per prima.

challenge icon

Sfida

Medio

La telecamera di un impianto di riciclaggio smista gli oggetti nei contenitori per vetro, metallo, carta e plastica. Il programma legge k e il codice iniziale addestra il modello k-NN della telecamera, popola pred ed elenca i bins.

  1. Stampa il rapporto di classificazione.
  2. Trova il contenitore con il valore F1 più basso e stampalo, poi stampa il suo aspetto più debole, precisione o richiamo, come sotto (3 decimali).

Dopo il rapporto, per un altro impianto:

Weakest bin: metal, F1 0.667
Its weaker side: recall 0.571

Provalo tu

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, f1_score, precision_score, recall_score

k = int(input())

# Una riga per ogni oggetto sul nastro trasportatore e per il contenitore a cui appartiene
items = pd.read_csv("recycling.csv")
features = ["weight_g", "shine", "see_through", "bend"]
X_train, X_test, y_train, y_test = train_test_split(items[features], items["material"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Il modello della telecamera
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
pred = model.predict(X_test)
# I contenitori, nell'ordine in cui compaiono i punteggi per ciascuna classe
bins = model.classes_

# 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