Skip to main content
Esta guía detalla el proceso completo de entrenamiento del modelo CNN y la evaluación de sus resultados.

Proceso de Entrenamiento

Configuración Inicial

El entrenamiento se configura con los siguientes parámetros:

Épocas

20 épocasPuede detenerse antes con early stopping

Batch Size

32 imágenesPor lote de entrenamiento

Learning Rate

0.001Optimizador Adam

Validación

20%Del conjunto de entrenamiento

Ejecutar Entrenamiento

pipenv run python src/train.py
Tiempo estimado: 15-30 minutos en CPU, 5-10 minutos en GPU

Data Augmentation

Para mejorar la generalización del modelo y prevenir overfitting, se aplican las siguientes transformaciones al conjunto de entrenamiento:
Rango: ±15 grados
rotation_range=15
Simula diferentes ángulos de captura de rayos X.
El data augmentation solo se aplica al conjunto de entrenamiento, no al test set, para mantener una evaluación justa.

Callbacks y Regularización

Early Stopping

Detención Temprana

Detiene el entrenamiento si no hay mejora en validation loss.
Configuración:
EarlyStopping(
    monitor='val_loss',
    patience=5,              # Espera 5 épocas sin mejora
    restore_best_weights=True  # Restaura los mejores pesos
)
Beneficios:
  • Previene overfitting
  • Ahorra tiempo de entrenamiento
  • Garantiza el mejor modelo posible

Model Checkpoint

Guardado del Mejor Modelo

Guarda automáticamente el modelo con mejor validation accuracy.
Configuración:
ModelCheckpoint(
    'models/best_model.keras',
    monitor='val_accuracy',
    save_best_only=True,
    mode='max'
)
Archivo generado: models/best_model.keras

Reduce Learning Rate

Reducción de Learning Rate

Reduce el learning rate cuando el entrenamiento se estanca.
Configuración:
ReduceLROnPlateau(
    monitor='val_loss',
    factor=0.5,       # Reduce a la mitad
    patience=3,       # Después de 3 épocas sin mejora
    min_lr=0.00001
)

Dropout

Regularización

Dropout de 0.5 en las capas densas para prevenir overfitting.
Dropout(0.5)
Desactiva aleatoriamente el 50% de las neuronas durante entrenamiento.

Salida del Entrenamiento

Durante el Entrenamiento

Verás una salida similar a esta:
Epoch 1/20
163/163 [==============================] - 45s 276ms/step
loss: 0.3456 - accuracy: 0.8234 - val_loss: 0.2891 - val_accuracy: 0.8567

Epoch 2/20
163/163 [==============================] - 42s 258ms/step
loss: 0.2891 - accuracy: 0.8567 - val_loss: 0.2456 - val_accuracy: 0.8723

Epoch 3/20
163/163 [==============================] - 43s 264ms/step
loss: 0.2456 - accuracy: 0.8723 - val_loss: 0.2234 - val_accuracy: 0.8891

...

Epoch 15/20
163/163 [==============================] - 41s 252ms/step
loss: 0.1234 - accuracy: 0.9456 - val_loss: 0.2891 - val_accuracy: 0.8567

Restoring model weights from the end of the best epoch: 10.
Epoch 15: early stopping
Si ves “early stopping”, significa que el entrenamiento se detuvo automáticamente porque no hubo mejora en 5 épocas consecutivas.

Archivos Generados

Al finalizar el entrenamiento, se generan:
1

models/best_model.keras

Mejor modelo según validation accuracy durante el entrenamiento.Este es el modelo que se usa para evaluación.
2

models/final_model.keras

Modelo al final de todas las épocas (o cuando se detuvo early stopping).
3

results/training_history.png

Gráficas mostrando la evolución de:
  • Training loss vs Validation loss
  • Training accuracy vs Validation accuracy
Útil para identificar overfitting o underfitting.

Evaluación del Modelo

Ejecutar Evaluación

pipenv run python src/evaluate.py
La evaluación carga automáticamente models/best_model.keras y lo evalúa en el test set.

Métricas de Evaluación

Métricas Principales

