Classification de cellules

Nom: pathologiste.ai

La classification de cellules est une partie importante de la pathologie. Dans le tutoriel ci-dessous, nous allons tenter de travailler avec des données cellulaires pour créer un algorithme capable de distinguer des cellules cancéreuses de celles qui sont normales.

Nous utilisons énormément ce genre de technique en recherche, par exemple, avec la cytométrie en flux. C’est une technique capable de séparer des populations cellulaires complexes à l’aide d’un laser et de quantifier comment celui-ci est dévié par le contenu cytoplasmique. 

Categoriser des cellules cancereuses

Le jeu de données

Les données utilisées pour cette section proviennent du populaire jeu de données: Breast Cancer Wisconsin Data SetCelui-ci contient diverses valeurs de cellules normales de même que cancéreuses. 

Vous pouvez télécharger les données sous forme de CSV ci-dessous.

Créateurs:

1. Dr. William H. Wolberg, General Surgery Dept.
University of Wisconsin, Clinical Sciences Center
Madison, WI 53792
wolberg ‘@’ eagle.surgery.wisc.edu

2. W. Nick Street, Computer Sciences Dept.
University of Wisconsin, 1210 West Dayton St., Madison, WI 53706
street ‘@’ cs.wisc.edu 608-262-6619

3. Olvi L. Mangasarian, Computer Sciences Dept.
University of Wisconsin, 1210 West Dayton St., Madison, WI 53706
olvi ‘@’ cs.wisc.edu

Donneur:

Nick Street

Ces valeurs incluent:

  1.  Radius: Le rayon moyen cellulaire ou la moyenne des distances entre le périmètre membranaire et le centre de la cellule.

2. Texture: La déviation standard de l’échelle de gris.

Cette mesure est un peu compliquée. Brièvement, lorsqu’on mesure des images en échelle de gris, il est possible de mesurer l’intensité du gris pour chaque pixel dans l’image. Pour des systèmes à architecture en 8-bits c’est 2∧8 ou 256 niveaux de gris possible par pixel. Ensuite, ces scores pour chaque pixel peuvent être placés sur un graphique à partir duquel la distribution standard peut être calculée.

Modifié de: Ciaccio, Edward & Tennyson, Christina & Bhagat, Govind & Lewis, Suzanne & Green, Peter. (2010). Classification of videocapsule endoscopy image patterns: Comparative analysis between patients with celiac disease and normal individuals. Biomedical engineering online. 9. 44. 10.1186/1475-925X-9-44. 

3 – Perimeter: Le périmètre cellulaire ou le périmètre membranaire de la cellule.

4 – Area: Aire occupée par la cellule

5 – Smoothness : La variation locale en longueur du rayon de la cellule. 

6 – Compactness : la densité cellulaire, celle-ci est calculée ainsi : (périmètre∧2) ÷ (aire – 1.0)

7 – Concavity: La concavité ou sévérité de la concavité en certains points de la membrane cellulaire.

8 – Concave points: Nombre de points concaves ou sommes des points concaves de la membrane cellulaire.

9 – Symmetry: Symétrie de la cellule. Quantification de l’uniformité de celle-ci.

10 – Fractal dimension: Dimension fractale, celle-ci est calculée ainsi: Approximation costale – 1. (Pour voir une merveilleuse explication de ce qu’est la dimension fractale)

Bref le jeu de données, ouvert sur Excel, ressemble à ceci:

 

Nous obtenons ainsi 11 colonnes: 10 avec les différentes mesures cellulaires et la dernière, nommée target, avec le type de cellule.

À partir de maintenant nous allons définir deux termes:

1. Données prédictrices ou en anglais features : données indépendantes qui sont utilisées pour prédire la valeur de données cibles. Dans notre cas, ce sont nos mesures de nos petites cellules.

2. Étiquettes ou en anglais labels : données d’intérêt. Leurs valeurs sont ce que l’on recherche à prédire. Dans notre cas, c’est la nature de notre cellule (normale ou cancéreuse).

Notre but est maintenant de créer un algorithme capable d’utiliser nos données prédictrices pour prédire la valeur des données cibles associées.

L’algorithme

Si vous voulez simplement télécharger l’algorithme, vous pouvez le faire ici:

Maintenant que nous comprenons nos données, nous pouvons démarrer notre session KNIME.

Commençons par télécharger nos données dans notre session de travail. Pour ce faire, il faut importer une node de lecture de CSV ou CSV reader. Pour ce faire, simplement aller dans I/O > Read > CSV reader.

Maintenant que la node est importée, regardons-la d’un peu plus prêt.

Chaque node à un nom, un feu de circulation et un ou plusieurs petits triangles noirs. 

Les triangles noirs, lorsqu’ils se trouvent à la gauche de l’image, représente l’entrée de données, et lorsqu’ils se trouvent à sa droite, ils représentent la sortie de données. 

