Assembler des données pour les analyser
C’est l’histoire d’un paradoxe. Avec l’apprentissage machine, l’analyse de données devient à la fois phénoménalement puissante et très automatisée. Mais avant de lancer quoi que ce soit, l’analyste doit encore assembler les données manuellement. Il y consacre en moyenne plus de 60% de son temps.
Les données proviennent souvent de différentes tables. Il faut donc d’abord les assembler dans une seule. « À l’intérieur de ces tables, explique Alexis Cvetkov-Iliev, les données se présentent sous forme de lignes et de colonnes. Quand on assemble, on effectue deux opérations basiques : l’union pour ajouter des lignes. La jointure pour ajouter des colonnes. Or, chacune de ces opérations présente un problème particulier. »
L’appariement d’entités pour l’ajout de lignes
Le premier concerne ce que l’on appelle l’appariement d’entités. « Imaginons que je m’intéresse au prix des loyers dans différentes villes françaises. J’avais déjà plusieurs lignes pour des logements à Paris. D’autres lignes pour Lyon. Et je veux maintenant ajouter Saint-Étienne. Sauf que... quand je récupère des données provenant de différentes tables, je trouve parfois cette ville orthographiée ‘Saint-Étienne’ et parfois ‘Saint Etienne’. Pas d’accent. Pas de tiret. Du coup, elles sont considérées comme deux villes différentes. Naturellement, cela va biaiser les résultats. Il faut donc rattacher ces deux entités à la main, de sorte qu’elles aient la même orthographe. »
Les travaux effectués durant la thèse ont permis de trouver une solution avec l’utilisation d'"embeddings". Ce sont des représentations vectorielles qui encodent de l’information sur les entités. Chaque ville est ainsi représentée par un vecteur, c’est-à-dire une suite de coordonnées. Derrière cela, il y a une vraie structure : les entités qui possèdent des caractéristiques similaires sont proches dans l’espace.
Et c’est là que les choses deviennent intéressantes. En utilisant des embeddings adaptés, "Saint-Étienne" et "Saint Etienne" sont représentées par des vecteurs très proches : (0.8, 0.9) et (0.8, 0.85). Alors, plus besoin de faire un nettoyage manuel. Mettre l’accent. Rajouter le tiret. Les embeddings sont directement utilisés dans l’analyse. « Si mes deux points sont suffisamment proches, alors je considère qu’en pratique, c’est pareil. Et pour l’analyse derrière, nous avons montré que cela ne changeait pratiquement rien en termes de qualité. En revanche, c’est beaucoup plus rapide. » Ce résultat de recherche a donné lieu à une publication dans la revue IEEE Access.
La jointure pour l’ajout de colonnes
Deuxième problème : la jointure. Quand on souhaite ajouter une nouvelle colonne à une table, il faut avoir une relation 1-pour-1 entre les entités et les valeurs que l’on veut joindre. C’est une condition nécessaire pour faire cette jointure. « Si je reprends l’exemple de la ville, j’ai une seule valeur de population pour Paris : 2.2 millions. Mais si je veux ajouter les salaires des parisiens, cela ne marche plus : chaque parisien reçoit un salaire différent. Je me retrouve donc avec une relation "1-pour-plusieurs" entre les entités (les villes) et les valeurs (les salaires). Or dans ma colonne, je ne peux mettre qu’une seule valeur. »
Alors comment faire ? Il convient d’agréger manuellement toutes les valeurs pour produire un seul indicateur. Par exemple en calculant le salaire moyen, ou le salaire médian, la somme de tous les salaires… Le choix du bon indicateur dépendra de l’analyse.
En pratique, l’affaire s’avère bien plus complexe encore. « Imaginons maintenant que je veuille étudier la qualité de l’éducation dans Paris. La ville compte plusieurs écoles. Pour chaque école, j’ai plusieurs étudiants. Il va donc falloir que j’agrège les notes des élèves dans chaque établissement puis les notes de tous les établissements. J’ai donc deux étapes d’agrégation. Et pour chaque étape, plusieurs possibilités d’indicateurs possibles : la moyenne des notes, les quantiles, etc. » Le nombre d’indicateurs explose.
Là aussi, la nouvelle méthode proposée par Alexis Cvetkov-Iliev va s’appuyer sur un embedding. Pour chaque entité, donc ici chaque ville, le scientifique calcule une représentation vectorielle qui contient implicitement toute l’information contenue dans les différentes tables de départ : population, département d’appartenance, taux de pauvreté dans le département… Grâce à cela, chaque entité est désormais décrite par une seule chose : le vecteur. À partir de là, nous retrouvons donc une relation 1-pour-1 et cela devient beaucoup plus facile de faire des jointures.
Une représentation compacte de l'information
Des méthodes d’agrégation automatique avec représentation par vecteurs existaient déjà. Mais contrairement à cette nouvelle approche, les méthodes classiques calculent toutes les combinaisons d’indicateurs possibles. Elles conservent beaucoup d’informations redondantes et cela devient exponentiel. Les vecteurs sont gros, prennent énormément de mémoire et exigent beaucoup de temps de calcul. Pour un même calcul, un vecteur comportait précédemment plus de 100 000 nombres, il n’en contient aujourd’hui plus que 200. Cette nouvelle méthode offre une syntaxe plus compacte. « En termes de qualité de performance, on ne voit pas la différence. »
De plus, avant de procéder à l’embedding, Alexis convertit les tables sous forme de graphes. C’est une manière assez simple de représenter de l’information. Il relie deux entités par une relation pour former un triplet, par exemple : "Paris, capitale de, France". L’avantage ? Ça permet de combiner facilement de l’information qui, à l’origine, peut provenir de sources très différentes. « On unifie tout dans un seul graphe. Dans la science des données, c’est d’ailleurs tout l’enjeu : avoir des données que l’on puisse facilement interconnecter. »
Gérer les valeurs numériques
Ces travaux de recherche menés apportent une autre amélioration significative. « Historiquement, l’embedding a été beaucoup utilisé dans le domaine du langage, comme pour le fameux ChatGPT. Mais dans ce domaine, les entités sont des mots. À partir d’un gros corpus de texte, le modèle apprend un embedding pour chaque mot. À la fin, cette représentation va contenir implicitement le sens du mot. Deux mots qui ont un sens proche auront ainsi des vecteurs proches. »
Ces méthodes classiques ne sont pas adaptées aux données numériques qui, elles, sont continues. En effet, elles calculent un embedding pour chaque valeur numérique de manière indépendante, sans préserver leur structure sous-jacente. « Intuitivement, deux valeurs proches devraient avoir des vecteurs proches. Or il n’y a pas de contrainte explicite pour garantir cela dans les méthodes classiques, et on se retrouve donc avec des embeddings de piètre qualité. »
Pour pallier ce problème, les analystes font souvent ce que l’on appelle du "binning". Ils constituent des groupes de valeurs, par exemple un groupe allant de 1 à 10 000 habitants, puis un autre allant de 10 000 à 100 000. À la fin, les valeurs d’un même groupe ont le même embedding. Inconvénient ? Une ville de 10 000 habitants se retrouve dans le même groupe qu’un village de 100 habitants, mais dans un groupe différent d’une ville de 10 001 habitants.
Retour donc à la case départ : un vecteur pour 10 000 habitants et un autre pour 10 001, mais potentiellement très différents. Et c’est là qu’intervient l’innovation clé. Dans cette nouvelle méthode, l’embedding d’une certaine valeur numérique va simplement être la combinaison linéaire de deux embeddings. « La manière dont je les combine, le poids que j’attribue à chacun d’eux, dépend de la valeur en question. Exemple : pour la population d’un village de 100 habitants, ce sera 99% de l’embedding n°1 et 1% de l’embedding n°2. Pour une mégalopole de 2 millions d’habitants, ce sera le contraire : 1% et 99%. À mesure que la population augmente, on donne ainsi de plus en plus de poids à l’embedding n°2. Au final, deux valeurs proches mélangent en proportions similaires les deux embeddings, et obtiennent donc des vecteurs proches. En pratique, la méthode marche bien et est peu coûteuse car on a besoin que de deux embeddings pour toutes les valeurs de populations, au lieu d’un embedding par valeur. »
Cette partie des travaux a fait l’objet d’une publication dans Machine Learning. La méthode permet de représenter de très grands jeux de données. Les scientifiques ont ainsi vectorisé une partie de la connaissance contenue dans l’encyclopédie Wikipédia. « Ces représentations peuvent maintenant servir à d’autres analystes qui les trouveront en téléchargement sur notre site. »
Au centre Inria de Saclay, deux postdoctorants et un étudiant en thèse ont été recrutés pour prolonger ces recherches au sein de Soda, une équipe-projet à l’intersection entre le machine learning, les bases de données, et leurs applications, notamment en santé. « Dans ce domaine-là, mais aussi dans d’autres, il y a de gros enjeux car il faut traiter énormément de données provenant d’un nombre de tables très élevé. Donc beaucoup de problèmes d’unions et de jointures. Les méthodes que nous avons proposées vont contribuer à les résoudre. »