Preprocessing et Feature Engineering: booster les performances d'un modèle IA

Auteur: Mohamed CHINY Durée necessaire pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Niveau recommandé pour le cours de Preprocessing et Feature Engineering: booster les performances d'un modèle IA Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 2: Preprocessing: Nettoyer les données et traiter les valeurs manquantes

Toutes les pages

Preprocessing et Feature Engineering: booster les performances d'un modèle IA

Page 1
Pourquoi le preprocessing et le feature engineering sont indispensables?
Page 2
Preprocessing: Nettoyer les données et traiter les valeurs manquantes

Nettoyage de données: suppression des valeurs manquantes ou incomplètes

Qu'est ce qu'une donnée manquante sur le plan technique?

Techniquement, une donnée manquante correspond à une valeur absente dans une cellule où une information devrait normalement exister. Cela peut se traduire par:
  • NaN: (Pour Not a Number) est une valeur spéciale utilisée en Python (via NumPy et pandas) pour représenter une donnée numérique manquante. Elle apparaît souvent lors de conversions, calculs impossibles ou importation de fichiers incomplets.
  • None: C’est l’objet Python qui signifie "absence de valeur". Dans un DataFrame, pandas le convertit généralement en NaN pour les colonnes numériques mais le conserve parfois tel quel dans les colonnes de type objet.
  • Chaîne vide: C’est une valeur textuelle valide mais vide. Techniquement, ce n’est pas une valeur manquante pour pandas, même si elle peut représenter une absence d’information dans certains contextes métier.
  • Espaces ou tabulations: C’est une chaîne contenant un ou plusieurs espaces. Comme la chaîne vide, ce n’est pas considéré comme une valeur manquante mais c’est souvent un "faux vide" introduit par une mauvaise saisie ou un mauvais nettoyage.
  • Code spécial: (comme ? ou unknown) ce sont des conventions utilisées dans certains fichiers (comme les CSV ou les formulaires) pour indiquer qu’une information n’a pas été fournie. Pandas ne les reconnaît pas automatiquement comme des valeurs manquantes, mais on peut changer ce comportement par défaut.
  • Absence totale d’enregistrement: Il s’agit d’une ligne ou d’une cellule qui n’a jamais été créée ou enregistrée dans la source de données. Ce n’est pas une valeur mais un manque structurel dans le dataset (par exemple une ligne non collectée, un champ non transmis...).

Cette absence peut résulter d’erreurs de saisie, de problèmes de collecte, de capteurs défaillants, de réponses non fournies ou de filtres appliqués en amont. En pratique, une donnée manquante indique que l’information attendue n’a pas été enregistrée ou n’est pas disponible, ce qui nécessite un traitement spécifique avant d’entraîner un modèle de Machine Learning.

Stratégies de suppression des données manquantes

La suppression des lignes présentant des valeurs manquantes est la méthode la plus simple et la plus intuitive pour traiter les données incomplètes. Elle consiste à éliminer toute observation (ligne du dataset) dès qu’une ou plusieurs de ses variables contiennent une valeur absente. Cette approche garantit que le dataset final ne comporte plus aucune donnée manquante, ce qui facilite l’entraînement des modèles et évite d’introduire des biais liés à des imputations mal maîtrisées.
Nous détaillerons plus loin dans ce cours la notion d'imputation qui constitue une autre stratégie essentielle pour traiter les valeurs manquantes.
Cependant, la technique de suppression doit être utilisée avec prudence. Supprimer des lignes revient à réduire la quantité d’information disponible, ce qui peut affaiblir la capacité du modèle à apprendre surtout si le dataset est déjà de taille modeste. En plus, si les valeurs manquantes ne sont pas réparties de manière aléatoire, la suppression peut introduire un biais. En effet, certaines catégories, profils ou comportements risquent d’être sous‑représentés dans les données finales, ce qui mène souvent à un désiquilibre dans la diversité des données (surtout vis-à-vis des algorithmes de classificaiton).

En pratique, la suppression des lignes est pertinente lorsque la proportion de valeurs manquantes est faible ou lorsque les lignes concernées sont peu nombreuses et ne contiennent pas d’informations essentielles. C’est une solution rapide, propre et efficace dans certains cas, mais elle doit toujours être précédée d’une analyse du taux de valeurs manquantes et de leur distribution. L’objectif n’est pas seulement d’obtenir un dataset sans trous, mais de préserver autant que possible la représentativité et la richesse des données.

Stratégie de suppression mise en pratique

Pour voir le processus de suppression de valeurs manquante en pratique, nous allons encore une fois faire appel au dataset Titanic.