Le ”feu de circulation” représente le statut de la node. Rouge = Non configurée, Jaune  = configurée mais non-exécutée et Verte = exécutée et prête. La node devient alors jaune lorsque de l’information d’une node précédente lui est transmise. Ceci pourrait aussi être le cas lorsque la première node du système (comme dans le cas de CSV reader) est configurée. La node devient verte lorsqu’elle peut transmettre ses données à la prochaine. Si cela ne vous semble pas claire, tout le deviendra sous peu! 

Si on double-clique sur la node, nous obtenons le menu de configuration de celle-ci:

Avec l’outils Browse… nous allons télécharger le jeu de données. Ceci est important puisque /Users/Alexis/Desktop/jeux de données/Paramètres_cellulaires.csv va être remplacé par la location du jeu de données sur votre ordinateur. S’assurer aussi que l’option Has Row Header est désactivée. Le reste des options présentes peuvent être laissée à elles-mêmes. Après avoir cliqué sur Apply et Ok la node va devenir jaune. (ce qui nous confirme qu’elle est désormais configurée)

Par la suite, pour executer la node, simplement cliquer sur la node et cliquer Execute

La node va ensuite devenir verte.

Nous allons maintenant jeter un coup d’oeil à nos données. Pour ce faire, nous devons associer des couleurs pour nos catégories (cancer et normales). Pour ce faire, nous allons importer la node Color Manager sous Views > Property > Color Manager. Par la suite, nous allons connecter la node CSV Reader à Color Manager.

Nous pouvons tout simplement ouvrir le panneau de configuration, accepter et exécuter la node en cliquant Apply et OK et puis Execute avec un clique de droite.

Par la suite, avec notre node Color Manager prête, nous allons visualiser nos données en connectant une node nommée Scatter Plot  sous Views > JavaScript > Scatter plot. 

En ouvrant le panneau de configuration en cliquant sur la node, nous pouvons varier les variables utilisées pour les axes. Nous allons choisir radius et texture

Cliquer sur OK – Execute et ensuite cliquer sur execute and Open Views. 

Ci-dessous, un exemple selon un graphique utilisant la texture vs le rayon cellulaire (celui-ci peut prendre un peu de temps à générer): 

Comme nous apperçevoir voir une bonne séparation entre nos deux populations, la question est maintenant de créer un algorithme capable  de catégoriser automatiquement ces populations.

Pour simplifier notre algorithme, nous allons isoler les deux colonnes utilisées pour la figure ci-haut:radius et texture. Pour ce faire, nous allons utiliser une node nommée Column filter sous Manipulation > Column > Filter > Column filter.

Nous allons ensuite filtrer le colonnes non nécessaires en utilisant le menu de configuration comme suit:

La node Column filter peux ensuite être executée en cliquant Apply et OK ainsi qu’Execute.

Nous allons maintenant introduire un nouveau concept. En intelligence artificielle, tout comme dans n’importe quel processus d’apprentissage, nous entraînons un algorithme à compléter une tâche particulière. Par conséquent, nous devons consacrer une partie de nos données à l’entraînement de notre algorithme. Par contre, nous devons créer une manière de quantifier la qualité de notre algorithme. En d’autres mots, nous devons être capable de noter la capacité de l’algorithme de prédire des valeurs cibles ou étiquettes à partir de valeurs prédictives. Pour ce faire nous devons aussi conserver des données pour créer un examen avec de données qui ne fut jamais utilisées lors de l’entrainement. Par conséquent nous allons diviser notre jeu de données en données d’entraînement et donnée tests

Pour illustrer le concept autrement, c’est comme le processus d’enseignement. Le contenu d’un cours est en grande majorité enseigné en cours pour que les élèves se créent un modèle mental pour le cours. Par la suite, une petite partie du contenu est conservé pour créer un examen pour évaluer la qualité du modèle mental des élèves. Par la suite, le score obtenu à l’examen est un évaluation de la précision du model mental des élèves. 

Pour ce faire, nous allons importer une node nommée Partitioning. Celle-ci se trouve sous Manipulation > Row > Transform > Partitioning.  

Par la suite, pour activer et exécuter la node, il faut tout simplement ouvrir le menu de configuration. Ici nous voyons que nous allons diviser en 70/30 notre jeu de données. En d’autres mots, nous allons conserver 70% (n = 399) de nos données cellulaires pour l’entraînement de notre algorithme et conserver 30% (n = 171) pour l’évaluation de la qualité de nos prédictions.

Une fois avoir cliqué sur Apply et OK, nous pouvons executer la node. Par la suite, nous allons plonger dans le choix de notre classificateur. Il serait possible de tenter d’utiliser plusieurs modèles supervisés dans le cas suivant. Par conséquent je vais utiliser l’un de mes modèles favoris: séparateur à vaste marge (SVM). 

