SimpleImputer Scikit-learn Tutorial : Guide Complet de l’Imputation des Données

février 23, 2026

comment Aucun commentaire

Par Colin Barthet

Ton dataset a des trous, et ton modèle de Machine Learning refuse de tourner ? 🚫 C’est le classique. Avant de paniquer ou de supprimer des lignes précieuses, il y a une solution rapide et efficace : SimpleImputer de scikit-learn. En 2025, c’est toujours l’outil de base pour gérer les valeurs manquantes (NaN) en Python.

Je vais te montrer exactement comment l’utiliser, avec les bons paramètres, des exemples concrets sur DataFrame pandas, et les pièges à éviter pour ne pas fausser tes prédictions. C’est comme préparer un voyage : on règle les problèmes logistiques (les données manquantes) avant de profiter du paysage (l’entraînement du modèle).

⚡ Info Pratique Immédiate : SimpleImputer remplace les valeurs manquantes par une statistique simple (moyenne, médiane, mode) ou une constante. C’est la méthode « quick win » avant de passer à des techniques plus avancées comme KNNImputer.

Les paramètres à connaître (ta checklist)

Voici les réglages principaux. Garde ce tableau sous le coude.

Paramètre À quoi il sert ? Valeur par défaut Mon conseil
strategy La stratégie d’imputation : ‘mean’, ‘median’, ‘most_frequent’, ‘constant’. ‘mean’ (moyenne) Utilise ‘median’ si tes données ont des valeurs extrêmes (outliers). Pour du texte, ‘most_frequent’ (la mode).
missing_values La valeur à considérer comme manquante (np.nan, pd.NA, un nombre…). np.nan Laisse par défaut (np.nan) sauf cas très spécifique.
fill_value La valeur constante à utiliser si strategy='constant'. None Par exemple, fill_value=0 ou fill_value='inconnu'.
add_indicator Ajoute des colonnes (True/False) pour marquer où étaient les valeurs manquantes. False Très utile ! Ça permet à ton modèle de savoir qu’une donnée était manquante à l’origine.
copy Copie les données avant transformation. True Laisse à True pour éviter de modifier tes données d’origine par accident.

Le code minimal pour démarrer (5 lignes)

Voici l’exemple basique. On a un petit tableau avec un NaN, et on le remplace par la moyenne de sa colonne.

import numpy as np
from sklearn.impute import SimpleImputer

# Données d'exemple
X = [[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]

# 1. Créer et configurer l'imputer
imputer = SimpleImputer(strategy='mean')

# 2. Lui apprendre les stats sur les données d'entraînement (fit)
imputer.fit(X)

# 3. Appliquer la transformation (transform)
X_imputed = imputer.transform(X)
print(X_imputed)

Résultat : Le np.nan (à la position [1,1]) est remplacé par 3.67, la moyenne des valeurs de la 2ème colonne (2, 5).

⚠️ Attention : La méthode .fit() calcule la moyenne uniquement sur les données d’entraînement. Pour tes données de test, tu utilises seulement .transform() avec les stats apprises. C’est la règle d’or pour éviter la fuite de données (data leakage).

Cas réel : un DataFrame Pandas avec âge et ville

Dans la vraie vie, tes données sont dans un DataFrame. Voici comment traiter séparément les colonnes numériques et catégorielles.

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer

# Création d'un DataFrame factice
df = pd.DataFrame({
    'Age': [24, np.nan, 35, 40, np.nan],
    'Ville': ['Paris', 'Lyon', np.nan, 'Nice', 'Bordeaux']
})

print("Avant imputation :")
print(df)

# 🔢 Pour la colonne numérique 'Age' : on utilise la médiane (moins sensible aux extrêmes)
imputer_num = SimpleImputer(strategy='median')
df['Age'] = imputer_num.fit_transform(df[['Age']]).ravel()  # .ravel() pour repasser en format série

# 🏙️ Pour la colonne texte 'Ville' : on utilise le mode (la valeur la plus fréquente)
imputer_cat = SimpleImputer(strategy='most_frequent')
df['Ville'] = imputer_cat.fit_transform(df[['Ville']]).ravel()

print("n✅ Après imputation :")
print(df)

Ce que tu obtiens : Les NaN de ‘Age’ sont remplacés par la médiane (35), et celui de ‘Ville’ par la mode (‘Paris’ ou ‘Lyon’, selon l’ordre).

L’astuce pro : l’indicateur de valeurs manquantes

Parfois, le fait qu’une valeur soit manquante est une information en soi (ex: un client qui n’a pas renseigné son salaire). Avec add_indicator=True, SimpleImputer ajoute des colonnes pour le signaler.

imputer = SimpleImputer(strategy='median', add_indicator=True)
X_with_indicator = imputer.fit_transform(X)

print("Shape original :", np.array(X).shape)
print("Shape avec indicateur :", X_with_indicator.shape)
print("nLes nouvelles colonnes (à la fin) indiquent 1 si la valeur était manquante, 0 sinon.")

C’est comme garder une trace dans ton carnet de voyage des endroits que tu n’as pas pu visiter. Ton modèle pourra en tenir compte.

L’intégrer dans un Pipeline (pour un workflow propre)

La force de scikit-learn, c’est l’enchaînement des étapes. Voici comment imbriquer SimpleImputer dans un Pipeline, le must pour un code robuste et reproduisible.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# Création d'un pipeline : imputation -> mise à l'échelle -> modèle
pipeline = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])

