Feature Selection à l'aide de la méthode de la variance
Variance Threshold: une approche simple pour réduire les dimensions
La méthode de la variance est une technique simple de sélection de variables qui consiste à supprimer celles dont la variance est trop faible. Une variable quasi constante n’apporte que très peu d’information au modèle car elle ne permet pas de distinguer efficacement les observations entre elles.
En pratique, on fixe un seuil (par exemple 0.01) et toutes les variables dont la variance est inférieure à ce seuil sont éliminées. Cette approche est rapide, intuitive et utile pour réduire le bruit dans les données dès les premières étapes du prétraitement. Toutefois, elle reste limitée car elle ne prend pas en compte la relation entre les variables et la cible, ce qui en fait une méthode de filtrage basique mais efficace pour une première réduction dimensionnelle.
Méthode de la variance mise en pratique sur le dataset Breast Cancer
Le dataset
Breast Cancer Wisconsin (que nous avons déjà traité lors de la
leçon de scaling et normalisation) disponible dans scikit-learn, est un jeu de données médicales largement utilisé pour l’apprentissage automatique. Il contient des mesures numériques extraites d’images de cellules mammaires, avec l’objectif de prédire si une tumeur est bénigne ou maligne.
Ce dataset est particulièrement adapté pour illustrer la méthode de la variance car certaines variables présentent une faible variabilité et peuvent être supprimées sans perte d’information significative. En l’utilisant, on peut observer concrètement comment la sélection par variance réduit le nombre de variables tout en conservant celles qui contribuent réellement à la classification.
Je propose ce code:
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
print("Features initiales:")
print(data.feature_names)
print("Dimensions initiales:", X.shape)
# Appliquer la sélection par variance
# On fixe un seuil de variance à 0.01
selector = VarianceThreshold(threshold=0.01)
X_reduced = selector.fit_transform(X)
print("Dimensions après sélection:", X_reduced.shape)
# Afficher les variables conservées
selected_features = X.columns[selector.get_support()]
print("Features retenues:")
print(selected_features)
Passons à l'explication:
On commence par importer les modules nécessaires: d’une part, le jeu de données Breast Cancer Wisconsin depuis scikit-learn, et d’autre part, la classe
VarianceThreshold qui permet de réaliser une sélection de variables en éliminant celles dont la variance est trop faible.
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import VarianceThreshold
Ensuite, on affiche l'intégralité des features du dataset ainsi que les dimensions de ce dernier:
print("Features initiales:")
print(data.feature_names)
print("Dimensions initiales:", X.shape)
Ce qui donne:
Features initiales:
['mean radius' 'mean texture' 'mean perimeter' 'mean area'
'mean smoothness' 'mean compactness' 'mean concavity'
'mean concave points' 'mean symmetry' 'mean fractal dimension'
'radius error' 'texture error' 'perimeter error' 'area error'
'smoothness error' 'compactness error' 'concavity error'
'concave points error' 'symmetry error' 'fractal dimension error'
'worst radius' 'worst texture' 'worst perimeter' 'worst area'
'worst smoothness' 'worst compactness' 'worst concavity'
'worst concave points' 'worst symmetry' 'worst fractal dimension']
Dimensions initiales: (569, 30)
Le dataset se révèle particulièrement riche puisqu’il comporte 30 variables explicatives.
Ensuite, on applique la Feature Selection pour éliminer les colonnes peu pertinentes pour l’apprentissage:
selector = VarianceThreshold(threshold=0.01)
X_reduced = selector.fit_transform(X)
En effet, ce code applique une sélection de variables par la variance. L'instruction
selector = VarianceThreshold(threshold=0.01) crée un objet qui supprimera toutes les features dont la variance est inférieure à 0.01, c’est-à-dire celles qui sont quasi constantes et donc peu informatives. Ensuite,
X_reduced = selector.fit_transform(X) entraîne le sélecteur sur les données X et renvoie une nouvelle matrice contenant uniquement les variables retenues.
Maintenant, on affiche combient de features ont été retenues après l'opération de la feature sélection:
print("Dimensions après sélection:", X_reduced.shape)
Ce qui donne:
Dimensions après sélection: (569, 14)
Cela signifie qu’après l’application de la méthode VarianceThreshold avec un seuil de 0.01, le dataset Breast Cancer Wisconsin est passé de 569 observations et 30 variables initiales à 569 observations et seulement 14 variables retenues. Autrement dit, 16 features ont été supprimées car leur variance était trop faible, ce qui illustre concrètement la réduction dimensionnelle et l’élimination des variables peu informatives.
En fin, on affiche les features qui ont été retenues:
selected_features = X.columns[selector.get_support()]
print("Features retenues:")
print(selected_features)
La méthode
get_support() renvoie un masque booléen (une liste de True/False) indiquant quelles colonnes ont été conservées après l’application du filtre de variance. Donc, selector.get_support() produit un tableau de la même longueur que le nombre de colonnes de X où chaque position vaut True si la feature a été retenue, et False si elle a été éliminée. Ensuite;
X.columns[...] utilise ce masque pour sélectionner uniquement les noms des colonnes correspondantes.
L'exéuction de cette portion de code produit ce résultat:
Features retenues:
Index(['mean radius', 'mean texture', 'mean perimeter', 'mean area',
'radius error', 'texture error', 'perimeter error', 'area error',
'worst radius', 'worst texture', 'worst perimeter', 'worst area',
'worst compactness', 'worst concavity'],
dtype='object')
Les features retenues concernent principalement des mesures liées au rayon, périmètre, surface et texture des cellules ainsi que leurs erreurs et valeurs « worst » (mesures maximales observées). Cela illustre que les variables quasi constantes (faible variance) ont été éliminées, tandis que celles qui présentent une variabilité significative entre les observations ont été gardées.
En pratique, cela réduit le bruit et concentre l’analyse sur les caractéristiques les plus discriminantes pour la classification bénin/malin.