Maître de Conférences en Informatique à l'Université d'Angers
Ce site est en cours de reconstruction certains liens peuvent ne pas fonctionner ou certaines images peuvent ne pas s'afficher.
Attention : la grande majorité du contenu de cette page a été généré avec Gemini de Google.
Les Indiens Pimas sont une population amérindienne vivant principalement dans l'Arizona (États-Unis) et au Mexique. Ils sont mondialement connus dans la communauté scientifique et médicale en raison d'une triste réalité : ils présentent l'un des taux de diabète de type 2 et d'obésité les plus élevés au monde.
Cette situation s'explique par la combinaison de deux facteurs majeurs :
Le contraste brutal entre leur génétique de "stockage" et l'abondance calorique moderne a provoqué une explosion des cas d'obésité et de diabète.
Le jeu de données (Pima Indians Diabetes Database) a été créé par le National Institute of Diabetes and Digestive and Kidney Diseases, ce dataset est devenu un standard en Machine Learning. Il contient les données médicales de femmes Pimas âgées d'au moins 21 ans. L 'objectif est prédictif : déterminer si une patiente va développer un diabète dans les 5 ans en se basant sur des mesures de diagnostic (taux de glucose, IMC, nombre de grossesses, insuline, etc.).
Le jeu de données possède 9 colonnes que nous appellerons :
Le champ glucose correspond au test HGPO (Hyperglycémie Provoquée par Voie Orale) qui est le test médical de référence mondial pour diagnostiquer le diabète et le prédiabète. Le test se déroule suivant le mode opératoire qui suit :
Comment interpréter le résultat ? Chez une personne saine dès que le glucose entre dans le sang, le pancréas détecte l'anomalie et libère immédiatement une forte dose d'insuline. L'insuline agit comme une clé qui ouvre les cellules pour qu'elles absorbent le sucre. Au bout de 2 heures, le sucre a été stocké et le taux dans le sang est redevenu normal.
Les valeurs du test sont donc interprétables ainsi :
Le champ fonction évalue le risque génétique de la patiente en se basant sur ses antécédents familiaux. Plus ce score est élevé, plus le risque génétique (et donc la probabilité que l'algorithme prédise un diabète) est important. Dans le jeu de données Pima, cette valeur varie généralement entre 0.078 (risque génétique très faible) et 2.42 (risque génétique très élevé).
On désire analyser les données afin d'être en mesure de prédire si une patiente va développer un diabète.
On va donc jouer le rôle d'un data-analyste et faire du machine learning (apprentissage artificiel) et du deep-learning (apprentissage profond).
Le jeu de données comporte :
On va utiliser des packages Python qui permettent d'analyser les données et de les afficher de manière intelligible. On va notamment :
On dispose des packages :
La liste des packages à installer est donnée par le fichier requirements.txt. On peut les installer grâce à la commande :
richer@solaris:~\$ pip install -r requirements.txt
...
Voici le script python, il est composé de plusieurs parties et fait un peu plus de 280 lignes :
On dispose d'une URL faisant référence au fichier .csv contenant les données mais sans le titre des colonnes. On fournit donc les noms des colonnes en français, puis on affiche les premières lignes du fichier ainsi que quelques statistiques.
grossesses glucose pression epaisseur insuline IMC fonction age diabete
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
...
count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000
mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 0.471876 33.240885 0.348958
std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 0.331329 11.760232 0.476951
min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.078000 21.000000 0.000000
25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 0.243750 24.000000 0.000000
50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 0.372500 29.000000 0.000000
75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 0.626250 41.000000 1.000000
max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 2.420000 81.000000 1.000000
Par exemple la première colonne de statistiques concerne la grossesse :
On évalue le nombre de patientes atteintes ou non de diabète :
On obtient
Soit une proportion 65% / 35%, ce qui indique que les patientes sans diabète sont presque deux fois plus importantes que celles avec diabète. La surreprésentation d'une catégorie par rapport à une autre peut biaiser les résultats.
Dans la plupart des analyses de ce type, il existe beaucoup de données mais également beaucoup de données manquantes. On peut soit éliminer les patients avec trop de données manquantes soit modifier les données en remplaçant une donnée manquante par la médiane des données connues.
Ici, plusieurs colonnes sont concernées et pour lesquelles on fait le choix de la médiane, un zéro indiquant une donnée manquante.
Il faut bien comprendre que cela peut fausser les résultats !
grossesses glucose pression epaisseur insuline IMC fonction age diabete
0 6 148.0 72.0 35.0 125.0 33.6 0.627 50 1
1 1 85.0 66.0 29.0 125.0 26.6 0.351 31 0
2 8 183.0 64.0 29.0 125.0 23.3 0.672 32 1
3 1 89.0 66.0 23.0 94.0 28.1 0.167 21 0
4 0 137.0 40.0 35.0 168.0 43.1 2.288 33 1
Attention, ici, pour l'insuline, la médiane donnée initialement était de 23.0 mais elle prenait en compte toutes les lignes qui contenaient des 0. La nouvelle médiane de 125.0 prend uniquement en compte les lignes qui n'ont pas de 0 pour cette colonne.
La visualisation graphique est souvent plus intéressante pour comprendre un jeu de données important. On génère ici trois graphiques.

On voit graphiquement, comme indiqué précédemment, qu'il y à peu près deux fois plus de patientes sans diabète que de patientes avec diabète.

Pour ce graphique, plus les facteurs sont corrélés, plus on est proche de 1.0 (sauf pour la diagonale qui n'a pas de sens). On voit donc, si on regarde la partie triangulaire supérieure ou inférieure, que :

Le test du taux de glucose est très important pour déterminer le diabète. Sur le graphique on note beaucoup de points verts pour des patientes :
Cependant, on observe également deux patientes atteintes de diabète de moins de 30 ans et un taux de glucose < 80 mg/dL !
Le pair-plot visualise les relations par paires entre toutes (ou partie) des variables d'un jeu de données.

Le diagramme ci-dessus permet de voir clairement qu'il sera difficile de classer les données (présence / absence de diabète) car on ne peut pas tracer de frontière entre le points verts et les points rouge. Si on peut tracer une ligne, une courbe ou un patatoïde qui sépare les données en deux ensembles distincts alors il est plutôt facile de trouver une classification.
Deux étapes préalables au traitement des données sont généralement effectuées avant de mettre en place des algorithmes de prédiction :
Au final on obtient :
La normalisation est nécessaire notamment pour les SVM et Réseaux de Neurones car si une variable possède de grandes valeurs ($v > 100$) et une autre variable de petites valeurs ($0 < w < 1$), alors la variable $w$ risque d'être totalement ignorée.
On utilise par exemple un
$$z = {x - μ}/σ $$
On soustrait la moyenne de la colonne ($μ$) à chaque valeur. Cela permet de "centrer" les données autour de 0. Puis on divise ensuite par l'écart-type de la colonne ($σ$). Cela permet d'avoir une dispersion (un écart-type) exactement égale à 1.
Une Machine à Vecteurs de Support (SVM) est un algorithme d'apprentissage automatique dont le but est de trouver la meilleure frontière possible pour séparer différentes catégories de données (hyperplan).
Le réslutat obtenu est le suivant :
==================================================
PRÉDICTION AVEC SVM
==================================================
- précision du SVM = 0.73
- rapport de classification
precision recall f1-score support
0 0.85 0.70 0.77 100
1 0.58 0.78 0.67 54
accuracy 0.73 154
macro avg 0.72 0.74 0.72 154
weighted avg 0.76 0.73 0.73 154
On parvient à prédire 75% des données du jet de test ce qui est bien mais pas extraordinaire. Cela signifie que dans 75% des cas on prédit la réponse attendue, on a donc 25% de chance de commettre une erreur.
L'analyse plus fine indique qu'on a 100 patientes de classe 0 (sans diabète) et 54 de classe 1 (avec diabète).
A priori le SVM souffre d'un biais vers la classe majoritaire : il a tendance à prédire 0 (pas de diabète) plus souvent parce qu'il a vu plus d'exemples sans diabète pendant son entraînement.
Pour afficher le résultat obtenu et comparer au jeu initial, on peut créer un petit graphique :

On affiche le graphique avec deux coordonnées fictives que l'on appelle des composantes principales. Chacune de ces composantes est une combinaison mathématique, une sorte de mélange, de toutes les colonnes d'origine.
L'analogie : si nos colonnes sont des fruits, la PCA ne choisit pas d'afficher une pomme et une banane. Elle crée un smoothie. La Composante Principale 1 est un jus composé, par exemple, à 60% de Glucose, 30% d'IMC, 5% d'Âge et 5% d'Insuline.
Un réseau de neurones (RN) agit comme un classifieur ou un prédicteur et dont le fonctionnement s'inspire du cerveau humain. Il dispose de plusieurs couches de neurones dont le but est de capturer une partie de l'information globale.
Le réseau de neurones est composé :
Il demande beaucoup de calculs car on doit entraîner le réseau à prédire le bon résultat par essais successifs et correction d'erreurs. On peut comparer le processus d'entraînement (également nommé apprentissage) à la minimisation d'une fonction d'énergie, où l'énergie est l'erreur par rapport aux bonnes prédictions.
Voici un exemple de réseau de neurone qui peut vous aider à comprendre le principe de fonctionnement des RN.
On veut ici générer un classifieur qui indique si oui ou non une patiente va déclencher du diabète dans 5 ans.
On crée un réseau composé :
Le choix du nombre de couches intermédiaires ainsi que le nombre de neurones dans chaque couche intermédiaire est laissé au programmeur.
Les
On passe en paramètre de l'apprentissage (fonction
On indique également de réaliser 150 évaluations en prenant les patientes par groupes de 32 personnes.
On évalue ensuite (fonction
- précision du réseau = 0.75
- perte = 0.55
- rapport de classification
precision recall f1-score support
0 0.83 0.78 0.80 100
1 0.63 0.70 0.67 54
accuracy 0.75 154
macro avg 0.73 0.74 0.74 154
weighted avg 0.76 0.75 0.76 154
On obtient des résultats similaires à ceux d'une SVM avec un prédiction de 75% bonnes prédictions sur le jeu de test.
On a vu que les patientes sans diabète sont sur-représentées. Que se passe t-il si parmi les 500 patientes sans diabète, on en choisit aléatoirement autant (268) que de patientes avec diabète ?
Dans ce cas, on obtient un meilleure prédiction aux alentours de 77 à 78%.
Il est très difficile de prédire de manière précise sur des données du vivant.
La normalisation des données peut introduire un biais non négligeable, la donnée est donc très importante et doit être la plus précise possible. Peut-être manque t-il également d'autres données : taux de triglycérides, etc qui permettrait d'augmenter le taux de bonnes prédictions.
Néanmoins, en quelques lignes de Python, on peut réaliser des traitements complexes et se faire passer pour un data-analyste.