Sans trop compliquer la chose, le modèle SVM tente de diviser des populations au moyen d’une équation qui peut être linéaire, polynomiale ou circulaire. En gros, l’algorithme trace une frontière entre les deux zones. Puisque c’est le premier tutoriel et je ne désire pas rentrer dans les détails du modèle, je vous recommande cette excellente vidéo!

Par conséquent, le modèle tente de créer une ”barrière” qui circonscrit de manière optimale les groupes de points. Chaque nouveau point sera donc classifié selon sa position par rapport à cette ligne. 

Pour utiliser un modèle dans KNIME, nous devons utiliser deux nodes: SVM Learner et SVM Predictor. Elles se trouvent dans Analytics > Mining > SVM. Par la suite, la node Partitioning à SVM learner et SVM predictor. Par la suite, SVM learner est connecté au SVM predictor. 

Commençons par configurer le SVM Learner:

Par mesure de simplicité nous n’allons pas jouer avec les options du panneau de configuration de la node SVM Learner. Par la suite, la node SVM Learner peut être executée. La même chose peut être faite pour la node SVM Predictor. Par conséquent, nous avons compléter notre modèle … ou presque.

Il nous reste qu’une node à ajouter et nous avons terminé! Mais avant, je vais devoir introduire un dernier concept: la matrice de confusion.

Il existe plusieurs manières de quantifier la qualité d’un algorithme. La matrice de confusion est l’une d’elles et, selon moi, la plus simple. Elle consiste en une matrice 2X2 à 4 valeurs: les vrai positifs, les faux positifs, les vrai négatifs et les faux négatifs. En détail:

  1. Un vrai positif est une valeur qui est une prédiction que l’algorithme classifie comme vrai lorsqu’elle est aussi vrai dans la réalité. Par exemple: un algorithme qui classifie une personne ayant un cancer de la prostate et que la personne a effectivement un cancer de la prostate.  
  2. Un faux positif est une valeur prédite comme vraie, lorsque dans la réalité elle ne l’est pas. Reprenant l’exemple initial, un faux positif serait la classification d’un individu dans la catégorie ayant un cancer alors que la personne n’en a pas. Un point important en médecine: Les tests médicaux, dans la majorité des cas, tentent de garder cette valeur à un minimum. 
  3. Un vrai négatif est une valeur prédite comme négative et qui est en effet négative dans la réalité. L’équivalent d’être identifié par un test comme n’ayant pas le cancer et que ça soit le cas. 
  4. Un faux négatif est lorsqu’une valeur est prédite comme négative ne l’est pas. C’est l’équivalent de prédire qu’une personne n’a pas le cancer alors qu’elle en a un.

Visuellement, la matrice de confusion ressemble à ceci: 

Par définition, en haut à gauche nous retrouvons nos vrais positifs (53), en haut à droite les faux positifs (16), en bas à droite les faux négatifs (9) et en bas à droite les vrais négatifs (93).

Au moyen de la matrice de confusion, il est ensuite facile de calculer la sensibilité et la spécificité. Celles-ci sont calculées au moyen des équations suivantes:

Sensibilité = VP ÷ (VP + FN)

Spécificité = VN ÷ (VN + FP)

Nous allons, par contre, utiliser la statistique Accuracy ou Exactitude qui est calculée ainsi:

Accuracy =  (VP + VN) ÷ (VP + VN + FP + FN)

Je vais utiliser le terme Accuracy pour s’orienter plus facilement dans l’interface anglophone de KNIME.

Pour une vidéo détaillant encore plus la matrice de confusion, veuillez voir cette vidéo

Dans notre cas, nous allons créer notre matrice de confusion avec la node Scorer sous Analytics > Mining > Scoring > Scorer et connecter la node avec la sortie de données du SVM Predictor

Le panneau de configuration de la node devrait être déjà prêt à être exécuté. Simplement cliquer sur Apply et Ok

Une fois réalisée, cliquer sur Execute and Open Views.

Une fois exécutée, la node nous donne notre merveilleuse matrice de confusion!

Wohooo! Bravo, nous avons réalisé notre algorithme! Dans mon cas, mon algorithme fait 5 faux négatifs et 13 faux positifs. Ce total de 18 erreurs est petit lorsque comparé au 153 cellules bien classifiées! 

Votre valeur pour l‘Accuracy de votre algorithme est différente? C’est normal! Je vais rentrer dans les détails lors du prochain tutoriel, mais ceci est dû aux différentes données choisies lors de la division d’entraînement-test.  Puisque nous avons séparé les ensembles de manière aléatoire, certains vont avoir des valeurs plus faciles à classifier dans leur plus test (un examen plus facile) tandis que d’autres vont avoir des cas plus difficiles (examen plus difficile). Évidemment, des cas plus difficile a classifier augmente les chances de faux positifs/négatifs et donc diminue l’Accuracy, même si le modèle est le même.