Aller au contenu principal

Module 9 — Sélection de variables : filtres, enveloppes, importance

Les modules précédents ont surtout ajouté des variables. À force de décomposer des dates, d'encoder des catégories et d'agréger des historiques, on se retrouve avec des centaines de colonnes dont beaucoup n'apportent rien. Ce module fait le tri — et la question n'est pas seulement esthétique.

Pourquoi réduire

Quatre raisons, dont deux qu'on sous-estime souvent :

  • la performance : les variables inutiles ajoutent du bruit sur lequel le modèle peut surajuster, en particulier quand les observations sont peu nombreuses au regard du nombre de colonnes ;
  • la vitesse : entraînement et prédiction plus rapides, ce qui compte sous contrainte de temps réel ;
  • l'interprétabilité : un modèle à 15 variables s'explique à un décideur, un modèle à 400 ne s'explique pas ;
  • le coût d'exploitation, le plus négligé : chaque variable est un calcul à maintenir en production, une source de données qui peut tomber, une dépendance qui peut dériver. Une variable qui rapporte 0,1 point de performance pour un pipeline nocturne supplémentaire est une mauvaise affaire.

Le préalable : éliminer ce qui est manifestement inutile

Avant toute méthode élaborée, deux nettoyages gratuits. Les variables quasi constantes (une seule valeur dans 99 % des cas) ne peuvent rien discriminer. Les variables quasi dupliquées (corrélation supérieure à 0,95 avec une autre) comptent deux fois la même information ; on en garde une, en privilégiant la plus simple à produire et à expliquer.

from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold=0.01) # retire les variables quasi constantes

Méthodes par filtre : rapides et indépendantes du modèle

Un filtre évalue chaque variable par une mesure statistique de lien avec la cible, sans entraîner de modèle. C'est très rapide, ce qui permet de dégrossir un ensemble de plusieurs milliers de colonnes.

from sklearn.feature_selection import SelectKBest, f_classif, mutual_info_classif

SelectKBest(f_classif, k=50) # test statistique : lien lineaire
SelectKBest(mutual_info_classif, k=50) # information mutuelle : tout lien

L'information mutuelle est préférable au test F dans la plupart des cas, car elle capture aussi les relations non linéaires, que le test F ignore.

Les filtres ont cependant une faiblesse de principe qu'il faut connaître : ils jugent chaque variable isolément. Deux variables inutiles séparément peuvent être décisives ensemble, et un filtre les écartera toutes les deux. Symétriquement, il conservera dix variables excellentes mais redondantes.

Méthodes par enveloppe : plus justes, plus coûteuses

Une enveloppe évalue des sous-ensembles en entraînant réellement le modèle. La plus utilisée est l'élimination récursive : on entraîne, on retire la variable la moins importante, on recommence.

from sklearn.feature_selection import RFECV

RFECV(estimator=modele, step=1, cv=5, scoring="roc_auc")

La variante RFECV détermine en outre le nombre optimal de variables par validation croisée, ce qui évite de le fixer arbitrairement. L'approche tient compte des interactions et s'accorde au modèle visé ; son coût de calcul est en revanche sans comparaison avec celui d'un filtre.

Méthodes intégrées : le modèle sélectionne lui-même

Certains modèles font la sélection pendant l'entraînement. Lasso met à zéro les coefficients les moins utiles, comme vu au cours 04 : les variables survivantes sont les variables retenues. Les modèles à base d'arbres fournissent une importance des variables directement exploitable.

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV

SelectFromModel(LassoCV(cv=5)) # variables a coefficient non nul
SelectFromModel(modele_arbres, threshold="median") # au-dessus de l'importance mediane

C'est le meilleur rapport coût-bénéfice : la sélection est cohérente avec le modèle final et ne demande qu'un entraînement.

L'importance par permutation : la mesure la plus fiable

Les importances issues des arbres ont deux biais connus, signalés au cours 04 : elles favorisent les variables à nombreuses modalités, et elles se répartissent arbitrairement entre variables corrélées.

L'importance par permutation contourne ces biais par une idée directe : mélanger aléatoirement les valeurs d'une variable et mesurer la dégradation de performance. Si mélanger une variable ne change rien, elle n'était pas utilisée.

from sklearn.inspection import permutation_importance
r = permutation_importance(modele, X_val, y_val, n_repeats=10, scoring="roc_auc")

Deux qualités décisives : la mesure fonctionne sur n'importe quel modèle, et elle se calcule sur les données de validation, donc mesure l'utilité réelle en généralisation et non la contribution à l'ajustement. Une importance négative signale une variable qui nuit — elle est à retirer sans hésiter.

Une démarche pragmatique

Le plus efficace en pratique combine les approches : nettoyer les variables quasi constantes et quasi dupliquées, dégrossir par information mutuelle si le nombre de colonnes est élevé, puis affiner par importance par permutation sur le modèle retenu. Et fixer le seuil par la performance en validation croisée, pas par une règle arbitraire : on retient le plus petit ensemble dont la performance reste dans le bruit de la performance maximale. Le gain d'exploitation dépasse alors largement le dixième de point sacrifié.

En résumé

  • On réduit pour la performance, la vitesse, l'interprétabilité et surtout le coût d'exploitation de chaque variable en production.
  • Les filtres (information mutuelle de préférence) sont rapides mais jugent chaque variable isolément, ratant les interactions.
  • Les enveloppes (élimination récursive, RFECV) tiennent compte des interactions au prix d'un calcul lourd ; les méthodes intégrées (Lasso, importances d'arbres) offrent le meilleur compromis.
  • L'importance par permutation est la mesure la plus fiable : indépendante du modèle, calculée en validation, et une valeur négative signale une variable nuisible.

Module suivant : les chaînes de traitement scikit-learn, qui rendent tout ce cours reproductible et immunisé contre la fuite.