skrub préparation de données

Skrub pour préparer efficacement vos données : une solution Python pour le machine learning

Emmanuel Jakobowicz Mis à jour le : 21 mai 2025 méthode, python Leave a Comment

Introduction

Dans le domaine du machine learning, la qualité des données est primordiale. Cependant, les données réelles sont souvent désordonnées, incomplètes ou mal structurées.

Skrub est une bibliothèque Python développée pour faciliter la préparation de telles données tabulaires hétérogènes. Elle offre des outils puissants pour le nettoyage, la transformation et l’enrichissement des données, tout en s’intégrant parfaitement avec des bibliothèques populaires comme pandas et scikit-learn.

Skrub est développé par des core développeurs de scikit-learn en complément de ce package afin de faciliter l’utilisation de scikit-learn.

Alors pourquoi utiliser skrub ? Car les outils de préparation de données de scikit-learn restent limités et l’utilisation de pandas n’est pas adapté aux problématiques machine learning.

Installation de Skrub

Skrub peut être installé facilement via pip :

pip install skrub

Ou via conda :

conda install -c conda-forge skrub

Chargement d’un jeu de données réel

Pour illustrer les fonctionnalités de Skrub, utilisons le jeu de données fetch_employee_salaries fourni par la bibliothèque :

import pandas as pd
from skrub.datasets import fetch_employee_salaries
from sklearn.model_selection import train_test_split

dataset = fetch_employee_salaries()
X, y = dataset.X, dataset.y

# séparation des données en apprentissage / test
x_train, x_test, y_train, y_test = train_test_split(X,y)

Ce jeu de données contient des informations sur les employés, telles que le sexe, le département, le titre du poste, etc., ainsi que leur salaire.

Nettoyage des données avec Cleaner

Skrub propose un outil appelé Cleaner pour faciliter le nettoyage des données :

from skrub import Cleaner

cleaner = Cleaner()
X_clean = cleaner.fit_transform(X)

Le Cleaner effectue plusieurs opérations, telles que :

  • La conversion des chaînes de caractères représentant des dates en objets datetime.
  • La détection et la gestion des valeurs manquantes.
  • La suppression des colonnes contenant trop de valeurs nulles.

On peut afficher les différentes transformations appliquées à chaque colonne du DataFrame :

cleaner.all_processing_steps_
skrub Cleaner

On voit ici que pour chaque colonne il applique des transformations différentes. Par exemple, un ToDatetime() pour la colonne date_first_hired.

Exploration des données avec TableReport

Pour obtenir un aperçu interactif des données, Skrub offre l’outil TableReport. La classe TableReport est un outil interactif conçu pour faciliter l’analyse exploratoire des données tabulaires. Elle génère un rapport riche et structuré, offrant une vue d’ensemble complète d’un DataFrame, ce qui permet de mieux comprendre la structure et la qualité des données avant de les utiliser dans des modèles de machine learning. Cette fonctionnalité ressemble à ydata-profiling :

from skrub import TableReport

report = TableReport(X_clean)

TableReport génère un rapport interactif affichant :

  • Les statistiques descriptives de chaque colonne.
  • La distribution des valeurs pour les colonnes catégorielles et numériques.
  • Les associations entre les colonnes, basées sur des mesures telles que le coefficient de Cramér.

Vectorisation des données avec TableVectorizer

Pour préparer les données en vue de l’entraînement d’un modèle de machine learning, il est nécessaire de convertir les variables catégorielles en représentations numériques. Skrub propose TableVectorizer pour automatiser ce processus :

from skrub import TableVectorizer

vec = TableVectorizer()
x_train_vec = vec.fit_transform(x_train_clean)

TableVectorizer détecte automatiquement les types de colonnes (numériques, catégorielles, dates) et applique les transformations appropriées, telles que l’encodage one-hot ou l’encodage de dates. Par exemple, si il découvre plus de 40 catégories sur une colonne, il n’applique pas de transformation OneHotEncoder mais il utilise un GapEncoder. Les transformations utilisées sont toutes compatibles avec scikit-learn.

Sur nos données, voici les transformations appliquées :

skrub TableVectorizer

On voit que les colonnes numériques ne sont pas transformées et les autres colonnes sont traitées avec la transformation adaptée.

Si vous désirez appliquer une transformation spécifique à certaines colonnes (des colonnes numériques à traiter comme catégorielles par exemple), vous pouvez utiliser le paramètre specific_transformers qui vous permet d’entrer un tuple (OneHotEncoder(),['col1','col2']).

Jointure floue avec fuzzy_join

Dans de nombreux cas, il est nécessaire de fusionner des tables contenant des clés similaires mais non identiques (par exemple, des noms de pays avec des variations orthographiques). Skrub propose la fonction fuzzy_join pour effectuer des jointures approximatives (jointure à gauche) :

from skrub import fuzzy_join

left = pd.DataFrame({'Country': ['France', 'Italia', 'Georgia']})
right = pd.DataFrame({'Country Name': ['France', 'Italy', 'Germany'], 'Capital': ['Paris', 'Rome', 'Berlin']})

joined = fuzzy_join(left, right, left_on='Country', right_on='Country Name', add_match_info=True)
joined

La fonction fuzzy_join calcule la similarité entre les chaînes de caractères et effectue la jointure même en présence de variations orthographiques. On demande ici d’ajouter une donnée sur les distances calculées. On obtient comme résultat :

skrub fuzzy_join

Ici on voit que la fonction associe Georgia et Germany ce qui est faux, on peut modifier le niveau d’agrégation en utilisant :

joined = fuzzy_join(left, right, left_on='Country', right_on='Country Name',max_dist=0.8, add_match_info=True)
joined
skrub corrected fuzzy join

Construction d’un pipeline complet

Skrub s’intègre parfaitement avec scikit-learn, permettant la construction de pipelines complets pour le traitement des données et l’entraînement de modèles :

from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestRegressor

pipeline = make_pipeline(
    Cleaner(),
    TableVectorizer(),
    RandomForestRegressor(random_state=42)
)

pipeline.fit(x_train, y_train)

Ce pipeline effectue le nettoyage des données (avec Cleaner), la vectorisation (avec TableVectorizer) et l’entraînement d’un modèle de régression, le tout de manière transparente comme vous avez l’habitude de le faire avec scikit-learn (Forêt aléatoire avec python et scikit-learn).

Le pipeline obtenu est le suivant :

skrub ml-pipeline

Une fois cet apprentissage effectué, il est extrêmement simple d’appliquer ce pipeline pour scorer des données de test, on pourra utiliser :

from sklearn.metrics import root_mean_squared_error

predictions = pipeline.predict(x_test)
rmsea = root_mean_squared_error(y_test,predictions)
print(f"Le RMSEA sur les données de test est de : {rmsea}")

# Le RMSEA sur les données de test est de : 6126.813024829293

Le processus de machine learning est encore plus simple qu’avec scikit-learn uniquement.

Conclusion

Skrub est une bibliothèque puissante pour la préparation des données tabulaires en vue du machine learning. Elle simplifie les étapes de nettoyage, de transformation et de fusion des données, tout en s’intégrant harmonieusement avec les outils existants de l’écosystème Python. Que vous soyez data scientist, analyste ou ingénieur en machine learning, Skrub peut grandement faciliter votre travail sur des données réelles souvent désordonnées.

Ressources supplémentaires

  • Notebook Jupyter : Un notebook contenant tous les exemples de code présentés dans cet article est disponible ici.

Partager cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.