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:
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í solosEsto imprime:
[[50 3]
[ 5 42]]
5Este 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.
Desafío
IntermedioLos 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).
- Crea la matriz de confusión e imprime los cuatro recuentos como se muestra a continuación.
- Dibújala en
ax, con las etiquetascalmyrip, y muéstrala.
Para otro modelo:
Rips caught: 30
Rips missed: 2
False alarms: 9
Calm days cleared: 59Coddy describe tu gráfico. Debería parecerse a este, de una alerta por una fuga en una tubería:
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Aprendizaje supervisado
1Tu primer modelo
Aprender de ejemplosConjuntos de entrenamiento y pruebaAjustar y predecirEvaluar un modeloRepaso: clasificador de semillas4Regresión logística
Predicciones de sí o noEl umbral de decisiónLos pesos como evidenciaVarias clasesRepaso: filtro de spam2Vecinos más cercanos
Cómo decide k-NNCómo elegir kFronteras de decisiónEscalado para los vecinosRepaso: vecinos del vino5Medición de clasificadores
La matriz de confusiónPrecisión y exhaustividadLa puntuación F1Clases desequilibradasCurvas ROCRepaso: prueba de detección8Validación cruzada
Validación K-FoldComparación justa de modelosBúsqueda en cuadrículaRepaso: reparaciones de monopatines11Proyecto: especies de pingüinos
Conoce a los pingüinosPrepara los datosElige un modeloAjusta el modelo ganadorPublica el modelo3Regresión lineal
Predicción de númerosVarias característicasMedición de erroresGráficos de residuosRepaso: alquiler de bicicletas6Árboles de decisión
Los árboles hacen preguntasLeer un árbolProfundidad del árbolImportancia de las característicasRepaso: decisiones de préstamosPractica por tu cuenta: Compilador de Python online