top of page

APLICANDO ANALÍTICA AVANZADA POR PRIMERA VEZ

  • fjroar
  • 9 mar
  • 6 Min. de lectura

Una de las últimas clases que tuve, tras impartir la clase de Modelos de Ensemble en el Master de Data Science y analítica avanzada de la UIC https://www.uic.es/es/estudis-uic/ade/master-en-data-science-y-analitica-avanzada fue una apuesta arriesgada porque prácticamente la improvisé toda y la dimos entre los alumnos que asistieron y yo que hice lo que me dijeron.


Básicamente ese día llegué con un dataset de Kaggle que era el siguiente: https://www.kaggle.com/datasets/hopesb/student-depression-dataset?resource=download y que tenía las siguientes características que me interesaban para considerarlo como instructivo:

 

  • Tiene un tamaño considerable de algo más de 27.000 registros en total

  • Los nombres de las variables resultan autoexplicativas y están además explicadas en el enlace aquí dado

  • Las anteriores variables, aunque bastante limpias, tenían algunos problemillas que comentaremos

  • Existe una variable target denominada Depression ya montada

 

Pues bien, como describiré a continuación llegamos a sacar cosas como estas:


Así pues, tras unas sesiones de teoría, hicimos algo que generalmente no suele dar tiempo en hacerse en una mañana de clase que fue lo que tuvimos y es que al final nos propusimos como objetivo, tratar de asociar distintos modelos de analítica avanzada (que la gente en general denomina de Machine Learning) y hacer una discusión entre los principales modelos que habíamos estudiado en la teoría y que queríamos aplicar.

Nadie, ni tan siquiera yo había estudiado el dataset previamente y la verdad es que salió todo bastante redondo tal y como voy a describir a continuación.

En definitiva, con el nombre del dataset y tras horas de machaque teórico, los veía un poco alicaídos y este conjunto sobre “alumnos deprimidos”, fue un tanto jocoso porque permitía una cierta identificación que lo que pretendía era realmente animarlos un poco así pues lo que nos propusimos fue usar a mansalva Chat GPT y ver si llegábamos a hacer una discusión de modelos adecuada.

Tanto el código que comentaré a continuación como el dataset y la estructura que cualquiera puede llevar a su máquina si lo quiere ejecutar estaría aquí https://github.com/FJROAR/AnalisisDatasetDepression y prácticamente el 95% de éste código lo hicimos en clase y yo añadí un poquito más de vuelta en el tren para que quedase presentable por si alguien lo quiere utilizar para lo que desee.

Pues bien, la clase se desarrolló tal como sigue:

 

  1. Lo primero era elegir en qué lenguaje lo hacíamos, mis alumnos eligieron Python y aunque a mí me gusta más R, pues nada, había que hacerlo en Python y trabajamos por tanto en Spyder. En todo caso, nos íbamos a ayudar de ChatGPT, porque aunque ellos tenían alguna idea de programación en Python, teníamos un tiempo muy limitado y no podíamos pararnos a pensar mucho el código


  2. Lo único que les indiqué era que hiciésemos una carpeta que se llame code donde estaría el código y otra data donde estarían los datos que Kaggle permitían descargarlos en formato .csv


  3. Cuando se trabaja por primera vez con datos es increíble que hasta lo más tonto, se puede convertir en un mundo y claro, había que leer los datos. Pues nada, pregunta al canto y rápido se obtiene una solución totalmente sencilla y correcta, trabajada además con rutas relativas como debe ser:

  4. Tras esto echamos una inspección visual y aunque es cierto que en un proyecto en real hay que llegar a construir este dataset a partir de unir distintas tablas, ese trabajo lo teníamos resuelto, pero tras abrir el dataset nos encontramos esto:


    1. Había algunas variables como City que al estar en formato carácter no van a poder usarse en Python, tampoco la variable Gender ni otras Have you ever had suicidal thoughts ?


    2. Otras variables como Profession parecían que presentaban un único valor, pero no era así, no siempre vale Student y había que tomar decisiones de que se hacía con los no tomaba ese valor y con la variable en sí


    3. Por otro lado en concreto con la citada variable City vimos que había unas 52 categorías y por tanto ¿Qué hacíamos con esta variable? ¿Hacíamos Dummy u optamos por algo tipo LabelEncoding?


      Todas estas y otras decisiones fueron tomadas conforme la marcha y generando un código gracias a las distintas preguntas que los estudiantes le iban haciendo a Chat GPT que generaba parte de un código que después adaptábamos a nuestras necesidades. Un pequeño fragmento de lo que se hizo es lo que se muestra a continuación:


      Tomar por tanto la decisión, ver que funcionaba, adaptar … Nos llevó bastante tiempo y vimos parte del marrón que en la vida real toca sobre preparación de la información antes de poder tocar los modelos


  5. Del paso anterior decidimos prepara y “numerizar” todas las variables tipo carácter salvo 2 de ellas que eran las variable Gender y Degree. Estas 2 variable le íbamos a dar un tratamiento alternativo tipo label encoding donde en conjunto training contaríamos por cada categoría, cuántas veces aparece en el dataset y asignaríamos una proporción. Por tanto, con un dataset tal como este:

    Llegamos al punto de hacer los respectivos conjuntos training y test con un código que nos proporción ChatGPT y que debidamente adaptamos a nuestra necesidades donde quitamos la variable id que no nos sirve para nada y donde separamos la target de las variables explicativas haciendo lo siguiente:

  6. Tras lo anterior, se estaba en disposición de transformar en numéricas las 2 variables comentadas en (4) en el training para aplicar esa transformación en test, para esto preguntamos de nuevo ChatGPT y nos proporcionó bastante ayuda al respecto, permitiendo dicha transformación tal y como se observa en una de ellas a continuación:


  7. Aunque no llegamos a hacerlo, antes de llegar a la fase de modelización es siempre conveniente realizar una pre-selección de variables previa o al menos eliminar las que son muy parecidas entre sí, mediante un análisis de correlaciones, no lo hicimos y decidimos ir a ver si iba a salir algo predictivo o no con todo lo que se tenía, así que lo único que se hizo fue una mera imputación de valores missing que había unos pocos y fuimos por fin a la FASE DE MODELIZACIÓN.


  8. Es pues este paso el más excitante de lo que hicimos porque queríamos asociar modelos y teníamos muchas posibilidades ¿Qué hacer? ¿Cogemos una tipología de modelos y aplicamos un grid search? ¿Hacemos un repaso de todos los modelos que conocemos? ¿Combinamos lo anterior? … Optamos por la segunda opción y elegimos ver distintas opciones de lo que habíamos visto hasta el momento tal y como sigue a continuación:


  9. Para analizar todo esto, necesitábamos montar un bucle, que permitiese aplicar opción por opción a test y decidimos en cada caso medir mediante el índice de Gini y generar un dataset para tener una discusión adecuada, el corazón y la parte más importante del código sería por tanto la siguiente:


