
Proyecto Javierre — Sesión 3: la matriz de confusión, aplicada a dos tipos de cáncer real
En la Sesión 2 entrenamos nuestro primer árbol de decisión sobre los cuatro genes y calculamos su exactitud. Hoy, igual que hicimos en CUTLER, abrimos la caja de las predicciones para ver exactamente dónde acierta y dónde falla el modelo — pero aquí la lectura va a ser distinta, y merece la pena pararse a pensar por qué.
Por qué este caso es distinto al de CUTLER
En CUTLER trabajábamos con tumores malignos o benignos: un falso negativo (decir “sano” a quien tenía cáncer) era claramente el error más grave, porque dejaba una enfermedad real sin detectar.
Aquí no hay ningún paciente sano en el conjunto de datos: los 72 pacientes tienen leucemia. La pregunta no es “¿tiene cáncer o no?”, sino “¿de qué tipo es?” — ALL o AML. Y esto cambia por completo cómo hay que leer los errores: confundir un ALL con un AML no es una falsa alarma sin consecuencias, es indicar el tipo de leucemia equivocado. En la práctica clínica real, ALL y AML se tratan con quimioterapias distintas, así que un error en cualquiera de las dos direcciones significa apuntar al tratamiento que no toca. Aquí no hay un error “grave” y otro “leve” como en CUTLER — los dos pesan.
Dibujando la matriz de confusión
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
# 1. Obtenemos las predicciones del árbol sobre los 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, labels=["ALL", "AML"])
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["ALL", "AML"])
disp.plot(cmap="Blues")
plt.title("Matriz de confusión — ALL frente a AML")
plt.show()

Cómo leer estos números, paso a paso
Practicamos primero con un ejemplo (no son vuestros datos reales, son solo para aprender a leer la tabla). Nuestro conjunto de examen tiene 15 pacientes: 10 con ALL y 5 con AML, en la misma proporción que en los datos completos gracias a stratify.
Predicho: ALL Predicho: AML
Real: ALL 9 1
Real: AML 1 4
Para leerla:
- Los aciertos están en la diagonal: 9 pacientes ALL bien identificados + 4 pacientes AML bien identificados = 13 aciertos de 15.
- Fuera de la diagonal están los errores en las dos direcciones: 1 paciente con ALL al que el árbol le puso AML, y 1 paciente con AML al que el árbol le puso ALL. Ninguno de los dos es “el error bueno” — los dos son un paciente con el tipo de leucemia equivocado en su informe.
Con estos números de ejemplo: de los 10 pacientes ALL reales, el árbol detectó 9, así que la exhaustividad de ALL sería 9/10 = 0,90 (un 90%). De los 5 pacientes AML reales, detectó 4, así que la exhaustividad de AML sería 4/5 = 0,80 (un 80%). Cuando tengáis vuestra propia matriz, el procedimiento es el mismo: localizad las cuatro casillas y aplicad estas cuentas con vuestros números reales.
Precisión y exhaustividad, para cada tipo de leucemia
En CUTLER mirábamos la exhaustividad de una sola clase (malignant), porque era la que más importaba. Aquí no podemos quedarnos solo con una: como los dos errores pesan igual, hay que mirar la precisión y la exhaustividad de ALL y de AML por separado.
Precisión de una clase: de todos los pacientes a los que el árbol puso esa etiqueta, ¿qué porcentaje la tenía de verdad?
Exhaustividad de una clase (o recall): de todos los pacientes que tenían de verdad esa leucemia, ¿qué porcentaje detectó el árbol?
from sklearn.metrics import classification_report
# Generar el informe detallado, para ALL y para AML
print(classification_report(y_test, y_pred))

La tabla que aparece os da, en dos filas (una por ALL y otra por AML), la precisión y la exhaustividad de cada una. A diferencia de CUTLER, hoy no hay una única fila “importante” que mirar — comparad las dos exhaustividades entre sí: si una es bastante más baja que la otra, significa que al árbol le cuesta más detectar ese tipo concreto de leucemia, y merece la pena fijarse en qué pacientes en concreto se le escapan (los tenéis en la matriz de confusión de arriba).
[COMPLETAR CON VUESTROS DATOS REALES: exhaustividad de ALL = ___ | exhaustividad de AML = ___ → ¿le cuesta más al árbol un tipo de leucemia que el otro?]
Próximo paso
En la próxima sesión entrenaremos muchos árboles a la vez y los dejaremos votar: el Random Forest que ya conocemos de CUTLER, para ver si mejora estos resultados.



