Target Encoding: relier directement les variables catégorielles à la cible
Donner du sens aux catégorie grace au Target Encoding
Le
target encoding est une méthode d’encodage des variables catégorielles qui consiste à remplacer chaque modalité par une valeur calculée à partir de la variable cible.
Par exemple, dans le dataset Titanic, au lieu de garder male et female comme simples étiquettes, on calcule le taux de survie moyen pour chaque groupe. Anisi, male devient environ 0.19 et female environ 0.74. Ces valeurs numériques ne sont pas arbitraires mais elles traduisent directement la relation entre la catégorie et la probabilité de survie, ce qui rend l’information beaucoup plus pertinente pour l’algorithme d’apprentissage.
À titre de comparaison, le
Label Encoding attribue simplement un numéro à chaque catégorie (male = 0, female = 1) sans lien avec la cible. Cette approche est plus basique et souvent moins performante car elle ne fournit aucune information statistique utile au modèle. Le target encoding, en revanche, enrichit les données en intégrant la structure de la cible, ce qui peut améliorer la qualité des prédictions, à condition de l’appliquer avec précaution pour éviter la fuite d’information.
Target Encoding et data leakage: comprendre le risque de fuite d'information
La principale limite du target encoding réside dans le risque de
fuite d’information (ou data leakage). En effet, si l’on calcule les taux de survie (ou toute statistique de la cible) en utilisant l’ensemble complet des données, on introduit involontairement des informations du jeu de test dans l’entraînement. Cela fausse les résultats car le modèle apprend sur des données qu’il n’est pas censé connaître.
Pour éviter le problème de fuite d'information, il est recommandé d’appliquer le target encoding uniquement sur l’ensemble d’entraînement, puis de reporter les valeurs sur le test, ou encore de l’intégrer dans une procédure de
validation croisée avec lissage. Ainsi, on conserve la richesse de l’encodage tout en garantissant la fiabilité des performances du modèle.
Le lissage en target encoding consiste à ajuster les moyennes calculées pour chaque catégorie en les pondérant avec la moyenne globale de la cible afin d’éviter que les petites catégories ou celles avec peu d’exemples ne produisent des valeurs instables ou trompeuses.
Mise en pratique du Target Encoding sur le dataset Titanic
Nous allons voir comment transformer directement les variables catégorielles en valeurs numériques porteuses de sens statistique. Dans cette approche, nous allons encoder simultanément les trois variables Sex, Embarked et Pclass en utilisant le taux moyen de survie associé à chacune de leurs modalités.
Comme d'hatibude, le code sera présenté en une seule fois afin de montrer comment appliquer ce procédé de manière cohérente sur l’ensemble des colonnes choisies, puis des explications détailleront le fonctionnement et l’interprétation des résultats.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from category_encoders import TargetEncoder
df = pd.read_csv("titanic.csv")
data = df[['Sex', 'Embarked', 'Pclass', 'Survived']].dropna()
X = data[['Sex', 'Embarked', 'Pclass']]
y = data['Survived']
# Target Encoding pour Sex, Embarked et Pclass
target_encoder = TargetEncoder(cols=['Sex', 'Embarked', 'Pclass'])
X_encoded = target_encoder.fit_transform(X, y)
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.2, random_state=42)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print("Accuracy k-NN:", accuracy_score(y_test, y_pred))
print("Extrait Target Encoding de Pclass:")
print(X_encoded['Pclass'].head(10))
On commence par importer la classe
TargetEncoder du module
category_encoders:
from category_encoders import TargetEncoder
Ensuite, on met en place un Target Encoding sur les variables Sex, Embarked et Pclass du dataset Titanic:
target_encoder = TargetEncoder(cols=['Sex', 'Embarked', 'Pclass'])
X_encoded = target_encoder.fit_transform(X, y)
L'instruction
target_encoder = TargetEncoder(cols=['Sex', 'Embarked', 'Pclass']) crée un objet encodeur qui sait qu’il doit transformer ces trois colonnes en valeurs numériques basées sur la cible "Survived". Ensuite, l'instruction
X_encoded = target_encoder.fit_transform(X, y) applique l’encodage. En effet, pour chaque modalité de ces colonnes, l’encodeur calcule la moyenne de la variable cible (par exemple, le taux de survie des hommes, des femmes, des passagers de chaque port ou de chaque classe) et remplace la catégorie par cette valeur. Le résultat est un nouveau DataFrame
X_encoded où les variables catégorielles sont converties en nombres porteurs d’information statistique directement liée à la survie, ce qui rend les données plus exploitables par les algorithmes de machine learning.
L'exécution du code complet produit ce résultat:
Accuracy k-NN: 0.7640449438202247
Extrait Target Encoding de Pclass:
0 0.242363
1 0.626168
2 0.242363
3 0.626168
4 0.242363
5 0.242363
6 0.626168
7 0.242363
8 0.242363
9 0.472826
Les valeurs numériques observées constituent les statistiques attribuées à chaque modalité de la variable Pclass en fonction du taux moyen de survie des passagers.
- La valeur 0.626168: correspondent au taux de survie des passagers de la 1ère classe (environ 62 %).
- La valeur 0.472826: correspond au taux de survie associée à la 2ème classe (environ 47 %)
- La valeur 0.242363: représentent le taux de survie moyen des passagers de la 3ème classe (environ 24 %).
Ainsi, chaque ligne du DataFrame encodé reprend la valeur de survie moyenne liée à la classe du passager.