Comment un débutant en IA a pu finir 4ème dans un hackathon mondial (School of AI)

Kim Noël
France School of AI
15 min readApr 15, 2019

Le weekend du 30/31 mars dernier se tenait le tout premier hackathon organisé par School of AI (Siraj Raval). Cet article est un retour d’expérience du point de vu d’un débutant en data science et machine learning.

Too small to fail (randyfath sur Unsplash)

Les sujets

Les problématiques portent sur la santé et tous représentent un enjeu critique. School of AI a proposé 5 challenges, mais il est aussi possible de venir proposer son propre projet :

  1. Détection de 14 maladies répandues à partir d’images radiographiques en rayon X de la cage thoracique
  2. Estimation du rythme respiratoire à partir d’autres données médicales
  3. Détection du mélanome à partir de photos de grains de beauté
  4. Intégration d’un chatbot pour informer et personnaliser le suivi et la prédiction des périodes féminines (pslove)
  5. Prédiction des architectures moléculaires des protéines biologiques à partir de leur composition chimique (Protein Fold)
#HealthHack

Voici en quelques mots le contexte de chacun d’eux.

1. Détection de 14 maladies répandues à partir d’images radiographiques en rayon X de la cage thoracique

La radiographie par rayon X de la cage thoracique est l’un des examens médicaux les plus fréquemment utilisés et l’un des plus efficaces dans l’imagerie.

Cependant, il est très difficile d’effectuer un bon diagnostic médical en se basant uniquement sur la radiographie, et on doit très souvent faire effectuer des imageries au scanner, beaucoup plus cher et avec des résultats plus longs à obtenir.

Il existe déjà des outils capables d’aider les professionnels à diagnostiquer des maladies à partir d’image de radio de la cage thoracique, mais ils sont encore peu efficaces.

L’enjeux est de développer un outil plus performant qui sera capable d’effectuer le diagnostic de 14 maladies de la cage thoracique, simplement à partir d’images radio.

Les données sont composées de plus de 4 000 images radio libellées avec la ou les maladies diagnostiquées : la concurrence de maladies sur une même radio rend difficile l’identification de chacune d’elle.

Exemple de 8 maladies communes au niveau du thorax
Les 14 types de maladies et les statistiques de concurrence ; par exemple l’effusion l’infiltration et l’atélectasie sont très souvent présentes en même temps

2. Estimation du rythme respiratoire à partir d’autres données médicales

Le suivi du rythme respiratoire est critique pour détecter les arrêts respiratoires, mais il n’existe pas de méthode simple et non invasive pour effectuer des mesures.

Une solution est d’effectuer un calcul indirect : calculer une estimation du rythme respiratoire à partir d’autres données plus simples à mesurer, comme le rythme cardiaque et la saturation pulsée en oxygène (quantification de la saturation en oxygène de l’hémoglobine au niveau des capillaires sanguins en prenant le pouls).

Oxymètre de pouls (Source)
Activité électrique du cœur (Source)

Les données mises à disposition sont des 53 enregistrements de 8 minutes des trois grandeurs en question (rythme respiratoire, rythme cardiaque, et oxygénation du pouls). Ces mesures proviennent de patients, âgés de 19 à plus de 90 ans, admis en soin intensif dans un hôpital à Boston, aux Etats-Unis.

Les trois signaux mesurés : rythme respiratoire, rythme cardiaque, et oxygénation du pouls. L’enjeux est de reproduire la courbe noir du haut à partir des deux du bas en vert et en bleue.

3. Détection du mélanome à partir de photos de grains de beauté

Le mélanome est un cancer de la peau et des muqueuses. Ce cancer peut être soigné s’il est détecté suffisamment tôt.

En effet si au moment du diagnostic le mélanome est resté confiné dans les couches extérieures de la peau, alors une simple excision est généralement suffisant pour guérir le patient. Les patients traités par excision voient leur taux de survie à 5 ans approcher les 98%.

Le taux de survie à 5 ans est le ratio entre deux pourcentages : le pourcentage de patients atteints de la maladie et encore vivant 5 ans après le diagnostic, et le pourcentage de la population générale de même sexe et d’âge similaire encore vivant sur cette même période de 5 ans.

