
Proyecto Taussig — Sesión 4: Random Forest, y en qué instante exacto del latido se fija el bosque
En la Sesión 3 vimos que un solo árbol puede tener una exactitud alta y aun así fallar bastante con la clase que más nos importa, la V (ventricular), si no miramos más allá del número global. Hoy probamos si un comité de árboles hace mejor ese trabajo — y de paso, descubrimos algo que ningún proyecto anterior de la familia podía enseñarnos: en qué momento exacto del latido se fija el modelo para decidir.
De un solo árbol a un comité que vota
Ya conocéis la idea de CUTLER y de Javierre: un único árbol de decisión es muy sensible a los datos concretos con los que ha aprendido. Random Forest, el algoritmo de Adele Cutler y Leo Breiman que da nombre a nuestro primer taller, entrena muchos árboles independientes —cada uno con una muestra distinta de latidos y de instantes de la señal— y los deja votar. Si 85 de 100 árboles dicen que un latido es V, el bosque dice V.
Entrenando el bosque
Pasar de un árbol a un bosque de 100 árboles solo cambia el nombre del modelo:
from sklearn.ensemble import RandomForestClassifier
# 1. Crear el bosque con 100 árboles de decisión
bosque = RandomForestClassifier(n_estimators=100, random_state=42)
# 2. Entrenar a todos los árboles a la vez
bosque.fit(X_entrenamiento, y_entrenamiento)
# 3. Evaluar la exactitud en el conjunto de prueba
exactitud_bosque = bosque.score(X_prueba, y_prueba)
print(f"Exactitud del Random Forest en el conjunto de prueba: {exactitud_bosque:.2%}")
[COMPLETAR CON VUESTROS DATOS REALES: exactitud del árbol de la Sesión 2 = ___ | exactitud del Random Forest = ___]

¿Mejora el bosque justo donde más nos importa?
La exactitud global es solo el primer vistazo. Lo que de verdad queremos saber, después de la Sesión 3, es si el bosque reconoce mejor la clase V que el árbol único — y si esa mejora se nota tanto en el macro avg (que trata a V igual que a las demás) como en el weighted avg (dominado por la clase N).
from sklearn.metrics import classification_report
etiquetas = ["N", "S", "V", "F", "Q"]
predicciones_bosque = bosque.predict(X_prueba)
print("--- INFORME DEL RANDOM FOREST ---")
print(classification_report(y_prueba, predicciones_bosque, target_names=etiquetas))
Comparad la exhaustividad de la fila V con la que obtuvisteis en la Sesión 3 con el árbol único: ¿sube, baja o se queda igual? No hay una respuesta garantizada de antemano — por eso lo comprobamos con los datos, en vez de darlo por supuesto.
[COMPLETAR CON VUESTROS DATOS REALES: exhaustividad de V con el árbol = ___ | con el Random Forest = ___. Macro avg con el árbol = ___ | con el bosque = ___]

Lo nuevo de hoy: el bosque nos dice dónde “toca” el latido
En Javierre, feature_importances_ os decía qué gen pesaba más en la decisión —y podíais comprobar si coincidía con lo que ya sabíais de biología. Aquí no tenemos genes con nombre: tenemos 187 números que son, literalmente, instantes sucesivos de un latido. Así que la misma herramienta nos va a responder una pregunta distinta y muy bonita: ¿en qué momento exacto del latido se fija más el bosque para decidir?
import matplotlib.pyplot as plt
# La importancia de cada uno de los 187 instantes de la señal
importancias = bosque.feature_importances_
plt.figure(figsize=(10, 4))
plt.plot(importancias)
plt.title("Importancia de cada instante del latido según el Random Forest")
plt.xlabel("Instante dentro del latido (de 0 a 186)")
plt.ylabel("Importancia relativa")
plt.show()

Si veis picos claros en la gráfica, esos son los instantes del latido donde el bosque concentra su atención para distinguir entre N, S, V, F y Q — el resto de la señal le aporta mucho menos. Podéis comparar esos picos con la forma del latido normal y del ventricular que dibujasteis en la Sesión 1: ¿coinciden los picos de importancia con la parte de la señal donde más se diferenciaban las dos formas a simple vista?
Hay algo bonito en esto, y merece la pena decirlo en voz alta: Helen Taussig, cuando se quedó sorda, no perdió la capacidad de diagnosticar el corazón — la trasladó a los dedos, aprendiendo a notar en qué momento exacto del latido algo no encajaba. Un Random Forest no tiene dedos ni oídos, pero acaba de hacer, con matemáticas, algo parecido: encontrar el instante concreto de la señal donde está la información que de verdad importa.
[COMPLETAR EN CLASE: ¿en qué instante (aproximadamente) está el pico más alto de importancia? ¿Al principio del latido, en mitad, o al final?]
Próximo paso
Hemos construido un modelo más robusto que un solo árbol. Pero toda esta comparación se apoya en la misma partición de entrenamiento y prueba desde la Sesión 2 — la que Kaggle nos entregó ya hecha. En la próxima sesión comprobaremos, con validación cruzada, si esa partición concreta nos está dando una imagen fiable del comportamiento del modelo o si tuvimos suerte (o mala suerte) con ella.