El sistema calcula las siguientes métricas en el conjunto de test:
Fórmula: (TP + TN) / (TP + TN + FP + FN)Significado: Porcentaje de predicciones correctas sobre el total.Objetivo: > 85%Ejemplo: Si el modelo tiene 85% accuracy, significa que de 100 predicciones, 85 son correctas.
Fórmula: TP / (TP + FP)Significado: De todas las predicciones de PNEUMONIA, ¿cuántas son correctas?Objetivo: > 80%Importancia: Alta precision significa pocas falsas alarmas.Ejemplo: Si precision es 80%, de cada 10 casos que el modelo dice “PNEUMONIA”, 8 realmente lo son.
Fórmula: TP / (TP + FN)Significado: De todos los casos reales de PNEUMONIA, ¿cuántos detecta el modelo?Objetivo: > 90%Importancia: Alta recall significa que no se pierden casos de neumonía.Ejemplo: Si recall es 90%, el modelo detecta 9 de cada 10 casos reales de neumonía.
Esta es la métrica más importante en screening médico - no queremos perder casos de enfermedad.
Fórmula: 2 × (Precision × Recall) / (Precision + Recall)Significado: Media armónica entre precision y recall.Objetivo: > 85%Importancia: Balancea precision y recall en una sola métrica.Ejemplo: F1-Score alto significa buen balance entre no perder casos y no dar falsas alarmas.
Nombre completo: Area Under the ROC CurveRango: 0.0 a 1.0Significado: Capacidad del modelo para discriminar entre clases.Objetivo: > 0.90Interpretación:
  • 0.5: Clasificador aleatorio
  • 0.7-0.8: Aceptable
  • 0.8-0.9: Excelente
  • 0.9: Sobresaliente

Matriz de Confusión

La matriz de confusión muestra los 4 tipos de resultados:
Predicción: NORMALPredicción: PNEUMONIA
Real: NORMALTN (True Negative)FP (False Positive)
Real: PNEUMONIAFN (False Negative)TP (True Positive)
Interpretación:
  • TN (True Negative): Casos sanos correctamente identificados
  • TP (True Positive): Casos de neumonía correctamente identificados
  • FP (False Positive): Falsa alarma - el modelo dice neumonía pero está sano
  • FN (False Negative): Caso perdido - el modelo dice sano pero tiene neumonía
En contexto médico, los False Negatives (FN) son los más peligrosos porque significan casos de neumonía no detectados.

Visualizaciones Generadas

1. training_history.png

Historial de Entrenamiento

Gráficas de evolución durante el entrenamiento.
Contiene 2 subplots:
Gráfica de pérdida (loss) por época:
  • Línea azul: Training loss
  • Línea naranja: Validation loss
Interpretación:
  • Si val_loss > train_loss y la brecha crece: Overfitting
  • Si ambas son altas: Underfitting
  • Si ambas bajan juntas: Buen entrenamiento
Ubicación: results/training_history.png

2. confusion_matrix.png

Matriz de Confusión

Visualización de las predicciones vs etiquetas reales.
Contenido:
  • Matriz 2x2 con valores absolutos
  • Colores: más oscuro = más casos
  • Incluye las 4 métricas principales (Accuracy, Precision, Recall, F1)
Ejemplo de interpretación:
                 Predicción
              NORMAL  PNEUMONIA
Real NORMAL      210      24      ← 24 falsos positivos
     PNEUMONIA   18     372      ← 18 falsos negativos
                  ↑       ↑
                  18 FN   372 TP

Accuracy:  0.9327
Precision: 0.9394
Recall:    0.9538
F1-Score:  0.9465
Ubicación: results/confusion_matrix.png

3. roc_curve.png

Curva ROC

Representa la capacidad de discriminación del modelo.
Ejes:
  • X: False Positive Rate (Tasa de falsos positivos)
  • Y: True Positive Rate (Tasa de verdaderos positivos)
Interpretación:
  • Línea diagonal (AUC=0.5): Clasificador aleatorio
  • Curva pegada a la esquina superior izquierda: Modelo perfecto
  • Área bajo la curva (AUC): Métrica de desempeño general
Incluye:
  • Curva ROC en azul
  • Línea diagonal de referencia (punteada)
  • Valor AUC en la leyenda
Ubicación: results/roc_curve.png

4. predictions.png

Ejemplos de Predicciones

Grid visual de predicciones del modelo.
Muestra:
  • 12 ejemplos aleatorios del test set
  • Imagen original del rayo X
  • Etiqueta real (verde si correcto, rojo si error)
  • Predicción del modelo
  • Probabilidad de la predicción
Ejemplo de título:
Real: PNEUMONIA
Pred: PNEUMONIA (98.5%)
Útil para:
  • Presentaciones y demos
  • Identificar patrones de errores
  • Validación cualitativa