Dataset de l’ISIC

Malheureusement, bien qu’une simple inspection visuelle suffirait à diagnostiquer le mélanome dans son stade précoce, encore beaucoup de patients continuent à être diagnostiqués dans un stade avancé.

Les estimations montrent que le mélanome sera la cause de 7 200 décès en 2019, dont 5 000 hommes et 2 000 femmes.

Les enjeux sont considérables, aussi bien du point de vue humain que financier. Un mauvais diagnostique de mélanome peut conduire à de nombreuses biopsies inutiles et à des excisions de lésions cutanées bénignes.

L’enjeux est de développer un outil capable de classifier les mélanomes bénins et malins à partir de photos de grains de beauté.

Pour information, seulement 20 à 30% des mélanomes sont trouvés dans des grains de beautés existant, et que 70 à 80% des mélanomes naissent dans des régions apparemment normales de la peau.

4. Intégration d’un chatbot pour informer et personnaliser le suivi et la prédiction des périodes féminines, par pslove

Les conséquences des périodes féminines sur l’état de santé sont souvent mal connues des hommes et des femmes aussi.

Les pics d’hormones et les hémorragies qui se produisent peuvent notamment entraîner un état de fatigue important, une chute en bio-éléments dans le sang, mais aussi un état de stress qui peut se traduire par une dépression.

Exemples des symptômes et maux qui peuvent être causés par les règles

L’entreprise pslove a pour objectif de mieux faire connaître ces problématiques de santé qui touchent la moitié de la population mondiale.

Leur application pslove Period Tracker est déjà disponible et propose une prédiction précise et personnalisée des périodes de fertilité et d’indisposition. Elle délivre aussi des conseils et des recommandations basées sur les ressentis et les symptômes que l’utilisateur décrit dans l’App.

L’objectif est de proposer un chatbot conversationnel capable de proposer un diagnostic et des recommandations personnalisées, en analysant le langage naturel, lors des échanges avec l’utilisateur. Le chatbot proposera un service personnalisé grâce à une base de données qui met en commun les retours d’expérience des utilisatrices

5. Prédiction des architectures moléculaires des protéines biologique à partir de leur composition chimique (Protein Fold)

Les protéines sont des molécules biologiques produites dans les cellules et servent à son bon métabolisme.

Une protéine est une séquence d’acides aminés, leur constituant de base, et peut être longue de plusieurs centaines d’éléments. Lors de sa création, la protéine a une forme de filament (forme polypeptidique), puis elle adopte sa forme tridimensionnelle en se repliant sur elle-même.

Repliement des protéines (Source)

Ce repliement est essentiel car la fonction de la protéine est déterminée non seulement pas sa composition chimique mais aussi par sa structure moléculaire : chaque protéine est programmée pour agir sur une cible spécifique, à la manière d’une clef, de sorte que la bonne protéine agisse sur la bonne cible.

Il suffit qu’une mutation se produise pour que la molécule ne remplisse plus son rôle, voire qu’elle devienne nocive pour l’organisme. De nombreuses maladies neurodégénératives ou autres sont considérées comme résultant d’une accumulation de protéines “mal repliées”.

La prédiction de la structure spatiale de la protéine a aussi une application majeure dans la prédiction de l’efficacité d’un médicament. Bien connaître le champ des possibles pour une molécule permet de savoir si un médicament sera efficace, sans effet, ou nocif pour les patients.

Animation sur la prédiction de la structure de la cible T1008 pour le CAPS13, par la méthode de la descente du gradient

L’étude du repliement des protéines revient à déterminer la distance entre deux acides aminés, et l’angle de la liaison chimique.

Effectuer des simulations brutes pour étudier toutes les configurations possibles n’est physiquement pas possible. D’après le paradoxe de Levinthal, une protéine de 100 acides aminés porte le nombre de possibilité à 3³⁰⁰ soit 10¹⁴³, et le temps de simulation serait plus long que l’âge de l’Univers.

Ensembles des étapes possibles dans le repliement d’une protéine (modèles d’état de Markov), (right)

