2.26 - Proyecto Final: Predicción del Riesgo de Diabetes con Redes Neuronales

Lección 26 de la sección “Redes Neuronales” del curso Fundamentos de Deep Learning con Python.

Introducción

En la lección anterior vimos varios aspectos prácticos a tener en cuenta en la implementación de Redes Neuronales, y con esto ya tenemos todos los elementos para resolver un problema real de forma práctica usando esta arquitectura.

Así que en esta lección veremos cómo crear y entrenar una Red Neuronal en con ayuda de Python y Keras para predecir la probabilidad de aparición de diabetes en una población determinada.

Contenido exclusivo suscriptores

Suscríbete y accede al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

El problema a resolver

La diabetes es una enfermedad crónica asociada a elevados niveles de azúcar en la sangre.

El problema es que se trata de una enfermedad “silenciosa”, difícil de detectar en etapas tempranas, pues muchas veces es asintomática.

La idea es usar el set de datos de los indígenas Pima, que contiene múltiples variables predictivas asociadas a la diabetes así como la presencia o ausencia de la enfermedad en una muestra de esta población, para entrenar una Red Neuronal capaz de predecir la probabilidad de aparición de diabetes.

El set de datos

Este set fue obtenido de una población de 768 indígenas, todas mujeres y con edades de 21 años en adelante.

Cada dato corresponde a un sujeto y contiene un total de ocho (8) características (features), así como la variable Outcome indicando si el sujeto tiene (1) o no (0) la enfermedad.

Comencemos realizando la lectura del dataset usando la librería Pandas.

Como el set contiene muy pocos datos, al hacer la división convencional entre entrenamiento/prueba/validación, se tendrán muy pocos datos de prueba y validación.

Al final veremos qué alternativa se puede usar para validar correctamente el modelo.

Análisis Exploratorio de los Datos

El primer paso en todo proyecto de Deep Learning es entender los datos. Esto implica, entre otras, entender las distribuciones, el rango de valores que tienen y si hay o no datos faltantes.

Al realizar este análisis vemos por ejemplo que cada variable tiene una escala diferente y que el set está desbalanceado: hay más sujetos sanos (categoría 0) que enfermos (categoría 1), y que además hay algunos datos “sospechosos”: en algunas variables los sujetos presentan valores iguales a 0, ¡lo cual es fisiológicamente imposible!

Manejo de datos faltantes

Los datos “sospechosos” pueden corresponder a lo que se conoce como datos faltantes (bien sea porque no fueron tomados en su momento o porque la muestra no fue procesada correctamente). Acá podemos optar por hacer imputación o eliminación usando la librería Pandas.

Pre-procesamiento: estandarización de los datos

Usaremos el módulo preprocessing y específicamente la función scale de la librería Scikit-Learn para pre-procesar los datos.

Sets de entrenamiento, prueba y validación

Haremos una partición de 80-10-10% usando repetidas veces el módulo train_test_split de Scikit-Learn.

Modelos base, entrenamiento y prueba

Al no tener un referente crearemos dos modelos de diferente complejidad:

Con esto tendremos una idea de qué tan buenos son y luego podremos refinarlos.

Para ello usaremos un enfoque similar al visto en la práctica 6 (donde implementamos una Red Neuronal con Keras).

El problema de este entrenamiento, prueba y validación es que el set está desbalanceado y hay muy pocos datos.

Para entrenamiento y prueba se tienen prácticamente las mismas proporciones, pero en la validación son diferentes (hay más enfermos que en los casos anteriores). Esto afecta la validación final con cada modelo, lo cual implica que el desempeño del modelo no dependerá del modelo mismo, sino más bien de los datos con los que está siendo entrenado (que son muy pocos).

¿Qué alternativa existe para una validación más robusta?

Cross-validation

Cuando se tienen pocos datos de entrenamiento se sugiere NO dividirlos en entrenamiento-prueba-validación (usualmente 80-10-10), pues de hacerlo los sets de prueba y validación no serán una muestra representativa.

Con k-fold cross-validation se evita este sesgo y se tiene una validación más robusta.

Al final del entrenamiento se calcula el promedio y la desviación de las métricas de desempeño (accuracy) para los k entrenamientos, y se escoge el modelo con el mejor desempeño promedio.

Finalmente se entrena este modelo escogido con la totalidad del set de datos.

Al hacer esto vemos que el modelo 1 es ligeramente mejor que el modelo 2 (mayor promedio de exactitud y menor varianza).

Finalmente, el modelo definitivo se entrena con la totalidad del dataset y puede ser almacenado en un archivo para posteriores predicciones.

Contenido exclusivo suscriptores

Recuerda suscribirte para acceder al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusiones

Perfecto, acabamos de poner en práctica varios de los conceptos desarrollados en esta sección para la implementación de un modelo que responde a un problema real. Con esto hemos podido no sólo reforzar las herramientas aprendidas previamente sobre la implementación de modelos usando Python y la librería Keras, sino también nos enfrentamos a diferentes fases de toma de decisiones que se deben tomar en un proyecto real de Deep Learning.

Así que con esto concluimos esta sección del curso en donde aprendimos todo lo relacionado con las Redes Neuronales, con lo cual estamos listos para comenzar la tercera sección, en donde hablaremos de las Redes Convolucionales, una de las arquitecturas más usadas actualmente para el procesamiento de imágenes y para tareas de visión artificial.

En particular en la próxima lección veremos una introducción a esta arquitectura, y hablaremos específicamente del sistema de visión humano y su relación con las Redes Convolucionales.

Ver todas las lecciones de este curso