Comprendre et préparer les données
Introduction
Avant de commencer à créer nos propres algorithmes qui nous permettront d’obtenir des modèles performants, il y a une étape capitale que nous ne devrons jamais minimiser : la préparation des données.
En effet, tout projet d’IA nécessitera de récolter des données, de les explorer en les visualisant pour mieux les comprendre, de les nettoyer et de les rendre disponibles pour pouvoir créer des modèles adaptés et performants. En fonction de celles-ci et des résultats souhaités, nous serons amenés à choisir certains algorithmes plus adaptés que d’autres. La qualité des données est la clé de la réussite de tout projet d’IA. Sans des données propres, pertinentes et bien structurées, même les algorithmes les plus sophistiqués échoueront.
Partons à la découverte de cette étape fondamentale en parcourant les thèmes suivants :
-
types de données ;
-
types d’apprentissages ;
-
solutions de visualisation des données ;
-
récolte, nettoyage et imputation des données ;
-
exploration et analyse des données appliquées à PHP ;
-
prétraitement des données ;
-
solutions de réduction des dimensions.
À la fin de ce chapitre, nous connaîtrons...
Types de données
Dans un énoncé de problème à traiter avec l’IA, la première étape est de récolter les données qui nous permettront d’éduquer et d’entraîner nos modèles qui auront pour vocation de solutionner notre problématique. Dans les ensembles que nous aurons, il sera possible de rencontrer une large variété de types de données. Voici une liste des types les plus courants.
1. Données numériques
Les données numériques peuvent être continues ou discrètes. Elles sont discrètes si elles ne peuvent prendre qu’une quantité limitée de valeurs dans un intervalle donné (exemple : l’effectif présent dans une salle ne peut prendre que les valeurs 0, 1, 2... 30). Elles sont continues si elles peuvent prendre une infinité de valeurs dans un intervalle défini (exemple : la température d’une pièce à vivre).
2. Données catégorielles
Les données catégorielles prennent des valeurs qui représentent des catégories distinctes dans un panel donné.
Parmi ces données catégorielles, nous pourrions par exemple trouver les types de produits (électronique, vêtement, alimentation), les genres (masculin, féminin, autre) ou même les couleurs (rouge, bleu, vert)....
Types d’apprentissage
En Machine Learning, nous rencontrerons principalement deux approches pour éduquer et entraîner nos modèles :
-
L’apprentissage supervisé : ce type d’apprentissage utilise des données étiquetées (souvent le résultat attendu), où chaque exemple d’entraînement est associé à une réponse ou à une sortie connue.
-
Si les étiquettes sont des données numériques continues, nous sommes dans le cadre d’un problème de régression.
-
Si les étiquettes sont des données catégorielles, nous sommes dans le cadre d’un problème de classification.
Illustration concrète
Vous souhaitez apprendre les noms des capitales de chaque pays du monde à votre enfant. Vous lui posez des questions, vous attendez qu’il vous propose une solution. Ensuite, vous lui donnez la capitale espérée. Ainsi, il corrige son comportement en fonction de la réponse (correction ou confirmation).
-
L’apprentissage non supervisé : ce type d’apprentissage utilise des données non étiquetées. Le modèle cherche des structures ou des patterns inhérents dans les données sans supervision humaine.
Illustration concrète
Vous avez un sac avec de multiples objets, vous devez les classer en plusieurs groupes. À...
Solutions de visualisation des données
Pour bien cerner notre problème et mieux l’envisager par la suite, observons nos données pour mieux les comprendre. L’objectif de cette phase d’analyse est d’avoir une estimation de la distribution des données pour se faire une idée de leur représentativité. Les données sont-elles bien réparties ou notre échantillon ne représente-t-il que certains types ou intervalles en particulier ? Cela nous permettra ensuite de connaître les limites potentielles de notre modèle.
PHP n’étant pas un langage à vocation de création visuelle, nous allons utiliser une librairie JavaScript optimisée pour la visualisation des données. Notre choix se portera sur Plotly.js, une surcouche du célèbre D3.js.
Afin d’éviter d’y passer trop de temps et ainsi nous permettre de nous concentrer sur nos besoins réels, utilisons une librairie PHP permettant la génération du code pour les diagrammes directement depuis PHP en quelques lignes simples disponibles à cette adresse : https://github.com/LouisAUTHIE/Php2Plotly/
Le plus simple sera de déléguer son installation à Composer via la commande suivante :
composer require louisauthie/php2plotly
La seule nécessité en amont de son utilisation est de nous occuper de l’inclusion de la librairie Plotly.js dans notre code HTML, à l’intérieur de la balise <head> de notre page. Par exemple, nous pourrions utiliser le code suivant :
<script src="js/plotly-2.32.0.min.js" charset="utf-8"></script>
Présentons rapidement les types de diagrammes à notre disposition. Nous en profiterons pour proposer un exemple de mise en œuvre pour chacun des diagrammes.
1. Diagramme à bâtons
Ce type de diagramme permet de visualiser les effectifs en ordonnées en fonction de catégories en abscisses. En voici un ci-après, illustrant les effectifs de personnes par tranches d’âge dans une population définie.

