Un estudio de machine learning
A esta sección la escribo mientras se realiza el proyecto. Al momento, no sé a qué resultado llegaremos. La idea del proyecto es implementar distintas arquitecturas recientes de deep learning para hacer estudios con los datos (clásicos) del Hospital Infantil de Boston. Es un buen desafío por varias razones. Una de ellas son los datos mismos. No están "regalados". Son registros en formato edf (el formato en el que escribe el equipo de EEG). Por cada paciente hay varios archivos edf que registran una hora de lectura. Una dificultad extra es que no se utiliza la metadata en el formato (los archivos edf suelen tener no únicamente el registro sino que también guardan metadata del estudio), sino que existe un txt por cada paciente que muestra cómo fue registrado cada hora (qué canal es qué sensor), la frecuencia de muestreo y dónde hay o no convulsiones.
El código del proyecto se encuentra en mnsosa/SeizurePrediction.
Estamos en procesos burocráticos. Tenemos ya dos asesores, por suerte, excelentes ambos. Uno es el profesor Pedro Pury, quien conocí en Matemática Discreta I de la licenciatura. Es físico de FAMAF y se dedica a la investigación y la docencia. Dio clases de fundamentos del aprendizaje automático y está metido en el tema. Acá para más información. La otra asesora, quien sería la asesora principal, es Jackelyn Kembro, quien es investigadora de CONICET. Tiene un postdoctorado, bióloga de base. Su researchgate es este.
A Pedro le comenté sobre el proyecto más o menos en junio de este año. Fue una breve charla en la que quedamos de hablar después mejor. No recuerdo bien, pero me parece que hubo un par de mails de ida y vuelta hasta que aceptó ser asesor. Luego, como al mes y medio probablemente (porque no tengo bien ubicados los recuerdos en este momento) nos juntamos con el pelado y Pedro a hablar. Fue una charla muy buena, donde nos introdujimos, contamos de dónde sale la idea del proyecto y qué pensamos hacer. Duró aproximadamente 2hs y algo, muy bien.
A Jackelyn todavía no la conozco en persona. El pelado la conoció porque andaba peladeando por ahí y se encontró con que un grupo de investigación de la facultad de ciencias exactas, físicas y naturales necesitaba a alguien que les ayudara con machine learning para procesar señales de cordornices. Una peladeada bárbara. Esto es relativamente reciente. Entre charla y charla, entre que Cristian se puso a hacer trabajo para ellos de onda, por amor al arte, él y Jacky quedaron en que podían ayudarse mutuamente. Jackelyn es una investigadora experta, con muchísima experiencia, y puede asesorarnos en el proyecto integrador, mientras que Cristian, que le gusta darse contra la pared constantemente con códigos de difícil replicación, podía ayudar al grupo. Además, son señales temporales, tal cual como las de EEG que queremos estudiar. Win win.
En este momento, Cristian y yo nos encontramos leyendo cosas que nos mandó a leer Pedro, y al mismo tiempo corrigiendo las 249824968 correcciones que nos hizo Jackelyn en las tres oraciones que hicimos para el anteproyecto.
Hace aproximadamente una semana y media, Pedro nos recomendó que leamos unos papers acerca de la predicción de anomalías con datos de EEG. Esto viene porque le consultamos nuestras dudas sobre el desbalance de los datos que tenemos.
Con Cristian estamos juntándonos lunes, miércoles y viernes a leer eso. Lo hacemos por Discord y estamos haciendo anotaciones virtuales.
Hoy es lunes y no pudimos juntarnos por distintas cuestiones. Yo ando con un trabajo freelancer para un chino y el pelado preparándose para una entrevista técnica. Supongo que a muchos les pasará de ir buscando trabajo mientras se hace el proyecto final.
Originalmente teníamos la idea de comenzar en invierno para terminar en verano, aproximadamente en febrero y presentar por esa fecha. Resulta que las cosas se complican mucho. Siempre se tienen y se quiere hacer más cosas además de la facultad. También sucedió que tuvimos un cambio de director de proyecto. Esto se dio por distintas razones que prefiero no escribir acá.
Es realmente un bajón, pero es algo que hay que aceptar: las cosas pueden complicarse y todo demora su tiempo. Hemos decidido repensar nuestras expectativas y ahora apuntamos a recibirnos en julio del año que viene (2023). Esto es porque AÚN no hemos mandado los papeles para que nos acepten el anteproyecto.
Nos frena también que, además de los dos asesores que nombré antes, tenemos un tercero que aún no leyó la propuesta que hicimos. No hablo mucho de él porque nunca hablé con él aún. Lo conoce el pelado por el trabajo. Es Federico Perrote del Hospital Privado de Córdoba, neurofisiólogo con un cargo alto en el hospital. Es excelente contar con su ayuda, pero entiendo que está más que ocupado. Por suerte, según me cuenta Cristian, él tiene un grupo de gente que estudia con él que podrán revisar nuestro escrito y dar devoluciones, además de él.
Frena el avance que todavía la facultad no leyó ni aceptó el proyecto que proponemos. Sería muy malo que no lo aceptaran porque ya hemos leído bastante, y jugado con los datos y demás. Supongo que esto es un peso para que se acepte el proyecto, pero esa incertidumbre hace que las cosas no sigan un flujo claro claro.
Tenemos varios papers leídos sobre el tema. Estamos más que metidos en el contexto de esta investigación que lleva muchísimos años. Sabemos de sus problemas y sus avances, y nos gustaría contribuir.
Cristian anda leyendo sobre los transformers y ese tipo de redes que queremos usar. Yo ando organizando el proyecto para que sea claro y limpio, y fácil de replicar. Esto es algo que hacemos porque una de las mayores críticas de todo esto es que los estudios del tema no proporcionan los programas para lograr las salidas que tuvieron. Solo muestras resultados, pero no muestran con detalle cómo se lograron. Nosotros queremos que cualquier persona pueda entender los procesamientos que se le hicieron a los datos, que vea efectivamente qué funciones se usaron y que repliquen y corrijan si es necesario.
Pienso que una cosa es escribir la función que se quiso usar (la que escriben de forma matemática en los papers) y otra cosa es la función que se programó y la que realmente se usó. Uno puede querer hacer algo e implementarlo mal. Las publicaciones del tema muestran resultados, muestras qué funciones se quisieron usar, procesamientos (generalmente en diagramas) y los resultados, pero no muestran las funciones que efectivamente se usaron. No tengo garantía de que ellos han implementado bien lo que han querido hacer, y es tan fácil como compartir el código. Además, compartiendo el código sirve de baseline para otros proyectos.
Ya tenemos una estructura de los procesos más importantes. También se nos ocurrió de hacer una interfaz sencilla con streamlit para que sea de fácil visualización lo que se vaya haciendo. Tenemos pensado agregar en esta visualización la misma documentación, pero ya iremos viendo a partir de nuestros tiempos.
Algo del repo en Github al día de la fecha.
Esta semana se nos ha asignado el tribunal que nos evaluará. Todavía tengo la presión (miedo) de saber que queda que ellos evalúen la propuesta. Realmente no tengo ganas de que digan nada, ya a esta altura con el proyecto tan leído y empezado.
Cristian sigue avanzando con eso de los pollos (codornices). Creo que no lo mencioné antes, pero con la Kembro (así nos referimos con el pelado) hay una especie de trato. Cristian la conoce porque Cristian se ofrece a participar voluntariamente y ad honorem a un proyecto donde investigan a codornices utilizando Machine Learning. Justo nosotros al mismo tiempo teníamos la necesidad de tener un asesor del proyecto para la predicción de convulsiones, por lo que Kembro, como retribución a lo que hace Cristian, se ofreció a ser nuestra asesora. El pelado sigue más que metido con ese tema. Yo conseguí un trabajito el mes pasado por lo que habíamos bastante de lado al proyecto integrador.
Ahora retomamos. Cristian sigue con lo de las codornices. Dice que quiere hacer cosas que sirvan para ambos proyectos. Además, estuvo aprendiendo herramientas nuevas: MLFlow, Poetry. Yo por mi lado también aprendí sobre cómo generar Wikis (Sphinx). Queremos ver de meter esto nuevo al proyecto, aunque lo de Poetry no me convence tanto (dice que es para producción, pero esto es muy académico y no le veo mucho sentido).
Esta semana avancé con la lectura automática del los archivos del summary (unos txt donde hay metadata). Estaba negado con eso porque había tenido unas semanas de avance en vano porque había interpretado mal una cosa. Cuestión que ahora, después de un mes y algo, volví a retomar ese tema. También sucedió que habíamos dejado de lado el código para enfocarnos en pensar cómo será el proyecto y leer artículos que nos pasó Pedro. Ahora que leímos algunas cosas nos gustaría implementarlas.
También generamos una página de Notion para gestionar el avance del proyecto: Seizure Prediction (notion.site).
Hablando de gestionar proyectos, nos dieron acceso a la plataforma de la facultad para gestionar el proyecto integrador. Acá es donde vemos quiénes son nuestro tribunal y demás. No parece una mala idea la plataforma, está okay.
Para cerrar el escrito de hoy, contar que está haciendo muchísimo calor. No nos estamos juntando presencialmente con Cristian y estamos más haciendo las cosas por separado hasta un día puntual que arreglamos.
Hoy es viernes, último día hábil del año.
Quiero contar sobre algunos avances y hablar de cómo siento algunas cosas.
Pury nos dijo muchísimas veces que nos concentremos en esto hasta terminar así ya nos olvidamos y tenemos el título. Pury no sabe que busqué y encontré trabajo a mitad de noviembre. Sé que este trabajo por suerte no es un inconveniente, no me come la cabeza ni me quita tiempos enormes de mi día, sino que es muy flexible y no les interesa cuándo haga sino más bien que haga. Igualmente, no tengo ganas de andar explicando. Escribo esto porque siento culpa por no decírselo.
Tampoco es que me sienta apurado. Y tampoco siento que vaya a faltarnos tiempo. Cada juntada que hacemos con el pelado suelen ser productivas. Además, pienso fuertemente que hay que pensar la base con mucho cuidado para que luego la punta sea más rápida de hacer.
Siempre pienso que debería hacer las cosas más rápido. En la última juntada con Pury me di cuenta de que vamos bastante bien, aunque no haya mucho código escrito, seguimos esbozando ideas que en algún momento cobrarán mucho valor.
También me hace un poco mal porque va en contra del clásico approach del software: hacer un producto mínimo y después hacerlo escalar. Nosotros no tenemos aún algo funcional, sino que vamos paso a paso, sin cerrar aún todavía el ciclo. No creo que haya que sentir culpa por esto.
Para mover un poco a algo más de la tesis en sí, un avance interesante es que hemos plasmado en código una idea que tuvimos varios meses atrás cuando definíamos el tema de la tesis.
Para explicarlo voy a dar mínimamente un contexto. Resulta que en esta investigación de intentar predecir convulsiones epilépticas, el enfoque clásico es tomar X minutos para atrás anteriores a la convulsión y etiquetarla como "pre-ictal", luego con un modelo de ML intentar encontrar ese momento. La bibliografía no dice que haya bien definido de cuánto tiempo para atrás sería pre-ictal o no. Para no definir nosotros eso, se nos ocurrió lo siguiente:
Llamémosle start al tiempo donde empieza la convulsión. La señal es de tipo pd.DataFrame.
Tomamos M ventanas de N muestras desde start hacia atrás.
Quedaría una lista con M dataframes.
Se etiqueta esa ventana con el valor de N/2 (la mitad del largo de la ventana) + distancia a start (inicio de convulsión).
Se usan para una red con capas convolucionales.