
Sesión 3 — La matriz de confusión: cuando no todos los errores valen lo mismo
Seguimos en nuestro cuaderno. En la Sesión 2 entrenamos nuestro primer árbol de decisión y calculamos su exactitud en el conjunto de prueba. Nos dio un porcentaje bastante alto pero, ¿es suficiente un solo número para confiar en un diagnóstico médico hecho por una inteligencia artificial?
Hoy abrimos la caja de las predicciones para descubrir que, en ciencia y en medicina, dónde se equivoca el modelo importa mucho más que cuántas veces acierta.
El problema de la exactitud: dos tipos de error que no valen lo mismo
Imaginad dos errores distintos que puede cometer el árbol al analizar a un paciente:
- Falso positivo: el árbol dice que el tumor es maligno, pero en realidad era benigno.
- Falso negativo: el árbol dice que el tumor es benigno, pero en realidad era maligno.
¿Valen lo mismo estos dos errores? No.
En el falso positivo, el paciente sufre un susto y se le hacen más pruebas para confirmar, pero al final descubre que está sano. En el falso negativo, el paciente se va a casa pensando que está sano mientras la enfermedad sigue avanzando sin tratamiento. Este segundo error puede costar una vida.
La exactitud mezcla los dos tipos de error en el mismo saco — por eso hoy usamos la herramienta que sí los distingue: la matriz de confusión.
Dibujando la matriz de confusión
La matriz de confusión es una tabla que compara los diagnósticos reales de los pacientes de prueba con las predicciones que hizo el árbol.
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
# 1. Obtenemos las predicciones del árbol sobre los 114 pacientes del examen
y_pred = arbol.predict(X_test)
# 2. Calculamos y dibujamos la matriz de confusión
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=cancer.target_names)
disp.plot(cmap="Blues")
plt.title("Matriz de confusión — diagnóstico de cáncer de mama")
plt.show()
La imagen muestra cuatro casillas. En la diagonal principal están los aciertos: los tumores malignos detectados como malignos, y los benignos detectados como benignos. Fuera de la diagonal están los errores: los falsos positivos (pacientes sanos clasificados como enfermos) y los falsos negativos (pacientes enfermos que se nos han “escapado” como sanos).
Cómo leer estos números, paso a paso
Como es la primera vez que veis una tabla así, vamos a practicar con números de ejemplo (no son los vuestros, son solo para aprender a leer la tabla):
Predicho: benigno Predicho: maligno
Real: benigno 70 2
Real: maligno 3 39
Aquí hay 114 pacientes en total, como en nuestro conjunto de prueba. Para leerla:
- Los aciertos están en la diagonal: 70 benignos bien detectados + 39 malignos bien detectados = 109 aciertos.
- Los falsos positivos son la fila “Real: benigno” fuera de la diagonal: 2 pacientes sanos a los que el árbol dio la alarma por error.
- Los falsos negativos son la fila “Real: maligno” fuera de la diagonal: 3 pacientes enfermos que el árbol clasificó como sanos — el error que más nos preocupa.
Con estos números de ejemplo: de los 39 + 3 = 42 pacientes malignos reales, el árbol detectó 39, así que la exhaustividad sería 39/42 ≈ 0,93 (un 93%). Y de los 2 + 39 = 41 pacientes a los que el árbol llamó “maligno”, 39 lo eran de verdad, así que la precisión sería 39/41 ≈ 0,95 (un 95%). Cuando tengáis vuestra propia matriz, el procedimiento es exactamente el mismo: localizad las cuatro casillas y aplicad estas dos cuentas con vuestros números reales.

Precisión y exhaustividad
Para medir con lupa el comportamiento del modelo, scikit-learn nos da dos métricas que van más allá de la exactitud general.
Precisión: de todos los casos que el árbol ha etiquetado como malignos, ¿qué porcentaje era realmente maligno? Mide la calidad de las alarmas que da el modelo.
Precisión = (malignos detectados correctamente) / (total de tumores que el árbol dijo que eran malignos)
Exhaustividad (también llamada recall): de todos los pacientes que tenían realmente un tumor maligno, ¿qué porcentaje logró detectar el árbol? Mide la capacidad del modelo para no dejar escapar a ningún enfermo. En medicina, esta es la métrica que más pesa.
Exhaustividad = (malignos detectados correctamente) / (total de tumores malignos reales que existían)
Guardaos bien esta palabra frente a la de la Sesión 2: exactitud mira todos los aciertos juntos, precisión y exhaustividad miran cada tipo de error por separado.
El informe completo con classification_report
Podemos pedirle a scikit-learn un informe completo en una sola línea de código:
from sklearn.metrics import classification_report
# Generar el informe detallado
print(classification_report(y_test, y_pred, target_names=cancer.target_names))

La tabla que aparece da la precisión y la exhaustividad de cada diagnóstico, y una tercera columna, f1-score, que combina las dos en un solo número — no hace falta saber calcularla a mano, basta con mirar precisión y exhaustividad por separado para entender dónde falla el modelo.
Mirando la fila de malignant, podemos responder a la pregunta clave de hoy: ¿nuestro árbol se deja pacientes enfermos sin detectar?
La respuesta está en el valor de recall (exhaustividad) de esa fila. Cuanto más cerca esté de 1 (100%), menos pacientes malignos reales se le escapan al árbol; si se aleja bastante de 1, hay que fijarse en cuántos falsos negativos concretos son (los tenéis en la matriz de confusión de arriba) y de qué pacientes se trata.
[COMPLETAR CON VUESTROS DATOS REALES: recall de malignant = ___ → de cada 100 pacientes malignos del conjunto de prueba, el árbol detecta a ___ y se le escapan ___]
Qué viene después
En la Sesión 4 vamos a entrenar muchos árboles a la vez y dejarlos votar: el Random Forest, el algoritmo de Adele Cutler y Leo Breiman que da nombre a este taller. Compararemos su exactitud con la del árbol único de la Sesión 2.



