Recette : Intégrer le contrôle de qualité des données d’entraînement avec Workflow v6
Apprenez à automatiser la validation de la qualité des jeux de données d’entraînement grâce à Workflow v6, pour garantir la fiabilité des modèles IA dès le départ.
Contexte et objectifs
La qualité des données d’entraînement influence directement la robustesse et la performance des modèles d’intelligence artificielle. Dans un environnement d’ingénierie produit, il est essentiel de détecter les incohérences, les doublons ou les valeurs manquantes avant le lancement d’un job d’entraînement. Cette recette montre comment implémenter un contrôle de qualité (Data Quality Check, DQC) dans un pipeline Workflow v6, en s’appuyant sur des tâches Python, des déclencheurs d’alerte et la persistance des métriques.
1. Définir les règles de qualité
Avant d’écrire le code, listez les règles à appliquer :
- Complétude : chaque enregistrement doit contenir toutes les colonnes obligatoires.
- Valeurs hors‑plage : les champs numériques doivent rester dans les intervalles attendus.
- Duplication : aucune ligne ne doit être dupliquée.
- Consistance de type : les colonnes catégorielles ne doivent contenir que les catégories pré‑définies.
Ces règles sont décrites dans un fichier YAML (dqc_rules.yaml) afin de les rendre modifiables sans toucher au code :
# dqc_rules.yaml
completude:
colonnes_obligatoires: ["id", "texte", "label"]
valeurs_hors_plage:
age:
min: 0
max: 120
duplication:
cle_primaire: "id"
consistance_type:
label:
categories: ["positif", "negatif", "neutre"]
2. Implémenter le contrôle dans le pipeline Workflow v6
2.1. Tâche Python de validation
Créez une tâche data_quality_check qui charge le jeu de données, applique les règles et renvoie un rapport JSON.
# tasks/data_quality_check.py
import yaml, json, pandas as pd
from pathlib import Path
def load_rules(path: str) -> dict:
with open(path) as f:
return yaml.safe_load(f)
def run_dqc(df: pd.DataFrame, rules: dict) -> dict:
report = {"errors": []}
# Complétude
missing = [col for col in rules["completude"]["colonnes_obligatoires"] if col not in df.columns]
if missing:
report["errors"].append({"type": "missing_columns", "details": missing})
# Valeurs hors‑plage
for col, limits in rules.get("valeurs_hors_plage", {}).items():
if col in df.columns:
out_of_range = df[(df[col] < limits["min"]) | (df[col] > limits["max"])][col]
if not out_of_range.empty:
report["errors"].append({"type": "out_of_range", "column": col, "count": len(out_of_range)})
# Duplication
dup = df.duplicated(subset=rules["duplication"]["cle_primaire"], keep=False)
if dup.any():
report["errors"].append({"type": "duplicates", "count": dup.sum()})
# Consistance de type
for col, spec in rules.get("consistance_type", {}).items():
if col in df.columns:
invalid = ~df[col].isin(spec["categories"])
if invalid.any():
report["errors"].append({"type": "invalid_category", "column": col, "count": invalid.sum()})
report["status"] = "OK" if not report["errors"] else "FAIL"
return report
if __name__ == "__main__":
df = pd.read_parquet(Path("{{input_path}}"))
rules = load_rules("{{rules_path}}")
report = run_dqc(df, rules)
Path("{{output_path}}").write_text(json.dumps(report, indent=2))
2.2. Déclaration du workflow
Dans le fichier workflow.yaml, ajoutez la tâche et configurez les chemins d’entrée/sortie.
name: dqc-pipeline
steps:
- name: fetch-data
type: fetch
args:
uri: s3://bucket/dataset.parquet
out: data.parquet
- name: data-quality-check
type: python
args:
script: tasks/data_quality_check.py
input_path: data.parquet
rules_path: dqc_rules.yaml
output_path: dqc_report.json
on_success: continue
on_failure: abort
- name: notify
type: webhook
args:
url: https://hooks.example.com/alert
payload: "{{ read_file('dqc_report.json') }}"
condition: "{{ read_json('dqc_report.json').status == 'FAIL' }}"
3. Automatiser les alertes et les corrections
- Alertes : le step
notifyne s’exécute que si le rapport indique un statutFAIL. Le payload JSON contient la liste des erreurs, facilitant le triage. - Correction automatique : pour les cas simples (ex. valeurs manquantes), on peut ajouter un step
impute-missingqui remplit les NaN avec la moyenne ou une valeur par défaut. Ce step doit être placé entrefetch-dataetdata-quality-checket conditionné par la présence d’erreurs de typemissing_columns. - Persistencia : stockez les rapports DQC dans un bucket dédié (
s3://bucket/dqc-reports/) avec un horodatage. Cela crée un historique exploitable pour l’audit et le suivi de la dérive de données.
4. Bonnes pratiques et pièges à éviter
- Versionner les règles : conservez le fichier
dqc_rules.yamldans le même dépôt que le workflow. Chaque modification doit être revue comme tout changement de code. - Idempotence : assurez‑vous que la tâche
data_quality_checkne modifie pas le jeu de données. Elle ne doit produire que des métriques, pour éviter les effets de bord. - Scalabilité : pour des jeux de données supérieurs à quelques gigaoctets, utilisez le mode
pandas.read_parquet(..., engine='pyarrow')avec le paramètrechunksizeou migrez vers Spark via le composantspark-submitde Workflow v6. - Surveillance des temps d’exécution : un DQC très coûteux peut retarder l’ensemble du pipeline. Mesurez le temps de chaque step et définissez un seuil d’alerte (
max_duration: 300s) dans le fichierworkflow.yaml. - Gestion des faux positifs : certaines règles peuvent générer des alertes non critiques. Implémentez un mécanisme de sévérité (
warningvserror) et filtrez les notifications en conséquence.
En intégrant ces contrôles de qualité directement dans le pipeline Workflow v6, les équipes produit gagnent en confiance sur leurs données, réduisent les cycles de ré‑entraînement coûteux et améliorent la stabilité des modèles en production.
Envie d’aller plus loin avec WORKFLOW v6 ?
Découvrir WORKFLOW v6