Menu
CoddyTech

La matriz de confusión

Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 21 de 58.

La exactitud cuenta los errores, no su tipo. En una prueba de gripe, enviar a casa a un paciente enfermo es mucho peor que una falsa alarma. Una confusion_matrix cuenta cada tipo:

Una cuadrícula de 2 por 2 para una prueba de gripe en 100 pacientes. Las filas representan la realidad: sano y después tiene gripe; las columnas representan la respuesta: dijo sano y después dijo que tiene gripe. Respuestas correctas en azul: 50 verdaderos negativos, 42 verdaderos positivos. Errores en naranja: 3 falsos positivos, 5 falsos negativos

La gripe es la clase positiva, 1. Los errores están fuera de la diagonal: falsos positivos (falsas alarmas) y falsos negativos (casos no detectados).

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

cm = confusion_matrix(y_test, pred)  # primero los valores reales
print(cm)
print(cm[1, 0])  # fila 1: tiene gripe, columna 0: se predijo "healthy"
ConfusionMatrixDisplay.from_predictions(y_test, pred, display_labels=["healthy", "flu"],
                                        ax=ax, colorbar=False)  # sin barra de colores: los recuentos hablan por sí solos

Esto imprime:

[[50  3]
 [ 5 42]]
5

Este capítulo trata sobre cómo reducir esa celda de casos no detectados. Termina con una prueba de detección que casi no deja a nadie sin detectar.

challenge icon

Desafío

Intermedio

Los socorristas reciben una alerta por la mañana cuando puede formarse una corriente de resaca. El código inicial entrena el modelo de alerta y completa pred para las mañanas de prueba (1 significa corriente de resaca).

  1. Crea la matriz de confusión e imprime los cuatro recuentos como se muestra a continuación.
  2. Dibújala en ax, con las etiquetas calm y rip, y muéstrala.

Para otro modelo:

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

Coddy describe tu gráfico. Debería parecerse a este, de una alerta por una fuga en una tubería:

Una matriz de confusión titulada Alertas de fugas. Las filas muestran la etiqueta real, seco y después fuga; las columnas muestran la etiqueta predicha. Celdas: 61 y 4 en la fila de seco, 7 y 28 en la fila de fuga

Pruébalo tú mismo

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

# Una fila por cada mañana en una playa de surf: 1 en rip significa que ese día se formó una corriente de resaca
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)

# La alerta de corrientes de resaca de los socorristas
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")

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje supervisado

Practica por tu cuenta: Compilador de Python online