Le binning: discrétisation des variables continues
Réduire la granularité des données par intervalles
Après avoir vu comment réduire les features pour alléger le modèle via la
feature selection, cette fois nous allons explorer une autre approche: réduire le nombre de valeurs possibles d’un même feature grâce au binning.
Le principe du
binning (dit aussi discrétisation) consiste à transformer une variable continue en catégories en regroupant ses valeurs dans des intervalles prédéfinis. Par exemple, au lieu de travailler avec l’âge exact des passagers du Titanic, on peut créer des classes comme enfant, adolescent, adulte et senior. Cette technique simplifie l’information, rend les relations non linéaires plus visibles et peut améliorer la robustesse face aux valeurs extrêmes.
Le binning est particulièrement utile pour les modèles linéaires ou les analyses exploratoires, car il permet de mettre en évidence des tendances cachées et de faciliter l’interprétation des résultats même si cela implique une perte de précision.
Le binning appliqué au dataset Titanic: transformer l'âge en catégories
Nous allons appliquer le binning sur la variable Age du célèbre dataset Titanic. Nous allons procéder à un découpage en intervalles fixes (equal-width) qui transforme l’âge en catégories interprétables comme Enfant, Adolescent, Jeune adulte, Adulte et Senior. Nous allons ensuite appliquer un découpage par quantiles (equal-frequency) qui répartit les passagers en quatre groupes contenant chacun un nombre similaire d’individus.
L’objectif est de montrer comment une variable continue peut être simplifiée en classes, ce qui facilite l’analyse exploratoire, la mise en évidence de tendances (par exemple, le taux de survie selon les tranches d’âge) et l’amélioration de l’interprétabilité des modèles.
Je propose le code suivant:
import pandas as pd
titanic = pd.read_csv('titanic.csv')
titanic=titanic[['Age','Sex', 'Embarked', 'Pclass', 'Survived']].dropna()
# Binning en intervalles égaux (equal-width)
titanic['Age_bin_width'] = pd.cut(titanic['Age'],
bins=[0, 12, 18, 35, 60, 80],
labels=['Enfant', 'Adolescent', 'Jeune adulte',
'Adulte', 'Senior'])
# Binning par quantiles (equal-frequency)
titanic['Age_bin_quantile'] = pd.qcut(titanic['Age'], q=4,
labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(titanic[['Age','Age_bin_width','Age_bin_quantile']].head(10))
Expliquons rapidement ce que nous avons fait, et commençons par cette instruciton:
titanic['Age_bin_width'] = pd.cut(titanic['Age'],
bins=[0, 12, 18, 35, 60, 80],
labels=['Enfant', 'Adolescent', 'Jeune adulte',
'Adulte', 'Senior'])
La fonction
pd.cut() de Pandas permet de transformer une variable continue en une variable catégorielle en la découpant en intervalles prédéfinis appelés bins. Par conséquent, nous avons crée une nouvelle colonne appelée
Age_bin_width dans le DataFrame titanic, où chaque passager se voit attribuer une catégorie en fonction de son âge. Les intervalles définis par les bornes [0, 12, 18, 35, 60, 80] permettent de regrouper les âges en classes significatives et les étiquettes associées (Enfant, Adolescent, Jeune adulte, Adulte, Senior) rendent ces catégories plus lisibles et interprétables.
Ainsi, au lieu de manipuler une valeur numérique brute, l’âge est transformé en une variable qualitative: un passager de 10 ans sera classé comme Enfant, tandis qu’un passager de 25 ans sera classé comme Jeune adulte, ce qui facilite l’analyse et la comparaison entre groupes.
titanic['Age_bin_quantile'] = pd.qcut(titanic['Age'], q=4,
labels=['Q1', 'Q2', 'Q3', 'Q4'])
Cette instruction crée une nouvelle colonne appelée
Age_bin_quantile dans le DataFrame titanic où chaque passager est classé dans l’un des quatre groupes d’âge définis par les quartiles de la distribution.
Concrètement, la fonction
pd.qcut() découpe une variable continue en intervalles contenant chacun un nombre similaire d’observations (equal-frequency binning). Les labels Q1, Q2, Q3, Q4 permettent d’identifier ces catégories de manière lisible. Ainsi, au lieu de manipuler directement l’âge exact, on obtient une segmentation équilibrée de la population en quatre classes, ce qui facilite l’analyse comparative entre groupes et met en évidence des tendances ou différences de comportement.
Après exécution du code, on obtient ce résultat:
Age Age_bin_width Age_bin_quantile
0 22.0 Jeune adulte Q2
1 38.0 Adulte Q3
2 26.0 Jeune adulte Q2
3 35.0 Jeune adulte Q3
4 35.0 Jeune adulte Q3
6 54.0 Adulte Q4
7 2.0 Enfant Q1
8 27.0 Jeune adulte Q2
9 14.0 Adolescent Q1
10 4.0 Enfant Q1
La nouvelle variable
Age_bin_width qui regroupe les passagers du Titanic en catégories d’âge telles que Enfant, Adolescent, Jeune adulte, Adulte et Senior, peut désormais être utilisée directement comme feature dans un modèle de classification.
Comme il s’agit d’une variable catégorielle, il est nécessaire de la transformer en valeurs numériques pour l’entraînement du modèle. Cela peut se faire par
label encoding, qui attribue un entier à chaque catégorie, ou par
One hot encoding qui crée une colonne binaire pour chaque classe. Ainsi, l’information qualitative issue du binning devient exploitable par les algorithmes de machine learning tout en conservant la lisibilité et l’interprétation des groupes d’âge.
Comme la variable Age_bin_width comporte 5 catégories (Enfant, Adolescent, Jeune adulte, Adulte, Senior), l’application d’un One Hot Encoding produirait 5 colonnes binaires distinctes. Pour réduire la dimensionnalité et limiter la complexité du modèle, on peut envisager l’utilisation du
Binary Encoding qui permet de représenter ces 5 catégories avec seulement 3 colonnes.