
Proyecto Rachael Tatman — Sesión 3: entrenamos, comprobamos los resultados, y volvemos a Tatman
Última sesión: entrenamos un Random Forest y comprobamos si de verdad distingue bien una voz masculina de una femenina.
Entrenando el modelo
from sklearn.ensemble import RandomForestClassifier
bosque = RandomForestClassifier(n_estimators=100, random_state=42)
bosque.fit(X_entrenamiento, y_entrenamiento)
exactitud = bosque.score(X_prueba, y_prueba)
print(f"Exactitud: {exactitud:.2%}")
[COMPLETAR CON VUESTROS DATOS REALES: exactitud del bosque = ___. Comparadla con la de Laennec y la de Katy Payne — ¿cuál es la más alta de toda la familia?]

Matriz de confusión e informe completo
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, classification_report
etiquetas = ["male", "female"]
predicciones = bosque.predict(X_prueba)
cm = confusion_matrix(y_prueba, predicciones, labels=etiquetas)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=etiquetas)
disp.plot(cmap="Blues")
plt.title("Matriz de confusión — voz masculina vs. femenina")
plt.show()
print(classification_report(y_prueba, predicciones, labels=etiquetas, target_names=etiquetas))
Como en Katy Payne, classification_report lleva labels=etiquetas además de target_names=etiquetas desde el primer momento — con clases en texto, es la única forma de que las filas no se descoloquen.
[COMPLETAR CON VUESTROS DATOS REALES: precisión y exhaustividad de cada clase = ___]

Qué propiedad pesó más
import pandas as pd
importancias = pd.Series(bosque.feature_importances_, index=X.columns)
importancias.sort_values(ascending=False).head(5)
[COMPLETAR EN CLASE: ¿aparece meanfun entre las más importantes? ¿Coincide con lo que ya intuíais desde el boxplot de la Sesión 2?]

Volviendo a Rachael Tatman
Si vuestro modelo ha rondado el 95-99% de exactitud, no es casualidad ni un golpe de suerte: es la consecuencia directa de partir de un dataset bien construido, bien equilibrado (50% masculino, 50% femenino) y con propiedades acústicas bien elegidas de antemano. Comparad esto con Laennec, donde un desequilibrio de clases real (320 sonidos normales frente a solo 46 extrasístoles) hacía que el bosque casi nunca acertara la clase minoritaria.
Aquí está la vuelta de tuerca de todo este mini proyecto: el sistema de reconocimiento de voz de Google que investigó Rachael Tatman en 2016 no se construyó con un dataset tan cuidado como este. Se entrenó con enormes cantidades de audio recopilado sin ese cuidado, con mucha menos voz femenina que masculina —la misma clase de problema que ya conocéis de Laennec, pero a una escala mucho mayor y con consecuencias reales: mujeres a las que su propio coche no entendía, médicas cuyas notas dictadas contenían más errores críticos. El algoritmo no era peor “por ser mujer” la voz; era peor porque los datos con los que se entrenó no representaban bien a la mitad de las personas que iban a usarlo.
La lección que cierra este proyecto, y con ella todo el hilo de “quién falta en los datos” que empezamos con la historia de Abraham Wald: un modelo nunca es mejor que los datos con los que se construye. Aquí lo habéis comprobado en positivo —datos bien hechos, modelo casi perfecto—. En Laennec lo comprobasteis en negativo. Los dos casos son la misma lección, vista desde extremos opuestos.



