Blog ENI : Toute la veille numérique !
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
  1. Livres et vidéos
  2. Machine Learning
  3. Préparation des données
Extrait - Machine Learning Implémentation en Python avec Scikit-learn (2e édition)
Extraits du livre
Machine Learning Implémentation en Python avec Scikit-learn (2e édition)
1 avis
Revenir à la page d'achat du livre

Préparation des données

La phase de Data Preparation

Dans la méthode CRISP-DM, la phase de Data Preparation permet de passer des données brutes, telles qu’extraites des sources de données, à des données utilisables par les différents algorithmes de Machine Learning.

Cette préparation est nécessaire pour deux raisons principales :

  • La majorité des algorithmes ont des contraintes sur le format des données en entrée. Cela peut concerner leur type : par exemple, ils peuvent n’accepter que des variables numériques, ou des contraintes sur leur format comme la nécessité de normaliser les entrées des réels entre 0 et 1.

  • Préparer les données permet de grandement améliorer les résultats des algorithmes, en extrayant ou en créant des colonnes plus adaptées au problème.

Cette phase doit être fortement documentée. En effet, il est vital de savoir exactement les choix qui ont été faits ainsi que les raisons qui les ont motivés. Cela permet de pouvoir valider ces choix d’un point de vue métier avant une potentielle mise en production des modèles, et de s’assurer que les résultats sont cohérents.

C’est aussi pendant la préparation que le choix de limiter les données utilisées pour la suite du processus est fait. Là encore, toutes les décisions...

Limiter les données

Toutes les données brutes ne seront pas forcément utilisées pour la suite du processus. Pour des raisons d’optimisation du travail effectué, elles doivent être éliminées dès le début de la phase de préparation des données.

Il est ainsi possible d’éliminer des lignes, dites enregistrements, ou bien d’éliminer des colonnes, dites caractéristiques.

Voici une liste non exhaustive des raisons d’éliminer des enregistrements (lignes) :

  • Ils ne correspondent pas aux cas à traiter, car ce sont des cas trop particuliers. 

  • Ils contiennent des erreurs comme des âges négatifs.

  • Trop de données sont manquantes et leur intérêt est donc moindre.

Pour les caractéristiques, il peut être judicieux d’éliminer les colonnes pour les raisons suivantes :

  • Elles n’ont pas de rapport avec le domaine.

  • Elles ne sont pas exploitables en l’état, comme des noms de personnes.

  • Elles sont trop incomplètes et n’apportent donc qu’une information fortement partielle.

  • Elles sont trop uniformes, comme une variable avec une seule valeur possible. 

  • Il s’agit d’un identifiant unique.

  • Etc.

Il existe cependant une exception : en cas de risque de biais, il est conseillé de conserver la colonne dans le dataset, même si elle...

Séparer les datasets

Avant d’aller plus loin, il est primordial d’avoir au moins deux datasets :

  • Un dataset d’entraînement, qui servira à créer le modèle.

  • Un dataset de test, pour tester le modèle.

Le dataset de test ne devra plus être utilisé jusqu’à la fin du processus complet, et surtout pas pour modifier les modèles (qui seraient alors fortement biaisés). Il ne doit pas non plus servir à choisir quelles sont les meilleures préparations des données.

En anglais, analyser trop finement les données sans avoir extrait le dataset de test s’appelle le data snooping. Normalement, cette séparation devrait même avoir lieu avant la phase d’analyse des données pour ne pas inclure trop de biais statistiques dans la suite du processus.

Lors du processus de modélisation, le dataset d’entraînement sera de nouveau séparé entre apprentissage et validation, la validation permettant de choisir les hyperparamètres des différents modèles.

1. Proportion Entraînement/Test

Pendant de nombreuses années, les textes de référence indiquaient qu’il fallait un ratio de 80/20, soit 80 % des données pour l’entraînement et 20 % pour le test. Cela est toujours vrai lorsque le nombre d’échantillons est faible, mais aujourd’hui, avec l’avènement du Big Data, c’est de moins en moins le cas.

En effet, sur un dataset de 150 valeurs comme Iris, il semble important d’avoir au moins 30 enregistrements pour tester les modèles. Cela représente environ dix lignes par classe.

Sur un dataset d’un million de données, il n’est cependant pas nécessaire d’avoir 200 000 échantillons de test.