Le congrès CASP (Critical Assessment of Structure Prediction), qui a vu sa 13ème édition s’ouvrir en juin 2018, aux États-Unis, a été créé pour catalyser la recherche dans ce domaine, et donner l’opportunité de présenter des méthodes innovantes de prédiction.

Le congrès propose un concours pour élire le meilleur algorithme de prédiction, et cette 13ème édition a été remportée haut la main par DeepMind avec le projet AlphaFold.

Méthode de résolution de DeepMind adoptée dans AlphaFold
Structure réelle en vert, structure prédite en bleu

En se basant sur les publications et les rapports publics, une version open source d’AlphaFold a été développée par Eric Alcaide, avec le projet MiniFold.

L’enjeux est de reproduire les résultats de MiniFold, disponible en open source, et d’améliorer ses performances.

Avec mon équipe avons choisi de travailler sur le sujet 5.

Résumé du weekend

Le hackathon de School of AI a commencé samedi matin pour finir dimanche en fin d’après-midi. Le weekend s’est organisé comme ceci :

Samedi :

  • 9:30 : Accueil des candidats. Il y a environ 70 personnes.
  • 10:00 : Présentation d’accueil et conférences d’intervenants.
Pitch d’AZmed
  • 11:00 : Présentation des sujets et des problématiques du hackathon.

Formation informelle des équipes, le but étant de composer des équipes de 5 personnes en variant les profils : débutant en IA, expérimenté en IA, professionnel de la santé, finance/business. Après avoir participé à la logistique de l’évènement, je rejoins avec un autre bénévole une équipe formée de 3 personnes : nous sommes 4 débutants en IA et 1 business.

D’autres équipes étaient déjà premade, et ont mis sur la table leur propre sujet d’étude.

  • 12:00 : Coup d’envoi et étude des dossiers.

Les équipes choisissent leur sujet. Il est également possible de travailler sur sa propre problématique. On a 24 heures pour poster le code sur GitHub, la date et l’heure d’upload des fichiers fait foi. Étant donné le changement d’heure pendant le weekend, l’heure de livraison est décalée à 13:00 le lendemain.

Ça bosse !
  • 16:00 : Nous choisissons de travailler sur le projet MiniFold.

Après avoir pris connaissance des 5 dossiers, nous choisissons de travailler sur la prédiction de la structure moléculaire des protéines. C’est le dossier qui nous a le plus intéressé, car il ouvre sur un domaine qui nous est totalement nouveau.

  • 23:00 : L’heure de rentrer pour certains, la nuit commence pour d’autres.

La salle se vide, les gens partent pour attraper le dernier métro, le dernier RER pour rentrer chez eux. Je choisis de rester dormir là avec un autre de membre de l’équipe. Niveau avancement on est bloqué. Les installations nécessaires pour faire tourner l’algorithme MiniFold rentrent en conflit entre elles, notamment à cause de problèmes de version.

Afin de pouvoir présenter quelque chose le lendemain, je propose qu’on représente graphiquement les données, les protéines. Sauf que ce n’est pas une mince affaire.

Premièrement les données sont lourdes, de 3.2 à 11 Go. Par pragmatisme nous téléchargeons le plus petit dossier zippé qui est de 3.2 Go ; ce sont les données de la conférence CASP7.

Les données à télécharger

Lorsque nous dé-zippons le dossier, on trouve 5 fichiers qui ont servi à l’entraînement d’un algorithme de prédiction (train, test, validate). Après les avoir convertis en .csv, nous voyons cela, sur des dizaines de milliers de lignes :

Données fournies sur ProteinNet

Un fichier source peuvent contenir 15 000 protéines, et chaque protéine est codée sur 33 lignes, ce qu’il fait beaucoup de données à analyser.

Après une lecture difficile des readme de ProteinNet, nous avons pu donner du sens :

Ajout de légende pour comprendre la structure des données