Ubicación: results/predictions.png

Salida de Evaluación

Console Output

Al ejecutar evaluate.py, verás una salida como esta:
Cargando modelo: models/best_model.keras

Evaluando modelo en test set...
20/20 [==============================] - 8s 402ms/step

Métricas de Evaluación:
========================
Accuracy:  0.8526
Precision: 0.8234
Recall:    0.9231
F1-Score:  0.8705
AUC-ROC:   0.9234

Matriz de Confusión:
                Pred NORMAL  Pred PNEUMONIA
Real NORMAL            200              34
Real PNEUMONIA          30             360

Gráficas guardadas en:
- results/confusion_matrix.png
- results/roc_curve.png
- results/predictions.png

Evaluación completada exitosamente!

Interpretación de Resultados

Escenario Ideal

Alta Recall

> 90%No perdemos casos de neumonía

Alta Precision

> 80%Pocas falsas alarmas

Buen Balance

F1 > 85%Equilibrio entre metrics

Discriminación

AUC > 0.90Excelente separación de clases

Interpretación Clínica

El modelo está diseñado como herramienta de screening (primera línea):
  • Alta Recall: Minimiza casos perdidos
  • Decisión final: Siempre debe ser de un médico
  • Contexto: Útil en áreas con escasez de radiólogos

Resultados Esperados

Rangos Típicos

Con este dataset y arquitectura, los resultados típicos son:
MétricaRango EsperadoObjetivo
Accuracy80-90%> 85%
Precision75-85%> 80%
Recall85-95%> 90%
F1-Score80-90%> 85%
AUC-ROC0.85-0.95> 0.90
Si tus resultados están en estos rangos, el modelo está funcionando correctamente.

Comparación con Literatura

Estudios similares reportan:
  • CheXNet (Rajpurkar et al., 2017): AUC 0.93-0.96
  • Dataset original (Kermany et al., 2018): Accuracy 92.8%
  • Este proyecto: Accuracy 80-90%
Resultados ligeramente más bajos son esperables debido a:
  • Arquitectura más simple (educativa)
  • Sin transfer learning
  • Menos épocas de entrenamiento

Solución de Problemas

Posibles causas:
  • Dataset no cargado correctamente
  • Modelo no entrenado suficientes épocas
  • Learning rate demasiado alto/bajo
Soluciones:
  • Verifica con verificar_dataset.py
  • Aumenta épocas a 30-40
  • Ajusta learning rate (0.0001 - 0.01)
Síntomas:
  • Train accuracy > 95%
  • Val accuracy < 80%
  • Brecha grande entre ambas
Soluciones:
  • Ya incluye Dropout (0.5)
  • Ya incluye Data Augmentation
  • Reduce épocas
  • Considera early stopping más agresivo
Problema: Muchos casos de neumonía no detectadosSoluciones:
  • Ajusta threshold de clasificación (< 0.5)
  • Balancea dataset (tiene más PNEUMONIA que NORMAL)
  • Usa class_weight en el entrenamiento
Causas:
  • CPU sin aceleración
  • Batch size demasiado pequeño
Soluciones:
  • Usa GPU si está disponible
  • Aumenta batch_size (si hay RAM)
  • Reduce tamaño de imágenes (actual: 224x224)

Checklist de Evaluación

Antes de dar por terminado el proyecto:
  • Modelo entrenado exitosamente sin errores
  • Accuracy > 80% en test set
  • Recall > 85% (prioridad en screening)
  • Todas las gráficas generadas en results/
  • Confusion matrix revisada (FN aceptables)
  • ROC curve con AUC > 0.85
  • Ejemplos de predicciones revisados visualmente
  • Interpretación clínica entendida
  • Limitaciones del modelo documentadas

Próximos Pasos

Después de completar el entrenamiento y evaluación:
1

Analizar resultados

Revisa todas las gráficas y métricas en results/
2

Preparar informe

Incluye:
  • Metodología de entrenamiento
  • Métricas obtenidas
  • Visualizaciones
  • Interpretación clínica
3

Preparar presentación

Muestra:
  • Arquitectura del modelo
  • Proceso de entrenamiento
  • Resultados (confusion matrix + ROC)
  • Ejemplos de predicciones
4

Considerar mejoras

Posibles extensiones:
  • Transfer learning (VGG16, ResNet)
  • Grad-CAM para visualización
  • Clasificación multiclase
  • Ensemble de modelos

Build docs developers (and LLMs) love