Clusteriser un DataSet selon 3 variables avec TensorFlow et Python

Principe

En Data science ou Data engineering, il est courant de devoir partitionner un groupe de populations selon plusieurs variables. Par exemple, on souhaite identifier un groupe de populations jeune dont le poids et la taille sont élevés. Dans cet article, nous vous proposons d’utiliser TensorFlow et Python pour traiter cette problématique.

Très généralement, pour ce cas d’usage, on va utiliser l’algorithme des K-Means (ou des K moyennes  en français). Cet algorithme de machine learning, non supervisé, est utilisé pour partitionner un jeu de données en N groupes ou clusters selon un principe d’optimisation discrète (Plus d’infos ici : https://fr.wikipedia.org/wiki/K-moyennes).

Revenons à un exemple concret simple. J’ai à disposition une population d’individus plutôt conséquente, sur laquelle je souhaite identifier un groupe de personnes ayant des caractéristiques communes. Par exemple, nous souhaitons identifier une population jeune, dont le poids et la taille sont élevés. Une fois ce groupe identifié, on sera en mesure d’y appliquer d’autres méthodes de sélection plus ciblées, ou d’éliminer des groupes dont les caractéristiques ne répondent pas aux objectifs d’analyses fixés.

Cet exemple est donné à titre d’exemple. En effet, il est tou d’abord assez peu représentatif de la réalité. Le K-Means peut donner des résultats un peu étranges notamment en fonction de la distribution des données qui est, ici totalement aléatoire. De plus, les variables ne sont pas corrélées.

Environnement technique: TensorFlow, Python et un peu de Cloud ?

Pour réaliser ce test, nous allons avoir besoin d’un environnement technique dont les caractéristiques sont données ci-dessous.

  • Python 3.6

Pour écrire cette implémentation, nous allons utiliser Python (dans sa version 3.6). Python est le langage approprié pour de nombreuses problématiques de Data Science notamment. De plus, c’est un langage riche en librairies. Dans notre exemple, nous avons utilisé les librairies suivantes :

  1. Numpy pour la représentation matricielle et le calcul scientifique
  2. Matplotlib pour la représentation graphique des résultats
  3. Mpl_toolkits.mplot3d pour la représentation 3D
  4. os pour le positionnement de variables d’environnement visant à rendre Numpy et Tensorflow plus ou moins verbeux.

et Tensorflow …

  • Tensorflow

Tensorflow est une librairie de Machine Learning (et surtout de Deep Learning) développée par Google. Son intégration avec Python est très simple, et ses APIs richement documentées (https://www.tensorflow.org/api_docs/). De plus, c’est une librairie entièrement interfaçable avec les GPU. Pour de simples problématiques de Machine Learning, il faudra installer la librairie CuDA, et CuDnn si vous souhaitez développer un modèle basé sur un réseau de neurones.

  • Cloud

Si le volume de données en entrée est conséquent, il est conseillé de disposer d’une grosse puissance de calcul. Dans ce cas, une plateforme optimisée pour le machine learning de type GCP ou Amazon SageMaker sera un choix incontournable.

Les différentes parties du code

Configuration et initialisation des données

La première partie du script est assez simple, elle consiste en une déclaration des packages et des variables visant à rendre Numpy plus verbeux, et Tensorflow un peu moins verbeux (on se retrouve sinon avec tout le debug lié au GPU)

Ensuite, nous avons utilisé les fonctions de randomisation offertes par Numpy pour initialiser un tableau de 3 colonnes représentant nos 3 variables que sont le poids, l’âge et la taille (ces données sont là pour l’exemple, la réalité est toute autre 😉 ).

C’est également dans cette partie du code que l’on définit la taille de notre échantillon, ici 1000. Si cet exemple avait été constituée de véritables données, l’initialisation aurait été réalisée à partir de différentes sources (fichiers, bases relationnelles etc.)

Déclaration du modèle et entrainement

La partie suivante est importante car elle va définir une fonction qui va transformer notre source de données (en l’occurrence notre tableau) en un tensor (objet de base dans tensorflow) dont le nombre de cycles d’évaluation va être positionné à 1.

Nous abordons la partie principale du script, dans laquelle nous allons successivement déclarer notre Estimator de type Kmeans, le nombre de clusters désirés. Cette déclaration sera suivie par l’entrainement à proprement dit. L’entrainement d’un KMeans consiste à déplacer les centres des clusters pour les rapprocher au plus près des points ou plutôt du triplet de variables représenté par notre point. Bien évidemment, plus il y aura de cycles et plus la segmentation sera correctement réalisée. Ceci s’observe assez facilement par le scoring qui, au dernier tour d’entrainement, n’évolue plus trop (voire plus du tout).

Notons que dans cette partie de code, on peut facilement obtenir les coordonnées des centres de cluster en invoquant la fonction cluster_centers() de l’objet KMeansClustering.

La dernière partie du traitement (hors affichage des résultats) se réalise en récupérant les indexs du cluster. En somme, on associe un point à un cluster identifié par un nombre.

Voilà, le Kmeans est terminé. Il est temps de passer à l’affichage des résultats.

 Affichage et représentation des résultats

Dans un premier temps, l’affichage est réalisé sous format texte dans la sortie standard:

Ce qui nous donne ce genre de résultats (très peu intuitifs 😉 ):

Dans un second temps, l’affichage des résultats est réalisé dans un graphe 3D (chaque axe représente une variable) et chaque index de cluster est associé à une couleur pour une identification plus intuitive:

Le résultat ressemblera à cela (ici on cible le cluster représenté en bleu) :

Kmeans Clustering

Kmeans Clustering

Kmeans Clustering

En conclusion

Pour conclure ce billet, on peut voir que l’association Python et Tensorflow permet une implémentation rapide d’algorithmes de Machine Learning (ici le Kmeans)… visualisation incluse.

Comme rappelé précedemment, cet article a été écrit dans le but de voir comment on peut partitionner des datasets conséquents, les visualiser, dans le but par exemple d’éliminer les données peu utiles dans l’objectif d’analyse que l’on s’est fixé.