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

Page 7: Encodage des variables catégorielles avec Label Encoding

Toutes les pages

Label Encoding appliqué au dataset Titanic

Encodage des variables catégorielles et classification k‑NN sur le Titanic

Dans cette leçon, nous allons mettre en pratique la technique du Label Encoding en utilisant le célèbre dataset Titanic. Ce jeu de données contient plusieurs champs catégoriels qu’il est nécessaire de transformer en valeurs numériques pour les rendre exploitables par les algorithmes de machine learning. Parmi ces variables, on retrouve par exemple:
  • Sex: indiquant si le passager est de sexe masculin ou féminin
  • Embarked: le port d’embarquement (C pour Cherbourg, Q pour Queenstown et S pour Southampton)
  • Pclass: la classe du billet, qui reflète une catégorie sociale (1, 2 et 3)

Notez que même si la variable Pclass du dataset Titanic est déjà représentée par des nombres (1, 2, 3), il ne s’agit pas d’une mesure quantitative mais bien d’une catégorie ordinale (Première, Deuxième, Troisième classe). Laisser ces valeurs telles quelles peut induire le modèle en erreur car il pourrait interpréter la différence entre 1 et 3 comme une relation numérique continue. L’encodage permet de préciser au modèle qu’il s’agit de catégories et non de valeurs quantitatives.

L’encodage des champs catégoriels du dataset Titanic permettra de préparer efficacement les données pour l’entraînement d’un modèle de classification, tout en conservant la possibilité de revenir aux valeurs originales grâce à l’inversion des labels.
Dans le cours de Machine Learning, nous avons déjà réalisé ces transformations manuellement en utilisant les méthodes map et apply, mais cela nécessitait une connaissance préalable de toutes les modalités possibles (par exemple, savoir à l’avance que Embarked peut être C, Q ou S). Cette exigence rendait la tâche plus complexe et moins flexible surtout lorsque le nombre de catégories est élevé.
Encore une fois, je vous présente le code dans son intégralité et j'expliquerai les passages importants relatifs à l'encodage:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

df = pd.read_csv("titanic.csv")
data = df[['Sex', 'Embarked', 'Pclass', 'Survived']].dropna()
X = data[['Sex', 'Embarked', 'Pclass']]
y = data['Survived']

# Encodage avec LabelEncoder
le_sex = LabelEncoder()
X['Sex'] = le_sex.fit_transform(X['Sex'])

le_embarked = LabelEncoder()
X['Embarked'] = le_embarked.fit_transform(X['Embarked'])

X_train, X_test, y_train, y_test = train_test_split(X, 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))

# Inverser les labels encodés
encoded_vals = X['Sex'][:10].values
decoded_vals = le_sex.inverse_transform(encoded_vals)
print("Sex encodé:", encoded_vals)
print("Sex original:", decoded_vals)

encoded_embarked = X['Embarked'][:10].values
decoded_embarked = le_embarked.inverse_transform(encoded_embarked)
print("Embarked encodé:", encoded_embarked)
print("Embarked original:", decoded_embarked)
On commence par importer la classe LabelEncoder depuis le module preprocessing de la bibliothèque scikit-learn.
from sklearn.preprocessing import LabelEncoder
Dans le dataset Titanic, la colonne Sex contient des valeurs catégorielles ("male" et "female"). Les algorithmes de machine learning (comme K-NN) ne peuvent pas directement traiter du texte, ils ont besoin de valeurs numériques. On va donc l'encoder comme ceci:
le_sex = LabelEncoder()
X['Sex'] = le_sex.fit_transform(X['Sex'])
Expliquons rapidement chaque instruction:
  • LabelEncoder(): Crée un objet encodeur qui va convertir des labels (catégories textuelles) en entiers.
  • fit_transform(X['Sex']): apprend quelles sont les catégories présentes dans la colonne (fit) puis remplace chaque catégorie par un entier (transform). Par conséquent, la colonne Sex devient une variable binaire numérique utilisable par les algorithmes de machine learning (female=0, male=1).

On procède de la même manière pour la colonne Embarked:
le_embarked = LabelEncoder()
X['Embarked'] = le_embarked.fit_transform(X['Embarked'])
Comme résultat, les trois catégories du champs Embarked seront remplacées par des entiers (C=0, Q=1, S=2).

Une fois le modèle entraîné, il est essentiel de rétablir les catégories originales (qui sont plus significatives pour l’interprétation). C’est pourquoi on utilise la méthode inverse_transform qui permet de retrouver les valeurs initiales avant l’encodage.
encoded_vals = X['Sex'][:10].values
decoded_vals = le_sex.inverse_transform(encoded_vals)

encoded_embarked = X['Embarked'][:10].values
decoded_embarked = le_embarked.inverse_transform(encoded_embarked)
Ce code montre comment utiliser la méthode inverse_transform de LabelEncoder pour reconvertir les valeurs numériques encodées en leurs catégories originales. On extrait d’abord les dix premières valeurs encodées de la colonne Sex et on les traduit à nouveau en "male" ou "female", puis on fait la même opération pour la colonne Embarked afin de retrouver les ports d’embarquement (C, Q, S), ce qui permet de rétablir les données textuelles initiales et donc de rendre les résultats plus interprétables après l’entraînement du modèle.

Après l'exécution du code entier on obtient ces résultats:
Accuracy k-NN: 0.8033707865168539
Sex encodé: [1 0 0 0 1 1 1 1 0 0]
Sex original: ['male' 'female' 'female' 'female' 'male' 'male' 'male' 'male' 'female'
'female']
Embarked encodé: [2 0 2 2 2 1 2 2 2 0]
Embarked original: ['S' 'C' 'S' 'S' 'S' 'Q' 'S' 'S' 'S' 'C']
Contrairement à Sex ou Embarked, la colonne Pclass (Passenger Class) est déjà numérique dans le dataset (bien qu'elle soit catégorielle). On n’a donc pas besoin de l’encoder avec LabelEncoder car les valeurs sont directement utilisables par les algorithmes de machine learning.
Pour éviter que le modèle interprète les chiffres de Plcass comme une relation mathématique (par exemple 3 > 2 > 1), il est souvent préférable de l’encoder avec un OneHotEncoder. Nous verrons en détail cette approche lors de la prochaine leçon.