La proportion d’enregistrements dans le dataset de test doit donc être de 20 % pour les petits datasets. Cette proportion baissera d’autant que le dataset contient beaucoup d’enregistrements....

Traiter les données manquantes

Pour traiter les données manquantes, il y a plusieurs stratégies :

  • Supprimer la colonne incriminée.

  • Supprimer les lignes contenant des valeurs vides.

  • Remplir les valeurs manquantes (dite imputation) via une valeur décidée en amont.

La première stratégie se traite comme la suppression d’une colonne (fonction drop). Elle est souvent utilisée lorsqu’une colonne est peu remplie, et que son importance semble faible. C’est par exemple le cas du numéro de la cabine pour le dataset Titanic, qui n’a pas un grand impact sur les chances de survie.

De plus, si la colonne a une proportion importante de valeurs manquantes, créer un modèle en l’utilisant ne semble pas pertinent. En général, si la valeur est absente dans plus de la moitié des cas, elle doit être supprimée. Si les valeurs manquantes représentent moins de la moitié des données (par exemple 25 %), la décision dépendra de nombreux paramètres : taille du dataset, répartition de la variable cible, importance métier de la variable, etc.

Pour supprimer les lignes, il est aussi possible d’utiliser la fonction dropna vue précédemment. Cela est souvent le meilleur choix lorsque les données manquantes se trouvent dans des enregistrements non spécifiques...

Préparer les attributs numériques

Les variables numériques sont potentiellement utilisables en l’état dans des modèles, mais de meilleurs résultats sont souvent obtenus en les préparant. Plusieurs possibilités cumulables existent :

  • La validation des données, qui consiste à vérifier que les données numériques sont correctes (ou en tout cas, qu’elles semblent correctes).

  • Le feature engineering qui consiste à créer de nouvelles données à partir de celles existantes.

  • La discrétisation, qui consiste à transformer une donnée numérique en donnée catégorielle.

  • Et la normalisation, qui consiste à ramener les données dans des intervalles équivalents pour mieux les comparer. Pour certains algorithmes, la normalisation est un prérequis.

1. Validation des données

La validation des données se fait sur deux aspects :

  • Sémantiquement : les valeurs des données correspondent à ce qui est attendu. 

  • Statistiquement : les données ne semblent pas présenter de valeurs extrêmes ou aberrantes.

a. Validation sémantique des données

Pour l’analyse sémantique, il faut vérifier que les valeurs fournies correspondent au sens de la colonne et à son contexte.

Une taille doit ainsi être positive. S’il s’agit d’un produit tenu dans la main comme une balle, celle-ci doit être comprise entre 5 et 10 centimètres (cm). Une taille de 70 cm serait incohérente.

Il arrive souvent que les données ne passent pas un tel filtre. En effet, lors du processus d’acquisition, il peut y avoir des erreurs.

Cela peut être le cas si le capteur est en panne ou qu’il n’y a pas eu de mesures, et qu’une taille « par défaut » a été mise. C’est aussi le cas si les données proviennent de deux capteurs qui mesurent soit dans des unités différentes (centimètres et pouces), soit avec un processus différent, menant à l’apparition d’un décalage entre les mesures.

En cas d’incohérence, il est important de revenir en phase de compréhension des données et/ou d’échanger...

Préparer les variables catégorielles

Les données catégorielles ne sont pas utilisables avec tous les algorithmes de Machine Learning. Différents pré-traitements peuvent être appliqués, comme pour les variables numériques :

  • La validation des données, pour vérifier que celles-ci sont correctes.

  • La modification de certaines valeurs (fusion, réordonnancement…), aussi appelée « feature engineering ».

  • La quantification des variables catégorielles.

1. Validation des données

Comme pour les données numériques, les données catégorielles doivent être validées sur deux plans :

  • Sur le plan sémantique : toutes les catégories ont une signification.

  • Sur le plan statistique : la répartition entre les catégories semble correspondre à la réalité.

Pour la validation sémantique, il peut être utile de demander la liste des catégories possibles et de vérifier leur correspondance avec la réalité :

iris_df['class'].cat.categories 
 
> Index(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], 
dtype='object') 

Comme attendu, il y a trois classes qui correspondent aux trois types de fleurs pour le dataset Iris.

Pour la validation statistique, et contrairement aux données numériques, il n’y a pas de notion de valeurs aberrantes (outliers). En effet, les valeurs sont automatiquement dans une des catégories existantes.