# Ensuite, tu utilises pipeline.fit() et pipeline.predict() normalement
# Il gère tout automatiquement, sans fuite de données !

❓ Questions Fréquentes (FAQ)

Q1 : Quand est-ce que je dois utiliser SimpleImputer et quand dois-je choisir KNNImputer ou IterativeImputer ?

  • SimpleImputer : C’est la solution rapide, simple et peu coûteuse. Parfait pour un premier prototypage, des données peu complexes, ou quand les valeurs manquantes sont peu nombreuses. Stratégie : moyenne/médiane/mode.
  • KNNImputer / IterativeImputer : Méthodes plus sophistiquées et calculatoires. À utiliser quand les variables sont corrélées entre elles. KNNImputer va chercher les lignes les plus similaires pour imputer. C’est plus précis, mais beaucoup plus lent sur gros datasets. (Source : Documentation officielle scikit-learn sur l’imputation).

Q2 : Est-ce que SimpleImputer fonctionne sur des données catégorielles (texte) ?

Oui, absolument ! Utilise la stratégie strategy='most_frequent'. Elle calcule la valeur la plus fréquente (le mode) et l’utilise pour remplir les trous. Cela fonctionne aussi bien pour du texte (‘Paris’, ‘Lyon’) que pour des nombres entiers représentant des catégories.

Q3 : Comment vérifier qu’il ne reste plus de NaN après imputation ?

Avec pandas, c’est un réflexe à avoir à la fin de ton prétraitement :

# Vérifie le nombre de valeurs manquantes par colonne
print(df.isnull().sum())

# Ou, pour un check global
if df.isnull().sum().sum() == 0:
    print("✅ Aucune valeur manquante !")
else:
    print("❌ Il reste des NaN.")

En résumé

SimpleImputer est ton premier outil dans la boîte à prétraitement. Rapide à mettre en place, il te permet de nettoyer ton dataset en quelques lignes pour passer à l’entraînement de modèle. N’oublie pas :

  • ⚠️ FIT uniquement sur le jeu d’entraînement.
  • 🎯 Choisis ta stratégie (médiane pour les données avec outliers).
  • 🚨 Pense à l’option add_indicator=True pour garder l’information “donnée manquante”.
  • 🔗 Enchaîne les étapes proprement avec un Pipeline.

Avec ça, les NaN ne seront plus qu’un mauvais souvenir. Bon code !

Laisser un commentaire