Menu
CoddyTech

A Matriz de Confusão

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

A acurácia conta os erros, mas não o tipo deles. Em um teste de gripe, mandar para casa um paciente doente é muito pior do que um falso alarme. Uma matriz de confusão conta cada tipo:

Uma grade de 2 por 2 para um teste de gripe em 100 pacientes. As linhas representam a realidade: saudável e depois com gripe; as colunas representam a resposta: considerado saudável e depois considerado com gripe. Respostas corretas em azul: 50 verdadeiros negativos, 42 verdadeiros positivos. Erros em laranja: 3 falsos positivos, 5 falsos negativos

A gripe é a classe positiva, 1. Os erros ficam fora da diagonal: falsos positivos (alarmes falsos) e falsos negativos (casos não detectados).

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

cm = confusion_matrix(y_test, pred)  # valor real primeiro
print(cm)
print(cm[1, 0])  # linha 1: tem gripe, coluna 0: indicou saudável
ConfusionMatrixDisplay.from_predictions(y_test, pred, display_labels=["healthy", "flu"],
                                        ax=ax, colorbar=False)  # sem barra de cores: as contagens falam por si

Isso imprime:

[[50  3]
 [ 5 42]]
5

Este capítulo trata de reduzir a célula de casos não detectados. Ele termina com um teste de triagem que quase não deixa ninguém passar despercebido.

challenge icon

Desafio

Médio

Os salva-vidas recebem um alerta pela manhã quando uma corrente de retorno pode se formar. O código inicial treina o modelo de alerta e preenche pred para as manhãs de teste (1 significa corrente de retorno).

  1. Crie a matriz de confusão e imprima as quatro contagens abaixo.
  2. Desenhe-a em ax, com os rótulos calm e rip, e exiba-a.

Para outro modelo:

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

O Coddy descreve seu gráfico. Ele deve ser parecido com este, de um alarme de vazamento em um cano:

Uma matriz de confusão intitulada Alertas de vazamento. As linhas representam o rótulo verdadeiro, seco e depois vazamento; as colunas, o rótulo previsto. Células: 61 e 4 na linha seco, 7 e 28 na linha vazamento

Experimente você mesmo

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

# Uma linha para cada manhã em uma praia de surfe: 1 em rip significa que uma corrente de retorno se formou naquele dia
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)

# O alerta de corrente de retorno dos salva-vidas
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")

# 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