Une erreur peut cependant être détectée avec la présence de catégories à très faibles taux d’utilisation. Ainsi, contenir un seul élément dans un dataset est sûrement un signe d’erreur.

Il est donc utile, pour ce point, de calculer la fréquence d’apparition de chaque occurrence d’une série grâce à value_counts :

iris_df['class'].value_counts() 
 
> Iris-virginica     50 
  Iris-versicolor    50 
  Iris-setosa        50 
  Name: class, dtype: int64 

Comme annoncé dans le dataset, chaque classe est présente 50 fois (sur...

Les données particulières

En Data Science, deux données sont souvent particulières à traiter :

  • Les dates au sens large, qui peuvent correspondre aux dates (du jour), à l’heure ou à l’ensemble date + heure. Ces variables peuvent être vues, selon le cas, comme des données numériques, par exemple un timestamp, ou comme des données catégorielles ordonnées avec une valeur par jour.

  • Les textes, qui ne correspondent pas à des valeurs précises dans une liste définie à l’avance. Il s’agit alors de variables catégorielles, non ordonnées, et qui possèdent autant de valeur que d’enregistrement (ou quasiment).

Ces deux formats nécessitent en général des manipulations particulières en phase de préparation des données.

1. Préparer les dates

Les dates peuvent être dans de multiples formats et Pandas propose de nombreux utilitaires pour pouvoir travailler avec. Les opérations courantes sont ainsi simplifiées.

Pour illustrer ces possibilités, nous allons charger le dataset « acc-2018 » qui contient la liste des accidents de la route en 2018. Le dataset original, qui provient de data.gouv.fr, contient de nombreuses variables qui ont ici été simplifiées pour ne conserver que les variables suivantes :

  • Num_Acc : le numéro de l’accident.

  • an, mois, jour : le jour de l’accident, sur trois colonnes numériques.

  • hrmn : l’heure de l’accident sous forme entière (par exemple, 1505 signifie 15:05, 425 signifie 4:25).

  • lat / long : les latitude et longitude de l’accident.

  • dep : le département de l’accident multiplié par 10 pour pouvoir prendre en compte la Corse (ainsi 590 indique le département 59 et, pour la Corse, 201 représente la Corse du Sud et 202 la Haute-Corse).

Pour charger le dataset, qui possède des points-virgules comme séparateurs, il faut utiliser la commande suivante :

acc_df = pd.read_csv('acc-2018.csv', sep=';') 

a. Le format datetime64

Pour pouvoir gérer des dates, elles doivent être stockées dans une seule variable (au format datetime64 avec la librairie Pandas).

Il arrive fréquemment que les datasets contiennent...

Automatiser la préparation

1. Création de pipelines de traitement

Dans une phase de préparation des données, il est important de pouvoir tester plusieurs préparations pour les différentes variables. De même, il est nécessaire de créer plusieurs modèles qui peuvent avoir des contraintes différentes en termes de format d’entrée. Il s’agit d’étapes fortement itératives.

Utiliser Pandas et Jupyter est à la fois un gain de temps et une combinaison pratique, à condition de bien conserver, dans un gestionnaire de version comme git, le travail fait et les différentes itérations.

Une fois que le modèle est créé et déployé, il faudra lui fournir les données réelles, en temps réel ou en mode « batch ». Mais celles-ci nécessiteront aussi des prétraitements car elles devront être au même format que les données d’entraînement qui ont servi à la création du modèle.

Par exemple, si une des transformations consiste à remplacer les valeurs manquantes par la moyenne des données d’entraînement, il faut pouvoir accéder à cette valeur.

Il s’agit alors d’un pipeline de préparation : la suite de toutes les étapes nécessaires pour passer d’un fichier brut (ou d’une seule donnée brute en temps réel) au format attendu par le modèle.

Ce pipeline permettra de s’assurer que toutes les données passeront par les mêmes étapes et pourra être monitoré. Ainsi, le modèle en production sera utilisable et fournira des résultats cohérents.

2. Paramètres des opérations et code Pandas

Certaines étapes ne dépendent pas des données utilisées comme le passage des textes en minuscules, la conversion d’un nombre dans un autre format, etc. Mais il y en a plusieurs qui sont fortement dépendantes du dataset d’entraînement comme la normalisation qui demande de connaître, selon le type choisi, le min et le max, la moyenne et l’écart-type ou encore le premier et troisième quartile.

En effet, dans le cas de la normalisation min-max, le 0 doit correspondre...