Llegados a este punto debo admitir que me sorprendió ChatGPT, estaba ayudando a unos estudiantes a sacar un código con cierto sentido de modo ordenado que iba a generar el listado de modelos que he puesto como Figura Principal al principio de este escrito.


Y hasta aquí lo principal de la parte del código el resto fue sacar conclusiones y ver para qué servía esto de los modelos realmente y se entabló un debate interesante donde resalto algunas de las ideas:


  • No siempre el modelo más complicado (o más famoso como el xgboost) resulta ser el mejor, aquí ganó la regresión ridge

 

  • Analizamos en los modelos tipo xgboost el típico gráfico de importancia de las variables que podía ser comparado con los coeficientes que salían de la regresión Ridge:


¿Cuál aporta más información? ¿Qué indica cada uno? ¿Se pueden usar de modo conjunto? ¿Tiene sentido lo que dicen? ¿Cómo podría elaborar políticas entre mis estudiantes con estos resultados? Aquí está la verdadera utilidad de los modelos aparte de por supuesto el poder predictivo con unos Ginis tan sumamente buenos


  • Y como al principio salió el XGBoost como mejor modelo bajamos al mundo de la interpretabilidad de modelos de analítica avanzada de la mano de los Shap values y generamos gráficos como el que está en la figura principal (aquí se genera para otro estudiante distintos):

 

¿Son los estudiantes distintos en su propensión a tener o no depresión? ¿Cómo influyen localmente las variables que inciden en la problemática bajo estudio? ¿Qué diferencia y/o relación hay con la interpretación que nos da una regresión y la de un xgboost? …


Finalmente, aunque es claro que en un proyecto en real hay que hacer muchas más cosas, esto fue lo que nos dio parte de una mañana de práctica, discusión y uso de los conceptos que nos conviene tener claros, por supuesto todo esto está a mejorar ¿Cómo? Pues eliminando variables redundantes, igualmente eliminando variables poco importantes que no aportan nada a los distintos modelos, aplicando Grid Search de hiperparámetros para cada una de las familias de los modelos presentados y seguro que mejorarían tanto los random forest como el xgboost, controlar el overfitting (en el caso del decision tree fundamental) que se nos iba de las manos al no estar controlada la profundidad, variables ... Pero eso lo dejamos para otra ocasión.


En definitiva, creo que avanzamos bastante y plantear un escenario así hace unos años y llegar a sacar algunas conclusiones como a las que llegamos, era cuestión, o de dedicarle algunas jornadas y llevarlo todo muy preparado (sin empezar de cero), o de limitarlo todo a analizar un único modelo y punto, quedé muy contento tanto con lo alumnos como con el modo de trabajo y lo que hicimos en esa clase.

Commenti


© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page