Figure 3.1 - exemple de diagramme à bâtons
Ce type de diagramme sera très utilisé dans nos études de données pour les données numériques discrètes (sans retraitement...
Récolte, nettoyage et imputation des données
Les données qui serviront à créer nos modèles, à les entraîner et à les utiliser peuvent être récoltées soit directement via des fichiers de données pré-exportées aux formats CSV, NDJSON (objets JSON non pas stockés dans un array JSON mais disposés les uns à la suite des autres, à la ligne, pour en faciliter la visualisation), soit directement depuis des bases de données SQL. Quoiqu’il en soit, toutes les données que nous explorerons et utiliserons avec Rubix ML devront implémenter l’interface Traversable de PHP afin de permettre de les parcourir via des boucles foreach. Voyons maintenant les objets mis à disposition par Rubix ML pour faciliter les récoltes de données dans différents formats.
1. Récolte de données au format CSV
L’objet CSV dont l’espace de noms est Rubix\ML\Extractors\CSV permet de récupérer des données stockées dans un fichier CSV en une seule ligne de code comme dans l’exemple suivant :
$extractorCSV = new CSV('donnees_flux.csv', true, ',', '"');
Le constructeur de cet objet peut prendre cinq arguments :
-
le chemin vers le fichier CSV contenant les données à récolter ;
-
un booléen (false par défaut), indiquant si la première ligne du fichier contient les noms de colonnes ;
-
une chaîne de caractères (par défaut la virgule) contenant le caractère délimiteur entre les valeurs de colonnes ;
-
une chaîne de caractères (les doubles quotes par défaut) définissant comment sera encadrée une chaîne de caractères contenant éventuellement le caractère délimiteur ;
-
une chaîne de caractères (par défaut il s’agit de \ - backslash) définissant le symbole d’échappement.
2. Récolte de données au format NDJSON
L’objet NDJSON dont l’espace de noms est Rubix\ML\Extractors\NDJSON permet de récolter des données stockées dans un fichier NDJSON (contenant des objets JSON non pas stockés dans un array JSON mais affichés les uns à la suite des autres, à...
Exploration et analyse des données
Avant la mise en place de tout algorithme pour créer nos modèles d’IA, il convient de nous approprier les données pour :
-
d’une part, les nettoyer d’éventuels échantillons aux valeurs aberrantes ;
-
d’autre part, éventuellement sélectionner les caractéristiques qui sont les plus intéressantes dans notre modélisation.
1. Analyse univariée des caractéristiques numériques continues
Forts des solutions de visualisation présentées ci-avant, il est toujours intéressant de tracer les diagrammes d’effectifs pour chaque caractéristique numérique afin de visualiser leur répartition. Cela nous permettra de voir quelles sont les caractéristiques les plus représentées.
Pour illustrer ces notions, prenons un ensemble de données célèbres, celui des fleurs d’iris disponible à cette adresse : https://archive.ics.uci.edu/dataset/53/iris
Cet ensemble de données contient un ensemble de 150 échantillons descriptifs d’iris étiquetés et donne le type d’iris en fonction de sa morphologie.
Dans le fichier ZIP contenant les données, vous trouverez un fichier nommé iris.data. C’est un fichier au format CSV contenant les caractéristiques dans l’ordre suivant :
-
longueur de la sépale en cm ;
-
largeur de la sépale en cm ;
-
longueur de la pétale en cm ;
-
largeur de la pétale en cm ;
-
type d’iris.
Procédons à la récolte des données de cet échantillon comme suit :
//Import Data from CSV file
$irisData = new CSV('iris.data', true, ',', '"');
$dataset = Labeled::fromIterator($irisData);
$dataset = $dataset->deduplicate();
//Data type conversion String to numeric
$numericStringConverter = new NumericStringConverter();
$dataset->apply($numericStringConverter);
Une fois les données récupérées, nous avons transformé les chaînes de caractères issues du CSV par leur valeur numérique pour les étudier comme des variables continues.
Il est trivial dans notre cas que nous sommes dans le cadre...
Prétraitement des données
Certains algorithmes nécessiteront que nous transformions nos données d’un type vers l’autre sans quoi il serait impossible de les traiter. Nous allons aborder les solutions disponibles pour effectuer ces transformations simplement.
1. Transformation des données catégorielles en données numériques
Des modèles comme ceux à base de réseaux de neurones ne sont capables d’exploiter et de calculer que des données numériques. Or, il est très fréquent d’effectuer des tâches de classifications avec ce type d’algorithmes. Pour cela, il convient d’utiliser des transformations comme l’encodage One Hot.
L’encodage One Hot prend toutes les valeurs distinctes d’une catégorie et va créer une nouvelle caractéristique pour chaque catégorie et fixer à 1 la caractéristique correspondant à la catégorie à laquelle chaque échantillon appartient.
Dans notre exemple de l’ensemble des iris, seules trois étiquettes sont disponibles pour nos échantillons : Iris-setosa, Iris-versicolor et Iris-virginica.
Ainsi un échantillon comme celui-ci :
6.7, 3.0, 5.2, 2.3, Iris-virginica
serait transformé en :
6.7, 3.0, 5.2, 2.3, 0, 0, 1
Pour faciliter cette transformation, nous pouvons utiliser le transformerOneHotEncoder de Rubix ML. Voici un exemple :
$transformerOneHot = new OneHotEncoder();
$transformerOneHot->fit($datasetLabeledCSV);
$datasetLabeledCSV->apply($transformerOneHot);
2. Transformation des données ordinales en données numériques
De la même manière que pour les données catégorielles, il est souvent nécessaire, dans certains algorithmes, de les transformer en leur équivalent numérique.
La spécificité des données ordinales est qu’elles n’ont pas la même valeur conceptuelle et nous devons restituer numériquement la notion d’ordre.
Par exemple, si on considère des données d’appréciation comme dans l’ensemble suivant : Inutile, Peu utile, Moyennement utile, Très utile, les encoder comme des catégories...
Réduction des dimensions
Nous avons vu que le nombre important d’échantillons est un élément favorisant les bonnes performances d’un algorithme d’IA. De la même manière, une grande variété de caractéristiques est un atout, cependant il ne servira à rien d’avoir une caractéristique qui ne présente pas d’informations utiles à nos travaux.
Le volume de données présente un coût indéniable, il convient donc d’optimiser cela en diminuant, lorsque cela est possible, le nombre de dimensions.
Une autre utilité de la réduction des dimensions est de rendre possible la visualisation des données dans des dimensions interprétables par l’homme. En effet, au-dessus de quatre dimensions (représentation dans l’espace avec des colorations des points en fonction d’une 4e dimension), il nous est quasi impossible de nous faire une représentation des données.
Le dernier atout de la réduction des dimensions est la lutte contre le fléau de la dimensionnalité. À savoir qu’en IA, l’augmentation du nombre de caractéristiques (dimensions) rend l’apprentissage de plus en plus compliqué et lourd. Il convient donc de se focaliser sur les données les plus utiles.
Il existe plusieurs algorithmes de réduction des dimensions, nous allons en tester deux : l’ACP et T-SNE.
1. L’analyse en composantes principales
Quand l’ensemble de données à exploiter contient beaucoup de caractéristiques uniquement continues et qu’il semble que certaines d’entre elles soient liées par des relations linéaires, il est possible d’utiliser un algorithme d’analyse en composantes principales (l’ACP).
C’est une technique de réduction de dimensions qui transforme un ensemble de variables corrélées en un ensemble de variables non corrélées appelées composantes principales. Ces composantes sont ordonnées de telle sorte que la première composante explique la plus grande partie de la variance totale (ou la dispersion) des données, suivie par les composantes suivantes. L’ACP se base sur la décomposition de la matrice de covariance ou de corrélation des données....
En résumé
Nous savons maintenant récolter des données depuis plusieurs types de supports, les décrire, les nettoyer, les prétraiter et les analyser à l’aide d’indicateurs statistiques et de représentations graphiques. Au besoin, nous savons comment les transformer et appliquer des méthodes pour réduire le nombre de dimensions.