Dans les fichiers .csv, il y a des données disponibles pour chaque protéine, et elles sont divisées en plusieurs blocs :

  • ID : c’est le nom de la protéine.
  • Primary : c’est la composition chimique de la protéine en acides aminés. Chaque acide aminé est représenté par une lettre (colonne C8 à C27), et il y a 20 espèces différentes représentées ici. La protéine peut être formée d’une dizaine à un millier d’acide aminé.
  • Evolutionary : c’est la matrice qui indique pour chaque acide aminé de la chaine (chaque colonne), la probabilité de dégénérer en un autre acide aminé (chaque ligne), par processus chimique. Les acides aminés de la chaine qui n’ont que 1 à leur ligne signifie que l’acide aminé est stable.
  • Tertiary : c’est un tableau qui regroupe les matrices 3x3 de chaque acide aminé. Ces matrices sont leurs coordonnées spatiales en coordonnées cartésienne en picomètre.
  • Mask : c’est un indicateur qui permet de prendre en compte certains phénomènes, pour ne pas biaiser les résultats de prédiction.

Nous nous sommes fixés comme objectif de représenter les chaines d’acides aminés grâce à leurs coordonnées spatiales dans la section Tertiary.

Comme un bon data scientist en herbe, je choisis Python pour programmer. J’utilise également Excel pour formater les coordonnées et les préparer pour Python. Les librairies et le code est disponible sur GitHub.

Voilà ce qu’on espérait :

Une chaine d’acides aminés (Source)

Versus ce qu’on a eu 😅

Représentation 3D des acides aminés avec Python

Bon ce n’est pas trop mal, et avec un peu de chance on pourra montrer quelque chose qui ressemble plus à une molécule qu’à un nuage de confettis. En réalité ces triangles dans l’espace correspondent bien à la représentation de la matrice 3x3, avec 3 points avec chacun un (x,y,z).

Dimanche :

  • 5:30 : Les yeux piquent piquent trop, je bug dans une fonction de select case pour donner des couleurs fixes à chaque acide aminé. Il est temps de dormir.
  • 8:30 : Le réveil, ça pique, mais il faut continuer. J’ouvre l’ordinateur et surprise :
Génial 😑

La distribution Anaconda et Spyder ne répondent plus. J’installe, je désinstalle mais rien n’y fait. Sans Anaconda, je ne sais pas non plus lancer Jupyter Notebook. L’un des organisateurs me conseil d’utiliser une machine virtuelle, je m’hasarde donc à installer une machine virtuelle sur Google Cloud Platform, mais l’installation est longue. Heureusement, je suis guidé.

Pendant ce temps, les autres membres ont réussi à passer les difficultés du conflit des versions des dépendances, et ils arrivent à faire tourner l’algorithme de prédiction. Sauf que celui-ci est devenu instable car les réglages ne sont pas exactement les mêmes.

Ce sont les aléas des problèmes techniques. ^^

  • 12:25 : Je retrouve un Jupyter Notebook sur lequel je tente de débugger ma fonction de couleur d’acide aminé. Je change d’activité et je préfère écrire un bon Readme pour le dossier GitHub.
README sur GitHub
  • 12:55 : On poste sur GitHub le code. Le code bug, mais avec du recul, le petit bug de la fonction de couleur se trouve à la ligne 29 : un == était écrit au lieu d’un =, pour une assignation.
  • 13:00 : Fin de la compétition.

On nous donne encore 1h00 pour préparer les supports de présentation. L’exposé des résultats se fera aux autres équipes et à un jury composé d’un biologiste moléculaire, d’une professionnelle du milieu hospitalier, et d’un expert computer vision. Le jury va départager les équipes pour élire le meilleur projet local.

  • 14:00 : Chaque équipe présente son travail. 8 équipes sont restées jusqu’au bout.

Chaque équipe va être évaluée par le jury, pour le classement local, et aussi par les autres équipes pour le classement de la meilleure présentation.

  • 16:00 : Fin des présentation et délibération du jury… et le gagnant est … 👇

Notre équipe — les débutants — est classée : 4ème ex-aequo sur 8 par le jury de professionnels et classée 2ème sur 8 pour la meilleure présentation par les autres équipes.

Désolé pour le titre détourné ^^. J’ai bien fini 4ème — localement — dans un hackathon — organisé — mondialement.

Les débutants : 4ème sur le classement local, 2ème meilleure présentation (sur 8 équipes)

Résultats améliorés

