FACULTAD DE ESTUDIOS ESTADÍSTICOS MÁSTER EN MINERÍA DE DATOS E INTELIGENCIA DE NEGOCIOS Curso 2022/2023 Trabajo de Fin de Máster TÍTULO: Clasificación de imágenes médicas para el diagnóstico de neumonía mediante técnicas de Machine Learning Alumno: Qiqi Zhou Tutora: Juana María Alonso Revenga Julio de 2023 Resumen La neumonía es una de las principales causas de muerte tanto en niños como en personas mayores. En concreto, la neumonía infecta a los alvéolos llenándolos de pus y líquido, pro- vocando que la respiración del paciente sea vea debilitada. Los pacientes con enfermedades respiratorias previas, sistema inmunitario débil, bebés hospitalizados o personas mayores con respiradores son más propensos a sufrir esta enfermedad, por lo que un diagnóstico temprano y eficiente resulta esencial para poder aplicar tratamientos adecuados. En el presente trabajo, se abordará el problema de la detección de la neumonía mediante el uso de las imágenes de radiografías de tórax. Han sido propuestos el desarrollo y evalua- ción de modelos de aprendizaje profundo basados en redes neuronales convolucionales para diagnosticar las imágenes rayos X en dos categorías: neumonía y sano. Se llevó a cabo un preprocesamiento de las imágenes con el fin de mejorar la calidad de los datos para opti- mizar el rendimiento del modelo. Se experimentó con diferentes arquitecturas de red, tanto de modelos propios personalizados como modelos preentrenados usando técnicas de transfer learning. Se hará una comparativa entre todos los modelos implementados y se elegirá el más óptimo considerando diferentes factores, siendo el más importante el rendimiento de los modelos. Los resultados obtenidos en este trabajo servirán como herramientas para acelerar los diagnósticos médicos, sirviendo como apoyo en el proceso de toma de decisiones y mejorando la eficiencia en la detección temprana de la neumonía. Esta herramienta siempre ha sido implementada con la intención de apoyar al personal médico para mejorar la precisión del diagnóstico, nunca con el objetivo de sustituirlos. Palabras clave Lista de palabras clave: Redes Neuronales Convolucionales, Neumonía, Inteligencia Ar- tificial, Deep Learning, Radiografías de Tórax, Clasificación de Imágenes. Abstract Pneumonia is a leading cause of death in both children and older individuals. Specifi- cally, pneumonia infects the alveoli, filling them with pus and fluid, thereby weakening the patient’s breathing. Patients with previous respiratory diseases, weakened immune systems, hospitalized infants, or older individuals on respirators are more prone to this disease, so making early and efficient diagnosis is essential for applying appropriate treatments. In the present study, the problem of pneumonia detection will be addressed through the use of chest X-ray images. The development and evaluation of deep learning models based on convolutional neural networks to diagnose X-ray images into two categories: pneumonia and healthy, have been proposed. Image preprocessing was carried out to improve data quality and optimize model performance. Different network architectures were experimented with, including custom models and pretrained models using transfer learning techniques. A comparison will be made between all implemented models, and the most optimal one will be chosen considering various factors, with the most important being the models’ performance. The result achieved in this study serves as an additional tool for medical diagnostic environments, offering support in decision-making and improving the efficiency of early pneumonia detection. This tool has always been implemented with the intent of supporting medical personnel to enhance the accuracy of medical diagnosis, never with the objective of replacing them. Keywords List of keywords: Convolutional Neural Networks, Pneumonia, Artificial Intelligence, Deep Learning, Chest X-rays, Image Classification. Índice general List of Figures III List of Tables V 1. Introducción y Motivación 1 2. Estado del Arte 3 2.1. Neumonía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2. Machine Learning en medicina . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3. Redes neuronales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4. Redes neuronales convolucionales . . . . . . . . . . . . . . . . . . . . . . . . 10 3. Descripción de la propuesta 15 3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3. Solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4. Metodología y Planificación 19 4.1. Arquitectura del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.2. Estudio de modelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.3. Métricas para la evaluación . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5. Implementación del proyecto 27 i ii 5.1. Fuente de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2. Preprocesamiento de imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2.1. Nueva partición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.2.2. Desbalance de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.2.3. Modificación de las imágenes . . . . . . . . . . . . . . . . . . . . . . . 32 5.3. Modelización y evaluación de modelos . . . . . . . . . . . . . . . . . . . . . . 36 5.3.1. Modelos CNN personalizados . . . . . . . . . . . . . . . . . . . . . . 37 5.3.2. Modelos CNN predefinidos . . . . . . . . . . . . . . . . . . . . . . . . 41 5.4. Elección de modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.5. Predicción e Interpretabilidad del mejor modelo . . . . . . . . . . . . . . . . 50 6. Conclusión y líneas del futuro 54 6.1. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.2. Líneas de futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Bibliografía 60 A. Anexos 61 A.1. Códigos en lenguaje Python de la implementación . . . . . . . . . . . . . . . 61 A.1.1. Librerías utilizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 A.1.2. Preprocesamiento de imágenes . . . . . . . . . . . . . . . . . . . . . . 61 A.1.3. Diseño de arquitecturas neuronales para modelos propios . . . . . . . 62 A.1.4. Diseño de arquitecturas neuronales para modelos preentrenados . . . 64 A.1.5. Entrenamiento de modelos . . . . . . . . . . . . . . . . . . . . . . . . 65 A.1.6. Evaluación de modelos . . . . . . . . . . . . . . . . . . . . . . . . . . 67 A.1.7. Intepretabilidad de modelos . . . . . . . . . . . . . . . . . . . . . . . 68 Índice de figuras 2.1. Tasa de mortalidad infantil por neumonía frente al PIB. Fuente: Our World in Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. Cantidad total de información generada en el sector sanitario estadounidense. Datos en exabytes. Fuente: Statista . . . . . . . . . . . . . . . . . . . . . . . 5 2.3. Estructura de una neurona biológica. Fuente: FutureLab . . . . . . . . . . . 7 2.4. Estructura de un perceptrón. Fuente: FutureLab . . . . . . . . . . . . . . . . 8 2.5. Descenso de gradiente. Fuente: Ahead of AI . . . . . . . . . . . . . . . . . . 9 2.6. Operación de convolución en una imagen. Fuente: Rubén Rodríguez Abril . . 11 2.7. Operación stride y padding. Fuente: Rubén Rodríguez Abril . . . . . . . . . . 12 2.8. Gráfica de funciones de activación. Fuente: Future Space . . . . . . . . . . . 13 2.9. Técnicas de agrupación. Fuente: Rubén Rodríguez Abril . . . . . . . . . . . . 14 4.1. Arquitectura de ML de clasificación de imágenes. Fuente: Elaboración propia 19 4.2. Estructura del modelo VGG-16. Fuente: Medium . . . . . . . . . . . . . . . 22 4.3. Estructura del modelo ResNet-50. Fuente: Towardsdatascience . . . . . . . . 22 4.4. Estructura del modelo InceptionV3. Fuente: Google Cloud . . . . . . . . . . 23 4.5. Estructura del modelo MobileNet. Fuente: Olarik Surinta, 2020 . . . . . . . . 24 5.1. Muestra de radiografías. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2. Distribución gráfica de clases en el conjunto de entrenamiento. . . . . . . . . 30 5.3. Diferencia de tamaño entre imágenes. . . . . . . . . . . . . . . . . . . . . . . 32 5.4. Ejemplos de imágenes tras aumento de datos. Fuente: Elaboración propia. . . 34 iii iv 5.5. Estructura modelo personalizado 1 . . . . . . . . . . . . . . . . . . . . . . . 37 5.6. Matriz de confusión del modelo propio 1 . . . . . . . . . . . . . . . . . . . . 38 5.7. Estructura modelo personalizado 2 . . . . . . . . . . . . . . . . . . . . . . . 39 5.8. Matriz de confusión del modelo propio 2 . . . . . . . . . . . . . . . . . . . . 39 5.9. Estructura modelo personalizado 3 . . . . . . . . . . . . . . . . . . . . . . . 40 5.10. Matriz de confusión del modelo propio 3 . . . . . . . . . . . . . . . . . . . . 41 5.11. Estructura modelo VGG-16 . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.12. Matriz de confusión del modelo VGG-16 . . . . . . . . . . . . . . . . . . . . 43 5.13. Estructura modelo ResNet-50 . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.14. Matriz de confusión del modelo ResNet-50 . . . . . . . . . . . . . . . . . . . 44 5.15. Estructura modelo MobileNet . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.16. Matriz de confusión del modelo MobileNet . . . . . . . . . . . . . . . . . . . 45 5.17. Estructura modelo InceptionV3 . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.18. Matriz de confusión del modelo InceptionV3 . . . . . . . . . . . . . . . . . . 46 5.19. Gráfica del tiempo de ejecución de los modelos . . . . . . . . . . . . . . . . . 48 5.20. Gráficas del nº de parámetros y el nº de capas de los modelos . . . . . . . . 49 5.21. Predicciones correctas sobre el conjunto de prueba. . . . . . . . . . . . . . . 51 5.22. Predicciones incorrectas sobre el conjunto de prueba. . . . . . . . . . . . . . 52 5.23. Mapa de importancia de una imagen sin neumonía bien clasificada. . . . . . 53 5.24. Mapa de importancia de una imagen sin neumonía mal clasificada. . . . . . . 53 Índice de cuadros 5.1. Distribución de clases en conjunto train, val y test. . . . . . . . . . . . . . . 27 5.2. Nueva distribución del conjunto train y val . . . . . . . . . . . . . . . . . . . 29 5.3. Tabla estadístico descriptivo de los datos . . . . . . . . . . . . . . . . . . . . 32 5.4. Tabla de resultados de la evaluación del modelo 1 . . . . . . . . . . . . . . . 38 5.5. Tabla de resultados de la evaluación del modelo 2 . . . . . . . . . . . . . . . 39 5.6. Tabla de resultados de la evaluación del modelo 3 . . . . . . . . . . . . . . . 40 5.7. Tabla de resultados de la evaluación de VGG-16 . . . . . . . . . . . . . . . . 42 5.8. Tabla de resultados de la evaluación de ResNet-50 . . . . . . . . . . . . . . . 44 5.9. Tabla de resultados de la evaluación de MobileNet . . . . . . . . . . . . . . . 45 5.10. Tabla de resultados de la evaluación de InceptionV3 . . . . . . . . . . . . . . 46 5.11. Tabla de métricas de evaluación de cada modelo. . . . . . . . . . . . . . . . . 48 v Introducción y Motivación A medida que crece la industria de la Inteligencia Artificial (IA), también se incrementan las oportunidades para su implementación en múltiples sectores alrededor del mundo. Esto se debe a las grandes ventajas que esta tecnología puede traer, por lo que muchísimas empresas de todos los sectores están invirtiendo mucho dinero en esta tecnología para optimizar y automatizar sus procesos y operaciones. Uno de los campos que ha salido beneficiado una y otra vez ha sido el diagnóstico médico por imagen con la ayuda de la IA. Según los datos de la Organización Mundial de la Salud (OMS), la neumonía es conside- rada una de las principales causas de muerte1. Llegando a causar un total de 740 180 muertes en el año 2019, especialmente en niños menores de 5 años. También es una de las primeras principales causas de muerte en los países en desarrollo con un bajo ingreso en donde los recursos médicos son escasos, debido a factores como la superpoblación, contaminación y condiciones ambientales antihigiénicas que empeoran la situación. Desde el punto de vista estadístico, se pueden planificar diferentes soluciones para ayudar en el tratamiento y la prevención de la enfermedad. Mediante el análisis de la estadística clásica es posible ofrecer soluciones como predecir la enfermedad según las características del paciente, vigilancias y control, así como la evaluación de tratamientos y resultados. En este trabajo nos centraremos especialmente en el problema del diagnóstico de la neumonía. La solución que se plantea es el reconocimiento de patrones en las radiografías para obtener un diagnóstico automatizado que sirva de herramienta en el trabajo de los expertos de la 1 2 salud. La neumonía suele diagnosticarse mediante radiografías de tórax o tomografías compu- tarizadas, siendo la primera la más usada debido a su reducido coste y disponibilidad en todos los países. Los programas computacionales puede ayudar a los expertos médicos a establecer el diagnóstico de neumonía gracias a su gran rapidez y a su juicio objetivo repro- ducible, ya que los signos de esta enfermedad no son tan fácilmente visibles o legibles para el ojo humano. Se han aportado varias soluciones de Diagnóstico Asistido por Ordenador (DAO) para ayudar en la clasificación de detección de la neumonía. Durante la pandemia del COVID-19 surgieron nuevas iniciativas en el desarrollo de tales procedimientos de diag- nóstico debido a la gran cantidad de casos. En este trabajo se implementarán algunas de las soluciones más exitosas en la literatura, basadas principalmente en la construcción de redes neuronales convolucionales y en técnicas propias del deep learning. Estado del Arte 2.1. Neumonía Según la definición de la OMS, la neumonía es un tipo de infección respiratoria aguda causada por diversos agentes infecciosos como virus, bacterias y hongos que afectan negati- vamente a los pulmones1. Estos están formados por pequeños sacos, llamados alvéolos, y son los encargados de almacenar el aire cuando se realiza una respiración. Sin embargo, cuando se sufre de neumonía, estos sacos se llenan de líquidos y puses, limitando la absorción del oxígeno y provocando que el proceso de toma de oxígeno sea doloroso2. Es una enfermedad que puede sufrir cualquier persona y existen muchos factores que de- terminan que un individuo pueda ser más susceptible a infección por unos microorganismos u otros. Por lo general suelen ser más graves y frecuentes en niños de edades inferiores a los 5 años, en personas mayores de más de 65 y en individuos con problemas o afecciones respiratorias previas. La neumonía provoca diversos síntomas dependiendo de la persona y del tipo de infección, pero las más frecuentes son la tos, fiebre, dificultad para respirar, escalofríos y dolor en el pecho. En caso de lactantes con una afectación muy grave pueden incluso ser incapaces de comer o beber y pueden presentar la pérdida de consciencia, hipotermia y convulsiones. Debido a los numerosos síntomas que puede presentar la enfermedad, un adecuado diag- nóstico es crucial para identificar la neumonía. Existen diversos test para su diagnóstico como análisis de sangre, pulsioximetría o prueba de esputo, pero la más utilizada y acertada 3 4 es el análisis de la radiografía de tórax.3 La neumonía es una de las enfermedades que más muertes causa en el mundo, provocando la defunción de alrededor de unos 2,5 millones de personas. Donde casi un tercio de todas las víctimas son niños menores de 5 años, siendo la principal causa de muerte en ese rango etario.4 A pesar de causar tantas muertes, siempre se puede encontrar alternativas para reducir la incidencia de la enfermedad. Actualmente, se están llevando a cabo diferentes campañas como vacunas contra la neumonía, reducción de la polución en el aire, acceso y tratamiento sanitario, y diagnósticos para detectar el problema a tiempo. Como resultado han demos- trado que estos métodos son eficaces si son implementados. Como se puede observar en la gráfica 2.1, los países cuyo Producto Interior Bruto (PIB) es alto tienen menor tasa de mortalidad que los países con bajo PIB, donde disponen de menores recursos para combatir la enfermedad. Figura 2.1: Tasa de mortalidad infantil por neumonía frente al PIB. Fuente: Our World in Data 5 2.2. Machine Learning en medicina El primer término de Machine Learning (ML) fue introducido por Arthur L. Samuel en 1950 con la intención de jugar a juegos de estrategia como el ajedrez. Lo definió como el me- canismo que hace que las computadoras aprendan de forma automática sin ser programado explícitamente. Estos ayudan a los modelos informáticos a adaptarse a nuevas circunstancias y a detectar patrones o tendencias mediante el aprendizaje de los datos de bajo nivel. Para tareas específicas, los modelos de ML se alimentan con ejemplos que tienen varias caracterís- ticas como entradas y etiquetas asignadas como salidas deseadas5. Por ejemplo, los píxeles de las imágenes digitalizadas del pulmón se convertirán en características, mientras que el estado del pulmón, ya sea sano o enfermo, se convertirá en etiquetas en formato binario. En el sector de la medicina, hay una cantidad enorme de información sobre los pacientes que está creciendo exponencialmente en los últimos años (Gráfica 2.2), y es imposible que toda esta información sea procesada únicamente por parte de los médicos. En consecuencia, los métodos de Machine Learning pueden aportar técnicas para reconocer patrones en esta gran cantidad tan ingente de datos, permitiendo usar diferentes algoritmos para predecir futuros resultados de los pacientes6. Figura 2.2: Cantidad total de información generada en el sector sanitario estadounidense. Datos en exabytes. Fuente: Statista 6 El aprendizaje automático ha sido el principal objetivo de una enorme investigación en las últimas décadas. Con los avances en el ámbito de la IA, las nuevas técnicas de ML pueden tratar cada vez con mayor eficacia los datos médicos. Aprovechando este crecimiento, los investigadores están cada vez creando mejores modelos de ML para poder tratar y predecir datos médicos aún más complejos y abundantes con una mayor eficiencia. Actualmente, las aplicaciones más comunes del ML al campo de la medicina son el apoyo de toma de decisiones clínicas y el análisis de imágenes. Estas tecnologías sirven de apoyo a los médicos, permitiéndoles tomar decisiones clínicas sobre tratamientos, medicamentos, salud mental, diagnósticos y otras necesidades del paciente ofreciéndole un acceso rápido a la información o a investigaciones que son relevantes. En cuanto a las imágenes médicas, las diferentes herramientas de ML se están empleando fundamentalmente para el análisis de tomografías computarizadas, rayos X, resonancias magnéticas y otras imágenes en busca de lesiones u otros hallazgos. Facilitando a los médicos el proceso de diagnóstico de las imágenes de una manera más rápida7. Debido al rápido avance de las tecnologías, las aplicaciones de la IA que benefician a los médicos, investigadores y pacientes están aumentando constantemente. En este punto ya existen pocas dudas de que la IA se esta convirtiendo en una parte central e imprescindible de los sistemas digitales de salud, respaldando en todo momento a la medicina moderna.8. 2.3. Redes neuronales Los modelos de redes neuronales artificiales (RNA) están basados en las redes neuronales biológicas del cerebro humano, por lo que para entender su funcionamiento es imprescindible conocer cómo trabaja nuestro cerebro. La unidad más básica con la que nuestro cerebro trabaja es la neurona, células que transmiten señales eléctricas de un extremo a otro desde el cuerpo del axón a través de las dendritas que llegan hasta su extremo final. De esta forma, la señal eléctrica es capaz de continuar transmitiéndose de una neurona a otra. Este proceso es conocido en medicina como sinapsis. La Figura 2.3 ilustra de manera gráfica este proceso. 7 Figura 2.3: Estructura de una neurona biológica. Fuente: FutureLab El cerebro humano contiene aproximadamente 100 billones de neuronas, por lo que es muy difícil hoy en día imitarlo con los recursos existentes. Sin embargo, podemos imitar las neuronas de otros seres como por ejemplo de las moscas, que poseen solamente 100 000 neu- ronas pero suficientes para ser capaces de encontrar comida, evitar peligros y reproducirse. Gracias a la estructura de las redes neuronales biológicas, se creó el perceptrón, la neu- rona artificial que dió paso a las redes neuronales artificiales. Estas redes se organizan en capas, generalmente en tres tipos de capas: Capa de entrada: Es la capa encargada de procesar los datos de entrada de cara a la fase de entrenamiento para analizar, clasificar y pasar a la siguiente capa. Capas ocultas: Estas capas pueden estar compuestas, a su vez, por muchas otras capas. Su función es tomar entradas de la capa inicial o de otras capas ocultas analizando la salida de la capa anterior para procesar el resultado aún más y pasarlos a la siguiente. Capa de salida: Es la capa que proporciona el resultado final de todo el procesamiento 8 de datos que realiza la red neuronal. Dependiendo del problema puede estar confor- mada por uno o varios nodos. Gracias a los diferentes tipos de capas la red es capaz de recibir datos de entrada, realizar el procesamiento programado y devolver una salida. Sin embargo, esta salida no siempre se genera de la misma manera, sino que depende de un umbral en concreto. La función que recibe una señal de entrada y devuelve una salida en función de un umbral en concreto se denomina función de activación. En la actualidad, las redes neuronales artificiales utilizan habitualmente un método de modificación de pesos en su proceso de aprendizaje, por lo que es imprescindible disponer de una función de activación en las capas para que estas puedan diferenciarse. Estas funciones de activación permiten eliminar la linealidad de las neuronas de las capas ocultas, por lo que permitirá que la adaptemos a todo tipo de datos9. Figura 2.4: Estructura de un perceptrón. Fuente: FutureLab La actividad de un perceptrón consiste en generar una salida y a partir de la aplicación de la función de activación f a la suma ponderada entre el vector de entrada x = (x1, ..., xm)T y el vector de pesos w = (w1, ..., wd)T sumándole un sesgo w0 (Ecuación 2.1). La siguiente expresión recoge matemáticamente lo comentado:10: 9 y = f ( m∑ i=1 xiwi + w0 ) (2.1) Durante el entrenamiento de las redes, los pesos se va ajustando para cada nodo. La actualización de estos pesos viene definida por el error entre la salida original y la prevista. Ese error se calcula con la función de coste. El objetivo de la red es conseguir minimizar ese error, por lo que una vez hecha la comparación, debemos devolvérselo a la red para que actualice los pesos. Existen diferentes algoritmos que se emplean en este proceso, denomi- nados algoritmos de optimización11. El más utilizado es el descenso de gradiente, aunque existen también otros muy populares como el descenso del gradiente estocástico o Adam. Esta técnica sirve para encontrar el punto más bajo donde se hace mínima a la función de coste. Esta información acerca del error se propaga hacia atrás a través de la red (propa- gación hacia atrás), ajustando los pesos de las conexiones de manera que las predicciones sean más precisas en cada repetición. La Figura 2.5 representa una función de descenso de gradiente con todos sus componentes. Figura 2.5: Descenso de gradiente. Fuente: Ahead of AI Aparte de la función de pérdida y del algoritmo de optimización, los resultados tam- bién dependen de otros hiperparámetros configurados por parte del investigador, como por ejemplo: learning rate, epoch y batch size 12. 10 Learning rate. Indica la importancia que le damos al error para actualizar cada peso. Determina la magnitud y la rapidez de los ajustes realizados en los pesos y sesgos de la red. Un valor pequeño haría que el proceso de red sea más lento pero con más posibilidad de dar con el mínimo global mientras que un valor más alto la red converge más rápido pero puede llegar a saltarse nuestro mínimo. Epochs. En modelos de Machine Leanirng, se entrenan con un conjunto de datos que pasan por el algoritmo. Cada vez que un conjunto de datos pasa por completo por el algoritmo se dice que se ha completado un epoch. Define el número de veces que pasa el conjunto de datos por el modelo. Mientras mayor sea el número de epoch mas aprenderá el modelo, pero a la vez que se corre el riesgo de sobreajuste13. Batch size. El tamaño de batch es el número de ejemplos que se utilizan en cada iteración de entrenamiento. Cuanto más grande sea el conjunto de ejemplos a procesar, más lenta será la compilación, aunque también se producirá una estimación más precisa de los gradientes. Conviene destacar que para la elección del mejor conjunto de hiperparámetros, es nece- sario realizar experimentaciones con varias pruebas hasta alcanzar los valores óptimos. 2.4. Redes neuronales convolucionales Las redes neuronales convolucionales (RNC) son una subclase especializada de las RNA, diseñadas para el procesamiento de imágenes y reconocimiento visual. Fue inspirada en el mecanismo natural de percepción visual de los seres vivos, y se usa con habitualidad en la clasificación de imágenes debido a su capacidad para extraer información y patrones de las imágenes. En cuanto a su estructura, mantiene la misma que las RNA, se dividen en tres tipos de capas: las capas de entrada, las ocultas y las de salida. Pero dentro de la capa oculta, este tipo de redes permiten introducir una nueva topología de capas aún más específicas. 11 Estos nuevos tipos de capas permiten a la red a hacer un preprocesamiento de los datos para que pueda aprender mejor de las características tanto de alto, como de bajo nivel14. El propósito de las RNC es extraer todas las características de una imagen para detectar o clasificar los objetos que la componen. A continuación, comentaremos las principales capas que nos permiten diseñar y construir redes de arquitectura convolucional: Capas Convolucionales. El propósito de este tipo de capas es extraer ciertas caracte- rísticas o patrones presentes en la imagen mediante la aplicación de filtros. Consiste en aplicar una serie de filtros entrenables al conjunto de datos de entrada, obtenien- do como resultado un mapa de características concreto. En la convolución cada filtro se desliza a lo largo de la altura y la anchura de la imagen. El producto entre cada elemento del filtro y la entrada se calcula en cada posición espacial15. Cada filtro en una capa convolucional está implementado para descubrir una característica específi- ca de la imagen, como un borde, textura o un color específico. Posteriormente, estas características se combinan en las capas posteriores para formar representaciones de características más complejas. Podemos ver un ejemplo más claro de la convolución en la figura 2.7, donde los valores toman rangos de 0 a 255, de más claro a más oscuro: Figura 2.6: Operación de convolución en una imagen. Fuente: Rubén Rodríguez Abril El cuadro azul llamado “kernel”, es el filtro que se aplicará sobre la imagen, en este caso es de tamaño 3x3. El cuadro azul de la derecha se produce cuando el filtro se 12 sitúa sobre esa posición de la imagen y realizan un producto entre los valores. Como resultado devuelve un mapa de características mediante la suma de los valores del resultado, con la información extraída sobre la imagen original. Capas convolucionales tienen como parámetros el stride y el padding, que indican el número de píxeles que el filtro se desplaza en cada paso durante la convolución. Un stride más grande significa que el filtro se moverá más rápidamente a través de la imagen. Por su parte, el padding es una técnica que se utiliza para preservar el tamaño espacial de la entrada. Consiste en añadir ciertos píxeles alrededor de la entrada antes de realizar la convolución, por lo que resulta útil cuando queremos conservar el mismo tamaño de entrada y salida. Podemos ver cómo queda representada esta operación en la figura 2.7. Figura 2.7: Operación stride y padding. Fuente: Rubén Rodríguez Abril Después de realizar la convolución, se suele aplicar una función de activación a la salida con el propósito de introducir la no linealidad en el modelo. Debido a que la mayoría de datos en la vida real son no lineales, y sin una función de activación, por 13 muy profunda que sean las redes, estas seguirían siendo un modelo no lineal, lo que limita su capacidad para aprender y modelar datos complejos. La más utilizada es la función “Rectified Lineal Unit” (ReLU), debido a que es muy eficiente en términos computacionales. También es la más usada porque no presenta problemas del descenso de gradiente como en otras funciones de activación tales como la “sigmoide” o la “tangente hiperbólica”. Por ende, con la función ReLU, la red será capaz de aprender patrones más profundos y complejos16. Cabe destacar que, aunque la función “ReLU” es la más popular en el estado del arte, no es perfecta para todas las situaciones, y por ello, debemos conocer primeramente cuál es nuestro caso y seleccionar correctamente nuestra funciones de activación más adecuada17. Por ejemplo, en la capa de salida de una red neuronal para clasificación binaria, la mejor opción es el uso de la función de activación “sigmoide”, que propor- ciona una distribución de probabilidad sobre las dos clases. En la Figura 2.8 se puede observar las distintas funciones de activación. Figura 2.8: Gráfica de funciones de activación. Fuente: Future Space 14 Capas de agrupación. Estas capas se utilizan para reducir el tamaño y resolución de nuestros mapas de características obtenidos de las capas de convolución, preservando las características más importantes. De esta forma reduciremos la cantidad de recursos computacionales que necesitemos, a la vez que también ayuda a reducir el overfitting. Esto se logra mediante la aplicación de ventanas que realizan otro tipo de operación sobre el mapa de entrada. Los modelos de agrupación más utilizadas son el Max-Pooling y el Average-Pooling 18. El Max-Pooling como su nombre indica, atribuye a la salida el mismo valor que la entrada más alta. Tiene el efecto de conservar las características más destacadas (las activaciones más altas), mientras se deshace de las características menos importan- tes. Esto hace que la red sea más tolerante a las diferencias en las posiciones de las características en las imágenes. En Average Pooling, la operación calcula el valor promedio de los valores en la ven- tana del mapa de características. Al conservar la información de todos los valores de la ventana, hace que sea menos invariante ante pequeñas transformaciones y al des- plazamiento que el Max-Pooling. La imagen 2.9 muestra el funcionamiento de ambas técnicas de agrupación. Figura 2.9: Técnicas de agrupación. Fuente: Rubén Rodríguez Abril Descripción de la propuesta En este apartado describiremos la propuesta que hemos planteado para solucionar el problema de la identificación de neumonías mediante la clasificación de imágenes haciendo uso de las herramientas adecuadas. 3.1. Introducción En este trabajo se van a implementar una serie de modelos que permitan clasificar las imágenes de radiografías de tórax de los pacientes, con el objetivo de detectar si padecen o no la enfermedad de la neumonía. La neumonía es una enfermedad respiratoria grave que afecta a personas de todas las edades en todo el mundo. La detección temprana y precisa de la esta enfermedad es crucial para un tratamiento adecuado y efectivo para curar a los pacientes de esta enfermad. En este sentido, una clasificación automatizada de imágenes de rayos X de tórax puede resultar imprescindible para la identificación de la presencia del primer síntoma. El enfoque de la propuesta está en la utilización de RNC, para que estas sean capaces de aprender y extraer las características y patrones más relevantes de las imágenes de las radiografías pulmonares. Más concretamente, se pretenden detectar las zonas donde hay una mayor opacidad que provoca la infección producida por la neumonía. Para este proceso de aprendizaje aportaremos un conjunto de datos que incluyen imágenes de pacientes con neumonía y sin neumonía, y evaluaremos el rendimiento de la propuesta mediante diferentes 15 16 sistemas de métricas para comprobar la calidad del trabajo. Con la implementación de la propuesta, se espera que los resultados puedan ser una herramienta de utilidad para la comunidad médica a la hora de diagnosticar casos de neu- monías. La intención del presente TFM nunca ha pretendido sustituir la labor del personal médico, sino servir de apoyo para que puedan mejorar la eficiencia de los resultados clínicos y reducir su carga de trabajo. 3.2. Problemas La enfermedad de la neumonía ha conllevado siempre un grave riesgo de mortalidad, por lo que un diagnóstico temprano y ágil que sea capaz de detectar dicha enfermedad resulta fundamental para contener su propagación. De esta forma dispondremos del tiempo suficiente para tomar las medidas necesarias y adecuadas para luchar contra ella, reduciendo de esta manera su morbilidad y su mortalidad asociada. La radiografía de tórax es una de las herramientas más comúnmente utilizadas para realizar el proceso de diagnosis. Sin embargo, la interpretación de este tipo de radiografías de tórax puede presentar diversos problemas. El primer problema se encuentra focalizado en los enfermos que viven en los países en desarrollo, donde miles de millones de personas sufren de pobreza energética y dependen de estas energías contaminantes para sobrevivir. Según la OMS, cada año se producen más de 4 millones de muertes prematuras por enfermedades relacionadas con la contaminación atmosférica. En estas áreas el problema puede agravarse debido a la escasez de recursos y personal médico, por lo que para ellos un diagnóstico rápido, preciso y que no requiera de muchos recursos, lo es todo. Otro problema está en que el diagnóstico con alta precisión de la neumonía es una tarea compleja. Requiere de la revisión de las radiografía por parte de especialistas altamente 17 cualificados y de la confirmación mediante el historial clínico, los constantes vitales y los análisis de laboratorio. El personal médico se tiene que enfrentar a la revisión de grandes volúmenes de imágenes en cada turno, suponiendo una gran carga de trabajo para ellos. Especialmente en hospitales de grandes ciudades o en áreas rurales con escasez de médicos. Los médicos con menos experiencias en estos casos pueden llevar a la variabilidad en la interpretación. Debido a que a la vez existen muchas otras enfermedades pulmonares que pueden presentar imágenes similares a las de la neumonía en una radiografía. Distinguir entre estas condiciones puede ser muy desafiante para los médicos con menos práctica. A la vez que durante las etapas tempranas de la neumonía pueden presentar cambios muy sutiles que pueden ser difícilmente apreciados en una radiografía. 3.3. Solución Con el objetivo de hacer que todo el mundo pueda disponer de un diagnóstico eficaz, preciso y rápido de sus radiografías, surge como solución las técnicas del aprendizaje auto- mático. Hoy en día los centros de salud cuentan con sistemas de Diagnóstico Asistido por Or- denadores (DAO) mediante la clasificación automática de imágenes que les ayudan en sus trabajos, ofreciendo una mayor eficiencia y precisión en los resultados de los análisis. DAO ofrece una solución para todos los problemas que se han comentado en el apartado anterior. Utilizan algoritmos para identificar signos de neumonía de manera más temprana y precisa que la interpretación humana. Esto puede ayudar a los expertos a reducir su tiempo y carga de trabajo, a la vez que disminuimos la variabilidad de la interpretación ofreciendo un enfoque más aproximado. Para alcanzar ese objetivo, recopilaremos un conjunto de imágenes de radiografías de tórax y lo usaremos para crear un modelo de machine learning que sea capaz de identificar 18 en cada imagen de rayos X la presencia de neumonía. Según diversos estudios, el uso de las RNC es la mejor opción para conseguir una solución más óptima frente a nuestra proble- mática. Hemos tenido en cuenta la dimensión del conjunto de datos, la complejidad en la diferenciación de imágenes con y sin neumonía, el balance entre clases de nuestros datos y la disponibilidad de nuestros recursos para la elección de las RNC como nuestro principal algoritmo para la clasificación de imágenes de neumonía. Sin embargo, hay que tener en cuenta que a día de hoy esta tecnología no es infalible y, por tanto, los resultados siempre deben ser utilizados únicamente como herramienta com- plementaria a la evaluación clínica de un facultativo. Metodología y Planificación Antes de adentrarnos con la implementación de nuestra solución, es muy importante realizar una planificación previa sobre el desarrollo de la misma. En este apartado están recogidos todos los pasos que vamos a seguir y las diferentes técnicas que se van a usar para conseguir los objetivos de este trabajo. 4.1. Arquitectura del sistema Para este trabajo hemos seguido una arquitectura típica de ML para una clasificación binaria de imágenes: Figura 4.1: Arquitectura de ML de clasificación de imágenes. Fuente: Elaboración propia 19 20 Empezando por la parte de la izquierda observamos que primeramente necesitamos una fuente de datos de imágenes de las que queremos extraer el conocimiento. En nuestro caso serán imágenes de radiografías de tórax de pacientes que sufren de neumonía y de pacientes que no. El siguiente paso es realizar un preprocesamiento de los datos fuente. Esta es una par- te esencial en cualquier proyecto de aprendizaje automático y afecta en gran medida a la calidad y rendimiento de nuestro modelo. En este proceso incluyen pasos como el redimen- sionamiento, normalización de las imágenes, técnicas de aumento de datos, balanceo de las etiquetas de las diferentes clases, así como la partición de los datos en entrenamiento, validación y prueba. Con los datos transformados y preparados, tenemos que seleccionar un modelo de clasifi- cación, en nuestro caso al tratarse de una clasificación de imágenes, la RNC siempre es una de las mejores opciones debido a su excelente capacidad de extraer características relevantes de forma automática y eficiente. Lo entrenaremos con nuestros datos de entrenamiento, y mientras el modelo se entrene usaremos nuestro conjunto de datos de validación para ajustar los hiperparámetros del modelo para maximizar el rendimiento obtenido. Conseguiremos el mejor modelo y usaremos nuestro conjunto de datos de prueba para comprobar su robustez y evaluar su rendimiento ante datos nuevos que no habían sido usados en las fases anteriores. Finalmente, si consideramos nuestro modelo lo suficientemente bueno en los casos de clasificación de neumonía, lo desplegaremos y lo utilizaremos para predecir sobre imágenes nuevas de los pacientes con el fin de ayudar a los personales médicos a hacer un mejor diagnóstico de casos sobre neumonías. 21 4.2. Estudio de modelos En esta sección haremos un estudio de los diferentes modelos que quizás nos puedan servir para utilizarlos en nuestro trabajo de clasificación imágenes de neumonía. En el ámbito de clasificación de imágenes, el modelo de RNC es la más comúnmente uti- lizada. Supera a otros métodos tradiciones como Support Vector Machine (SVM) o Random Forest (RF) porque es capaz de procesar grandes cantidades de datos y producir prediccio- nes muy precisas. Para nuestro caso de diagnóstico de neumonía, las RNC es el modelo que mejor resultados trae hasta la fecha de hoy debido a que puede aprender automáticamente tanto las características de alto y bajo nivel de las imágenes. Como primer acercamiento, empezaremos construyendo modelos RNC muy básicos para dar el primer paso y conseguir una aproximación a nuestros datos y a las redes neuronales convolucionales. Comenzaremos implementando modelos secuenciales propios con pocas ca- pas para comprobar si el modelo ya puede extraer patrones importantes de las imágenes sin haber pasado por muchos filtros. Luego iremos aumentando ese número de capas convolucio- nales para ayudar al modelo a encontrar más fácilmente las características más relevantes, y compararemos los resultados obtenidos por ambos. Finalmente usaremos también la trans- ferencia de aprendizaje a través de modelos preentrenados con conjuntos de datos masivos y lo adaptaremos a nuestros propósitos específicos. En el presente trabajo, a parte de los modelos de RNC propios, también se harán uso de los modelos preentrenados como VGG, ResNet, Inception y MobileNet. Fueron desarrollados por expertos del sector con grandes recursos computaciones y con una base de datos masivo como la de ImageNet. Modelo VGG-1619. El modelo VGG-16 fue desarrollado por la Universidad de Oxford para tareas de reconocimiento de imágenes. Como su nombre indica, consta de 16 capas ponderadas, incluyendo 13 capas convolucionales y 3 capas totalmente conectadas. El algo- 22 ritmo destaca por tener una arquitectura uniforme y simple con capas convolucionales con filtros de tamaño 3x3, seguidos de capas de MaxPooling2D. Figura 4.2: Estructura del modelo VGG-16. Fuente: Medium Modelo Resnet-50. Es una red neuronal convolucional de 50 capas (48 capas convolucio- nales, una capa MaxPool y una capa AvgPool). Se caracteriza por sus conexiones residuales que permiten a las señales de capas inferiores fluir directamente hacia capas superiores, resolviendo el problema de gradientes que desaparecen20. Figura 4.3: Estructura del modelo ResNet-50. Fuente: Towardsdatascience 23 Modelo InceptionV321. Es un modelo desarrollado por los investigadores de Google. Está compuesto por elementos simétricos y asimétricos, como capas de convoluciones, agrupacio- nes, concatenaciones, dropouts y capas totalmente conectadas. La normalización de lotes se utiliza en todo el modelo y se aplicará entradas de activación, La pérdida del modelo se calcula mediante la función “Softmax”. Figura 4.4: Estructura del modelo InceptionV3. Fuente: Google Cloud Modelo MobileNet. Es una arquitectura que se basa en la simplicidad utilizando convo- luciones separables en profundidad que permite ajustar el tamaño del modelo a través de un multiplicador de ancho. De esta forma es capaz de reducir significativamente la complejidad computacional. Tiene un rendimiento bueno en tareas como la clasificación de imágenes donde es capaz de detectar atributos finos y localizarlos de forma correcta. 24 Figura 4.5: Estructura del modelo MobileNet. Fuente: Olarik Surinta, 2020 4.3. Métricas para la evaluación Es muy importante conocer el rendimiento y la calidad de nuestro sistema. Para ello, se utilizan varios parámetros de evaluacion. Cuando el objetivo del modelo es la clasificación de datos, solo devuelve cuatro tipo de resultados posibles: True Positive (TP), True Negative (TN), False Positive (FP) y False Negative (FN). TP: El valor real es positivo y la predicción del modelo también es positivo. El paciente tiene neumonía y el modelo dice que sí tiene. TN: El valor real es negativo y la predicción del modelo también es negativo. El paciente no tiene neumonía y el modelo dice que no tiene FP: El valor real es negativo y la predicción del modelo es positivo. El paciente no 25 tiene neumonía y el modelo dice que sí tiene FN: El valor real es positivo y la predicción del modelo es negativo. El paciente tiene neumonía pero nuestro modelo dice que no. A partir de esas cuatro salidas surgen la matriz de confusión, y sus respectivas métricas que son las que usaremos en este trabajo. La exactitud, precisión, sensibilidad y el valor F122. La exactitud es el número de predicciones clasificadas correctamente por el modelo sobre el número total de instancias predichas y puede definirse como en la siguiente fórmula: Accuracy = TP + TN TP + FP + TN + FN (4.1) La precisión es el número de predicciones positivas correctas del número total de predic- ciones reales clasificadas como positivas, y puede definirse estadísticamente como: Precision = TP TP + FP (4.2) La sensibilidad, en inglés recall, es el número de predicciones positivas correctamente clasificadas que pertenecen a la clase positiva. Recall = TP TP + FN (4.3) El Valor-F se utiliza para combinar las medidas de precisión y sensibilidad en un solo valor. Es muy práctico porque hace más fácil el poder comparar el rendimiento combinado de la precisión y recall entre varios modelos. PuntajeF1 = 2 ∗ Precision ∗ Recall Precision + Recall (4.4) 26 Usaremos otras métricas de evaluación para observar cómo se desempaña un modelo a través de diferentes umbrales de clasificación. Estas métricas son el Receiver Operating Characteristic (ROC) y Area Under the Curve (AUC). La curva ROC muestra el rendimiento de un modelo de clasificación en todos los umbrales de clasificación. Esta curva es representado mediante dos parámetros, el TP (sensibilidad) en el eje Y, y el FP (1 - especificidad) en el eje X. En cambio, el AUC significa el área debajo de la curva ROC, representa la probabilidad de que un sujeto seleccionado al azar con la afección tenga un resultado de la prueba que indique mayor sospecha que el de un sujeto seleccionado al azar sin la afección23. Un valor de 1 indica que el modelo tiene un rendimiento perfecto, mientras que un valor de 0.5 implica que el modelo no mejora en comparación a una clasificación aleatoria. Debemos hacer uso de todas las métricas para ofrecer una visión global, equilibrada y detallada del rendimiento de los diferentes modelos. Implementación del proyecto 5.1. Fuente de datos Las fuentes de datos utilizadas en este proyecto han sido obtenidos del conjunto de datos “Chest X-Ray Images (Pneumonia)” disponible en Kaggle. Contiene un conjunto de imágenes de radiografías de tórax de dos tipos de clases; la clase “NORMAL” que contiene todas las radiografías cuyos pulmones están en un estado sano, y la clase “PNEUMONIA” con rayos X de pulmones que están infectadas por la neumonía. El conjunto de datos viene organizado en tres carpetas (train, test, val) que contienen subcarpetas para cada categoría de la imagen (Pneumonia/Normal), con un total de 5863 imágenes. Podemos ver la distribución en la tabla 5.1. Normal Neumonía Total % Normal % Neumonía % Total Train 1314 3875 5189 25.32 % 74.78 % 89.02 % Val 8 8 16 50 % 50 % 0.28 % Test 234 390 624 0.38 % 0.62 % 10.70 % Cuadro 5.1: Distribución de clases en conjunto train, val y test. Las imágenes de radiografía de tórax fueron seleccionadas a partir de cohortes retrospec- tivos de pacientes de uno a cinco años de edad del centro “Guangzhou Women and Children’s Medical Center”. El dataset fue creado por Daniel Kermany, Kang Zhang y Michael Gold- baum y está disponible en el repositorio “Mendeley Data” de acceso libre. Posteriormente fue compartido en Kaggle con ciertas adaptaciones. 27 28 (a) Neumonía (b) Sano Figura 5.1: Muestra de radiografías. A primera vista, para una persona que no es especializada en la interpretación de imá- genes médicas, es muy difícil observar las diferencias existentes entre las radiografías de pulmones con neumonía y sanos. 5.2. Preprocesamiento de imágenes El preprocesamiento de imágenes es un paso crucial en cualquier proyecto de análisis de datos o de ML. Consiste en un conjunto de técnicas que se utiliza para limpiar, transformar y organizar los datos iniciales en un formato que pueda ser trabajado de una forma más eficiente y sencilla por los modelos de ML. Durante este proceso mejoramos la calidad de los datos, y de esta forma la precisión y la confiabilidad de cualquier modelo de aprendizaje automático24. A diferencia de los datasets de datos estructurados las cuáles se enfocan especialmente en tareas de limpieza de datos, control de valores nulos y trasformaciones de datos, cuando tratamos con imágenes se traduce a preprocesamiento de imágenes. Es una técnica espe- cializada para datos visuales, que son representados en un array de píxeles. Los cambios y transformaciones que se hacen son sobre cada píxel con el fin de mejorar la calidad de la imagen o extraer las características más relevantes en la imagen para ayudar a los modelos a poder trabajar los datos de una manera más eficiente y consumiendo menos cómputo. 29 5.2.1. Nueva partición Como hemos podido observar en la distribución de los datos iniciales, en la carpeta de imágenes de validación hay solamente 16 imágenes, 8 imágenes para cada clase. Este es un problema porque debido a los escasos datos de validación no vamos a poder evaluar de forma correcta el rendimiento de nuestros modelos y tampoco estaremos informados de posibles sobreajustes del modelo, a parte de que devolverá métricas con una alta variabili- dad de poca confiabilidad que no podremos utilizar a la hora de la elección de modelos o hiperparámetros25. Como solución, se han unido los conjuntos de entrenamiento y validación para luego ajustar la proporción de división entre los conjuntos de entrenamiento y validación, pasando más datos de entrenamiento al conjunto de validación. Se ha decidido dividir en 80 % para entrenamiento y 20 % validación, de esta forma tendríamos una nueva distribución de datos como se aprecia en el cuadro 5.2. Normal Neumonía Total % Normal % Neumonía % Total Train 1082 3103 4186 25.32 % 74.78 % 89.02 % Val 267 780 1047 50 % 50 % 0.28 % Cuadro 5.2: Nueva distribución del conjunto train y val También se ha considerado otras alternativas para este tipo de problemas de un conjunto pequeño de validación. Han sido propuestas varias soluciones, la más popular y la que mejor rendimiento devuelve es la validación cruzada26. Pero para nuestro tipo de problemas no es aplicable debido a que puede ser tremendamente costoso en términos computacionales, ya que los principales modelos que se usan en este trabajo son redes neuronales convolucionales, que son a menudo muy complejos y necesitan mucho tiempo para entrenarse. A parte de que, también contamos con un tamaño grande de nuestro conjunto de datos, con una cantidad de casi seis mil de imágenes de radiografías a nuestra disposición. 30 5.2.2. Desbalance de clases Otro problema que nos hemos encontrado antes de aplicar los modelos ha sido la presencia de un alto desbalance de clases. Como se puede observar en la figura 5.2, todos los conjuntos de datos presentan un alto desbalance entre las dos clases, teniendo muchas más imágenes de casos positivos (neumonía) que de casos negativos (normales). La consecuencia de este desbalance de clases hace que los modelos de ML tiendan a sesgarse hacia la clase que tiene más casos y ser menos preciso para la clase con menos casos. Existen múltiples soluciones para estos casos como por ejemplo, undersampling de la clase mayoritaria, oversampling de la minotaria, técnicas de aumento de datos, ensamblado de modelos, transfer learning, corrección de pesos de ambas clases, etc. Figura 5.2: Distribución gráfica de clases en el conjunto de entrenamiento. En el presente trabajo, se ha decidido hacer uso de las siguientes técnicas: Oversampling. A comparación de undersampling, oversampling casi siempre es la mejor alternativa cuando tenemos los recursos computacionales necesarios. Nos asegura a no perder datos que podrían ser potencialmente útiles27. Con el uso de esta técnica 31 aumentamos el número de nuestras imágenes de la clase minoritaria hasta conseguir un 41.1 % en respecto al número total de imágenes. Cabe destacar que esta técnica simplemente replica aleatoriamente ejemplos de la clase minoritaria y no introduce variabilidad en los datos, a la vez de que puede estar haciendo que nuestro modelo se sobreentrene con datos repetidos. Para solucionar estos problemas lo acompañaremos con otra técnica de aumento de datos. Corrección de pesos. Es una técnica que permite ajustar el valor de peso de cada clase, de esta forma daremos más pesos a la clase minoritaria en proporción de la diferencia entre las clases. Este peso luego será ajustado en el parámetro de pesos de los modelos de las redes neuronales convolucionales para que trabajen con pesos más altos en casos de la clase minoritaria. Estos pesos más altos hace que el modelo pueda “prestar más atención” a las clases menos representadas.28 Aumento de datos. Como ya comentamos anteriormente el problema de solamente ha- cer el oversampling, vamos a acompañarlo de un método de aumento de datos. Consiste en crear imágenes nuevas a partir de las existentes realizando pequeñas transforma- ciones sobre ellas. Esto hace que las imágenes nuevas que habíamos replicado con oversampling, no sean las mismas. Consiguiendo que los modelos puedan tratar con nuevos tipos de imágenes haciéndolos más robustos, capaces de reconocer patrones en diferentes condiciones y ayudando en la prevención del sobreajuste. Podemos hacer aumentar nuestras imágenes a un límite de infinito con esta técnica, pero siempre debemos ser conscientes de que a partir de un cierto punto el modelo puede llegar a sobreentrenarse y por tanto debemos elegir adecuadamente el número de las imágenes nuevas que creamos. Con la combinación de estas técnicas, nos aseguramos de que trabajamos con un con- juntos de datos balanceados. Esto mejora la capacidad de los modelos de hacer predicciones más precisas, a la vez que se consigue una reducción en el sesgo hacia la clase mayoritaria. 32 5.2.3. Modificación de las imágenes Los datos con los que vamos a trabajar son imágenes, por lo que las modificaciones difiere con respecto a las que se hacen a un dataset estructurado. Las imágenes están formadas por un conjunto de elementos llamados píxeles. Las imágenes suelen venir representadas en tres dimensiones, el número de píxeles de cada fila, el número de píxeles de cada columna y el número de canales (1 para escala de grises y 3 para imagen de color). Redimensión de las imágenes En nuestro caso, las imágenes vienen cada una en una dimensión de altura y anchura diferente, pero sí todas con un mismo número de canal, de tres canales (formato RGB). Podemos ver el formato de nuestras imágenes en la siguiente tabla de estadísticas descriptivas 5.3. Valor Altura Media 968 Altura Máx. 2663 Altura Mín. 127 Anchura Media 1321 Anchura Máx. 2916 Anchura Mín. 384 Cuadro 5.3: Tabla estadístico descriptivo de los datos Figura 5.3: Diferencia de tamaño entre imágenes. 33 Esto es un problema ya que para el uso de las redes hace falta que los datos de entrada sean del mismo tamaño. Para resolver este problema, se va a hacer una redimensión de todas las imágenes, consiguiendo homogeneizarlas para que tengan todas la misma anchura y altura. Con el uso de esta técnica se va conseguir también reducir la información de las imágenes, consiguiendo al mismo tiempo una reducción en términos computacionales. Pero también debemos tener cuidado en no reducir excesivamente el tamaño, ya que podríamos estar perdiendo detalles importantes de la imagen. Tras varias pruebas de reajuste se ha decido usar la dimensión de 300x300x3. Data augmentation En el anterior apartado mencionamos el uso del aumento de datos, aquí describiremos cuáles son exactamente las modificaciones que haremos sobre las imágenes. Este proceso solamente lo aplicaremos al conjunto de datos de entrenamiento con el fin de ayudar a los modelos a aprender de características diferentes y más robustas. Al tratarse de imágenes de rayos X de pulmones, debemos tener en cuenta que no de- bemos hacer transformaciones muy extremas que alteren la interpretación clínica de las imágenes o creando radiografías que no existen clínicamente. Nuestras trasformaciones es- tán basadas del artículo “The Effectiveness of Image Augmentation in Deep Learning Net- works”29, donde pone a prueba diferentes acciones sobre las imágenes para conseguir una conclusión de las mejores técnicas de aumento de datos para imágenes de radiografías de tó- rax. En nuestro trabajo aplicaremos conjuntamente los aumentos de datos que se describen a continuación: Rotación. Rotaremos las imágenes aleatoriamente entre -20 y +20 grados. Zoom. Haremos un zoom sobre las imágenes en un rango del 80 % y el 120 % de su tamaño original. Traslación. Moveremos la imagen en direcciones horizontales y verticales en un rango 34 de -20 y + 20 grados de su alto y ancho, respectivamente. Relleno de píxeles. Rellenaremos los píxeles faltantes producidos por las acciones an- teriores con el valor del píxel más cercano. Usamos esta función para no introducir nuevos colores. Combinaremos diferentes técnicas de aumento de datos a todas nuestras imágenes de forma totalmente aleatoria, asegurando de que cada imagen puede ser transformada de manera diferente durante el proceso de entrenamiento. Figura 5.4: Ejemplos de imágenes tras aumento de datos. Fuente: Elaboración propia. 35 Normalización de píxeles Continuamos el preprocesamiento con proceso de normalización de los píxeles de las imágenes. Nuestras imágenes, inicialmente vienen en RGB, en un rango de valor 0 a 255 para cada píxel, pero son valores muy altos y difieren mucho unos a otros para que nuestro modelo los procese de la forma más óptima. Convertiremos los píxeles de modo que estén en una escala común, se usan generalmente un rango de [0,1] o [-1,1]. En este trabajo usaremos el rango de [0,1] debido a que en las redes neuronales convolucionales se usan las funciones de activación ReLU, estas convierten todo el valor negativo en 0 por lo que podríamos estar perdiendo información si muchos píxeles se encuentran en el rango negativo. Realizando una normalización de imágenes, conseguimos acelerar la convergencia de los modelos y mejorar el rendimiento y eficiente de nuestros modelos de redes neuronales. Creación de Batches Como último paso del preprocesamiento, trabajaremos con las imágenes del conjunto de entrenamiento y validación en lotes. Trabajar en batches en vez de imágenes sueltas ayuda a mejorar la eficiencia computacional, a la vez que conducen a un entrenamiento mucho más robusto30. El número de imágenes en un lote afecta a varios factores, un lote pequeño requiere menos memoria de cómputo y menos tiempo de convergencia, pero con menor calidad de convergencia debido a que puede permitir escapar de ciertos mínimos locales. Pero tampoco es cierto que mientras más tamaño de batch tengamos, obtenemos resultados mejores. Si tenemos tamaño de batches muy elevados podemos llegar a estar afinando demasiado hasta llevar a un sobreajuste31. Entonces tenemos que considerar un tamaño de batch adecuado según nuestros recursos, modelos y la naturaleza del conjunto de datos. En nuestro caso, usaremos un tamaño de batch de 64, tras hacer una consideración de nuestros recursos y de que usamos un modelo complejo con varias capas de redes neuronales convolucionales. 36 5.3. Modelización y evaluación de modelos En esta sección explicaremos todos los modelos que se han llevado a cabo para la predic- ción de las imágenes de radiografías de tórax. Empezaremos construyendo modelos de redes neuronales convolucionales personalizadas, empezando desde modelos con menos cantidad de capas y más simples, hasta modelos con un número de capas mayor y más complejas. Luego pasaremos a utilizar modelos con arquitecturas predefinadas, que han sido diseñadas y entrenados con grandes conjuntos de datos por investigadores profesionales. Por lo que podremos decidir si utilizar solamente su estructura de la red o también utilizar los pesos de su entrenamiento obtenido de un conjunto de datos mucho más grande, que han sido obtenidos aplicando muchos más recursos computacionales. Una vez definidas las características de las RNC, ya podemos pasarlo por el proceso de compilación y entrenamiento. Primero debemos compilar el modelo, más concretamente, es la configuración de varios parámetros y ajustes de cómo se actualizan y se evalúan las ponderaciones internas del modelo durante el entrenamiento32. En la fase de compilación tenemos que seleccionar un algoritmo de optimización, una función de pérdida y de forma opcional las métricas de evaluación adicionales que se desean incluir para medir su rendi- miento. Para todos los modelos, inicialmente se usarán el optimizador “adam”, debido a que es muy efectivo en situaciones con gradientes ruidosos o escasos, y la función de pérdida “binary_crossentropy”, la utilizada en problemas de clasificación binaria. Como métricas vamos a mostrar las que comentamos en la fase de metodología. Después de haber configurado el modelo, pasamos al proceso de entrenamiento, que es donde alimentamos de datos al modelo y ajustamos los pesos internos para minimizar la función de pérdida que habíamos definido previamente en la fase de compilación. También se le pasará el conjunto de validación para que evalúe el modelo con datos que no se ha visto antes para ajustar los pesos y sesgos. De esta forma podremos configurar ciertos parámetros para mejorar el rendimiento del modelo. Los parámetros definidos para el entrenamiento 37 han sido, un Batch size de tamaño 64, Epoch de 20 repeticiones y un Learning Rate de 0,001. A estas además le aplicaremos técnicas para evitar sobreajuste, con el uso de Early Stopping con una paciencia de 7 repeticiones, si las métricas del conjunto de validación no han mejorado. En todos los modelos que se explican a continuación se usará la misma configuración inicial para poder comparar la eficiencia de los modelos. En caso contrario, se mencionará en dicho apartado. 5.3.1. Modelos CNN personalizados En los modelos de RNC personalizados consiste en crear y decidir el número y tipo de capas que se van a crear. Modelo propio 1 En esta primera arquitectura de RNC personalizada será muy sencilla, con el objetivo de conseguir un primer acercamiento a nuestros datos preprocesados. Es una red secuencial donde se irán añadiendo las diferentes capas una tras otra de forma progresiva. Esta primera RNC tiene la siguiente estructura: Figura 5.5: Estructura modelo personalizado 1 En este primer modelo tenemos solamente cuatro capas. Estos modelos necesitan datos de entrada, y como ya explicamos en el preprocesamiento, todas las imágenes tienen una dimensión de 300x300x3. 1. Una capa convolucional con 16 filtros de tamaño 3x3, con strides de 1 y función de activación ReLU. 38 2. Una capa MaxPooling2D con una ventana de tamaño 2x2 y strides 1. 3. Una capa de aplanamiento para convertir la multidimensionalidad en una única di- mensión. 4. Una capa de salida con una única neurona que nos dará la probabilidad de si la imagen padece de neumonía. Esto es posible creando una capa totalmente conectada de 1 neurona con la función de activación “Sigmoid”. Este primer acercamiento ofrece un resultado de 76 % de exactitud con un AUC del 0.84, un resultado aceptable pero no deseado para este tipo de aplicaciones. Podremos ver más detalles de otras métricas en las siguientes dos tablas 5.6: Precisión Recall F1-Score Muestra Normal 0.67 0.73 0.70 234 Neumonía 0.82 0.78 0.8 390 Cuadro 5.4: Tabla de resultados de la evaluación del modelo 1 Figura 5.6: Matriz de confusión del modelo propio 1 39 Modelo propio 2 Viendo que los resultados del primer modelo no son buenos vamos a continuar creando un segundo modelo con una capa convolucional más y usando una capa totalmente conectada para aprender a combinar las características de las capas previas. Figura 5.7: Estructura modelo personalizado 2 En el segundo modelo vemos que la exactitud mejora a un 79 % con un AUC de 0.88. Precisión Recall F1-Score Muestra Normal 0.87 0.54 0.0.67 234 Neumonía 0.58 0.95 0.72 390 Cuadro 5.5: Tabla de resultados de la evaluación del modelo 2 Figura 5.8: Matriz de confusión del modelo propio 2 40 En la matriz observamos un sesgo alto hacia la clase positiva, siendo muy bueno pre- diciendo para casos positivos con un una sensibilidad del 95 % mientras en la especificidad tiene un valor de 54 %. Modelo propio 3 Crearemos otro modelo propio con más número de capas para comprobar si a mayor número de capas puede conseguir extraer características más concretas de las imágenes, mejorando el rendimiento del modelo. Figura 5.9: Estructura modelo personalizado 3 Este modelo a diferencia del anterior, se ha añadido más número de capas convoluciona- les, teniendo dos capas seguidas. Después de cada dos capas convolucionales reducimos los parámetros con la capa MaxPooling2D. Y añadimos otra capa totalmente conectada de 128 neuronas seguida de una capa Dropout para evitar el posible overfitting. El rendimiento de este modelo nos ofrece un 81 % de accuracy con un AUC de 0.89. Mejora en pequeñas cifras al modelo anterior de menos capas. Precisión Recall F1-Score Muestra Normal 0.75 0.74 0.74 234 Neumonía 0.84 0.86 0.85 390 Cuadro 5.6: Tabla de resultados de la evaluación del modelo 3 41 Figura 5.10: Matriz de confusión del modelo propio 3 5.3.2. Modelos CNN predefinidos Con la intención de conseguir una exactitud más alta, vamos a hacer uso de los modelos ya preentrenados. Estos modelos a diferencia de los modelos propios, importan los pesos que han sido entrenados en otro problema de clasificación, en vez de iniciarlos aleatoriamente. Los modelos preentrenados nos permiten conseguir predicciones más precisas a la vez que conseguimos reducir nuestro tiempo de ejecución de entrenamiento. Un problema de estos modelos preentrenados es que debemos adaptarlo a nuestro conjunto de datos, para ello normalmente se definen y se sustituyen las últimas capas por nuevas capas apropiadas con el fin de ajustar el modelo a nuestro problema de clasificación binaria con imágenes de neumonía. Dependiendo del modelo que se use, usaremos unas capas finales u otras, esas capas se especificarán en cada modelo que definiremos en este apartado. Como se ha mencionado en el capítulo 4, usaremos los modelos predefinidos VGG, ResNet, MobileNet e Inception. 42 VGG-16 Haciendo uso de la librería keras podemos importar las capas de VGG-16 y sus pesos entrenados con el dataset ImageNet. Sin embargo, si queremos adaptarlo a nuestro caso en específico, debemos excluir las últimas capas que están típicamente diseñadas para clasificar imágenes de la categoría del conjunto de datos original (las 1000 categorías de ImageNet). Necesitaremos adaptar la salida con capas adicionales totalmente conectadas que sea capaz de aprender relaciones complejas entre las características y poner la salida con una sola neurona para la clasificación binaria. La estructura final del modelo VGG-16 queda representada en la siguiente imagen: Figura 5.11: Estructura modelo VGG-16 Hemos adaptado las últimas capas con dos capas totalmente conectadas de 512 neuronas seguidas de capas Dropout para evitar posibles sobreajuste en el modelo, terminando con una capa de salida para una clasificación binaria. El resultado obtenido por este primer modelo predefinido ha sido de un accuracy de 90.54 %, una precisión de 94.12 % y un recall de 91.26 % para casos de neumonía. También obtenemos un AUC con valor de 0.97. Observamos que con este modelo es capaz de distinguir las dos clases muy bien, con un pequeña diferencia de mejora para casos positivos. Precisión Recall F1-Score Muestra Normal 0.85 0.90 0.88 234 Neumonía 0.94 0.91 0.92 390 Cuadro 5.7: Tabla de resultados de la evaluación de VGG-16 43 Figura 5.12: Matriz de confusión del modelo VGG-16 ResNet-50 Figura 5.13: Estructura modelo ResNet-50 ResNet50, al tener más número de capas, el número de parámetros a calcular en com- paración con el modelo anterior aumenta consideradamente. Tras varias pruebas, las capas finales adaptadas son las mismas que las utilizadas para el modelo VGG-16. Con el uso de esta arquitectura, obtenemos una exactitud en la predicción del 91.51 %, el mejor resultado obtenido hasta el momento. Con una precisión de 94.23 %, recall de 92.05 % y un AUC del 0.97. Por lo que quiere decir que nuestro modelo es capaz de clasificar con un alto porcentaje los casos con neumonía del conjunto de test. Para los casos negativos también es capaz de predecir correctamente un 90 % de los datos con una precisión del 88 %, un poco inferior a los casos positivos. 44 Precisión Recall F1-Score Muestra Normal 0.88 0.90 0.89 234 Neumonía 0.94 0.92 0.93 390 Cuadro 5.8: Tabla de resultados de la evaluación de ResNet-50 Figura 5.14: Matriz de confusión del modelo ResNet-50 MobileNet Como tercer modelo preentrenado, usaremos una capa GlobalAveragePooling2D para reducir la dimensionalidad y añadimos una capa de salida totalmente conectada de una neurona. Se ha probado con diferentes capas finales totalmente conectadas pero todas ellas daban resultado a un sobreasjuste. Figura 5.15: Estructura modelo MobileNet Los resultados obtenidos por el modelo MobileNet han sido de una exactitud en la predicción de 95.03 % con un AUC de 0.98. Demuestra un rendimiento alto del modelo que 45 es capaz de distinguir bien entre diferentes clases. Tratando con clases negativas (normal) es capaz de clasificar correctamente un 93 % con una precisión de 0.94 y para la clase positiva(neumonía) un 96 % con una precisión de 0.94. Precisión Recall F1-Score Muestra Normal 0.94 0.93 0.93 234 Neumonía 0.96 0.96 0.96 390 Cuadro 5.9: Tabla de resultados de la evaluación de MobileNet Figura 5.16: Matriz de confusión del modelo MobileNet Estas métricas dejan a este modelo en primer lugar hasta el momento. InceptionV3 Figura 5.17: Estructura modelo InceptionV3 Las últimas capas que se han añadido han sido mucho más simples que los modelos anteriores, gracias a la gran cantidad de capas predefinidas que posee el modelo. Teniendo 46 solamente una capa de GlobalAveragePooling2D y una capa de salida con una neurona para la clasificación binaria. InceptionV3 consigue una exactitud en las predicciones de un 93 % y un AUC con valor de 0.98. Vamos a ver como de bien clasifica en las dos clases en la siguiente tabla: Precisión Recall F1-Score Muestra Normal 0.91 0.89 0.90 234 Neumonía 0.94 0.95 0.94 390 Cuadro 5.10: Tabla de resultados de la evaluación de InceptionV3 Figura 5.18: Matriz de confusión del modelo InceptionV3 Observamos que es capaz de clasificar ambas clases con una tasa muy alta, para clases positivas tiene un acierto del 95 % con una precisión del 94 % y para la clase negativa un acierto de 89 % con una precisión del 91 %. Como todos los modelos, clasifica mejor las clases positivas. 47 5.4. Elección de modelo Vistos ya todos los modelos implementados para este problema, tenemos que seleccionar el mejor que satisfaga nuestras necesidades para este problema de clasificación binaria de imágenes de neumonía. Nos basaremos en los siguientes factores: 1. Rendimiento. El factor más crítico es la capacidad de una correcta predicción del modelo a la hora de clasificar las imágenes, especialmente las radiografías de tórax que presentan síntomas de neumonía. Una alta exactitud en contexto médico es crucial para identificar correctamente los casos positivos, para un diagnóstico temprano y un tratamiento adecuado. 2. Recursos computacionales. Otro factor que influye es la complejidad de los modelos. En muchos casos es mucho más eficiente elegir un modelo que requiere menos coste computacional aunque esta sea ligeramente menos preciso en los resultados. Podría llegar a ser una mejor elección para aplicaciones en tiempo real o cuando los recursos son limitados. 3. Tiempo de entrenamiento e inferencia. Es un factor que está altamente correlacionada con la de recursos computacionales. Quizás un modelo que requiera un alto tiempo de entrenamiento y de inferencia no sea aplicable en entornos reales que requiere que el modelo actúe de forma rápida y eficiente. A la hora de la elección del modelo, requiere equilibrar cuidadosamente todos los factores y hacer una consideración de forma conjunta para poder tomar una decisión informada sobre qué modelo de RNC es el más adecuado para la aplicación de nuestro problema. Rendimiento En la tabla 5.11 se comparan los modelos de acuerdo a los resultados obtenidos con el conjunto de prueba. 48 Exactitud % Sensibilidad % Especificidad % AUC Modelo 1 76 73 78 0.84 Modelo 2 79 54 95 0.88 Modelo 3 81 74 86 0.89 VGG-16 91 90 91 0.97 ResNet-50 92 90 92 0.97 MobileNet 95 93 96 0.98 Inception 93 89 95 0.98 Cuadro 5.11: Tabla de métricas de evaluación de cada modelo. Los modelos MobileNet e Inception son los modelos que representan un mayor Accuracy en comparación de otros, con un valor de 95 % y 93 % respectivamente. Ambas son capaces de clasificar y distinguir muy bien las dos clases presentes, con un valor de 0.98 de AUC ambos modelos. En términos de rendimiento de modelos, el modelo MobileNet sale ganador como mejor modelo. Tiempo de entrenamiento e inferencia En la gráfica 5.19 hemos capturado el tiempo de ejecución de entrenamiento de los modelos para comparar cuál es el modelo que más tiempo requiere y hacer un estudio sobre ellas. Figura 5.19: Gráfica del tiempo de ejecución de los modelos 49 El tiempo de inferencia para predecir el conjunto de prueba en todos los modelos son muy escasos, y no difiere mucho tiempo entre unos modelos a otros. A grandes rasgos observamos que los modelos propios tienden a necesitar más tiempo de entrenamiento para conseguir resultados óptimos, ya que requieren calcular los pesos desde el inicio mientras que los modelos preentrenados pueden importar dichos pesos y adaptarlos al problema. Vemos que los modelos que menos tiempo han requerido para su entrenamiento han sido los modelos MobileNet y ResNet. Con una media de solamente 16 minutos para entrenarse. Siendo el modelo que menos tarda ResNet-50 con una ventaja de 2 minutos en respecto a MobileNet. Cabe destacar que el tiempo varía en gran medida según el hardware que tengamos y los hiperparámetros asignados a los modelos. Complejidad de los modelos Por último, para controlar los recursos computacionales que requiere cada uno de los modelos, nos basaremos en dos consideraciones, el número de capas totales del modelo y el número de parámetros a ser calculados. Figura 5.20: Gráficas del nº de parámetros y el nº de capas de los modelos Como puede verse, el modelo “propio 1” es el que menos capas y parámetros tiene debido a su sencillez en su arquitectura. El modelo MobileNet, a pesar de tener un número de capas 50 alto, el número de parámetros a ser calculados resulta ser de solamente de 3.3 millones, siendo el segundo modelo con menos parámetros. Esto puede deberse que su arquitectura consiste en mucho nº de capas pero con pocos cálculos por capas. En el factor de complejidad nos quedaremos también con el modelo MobileNet. En conclusión, el modelo MobileNet es el modelo con el mejor rendimiento. Aunque tenga un número bajo de parámetros a ser calculados y no requiere mucho tiempo de entre- namiento, gracias a su transferencia de aprendizaje puede adaptarse eficientemente a nuestro conjunto de datos. Esto hace que sea la mejor opción de todas las implementadas cuando se busca un equilibrio entre rendimiento, complejidad y tiempo. 5.5. Predicción e Interpretabilidad del mejor modelo El mejor modelo seleccionado ha sido el modelo preentrenado MobileNet, vamos a utili- zarlo para realizar predicciones sobre un conjunto de datos test que no habían sido vistos ni en la fase entrenamiento ni validación. Debido a que nuestros modelos de redes neurona- les actúan como una caja negra (no podemos conocer su funcionamiento interno), es muy importante comprender cómo el modelo hace las predicciones mediante un estudio de la interpretabilidad, en concreto utilizando el valor SHapley Additive exPlanations (SHAP)33. La predicción del modelo sobre un conjunto de datos de prueba de 624 muestras es capaz de clasificar bien 593 casos, fallando solamente en 31 imágenes. En un entorno clínico es importante que los médicos conozcan en qué características de la imagen se basa el modelo para la toma de decisiones. Deben ser capaces de poder confiar en las predicciones del modelo, es esencial desde un punto ético cuando se trabaja con datos clínicos que podrían determinar a cierta manera la vida de las personas. Haciendo uso de SHAP, generaremos mapas de importancia para cada imagen test de entrada, y de esta manera podremos resaltar aquellos píxeles de la imagen de pulmones que fueron particularmente influyentes para la toma de decisiones del modelo. Se mostrará 51 en la imagen valores SHAP en un intervalo de negativos hasta positivos, donde cada uno contribuye a disminuir o aumentar la probabilidad de que la imagen pertenezca a una clase específica. Predicción En la figura 5.21 vemos unas muestras de las imágenes que han sido clasificadas de manera correcta. Observamos de primera vista que las imágenes con la predicción 0 (sano) tienden a tener un color negro o gris oscuro en la zona pulmonar, ya que están llenas de aire y son radiotransparentes. Mientras que las imágenes con la predicción 1 (neumonía) son de un color más blanco o gris claro, representando al líquido o pus presente en los pulmones. Figura 5.21: Predicciones correctas sobre el conjunto de prueba. Por otro lado, en la figura 5.22, en las imágenes mal clasificadas podemos observar que existen muchas imágenes que se ve completamente sanos. Esto puede deberse a que haya otros factores en la radiografía que sean muy poco comunes que afecte al diagnóstico de 52 la neumonía y que el modelo no ha sido capaz de entrenarse para esa característica, o simplemente puede deberse a un mal etiquetado de las imágenes test. Figura 5.22: Predicciones incorrectas sobre el conjunto de prueba. Interpretabilidad Una vez hecha las predicciones, vamos a crear el mapa de importancia sobre las imágenes predichas para observar cuáles son los que píxeles que toman especial importancia a la hora de la toma de decisiones. La figura 5.23 es una predicción correcta hecha sobre una radiografía sin neumonía. Observamos que el modelo se centra especialmente en las zonas del pulmón donde hay una mayor opacidad o un cambio de contraste brusco en la imagen. 53 Figura 5.23: Mapa de importancia de una imagen sin neumonía bien clasificada. Al igual que el ejemplo anterior, en la figura 5.24 donde el modelo falla en la predicción de una imagen sin neumonía vemos que el modelo observa en las características y cree que no existe una opacidad relevante. Figura 5.24: Mapa de importancia de una imagen sin neumonía mal clasificada. Estas son solamente conclusiones sacadas a primera vista por una persona que no tiene conocimiento sobre las radiografías de la neumonía, para una correcta interpretación de estos valores en el contexto clínico es preferible y recomendable que lo haga un personal profesional en el sector del diagnóstico. Conclusión y líneas del futuro 6.1. Conclusión En este TFM hemos conseguido aplicar los conocimientos adquiridos en el Máster de Minería de Datos e Inteligencia de Negocios para abordar un problema de clasificación de imágenes de radiográficas de tórax para el diagnóstico de la neumonía. Los resultados obtenidos han demostrado cómo la inteligencia artificial puede llegar a causar un impacto muy positivo en el sector de la medicina y de la salud. Hemos empleado diferentes modelos de ML y hemos podido observar cómo estos pueden ayudar al personal médico a mejorar la eficiencia en sus diagnósticos, permitiendo tratamientos más tempranos que puedan llegar a salvar vidas. Durante la elaboración de este TFM hemos tratado con datos fuente, en este caso imá- genes, y se ha confirmado que son fuentes de datos confiables y relevantes para el problema de la clasificación de neumonía. Un análisis exploratorio para asegurar el estado y conocer las características de las imágenes es importante. Preprocesar las imágenes es también un paso fundamental en el trabajo, ayudamos a mejorar la calidad de los datos de entrada antes de usarlos en el modelo, garantizando que nuestro modelo sea más robusto y más óptimo. En la construcción de los modelos de clasificación se utilizaron principalmente dos enfoques, modelos de RNC personalizados y predefinidos. Para cada modelo se han ajustado los hi- perparámetros con el fin de optimizar su rendimiento. Se ha evaluado su eficiencia mediante diferentes métricas de clasificación y otros factores como el tiempo y la complejidad con el 54 55 objetivo de escoger el modelo más prometedor. Finalmente se ha seleccionado el mejor mo- delo para predecir sobre datos de prueba a fin de comprender en que áreas de las imágenes se ha basado el modelo para su toma de decisión final. En conclusión, este TFM ha pretendido ofrecer una visión más clara de cómo las RNC pueden llegar a actuar como herramientas auxiliares para la detección temprana de la neu- monía, y en general, en el campo de la medicina. Cabe destacar que estas herramientas tienen como objetivo el ofrecer apoyo a los médicos para mejorar la eficiencia y la precisión a la hora emitir su diagnóstico, mas nunca con la intención de sustituirlos. 6.2. Líneas de futuro Este TFM se ha visto restringido en cuanto a su alcance debido a diferentes limitaciones, especialmente a los recursos disponibles y al tiempo de elaboración. Una de las posibles ampliaciones y mejoras del trabajo podría ser la utilización de un conjunto de datos más amplio con pacientes más diversos de otros rangos etarios y caracte- rísticas. Se podrían incluir radiografías de pacientes de diferentes edades, sexos y condiciones de salud con el objetivo de que nuestro modelo fuera más robusto y se adaptara a todo tipo de pacientes. Por otro lado, también podríamos recopilar otros conjuntos de datos de otras enfermedades pulmonares y realizar clasificaciones multiclase a fin de identificar cada tipo de enfermedad. También nos hemos visto limitados al no haber podido validar nuestros resultados por profesionales médicos. A pesar de que disponemos en la sección de interpretabilidad el mapa de importancia de las imágenes, no conocemos con total seguridad de que esas áreas pulmonares marquen la diferencia entre un pulmón sano o con neumonía. Contar con la ayuda de un experto en diagnóstico nos ayudaría a completar nuestros conocimientos sobre el funcionamiento del modelo, y de esta forma podemos mejorarlo según los consejos aportados por los personales médicos. 56 Otra aproximación que podría alcanzar un mejor resultado podría ser en la construcción de diferentes y múltiples arquitecturas de RNC a través del ensamblado de modelos, de manera que se consiguieran resultados más generalizables y con mayor robustez. Además, también podríamos probar con otros tipos de capas e hiperparámetros, a fin de averiguar las combinaciones más óptimas en las nuevas arquitecturas de las redes neuronales. Bibliografía [1] OMS. Neumonía infantil, 2022. [2] Medline Plus. Neumonía, 2022. [3] lung National Heart and Blood Institute. Pneumonia diagnosis, 2022. [4] Bernadeta Dadonaite and Max Roser. Pneumonia, 2019. [5] Zhi-Hua Zhou. Machine learning. Springer Nature, 2021. [6] Arwinder Dhillon and Ashima Singh. Machine learning in healthcare data analysis: a survey. Journal of Biology and Today’s World, 8(6):1–10, 2019. [7] IBM. Inteligencia artificial en la medicina, 2019. [8] Arunim Garg and Vijay Mago. Role of machine learning in medical research: A survey. Computer science review, 40:100370, 2021. [9] Su-Hyun Han, Ko Woon Kim, SangYun Kim, and Young Chul Youn. Artificial neu- ral network: understanding the basic concepts without mathematics. Dementia and neurocognitive disorders, 17(3):83–89, 2018. [10] Temi Babs. The mathematics of neural networks, 2018. [11] Vidushi Meel. Artificial neural network: Everything you need to know, 2020. [12] Keep Coding. Optimización de hiperparámetros en deep learning, 2022. 57 58 [13] Simplilearn. What is epoch in machine learning?w, 2023. [14] Jiuxiang Gu, Zhenhua Wang, Jason Kuen, Lianyang Ma, Amir Shahroudy, Bing Shuai, Ting Liu, Xingxing Wang, Gang Wang, Jianfei Cai, et al. Recent advances in convolu- tional neural networks. Pattern recognition, 77:354–377, 2018. [15] Rubén Rodríguez Abril. Redes convolucionales, 2019. [16] Jason Brownlee. How to choose an activation function for deep learning, 2021. [17] Raz Lapid and Moshe Sipper. Evolution of activation functions for deep learning- based image classification. In Proceedings of the Genetic and Evolutionary Computation Conference Companion, pages 2113–2121, 2022. [18] Frogames. La guía definitiva de las redes neuronales convolucionales, 2020. [19] Karen Simonyan and Andrew Zisserman. Very deep convolutional networks for large- scale image recognition. arXiv preprint arXiv:1409.1556, 2014. [20] Suvaditya Mukherjee. The annotated resnet-50, 2022. [21] Guía avanzada de Inception. v3 para cloud tpu| cloud tpu.(sf). Google Cloud. Recupe- rado, 24. [22] Muhammad Mujahid, Furqan Rustam, Roberto Álvarez, Juan Luis Vidal Mazón, Isabel de la Torre Díez, and Imran Ashraf. Pneumonia classification from x-ray images with inception-v3 and convolutional neural network. Diagnostics, 12(5):1280, 2022. [23] James A Hanley and Barbara J McNeil. The meaning and use of the area under a receiver operating characteristic (roc) curve. Radiology, 143(1):29–36, 1982. [24] Kuntal Kumar Pal and KS Sudeep. Preprocessing for image classification by convolu- tional neural networks. In 2016 IEEE International Conference on Recent Trends in 59 Electronics, Information & Communication Technology (RTEICT), pages 1778–1781. IEEE, 2016. [25] Yun Xu and Royston Goodacre. On splitting training and validation set: a compa- rative study of cross-validation, bootstrap and systematic sampling for estimating the generalization performance of supervised learning. Journal of analysis and testing, 2(3):249–262, 2018. [26] Maryam Pardakhti, Nila Mandal, Anson WK Ma, and Qian Yang. Practical active lear- ning with model selection for small data. In 2021 20th IEEE International Conference on Machine Learning and Applications (ICMLA), pages 1647–1653. IEEE, 2021. [27] Chunguang Bao. Image classification under class-imbalanced situation. Highlights in Science, Engineering and Technology, 39:465–474, 2023. [28] TensorFlow. Classification on imbalanced data, 2023. [29] Mohamed Elgendi, Muhammad Umer Nasir, Qunfeng Tang, David Smith, John-Paul Grenier, Catherine Batte, Bradley Spieler, William Donald Leslie, Carlo Menon, Ri- chard Ribbon Fletcher, et al. The effectiveness of image augmentation in deep learning networks for detecting covid-19: A geometric transformation perspective. Frontiers in Medicine, 8:629134, 2021. [30] Noor Baha Aldin and Shaima Safa Aldin Baha Aldin. Accuracy comparison of different batch size for a supervised machine learning task with image classification. In 2022 9th International Conference on Electrical and Electronics Engineering (ICEEE), pages 316–319, 2022. [31] Ibrahem Kandel and Mauro Castelli. The effect of batch size on the generalizability of the convolutional neural networks on a histopathology dataset. ICT express, 6(4):312– 315, 2020. 60 [32] Nikhil Ketkar and Nikhil Ketkar. Introduction to keras. Deep learning with python: a hands-on introduction, pages 97–111, 2017. [33] Christoph Molnar. Interpretable machine learning. Lulu. com, 2020. Anexos A.1. Códigos en lenguaje Python de la implementa- ción A.1.1. Librerías utilizadas import tensorflow as tf import os import cv2 import imghdr import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns from matplotlib import rcParams # Librerias para implementar el modelo de deep learning from tensorflow.keras.models import Sequential from tensorflow.keras. layers import Conv2D, MaxPooling2D, Dense,Flatten, Dropout, BatchNormalization, MaxPool2D, GlobalAveragePooling2D from tensorflow.keras import regularizers, Model from tensorflow.keras.optimizers import Adam, Adamax,RMSprop from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve from keras.utils . vis_utils import plot_model A.1.2. Preprocesamiento de imágenes # Aumento de datos y normalizacion train_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1./255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, 61 62 zoom_range=0.2 ) # Redimensionamiento, batch, mezcla de datos y modo binario train_generator_oversampling = train_datagen.flow_from_directory( train_dir_oversampling, target_size = (300,300), batch_size = 64 , shuffle= True, class_mode = ’binary’ ) # Tratamiento del conjunto de validacion val_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale = 1/255) validation_generator = val_datagen.flow_from_directory( val_dir, target_size = (300,300), batch_size = 64 , class_mode = ’binary’, shuffle= True ) # Tratamiento del conjunto de test test_generator = val_datagen.flow_from_directory( test_dir, target_size = (300,300), batch_size = 1 , class_mode = ’binary’, shuffle=False ) # Correccion de pesos debido a la clase desbalanceada count_normal_oversampled = len(os.listdir(os.path.join(train_dir_oversampling, ’NORMAL’))) count_pneumonia_oversampled = len(os.listdir(os.path.join(train_dir_oversampling, ’PNEUMONIA’))) weight_for_0_oversampled = (1 / count_normal_oversampled)∗(5269)/2.0 weight_for_1_oversampled = (1 / count_pneumonia_oversampled)∗(5269)/2.0 class_weight_oversampled = {0: weight_for_0_oversampled, 1: weight_for_0_oversampled} print(’Peso␣para␣la␣clase␣0:{:.2 f}’ .format(weight_for_0_oversampled)) print(’Peso␣para␣la␣clase␣1:␣{:.2 f}’ .format(weight_for_1_oversampled)) A.1.3. Diseño de arquitecturas neuronales para modelos propios # Implementacion de capas para modelo 1 modelo_propio1= Sequential() modelo_propio1.add(Conv2D(filters=16, kernel_size = (3,3), activation=tf.nn.relu , input_shape=(300,300,3) )) modelo_propio1.add(MaxPooling2D()) modelo_propio1.add(Flatten()) modelo_propio1.add(Dense(1, activation=’sigmoid’)) 63 # Compilacion con los diferentes hiperparametros modelo_propio1.compile( tf .keras.optimizers.Adam(learning_rate=0.001), loss=tf. losses .BinaryCrossentropy(), metrics=[’accuracy’, tf .keras.metrics.Precision(name=’precision’),tf .keras.metrics.Recall(name=’recall’)]) # Implementacion de capas para modelo 2 (representado como modelo 3 en el trabajo) modelo_propio2 = Sequential() modelo_propio2.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(300, 300, 3), activation=’relu’)) modelo_propio2.add(Conv2D(filters=32, kernel_size=(3, 3), activation=’relu’)) modelo_propio2.add(MaxPooling2D(pool_size=(2, 2))) modelo_propio2.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’)) modelo_propio2.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’)) modelo_propio2.add(MaxPooling2D(pool_size=(2, 2))) modelo_propio2.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’)) modelo_propio2.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’)) modelo_propio2.add(MaxPooling2D(pool_size=(2, 2))) modelo_propio2.add(Flatten()) modelo_propio2.add(Dense(128, activation=’relu’)) modelo_propio2.add(Dropout(0.2)) modelo_propio2.add(Dense(1, activation=’sigmoid’)) # Compilacion con los diferentes hiperparametros modelo_propio2.compile(loss=tf.losses.BinaryCrossentropy(), optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001), metrics=[’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) # Implementacion de capas para modelo 3 (representado como modelo 2 en el trabajo) modelo_propio3 = Sequential() modelo_propio3.add(Conv2D(filters=16, kernel_size=(5, 5), input_shape=(300, 300, 3), activation=’relu’)) modelo_propio3.add(MaxPooling2D(pool_size=(3, 3))) modelo_propio3.add(Conv2D(filters=32, kernel_size=(5, 5), activation=’relu’)) modelo_propio3.add(Flatten()) modelo_propio3.add(Dropout(0.2)) modelo_propio3.add(Dense(256, activation=’relu’)) modelo_propio3.add(Dense(1, activation=’sigmoid’)) # Compilacion con los diferentes hiperparametros modelo_propio3.compile(loss=tf.losses.BinaryCrossentropy(), optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), metrics=[’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) 64 A.1.4. Diseño de arquitecturas neuronales para modelos preen- trenados # Modelo InceptionV3, quitamos las ultimas capas con include_top = false y le especificamos la dimension de entrada inceptionv3_modelo_imagenet_base = tf.keras.applications.InceptionV3(weights=’imagenet’, include_top=False, input_shape=(300,300,3)) for layers in inceptionv3_modelo_imagenet_base.layers[:200]: layers . trainable = False # Adaptamos las capas personalizadas inceptionv3_modelo_imagenet = tf.keras.Sequential([ inceptionv3_modelo_imagenet_base, tf .keras. layers .GlobalAveragePooling2D(), tf .keras. layers .Dense(1,activation=tf.nn.sigmoid) ]) # Compilacion inceptionv3_modelo_imagenet.compile( loss=’binary_crossentropy’, optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001), metrics= [’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) # Modelo Resnet 50 resnet50_modelo_base = tf.keras.applications.ResNet50V2(weights=’imagenet’, include_top=False, input_shape=(300,300,3)) resnet50_modelo_base.trainable = False resnet50_modelo = tf.keras.Sequential([ resnet50_modelo_base, tf .keras. layers .Flatten(), tf .keras. layers .Dense(512, activation=tf.nn.relu ), tf .keras. layers .Dropout(0.2), tf .keras. layers .Dense(512, activation=tf.nn.relu ), tf .keras. layers .Dropout(0.2), tf .keras. layers .Dense(1, activation=tf.nn.sigmoid), ]) resnet50_modelo.compile( loss=’binary_crossentropy’, optimizer= tf.keras.optimizers.Adam(learning_rate=0.001), metrics= [’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) # Modelo VGG 16 vgg16_base = tf.keras.applications.VGG16(weights=’imagenet’, include_top=False, input_shape=(300,300,3)) 65 vgg16_base.trainable = False vgg16_modelo = tf.keras.Sequential([ vgg16_base, tf .keras. layers .Flatten(), tf .keras. layers .Dense(512, activation=tf.nn.relu ), tf .keras. layers .Dropout(0.2), tf .keras. layers .Dense(512, activation=tf.nn.relu ), tf .keras. layers .Dropout(0.2), tf .keras. layers .Dense(1,activation=tf.nn.sigmoid) ]) vgg16_modelo.compile( loss=’binary_crossentropy’, optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), metrics= [’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) #Modelo MobileNet base_model_mobil = tf.keras.applications.MobileNet(weights=’imagenet’, include_top=False, input_shape=(300, 300, 3)) mobilenet_modelo = tf.keras.Sequential([ base_model_mobil, tf .keras. layers .GlobalAveragePooling2D(), tf .keras. layers .Dense(1,activation=tf.nn.sigmoid) ]) mobilenet_modelo.compile( loss=’binary_crossentropy’, optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), metrics= [’accuracy’, tf .keras.metrics.Precision(name=’precision’), tf .keras.metrics.Recall(name=’recall’)]) early_stopping = tf.keras. callbacks .EarlyStopping(monitor =’val_loss’, patience=7, mode = ’min’,restore_best_weights=True) A.1.5. Entrenamiento de modelos modelo_propio1_trained = modelo_propio1.fit( train_generator_oversampling, steps_per_epoch = 32, epochs=20, validation_data=validation_generator, callbacks=[early_stopping], class_weight=class_weight_oversampled, verbose=1 66 ) modelo_propio2_trained = modelo_propio2.fit( train_generator_oversampling, steps_per_epoch = 32, epochs=20, validation_data=validation_generator, class_weight=class_weight_oversampled, callbacks=[early_stopping] ) modelo_propio3_trained = modelo_propio3.fit( train_generator_oversampling, steps_per_epoch = 32, epochs=20, validation_data=validation_generator, class_weight=class_weight_oversampled, callbacks=[early_stopping] ) inceptionv3_modelo_imagenet_trained2 = inceptionv3_modelo_imagenet.fit( train_generator_oversampling, epochs=35, steps_per_epoch= 10, validation_data=validation_generator, class_weight= class_weight_oversampled, callbacks=[early_stopping]) resnet50_modelo_trained2 = resnet50_modelo.fit( train_generator_oversampling, steps_per_epoch=10, epochs=20, validation_data=validation_generator, class_weight= class_weight_oversampled, callbacks=[early_stopping]) vgg16_modelo_trained2 = vgg16_modelo.fit( train_generator_oversampling, steps_per_epoch=10, epochs=20, validation_data=validation_generator, class_weight=class_weight_oversampled, callbacks=[early_stopping]) model_mobil_trained = mobilenet_modelo.fit( train_generator_oversampling, steps_per_epoch = 10, epochs=20, validation_data=validation_generator, callbacks=[early_stopping], 67 class_weight=class_weight_oversampled, verbose=1 ) A.1.6. Evaluación de modelos # La grafica con metricas del rendimiento con el conjunto de train y val # Cambiar modelo_propio1_trained al modelo correspondiente para mostrar el de cada modelo figure , axis = plt.subplots(2, 2, figsize =(20,10)) axis = axis. ravel () for i ,element in enumerate([’accuracy’, ’loss’, ’ precision ’ , ’ recall ’ ]): axis [ i ]. plot(modelo_propio1_trained.history[element]) axis [ i ]. plot(modelo_propio1_trained.history[’val_’ + element]) axis [ i ]. set_title ( ’Model␣{}’.format(element)) axis [ i ]. set_xlabel(’epochs’) axis [ i ]. set_ylabel(element) axis [ i ]. legend([ ’ train ’ , ’ val ’ ]) # Evaluacion del modelo # Cambiar al modelo correspondiente para obtener resultados de cada modelo (este caso de modelo_propio1) evaluation_modelo_propio1 = modelo_propio1.evaluate(test_generator, steps= 624) print(f"Test␣acc:␣{evaluation_modelo_propio1[1]∗100:.2f}%") print(f"Test␣precision :␣{evaluation_modelo_propio1[2]∗100:.2f}%") print(f"Test␣recall :␣{evaluation_modelo_propio1[3]∗100:.2f}%") # Prediccion sobre el modelo prediction_modelo1 = modelo_propio1.predict(test_generator) # Grafica con el crossover para seleccionar el umbral mas optimo de y_true = (test_generator.classes ).astype("int") fpr , tpr, thresholds = roc_curve(y_true, prediction_modelo1) plt .plot(thresholds , 1.−fpr) plt .plot(thresholds , tpr) plt .show() crossover_index = np.min(np.where(1.−fpr <= tpr)) crossover_cutoff = thresholds[crossover_index] crossover_specificity = 1.−fpr[crossover_index] print("Crossover␣al␣{0:.2f}␣con␣especificidad␣{1:.2 f}".format(crossover_cutoff, crossover_specificity )) # Curva ROC y valor de AUC plt .plot(fpr , tpr) plt .show() print("El␣area␣bajo␣la␣curva␣ROC␣es␣igual␣a␣{0:.2f}".format(roc_auc_score(y_true, prediction_modelo1))) # Matriz de confusion eleccionando el umbral prediction_modelo1_2 = np.where(prediction_modelo1 < 0.16, np.round(prediction_modelo1) , np.round(prediction_modelo1+0.35) ) confunsion_matriz = confusion_matrix(test_generator.classes, prediction_modelo1_2) confunsion_matriz 68 # Grafica para la matriz plt . figure ( figsize =(10, 7)) sns.set(font_scale=1.2) sns.heatmap(confunsion_matriz, annot=True, fmt=’g’, cmap=’Blues’, cbar=False, annot_kws={"size": 14}) plt . title ( ’Matriz␣de␣Confusion’, fontsize=20) plt . xlabel( ’Clase␣Predicha’, fontsize=16) plt . ylabel( ’Clase␣Verdadera’, fontsize=16) plt .show() # Diferentes metricas para cada una de las clases from sklearn.metrics import classification_report print( classification_report (test_generator. classes , prediction_propio_cross_medio)) A.1.7. Intepretabilidad de modelos # Importamos libreria e iniciamos la shap import shap shap. initjs () # En que se imagenes se ha basado el modelo para calcular sus pesos num_reference_images = 100 # El numero de imagenes de referencia que deseas utilizar reference_images = [] for i in range((num_reference_images + train_generator_oversampling.batch_size − 1) // train_generator_oversampling.batch_size): images, _ = next(train_generator_oversampling) reference_images.extend(images) if len(reference_images) >= num_reference_images: break reference_images = np.array(reference_images)[:num_reference_images] # Calculamos los valores shap , podemos elegir de que modelo usar explainer = shap.GradientExplainer(mobilenet_modelo, reference_images2) shap_values = explainer.shap_values(reference_images2) # Seleccionar imagen (imagen_for_explanation_2) shap_values = explainer.shap_values(images_for_explanation_2) # Mostrar shap shap.image_plot(shap_values, images_for_explanation_2) MÁSTER EN MINERÍA DE DATOS E INTELIGENCIA DE NEGOCIOS Trabajo de Fin de Máster TÍTULO: Clasificación de imágenes médicas para el diagnóstico de neumonía mediante técnicas de Machine Learning blank612x792 d475ec3310398ffa60168c2183c70d3411308756ef81f14c3c9513dd903fe07d.pdf Resumen blank612x792 d475ec3310398ffa60168c2183c70d3411308756ef81f14c3c9513dd903fe07d.pdf Abstract List of Figures List of Tables Introducción y Motivación Estado del Arte Neumonía Machine Learning en medicina Redes neuronales Redes neuronales convolucionales Descripción de la propuesta Introducción Problemas Solución Metodología y Planificación Arquitectura del sistema Estudio de modelos Métricas para la evaluación Implementación del proyecto Fuente de datos Preprocesamiento de imágenes Nueva partición Desbalance de clases Modificación de las imágenes Modelización y evaluación de modelos Modelos CNN personalizados Modelos CNN predefinidos Elección de modelo Predicción e Interpretabilidad del mejor modelo blank612x792 d475ec3310398ffa60168c2183c70d3411308756ef81f14c3c9513dd903fe07d.pdf Conclusión y líneas del futuro Conclusión Líneas de futuro blank612x792 d475ec3310398ffa60168c2183c70d3411308756ef81f14c3c9513dd903fe07d.pdf Bibliografía Anexos Códigos en lenguaje Python de la implementación Librerías utilizadas Preprocesamiento de imágenes Diseño de arquitecturas neuronales para modelos propios Diseño de arquitecturas neuronales para modelos preentrenados Entrenamiento de modelos Evaluación de modelos Intepretabilidad de modelos