Menu
CoddyTech

A Pontuação F1

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 23 de 58.

Um modelo pode maximizar a precisão ou a revocação abrindo mão da outra. A pontuação F1 combina as duas e permanece baixa, a menos que ambas sejam altas:

Barras para dois modelos. Desequilibrado: precisão 1, revocação 0.1, média simples 0.55, F1 apenas 0.18. Equilibrado: precisão 0.8, revocação 0.7, média simples 0.75, F1 0.75

Com P para precisão e R para revocação, F1 é 2 * P * R / (P + R). Para um modelo meteorológico:

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))  # um por classe, em ordem
print(classification_report(y_test, pred))

Isso imprime:

[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

O relatório pontua cada classe; support conta suas linhas de teste. A linha mais fraca indica o que você deve corrigir primeiro.

challenge icon

Desafio

Médio

A câmera de uma usina de reciclagem separa os itens em lixeiras de vidro, metal, papel e plástico. O programa lê k, e o código inicial treina o k-NN da câmera, preenche pred e lista as bins.

  1. Imprima o relatório de classificação.
  2. Encontre a lixeira com o menor F1 e imprima-a e, em seguida, seu lado mais fraco, precisão ou recall, como abaixo (3 casas decimais).

Após o relatório, para outra usina:

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

Experimente você mesmo

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())

# Uma linha para cada item na esteira e para a lixeira à qual ele pertence
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)

# O modelo da câmera
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
pred = model.predict(X_test)
# As lixeiras, na ordem em que aparecem as pontuações de cada classe
bins = model.classes_

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online