Créer un dermatologue artificiel
Nom: Dermatologue.ai

La dermatologie est la branche de la médecine spécialisée dans le diagnostic des lésions de la peau. Dans le tutoriel, nous allons créer un programme capable de diagnostiquer quelques lésions dermatologiques à 92% de précision! Par contre, avant d’aller plus loin, je vais devoir expliquer le jargon que notre jeu de données contient.
Dua, D. and Graff, C. (2019). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml/datasets/Dermatology]. Irvine, CA: University of California, School of Information and Computer Science.
Si vous ne voulez pas construire l’algorithme et simplement le télécharger:
Commençons par décrire nos étiquettes qui sont ici des lésions dermatologiques.
Nous en avons psoriasis, dermatite séborrhéique, lichen planus, pityriasis rosea , dermatite chronique et pityriasis rubra pilaris.
La première est le psoriasis. Celui-ci est fréquent et touche environ 2 – 3% de la population mondiale (Pariser M. et al.). L’apparition des lésions est aussi fréquemment associée au développement d’une arthrite psoriasique (Chandran V. et al.). Bref, c’est une maladie inflammatoire systémique qui cause des lésions non contagieuses de la peau très distinctives qui peuvent ressembler à des croûtes ou de la peau sèche. La physiopathologie du psoriasis est caractérisée par une prolifération anormale des kératinocytes et une infiltration des cellules immunitaires dans les couches de la peau (Gerb J. et al). Cependant, plusieurs sous-types avec d’autres apparences existent. Malheureusement, notre jeu de données n’entre pas dans les détails en ce qui a trait au genre de sous type de psoriasis qui est utilisé. Par conséquent, l’apparence des lésions pourrait varier parmi celles présentées ci-dessous. (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
Image – Psoriasis #1 Image – Psoriasis #2Nous avons ensuite la dermite séborrhéique. Cette atteinte dermique est caractérisée par des plaques rouges sur des zones riches en sébum comme le visage, les lèvres ou le cuir chevelu. Ces zones hautes en production séborrhéique offrent un milieu propice à une colonisation fongique qui engendre la pathologie. Cette maladie touche environ 11.6% de la population et semble être liée au genre de levure Malassezia (Berk T. et Scheinfeld N.). Puisque la maladie est causée par une infection fongique, le traitement recommandé est très similaire à celui de l’acné: des crèmes contenant de l’acide salicylique, de la crème contenant des agents antifongiques (anti-mycosiques) et de la crème ou du gel anti-inflammatoire contenant des stéroïdes (Naldi L. et Diphoorn J.). (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
Image – Dermite séborrhéique #1
Image – Dermite séborrhéique #2
Par la suite, nous avons le lichen plan. C’est une maladie inflammatoire affectant la peau et/ou les muqueuses de la bouche. Celle-ci touche entre 1-2% de la population et elle est caractérisée par une éruption fulminante de plaques de couleur rosée qui peut durer entre 12 et 18 mois. Ces éruptions peuvent même aller jusqu’à causer des rhumatismes musculaires (Sugerman et al.). Les lésions sont dites lichénoïdes puisqu’elles ressemblent à l’apparence du lichen. (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
La quatrième lésion dermatologique est le pityriasis rosé de Gibert ou pityriasis rosea. Cette pathologie est très intéressante pour l’universalité de sa présentation. Celle-ci débute avec l’apparition d’une petite tache rouge sur le thorax nommée tache de Brocq, aussi connue sous le nom de hearlad patch. Par la suite, de plus petites rougeurs apparaissent autour de cette tâche mère. Cette atteinte dermatologique touche principalement les jeunes femmes entre 20-30 ans de manière saisonnière (S. Eisman & R. Sinclair). On semble y attribuer une connexion avec les virus de l’herpès 6 et 7, mais les lésions demeurent non contagieuses (Eisman S.). (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
La cinquième lésion est la dermatite chronique . Celle-ci est probablement la plus notoire de notre liste puisqu’elle est également connue sous le nom d’eczéma! Il s’agit d’une famille de sous maladies dont les lésions sont caractérisées par une rougeur de la peau avec un prurit (démangeaison) sévère. Souvent, ceux qui souffrent d‘eczéma vont avoir une lichénification des zones atteintes (S. Nedoros). La maladie touche entre 1-20% de la population. Étonnamment, l’eczéma touche 10-20% de la population pédiatrique, mais cela diminue abruptement chez les adultes où les proportions se situent autour de 1-3%. Cependant, le nombre de cas ne cesse d’augmenter pour des raisons toujours inconnues (Lee J.H et al.). (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
Notre dernière maladie est le pityriasis rubra pilaris aussi connu sous le nom de maladie de Devergie. C’est une maladie caractérisée par de multiples papules rougeâtres, voire orange. Ces plaques peuvent apparaître partout sur le corps. De plus, les patients atteints de cette maladie ont souvent un épaississement de la peau des mains et des pieds ainsi que des problèmes d’ongles (NIH). (Cliquez pour voir – si vous avez le coeur sensible, vous pouvez sauter à la prochaine description!)
Maintenant que nos étiquettes sont décrites et que nous avons un peu plus d’informations sur ce que nous voulons prédire, passons un peu de temps à décrire nos données ainsi que les 33 attributs.
Les attributs du patient, tous définis ci-dessous, sont fixés sur une échelle entre 0-3.
1: Érythème: Une rougeur cutanée plus ou moins importante.
2: Desquamation: La perte des couches superficielles de la peau.
3: Définition de la bordure de la lésion: Si la lésion à des bordures bien définies ou non.
4: Prurit: La sévérité de la sensation de grattement.
5: Phénomène de Koebner: La sévérité de la réponse au test de Koebner.
6: Papules polygonales: La présence de papules dites polygonales. Celles-ci sont particulières à certaines atteintes dermatologiques.
7: Papules folliculaires: La présence de papules dites folliculaires. Celles-ci sont particulières à certaines atteintes dermatologiques.
8: Atteintes des muqueuses buccales: La sévérité, si présente, de l’atteinte buccale.
9: Atteintes aux coudes et aux genoux: La sévérité, si présente, de l’atteinte aux genoux et coudes.
10: Atteintes au cuir chevelu: La sévérité, si présente, de l’atteinte au cuir chevelu.
11: Histoire familiale, (0 – non / 1 – oui): Est-ce que la maladie est aussi présente dans la famille?
34: Âge: Age du patient.
Les attributs histopathologiques sur une échelle de 0 à 3:
12: Incontinence en mélanine: Quantification du changement de coloration de la peau à la lésion.
13: Infiltration en éosinophiles: Quantification de l’infiltration en éosinophiles.
14: Infiltration en leucocytes polymorphonucléaires: Infiltration d’éosinophiles, de basophiles et de neutrophiles dans la lésion.
15: Fibrose du derme papillaire: Quantification de la fibrose du tissu lésé.
16: Exocytose: En dermato-pathologie, c’est la quantification de cellules habituellement trouvées dans la circulation dans le tissu lésé.
17: Acanthose: Hyperplasie du tissu du derme.
18: Hyperkératose: Hyperprolifération des kératinocytes.
19: Para-kératose: Un type d’hyperkératose où les noyaux des cellules sont conservés dans l’épiderme.
20: Clubbing des crêtes Rete: Grossissement des crêtes de Rete qui sont des formations ondulatoires dans la peau.
21: Élongation des crêtes Rete: Élongation des crêtes de Rete qui sont des formations ondulatoires dans la peau.
22: Amincissement de l’épiderme suprapapillaire: Amincissement de la couche dermique.
23: Pustule spongiforme: Présence d’une couche spongieuse sous le stratum corneum.
24: Microabcès de Munro: Accumulation de neutrophiles ou abcès dans le stratum corneum.
25: Hypergranulose focale: Hyperkératose, mais focalisée en un seul endroit.
26: Absence de la membrane granuleuse: La perte du stratum granulosum.
27: Vacuolisation et dommages au stratum basale: Dommages à la couche de la peau nommée stratum basale.
28: Spongiose: La dissociation des cellules de l’épiderme causant de petites vacuolisations.
29: Apparence en scie des crêtes de Rete: Apparence caractéristique des tissus dermatologiques lésés.
30: Bouchons folliculaires en corne: Hyperkératose dans les canaux folliculaires.
31: Parakératoses para-folliculaires: Un mode de kératinisation caractérisé par la rétention de noyaux dans la couche cornée qui affecte les cellules parafolliculaires.
32: Infiltration mononucléaire: Infiltration du tissu par des macrophages et lymphocytes.
33: Infiltration de type band: Infiltration du type lymphoïde dans le tissu lésé.
Maintenant que le tout est bien expliqué, passons à l’action!
L’algorithme
Avant d’aller de l’avant avec le projet KNIME, j’aimerais passer un peu de temps sur les types de modèle que nous allons utiliser dont l’arbre de décision. Visuellement, ce modèle ressemble à au schéma présenté ci-dessous. (Pour une super vidéo: StatQuest)

Cela ressemble-t-il à quelque chose qu’on connaît bien? Eh oui! En médecine on les appelle des algorithmes de diagnostic (exemple: algorithme de diagnostic pour le VIH de l’OMS). Bref, il s’agit d’une manière de catégoriser une population hétérogène en deux selon un critère particulier pour ainsi donner lieu à deux sous population mieux uniformisées. Par exemple, prenons un arbre de décision qui catégorise les gens grands et petits selon un critère de 180 cm. Les gens dont la taille excède 180 cm vont dans notre population de droite (ou vert foncé) alors que notre population petite est à gauche (ou du côté vert pâle). Ces deux sous populations sont alors plus homogène en terme de taille que l’originale. Il est important de noter qu’on divise toujours une population en deux. Par conséquent, il n’y a pas d’entre-deux, mais bien deux extrêmes.
Mais quoi faire pour des populations plus complexes? Disons que l’on veut des gens de taille moyenne en plus de gens petits et grands. Eh bien, nous pouvons rallonger l’arbre avec une seconde division!
Dans le jargon des sciences des données, ces bulles vertes sont nommées feuilles ou leaf.

Ici, on a un exemple où, suite à la première filtration, une population encore trop hétérogène subsiste (celle de gauche). Par conséquent, celle-ci est re-filtrée avec une autre marge. Pour reprendre notre exemple avec la taille des gens, la première opération divisait notre population grande à droite et la petite à gauche. Désormais, une autre division permet de séparer cette seconde population hétérogène en deux autres groupes pour obtenir nos populations de taille moyenne et petite qui sont plus homogène que la feuille de départ.
Comment fait-on pour choisir le seuil pour la filtration? En d’autres mots, comment l’algorithme décide-t-il de classifier les gens grands lorsque leur taille excède 180 cm? Eh bien, nous allons utiliser ce que nous appelons le score d’impureté de Gini!
Prenons un premier exemple:

Pour tracer notre division, et donc pour séparer notre population de points orange de celle en bleu, c’est plus ou moins facile. Disons que les points bleus sont les gens dits petits et que les points orange sont les gens de grande taille.

Donc avec ce simple exemple de séparation, nous pouvons voir que nous obtenons deux populations uniformes, ou en d’autres termes, homogènes. Cette homogénéité peut être quantifié par l’équation suivante.

Où I(G) est l’index de Gini, qui est calculé pour chaque côté de notre axe décisionnel (ligne pointillée), et p(j) est la probabilité de choisir un objet de classe j.
Explication si tu n’aimes pas les mathématiques:
Prenons un groupe de points comme celui-ci afin d’illustrer le point autrement:
OOOOO
Quel est le score d’impureté de ce groupe de point? (À noter que le score d’impureté se calcule pour chacun des côtés de la séparation!)
Commençons par le symbole p(j) (appelons-le pyjama) pour les O. Le symbole pyjama représente la probabilité de trouver ce qu’on veut dans la population de points qu’on observe. S’il y a 4 sur 5 qui sont O et bien pyjama va avoir une valeur de 4/5.
OOOOO = 4/5 = 0.8
La valeur de pyjama est ensuite mise au carré.
pj^2 = 0.8^2 = 0.64
Parfait! Maintenant le gros Σ (sigma) veux dire qu’on doit additionner la valeur du terme pyjama^2 à l’autre type de valeur, ici: O (OOOOO).
Σpj^2 = 0.64 + pj^2 = 0.64 + (1/5)^2 = 0.64 + (0.2)^2 = 0.64 + 0.04 = 0.68
Pour obtenir le score d’impureté de Gini il ne reste plus qu’à faire 1 – 0.68 = 0.32!

Donc ici, pour notre quadrant gauche occupé par les points bleus, le score d’impureté peut être calculé ainsi:
1 – (1^2 + 0^2) = 0 = score d’impureté de Gini à gauche.
Que vient-il de se passer? La probabilité de trouver un point bleu à gauche est de 100% ou de 1 (représentée par le terme 1^2) et la probabilité de trouver un point orange dans le quadrant de gauche est de 0% ou 0 (représentée par le terme 0^2). Par conséquent notre score d’impureté de Gini est de 0 (100% pure). Nous pouvons répéter la même chose de l’autre côté ce qui nous donnerait:
1 – (0^2 + 1^2) = 0 = Index de Gini à droite.
Par conséquent, nous pouvons voir qu’un secteur pur donne un score d’impureté de Gini de 0, alors qu’un mauvais score d’impureté se situe vers 0.5. 0.5 est expliqué que 50% de la population est bleue et l’autre 50% est orange. Par conséquent, la population est parfaitement hétérogène.
Prenons un second exemple:

Ici nous avons une population pure dans notre quadrant de gauche, mais ce n’est pas le cas pour notre population de droite. Comment calculer le score de Gini dans cette situation-ci?
Reprenons notre formule:

Par conséquent, si nous commençons à mesurer le score d’impureté de Gini pour notre quadrant de gauche, nous devrions obtenir la même chose que sur l’exemple précédent.
1 – ((4÷4)^2 + (0÷4)^2) = 0 = score d’impureté de Gini à gauche.
Cependant, pour notre quadrant de gauche, l’histoire est différente. Ici, notre probabilité de tomber sur un point orange est de 5/6. Par conséquent, notre score d’impureté de Gini va changer pour représenter cette impureté.
1 – ((1÷6)^2 + (5÷6)^2) = 0.2778 = score d’impureté de Gini à gauche.
Ici, la probabilité de tomber sur un point bleu dans le quadrant de droit est de 1 sur 6 et la chance de tomber sur un point orange est de 5/6. Donc, le score de Gini va être de 0.2778.
Par contre, si nous utilisons la même distribution de points, mais que nous changeons le barrière de séparation quelque peu, nous retrouvons un score de Gini de 0 pour nos deux secteurs.

Bon bon bon, donc nous somme maintenant en mesure de quantifier l’efficacité d’une séparation et de voir comment bouger la séparation influence le score d’impureté de Gini. Mais comment trouver LA meilleure séparation pour un nuage de points donnés?
Afin d’y arriver, nous devrons regarder le gain de Gini. Pour ce faire, il faudra soustraire une impureté totale dont la valeur, tel que mentionné ci-haut, serait de 0.5 par les valeurs de chaque secteur avec un petit twist!

Ici, nous avons 4 points bleus à gauche avec un score de d’impureté de Gini parfait (donc de valeur de 0) et 6 points dans le secteur de droite avec le score d’impureté de Gini de 0.2778 (calculé précédemment). Par conséquent le gain de Gini sera calculé comme ceci.
- Nous allons multiplier notre score d’impureté par le nombre de points dans le secteur divisé par le nombre total de points dans le graphique:
(0 * (4 ÷ 10)) + (0.2778 * (6 ÷ 10)) = 0.1667
- Par la suite, nous n’avons qu’à soustraire le terme que nous venons d’obtenir du score d’impureté le plus horrible, soit 0.5.
Le gain de Gini = 0.5 – 0.1667 = 0.333
Par conséquent, l’algorithme va bouger la ligne pointillée de notre beau graphique tout en calculant le gain de Gini afin de choisir la position qui le minimise le plus! Et voilà!
Ceci est ensuite répété avec de nouvelles branches jusqu’à ce que les populations obtenues soient le plus pures possible. C’est à ce point que l’algorithme va choisir de couper la feuille en deux.
Passons à notre algorithme!
Lançons notre session KNIME!

Désormais, vous devriez savoir quelle sera notre première node: CSV Reader!

Vous devez simplement importer le jeu de données en haut de ce tutoriel dans le panneau de configuration de la node. Celui-ci devrait porter le nom de dermatology.csv.

Il ne reste plus qu’à exécuter la node!

Par la suite, nous allons filtrer une des colonnes puisqu’il lui manque des donnés. Nous aborderons ce problème par la suite, mais pour l’instant, nous ne ferons que l’enlever. Pour cela, il faut importer la node Column Filter sous manipulation > Column > Filter. Par la suite, il s’agit simplement connecter la node CSV Reader à Column Filter.

Pour la filtration, nous allons conserver toutes les colonnes sauf celles avec le titre band-like infiltrate. Pour ce faire, il faut sélectionner la colonne pour ensuite cliquer sur la flèche simple qui pointe vers la gauche et cliquer Apply et OK. Enfin, vous n’aurez qu’à exécuter la node!

Par la suite, nous allons suivre la même recette que d’habitude: une node Partitioning, nos deux nodes du modèle d’apprentissage machine choisi (cette fois-ci nommées Decision tree learner et Decision tree predictor) et puis notre node Scorer.

Après avoir tout exécuté nos nodes, il faudra simplement ajouter la node Scorer.

Vous n’aurez ensuite qu’à configurer la node (rien ne devrait changer) et rouler la node Decision Tree Predictor pour exécuter les deux d’un seul trait!

Ensuite, vous devrez introduire la node Scorer qui se trouve sous Analytics > Mining > Scoring > Scorer. Une fois cette node ajoutée et connectée, simplement ouvrir le panneau de configuration et cliquer sur Apply et OK. Par la suite, cliquez sur Execute and Open Views. Et voilà! Un algorithme avec 92% de précision!
Voici la matrice de confusion:

Nous pouvons voir que 8 patients ont été mal classifiés. Par exemple, un patient souffrant de psoriasis est faussement catégorisé comme étant un patient souffrant de dermatite séborrhéique. On constate ainsi que l’algorithme a beaucoup de difficulté à bien distinguer le pityriasis rubra pilaris. Cela est illustré par le fait que quatre des sept cas ont été classifiés correctement. Les autres symptômes de patients sont confondus pour ceux de la dermatite séborrhéique. Mais globalement, pour les autres atteintes dermatologiques, nous obtenons d’excellentes performances!
Encore une fois, comme dans le dernier tutoriel, pour avoir un réel estimé de la qualité de l’algorithme, il va falloir itérer plusieurs fois l’algorithme pour faire la moyenne des erreurs.