Le dataset Titanic contient des informations sur les passagers du célèbre paquebot, avec l’objectif classique de prédire leur survie. Il regroupe des variables démographiques (comme âge, sexe, classe sociale), des informations liées au voyage (comme port d’embarquement, tarif, cabine) ainsi que la variable cible survived. C’est un dataset simple, bien structuré et largement utilisé pour introduire les concepts fondamentaux de l'apprentissage automatique (comme on l'a fait d'ailleurs dans le cours de Machine Learning).

Comme d'habitude, nous allons commencer par importer les modules nécessaire (pandas dans ce cas), charger le dataset et voir un aperçu des données contenues dans le DataFrame:
import pandas as pd
df=pd.read_csv("titanic.csv")
df.head()
Ce qui produit ce résultat:
Preprocessing - suppression de données manquantes du dataset Titanic
Maintenant, on va produire des statitsiques sur les données manquantes:
df.isna().sum()
Cette instruction représente l'une des méthodes les plus simples et les plus utilisées pour diagnostiquer rapidement l’état de complétude d’un dataset.
  • df.isna(): crée un DataFrame de booléens dont les valeurs sont True si la données est manquante, sinon False.
  • sum(): additionne les True colonne par colonne, ce qui donne le nombre total de valeurs manquantes par variable.

On aura un résultat qui ressemble à ceci:
PassengerId          0
Survived             0
Pclass               0
Name                 0
Sex                  0
Age                  177
SibSp                0
Parch                0
Ticket               0
Fare                 0
Cabin                687
Embarked             2
On voit clairement que le champ Cabin renferme beaucoup de valeurs maquantes (687), suivi de Age (177) et enfin Embarked (2). Les autres champs par contre ne présentent aucune donnée manquante.

On peut également afficher ces informations sous forme d'un pourcentage:
df.isna().mean() * 100
Ce qui produit:
PassengerId         0.000000
Survived            0.000000
Pclass              0.000000
Name                0.000000
Sex                 0.000000
Age                 19.865320
SibSp               0.000000
Parch               0.000000
Ticket              0.000000
Fare                0.000000
Cabin               77.104377
Embarked            0.224467
On peut également identifier les enregistrements qui contiennent au moins une valeur manquante:
missing_rows = df[df.isna().any(axis=1)]
missing_rows.head()
Expliquons rapidement le code:
  • df.isna(): comme vu précédemment, elle crée un DataFrame de booléens indiquant, cellule par cellule, si la valeur est manquante.
  • any(axis=1): vérifie pour chaque ligne s’il existe au moins un True, donc au moins une valeur manquante. En effet, la méthode any() est une fonction très utilisée en pandas (et en NumPy) pour vérifier si au moins une valeur vraie apparaît dans un ensemble de valeurs.
  • df[...]: sélectionne uniquement les lignes pour lesquelles cette condition est vraie. Cette instruction utilise le mécanisme du boolean indexing (ou indexation booléenne). Cela consiste à filtrer les lignes de telle sorte de ne conserver que celle qui corresponent à True (retourné par l'expression entre les crochets).

En guise de résultat, on obtient uniquement les lignes incomplètes. D'ailleurs on peut connaitre le nombre de ces lignes avec:
missing_rows.shape[0]
Ce qui affiche:
708
Enfin l'opération qui nous intérésse, c'est la suppréssion des lignes qui représentent des valeurs manquantes:
df_clean = df.dropna()
La méthode dropna() retourne une copie du DataFrame dans laquelle toutes les lignes comportant un NaN, None ou une valeur manquante ont été retirées. Le résultat est stocké dans df_clean qui contient uniquement des observations complètes sans aucune valeur manquante.
Notez que le DataFrame original n’est pas modifié. Si on souhaite le modifier de telle sorte à ce qu'il ne contienne que les observations complètes alors on ajoute l'argument inplace=True dans la méthode dropna().
On peut désormais comparer le nombre d'observations initiales avec les observations retenues:
print("Dimensions avant suppression :", df.shape)
print("Dimensions après suppression :", df_clean.shape)
On obtient:
Dimensions avant suppression : (891, 12)
Dimensions après suppression : (183, 12)
On observe que le nombre d’observations chute considérablement après la suppression des lignes contenant des valeurs manquantes (de 891 à seulement 183). Cette réduction importante appauvrit le jeu de données et peut nuire à la robustesse du modèle de classification. Pour éviter de perdre autant d’informations, il est souvent préférable d’éliminer d’abord les colonnes présentant un taux très élevé de valeurs manquantes puis d’appliquer la suppression des lignes restantes. Cela permet de conserver un dataset plus riche et plus représentatif.          
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
Page 2
Preprocessing: Nettoyer les données et traiter les valeurs manquantes