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:
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 siIsso imprime:
[[50 3]
[ 5 42]]
5Este 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.
Desafio
MédioOs 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).
- Crie a matriz de confusão e imprima as quatro contagens abaixo.
- Desenhe-a em
ax, com os rótuloscalmerip, e exiba-a.
Para outro modelo:
Rips caught: 30
Rips missed: 2
False alarms: 9
Calm days cleared: 59O Coddy descreve seu gráfico. Ele deve ser parecido com este, de um alarme de vazamento em um cano:
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
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
1Seu primeiro modelo
Aprendendo com exemplosConjuntos de treino e testeAjustar e preverAvaliar um modeloRecapitulação: classificador de sementes4Regressão logística
Previsões de sim ou nãoO limiar de decisãoPesos como evidênciasVárias classesRevisão: filtro de spam2Vizinhos Mais Próximos
Como o k-NN DecideEscolhendo kLimites de DecisãoEscalonamento para VizinhosRevisão: Vizinhos do Vinho5Avaliando Classificadores
A Matriz de ConfusãoPrecisão e RevocaçãoA Pontuação F1Classes DesbalanceadasCurvas ROCRecapitulação: Teste de Triagem8Validação Cruzada
Validação K-FoldComparando Modelos de Forma JustaBusca em GradeRevisão: Consertos de Skate11Projeto: Espécies de Pinguins
Conheça os PinguinsPrepare os DadosEscolha um ModeloAjuste o VencedorColoque o Modelo em Produção3Regressão Linear
Prevendo númerosVárias característicasMedindo errosGráficos de resíduosRevisão: aluguel de bicicletas6Árvores de Decisão
Árvores fazem perguntasLendo uma árvoreProfundidade da árvoreImportância das característicasRevisão: decisões de empréstimoPratique por conta própria: Compilador de Python online