Suite au hackathon, j’ai voulu améliorer la représentation graphique en suivant les points suivants :

  • Automatiser la génération des graphiques, sans utiliser Excel.
  • Générer les graphiques sans ouvrir les fichiers .csv qui sont lourds (> 500 Mo à quelques Go) et qui contiennent plusieurs millions de lignes.
  • Calculer le nombre de lignes totales et donc le nombre de protéines total dans le fichier .csv sans utiliser de boucle for sur ses millions de lignes.
  • Gérer la mémoire dans l’opération de l’extraction des coordonnées pendant le scan du fichier de données.
  • Adopter une représentation par point pour chaque acide aminé, en prenant le centre de gravité des 3 points le définissant.
  • Ajouter des segments entre les acides aminés dans la chaîne de la protéine, afin d’imager les liaisons chimiques.
  • Donner la possibilité d’afficher les protéines de son choix.
  • Une hypothèse dans les données est que certains acides aminés dans la protéine n’ont pas de coordonnées 3D. Prendre en compte cette hypothèse pour différencies les blocs d’acides aminées en traçant des segments de couleur différente.
  • Attribuer une couleur fixe pour les 20 acides aminées.

Les résultats améliorés montrent que certains acides aminés n’étaient pas bien représentés (branche gauche pour TBM#T0363).

Dans les graphiques de droite, la différence des couleurs des segments entre les protéines n’est pas significative. Ce qui est significatif c’est la différence de couleur dans une même protéine : cela signifie qu’il y a plusieurs sous-chaînes non liées ou indépendantes.

Résultat du hackathon (gauche) et résultats améliorés (droite)

Le bestiaire

Une galerie de photos des résultats est en construction sur Facebook sur la page ‘plot MiniFold’. A terme, il y aura environ 50 000 protéines.

Galerie de photos la page Facebook ‘plot MiniFold

Axes d’amélioration

Les améliorations à venir sont :

  • Automatiser la publication des photos sur Facebook, en utilisant un token qui reste valable plus de 2 heures. Utilisation de la bibliothèque facebook.GraphAPI sur python.
  • Créer un moyen d’associer les images aux chaînes d’acides aminés pouvant être longues de 1000 éléments. L’intégration au nom des fichiers images aurait été impossible à cause de la restriction de 256 caractères dans le path Windows.
  • Etablir des jeux de couleurs différents pour les sous-groupes d’acides aminés dans la protéine, par exemple s’il y a des feuillets.
  • Calculer les distances et les angles entre les acides aminées.
  • Générer les images issues des autres jeux de données. A noté que dans les données de MiniFold, tous les acides aminés ne sont pas représentés en 3D, car les coordonnées ne sont pas disponibles.
  • Développer un algorithme de classification non supervisé pour établir des classes de protéines. Ce projet pourra se faire en se basant sur le MOOC fast.ai.

Conclusion : Un débutant peut participer à un hackathon mondial ? Oui, surtout les débutants !

Participer à un hackathon mondial peut faire peur, on peut se trouver toutes les excuses possibles et inimaginables pour ne pas plonger : je ne vais rien pouvoir faire, de toute façon ils sont trop forts, j’y connais rien en médecine, comment je vais faire pour rentrer samedi soir, etc… Mais c’est la meilleure opportunité pour commencer à faire, à pratiquer et être pro-actif.

Cela faisait quelques mois que j’étais bloqué à enchaîner les MOOCs sur Python, sur R, sur l’IA… et je me sentais stagner. Le hackathon a permis de sortir de ce stade de l’apprentissage qui s’éternisait à un stade proactif, où on prend en main son propre projet !

De plus, cette expérience pourra servir de storytelling pour plus tard : j’ai dormi que 3 heures et demi sur un matelas, près de tonneaux de bières ; mon python a planté en plein milieu de la compétition, avec Windows a encore fait une MAJ, et bien d’autres encore.

De plus, comme pour les bugs à tiroirs, travailler sur son propre projet développe des compétences à tiroir : j’ai pu découvrir comment poster automatiquement du contenu sur Facebook avec Python.

Donc foncez !

Remerciements

D’abord un grand merci aux deans de School of AI Paris d’avoir organisé ce hackathon et les cours précédents Rémi Connesson et Jeremy Cohen.

Je dédie cet article à l’équipe de hackathon :

--

--