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

Leçon 16: Temporal Feature Engineering: transformer une date en données

Toutes les leçons

Temporal Feature Extraction

Qu’est-ce que la Temporal Feature Extraction?

La Temporal Feature Extraction (ou extraction de caractéristiques temporelles) est une technique de feature engineering qui consiste à transformer une variable de type date ou temps en un ensemble de nouvelles variables plus informatives.

Au lieu de garder une date brute, on en extrait des éléments comme l’année, le mois, le jour, le jour de la semaine, l’heure, le trimestre ou encore des indicateurs saisonniers (vacances, week-end, etc.). On peut également créer des variables dérivées comme des décalages (lags), des moyennes mobiles ou des encodages cycliques (sinus/cosinus) pour capturer la périodicité.

L’objectif est de rendre explicite la structure temporelle cachée dans les données afin que les modèles puissent mieux identifier les tendances, les cycles et les comportements récurrents.

Pourquoi utiliser la Temporal Feature Extraction?

L’extraction temporelle est cruciale car de nombreux phénomènes suivent des patterns liés au temps (commme les ventes qui augmentent en fin d’année, le trafic web qui varie selon les jours de la semaine, la consommation énergétique qui dépend des saisons...).

En enrichissant les données avec ces variables, on permet aux algorithmes de machine learning de mieux capturer la dynamique temporelle et d’améliorer leurs performances prédictives. Sans cette étape, un modèle risquerait de manquer des régularités essentielles, car une simple date brute n’a pas de signification numérique exploitable.

En résumé, la temporal feature extraction transforme le temps en information exploitable, rendant les prédictions plus précises et plus robustes.

Exemple simplifié de Temporal Feature Extraction?

Voici un code qui illustre la création et l’enrichissement d’un petit dataset temporel:
import pandas as pd
import numpy as np

# Création d'un dataset artificiel avec 5 dates
data = {
   "date": pd.date_range(start="2025-01-01",
      periods=5, freq="1M")
   # Une date chaque mois
}
df = pd.DataFrame(data)

# Extraction des informations temporelles
df["année"] = df["date"].dt.year
df["mois"] = df["date"].dt.month
df["jour"] = df["date"].dt.day
df["jour_semaine"] = df["date"].dt.day_name()
df["semaine"] = df["date"].dt.isocalendar().week
df["trimestre"] = df["date"].dt.quarter

Le code de l'exemple précédent génère d’abord cinq dates espacées d’un mois à partir du 1er janvier 2025 à l'aide de la méthode Pandas date_range():
  • start="2025-01-01": la première date générée sera le 1er janvier 2025.
  • periods=5: on demande à générer 5 dates au total.
  • freq="1M": la fréquence est mensuelle (M = fin de mois). Cela signifie que chaque date générée correspondra au dernier jour de chaque mois. On peut également mettre D pour Day, B pour Business day, W pour semaine. On peut égalment préfixer la fréquence par un nombre de notre choix (1, 2, 7...)

Puis on construit un tableau DataFrame avec ces valeurs (df = pd.DataFrame(data)). Ensuite, on applique une étape de temporal feature extraction en ajoutant plusieurs colonnes dérivées de la variable date: l’année, le mois, le jour, le nom du jour de la semaine, le numéro de la semaine ISO et le trimestre.
Dans pandas, l’attribut .dt est une interface d’accès aux propriétés et méthodes des objets de type datetime. Il sert de pont qui permet d’accéder aux composants temporels (année, mois, jour, heure, etc.) ou d’utiliser des méthodes spécifiques aux dates.
L’idée du code est de transformer une simple information de type date en un ensemble de caractéristiques explicites et exploitables par un modèle de machine learning ou une analyse statistique, afin de mieux capturer les tendances, les cycles et les comportements liés au temps.

Si on affiche le dataframe df, on obtient:
Temporal feature extraction - Feature engineering

Encodage cyclique des variables temporelles

Lorsqu’on manipule des variables temporelles comme le mois ou le jour de la semaine, il est essentiel de tenir compte de leur nature cyclique. En effet, après décembre vient janvier, et après dimanche vient lundi. Si l’on encode ces valeurs simplement comme des entiers (1 à 12 pour les mois, 1 à 7 pour les jours), un modèle statistique ou de machine learning risque de considérer que 12 et 1 sont très éloignés, alors qu’ils sont en réalité voisins dans le cycle.

Pour résoudre ce problème, on utilise l’encodage cyclique basé sur les fonctions trigonométriques sinus et cosinus. L’idée est de projeter chaque valeur sur un cercle trigonométrique, en calculant ses coordonnées (sin ,cos) comme ceci:
\(\mathrm{mois\_ sin}=\sin \left( \frac{2\pi \cdot \mathrm{mois}}{12}\right)\)
\(\mathrm{mois\_ cos}=\cos \left( \frac{2\pi \cdot \mathrm{mois}}{12}\right)\)
  • Le dénominateur 12 correspond au nombre total de mois: Lorsque l’on calcule l’angle associé à un mois, on doit normaliser la valeur du mois par rapport au cycle complet. Comme une année contient 12 mois, on divise la valeur du mois par 12 pour obtenir une fraction de cycle (par exemple: janvier = 1/12, juin = 6/12 et décembre = 12/12).
  • 2π permet de couvrir tout le cercle trigonométrique: Un cercle trigonométrique est mesuré en radians, et sa circonférence correspond à \(2\pi\) radians (soit 360°). Multiplier la fraction du mois par \(2\pi\) permet de transformer cette position relative en angle en radians.

Ainsi, chaque mois est représenté par un point sur le cercle, ce qui permet au modèle de comprendre la périodicité naturelle des données. Par exemple, janvier et décembre auront des coordonnées proches, reflétant leur proximité temporelle.

Ajoutons ces instructions au code précédent:
df["mois_sin"] = np.sin(2 * np.pi * df["mois"] / 12)
df["mois_cos"] = np.cos(2 * np.pi * df["mois"] / 12)
Si on affiche notre dataframe, alors on aura deux autres champs qui s'ajoutent:
Cyclical feature encoding - Feature engineering
Cette technique, appelée cyclical feature encoding, est particulièrement utile pour capturer les patterns saisonniers ou hebdomadaires dans les séries temporelles et améliorer la performance des modèles prédictifs.