Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
SelectKBest : selection de features
Tu as 100 colonnes dans ton dataset, mais est-ce que toutes sont utiles ? Certaines sont du bruit, d'autres sont redondantes. Garder trop de features peut meme degrader les performances de ton modele (la malediction de la dimensionnalite). SelectKBest te permet de garder seulement les features qui comptent vraiment.
SelectKBest selectionne les k meilleures features selon un test statistique. Pour la classification, on utilise souvent f_classif (test ANOVA F). Pour la regression, mutual_info_regression.
Le test mesure a quel point chaque feature est liee a la cible. Les features avec les scores les plus eleves sont gardees.
from sklearn.feature_selection import SelectKBest, f_classif selector = SelectKBest(score_func=f_classif, k=5) X_selected = selector.fit_transform(X, y) selector.scores_ # score de chaque feature selector.get_support() # True/False pour chaque feature
Écris une fonction selectionner_features(X, y, k=5, feature_names=None) qui selectionne les k meilleures features et renvoie : 'X_selected' : les features selectionnees (array) 'scores' : dictionnaire feature_name (ou index) -> score 'features_gardees' : liste des noms (ou indices) des features gardees
Tests (4/4)
Bonne dimension
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=10, n_informative=5, random_state=42)
result = selectionner_features(X, y, k=5)
assert result['X_selected'].shape[1] == 5
K features gardees
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=10, random_state=42)
names = [f'f{i}' for i in range(10)]
result = selectionner_features(X, y, k=3, feature_names=names)
assert len(result['features_gardees']) == 3
Scores pour toutes les features
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=5, random_state=42)
result = selectionner_features(X, y, k=3)
assert len(result['scores']) == 5
Avec noms de features
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=4, random_state=42)
result = selectionner_features(X, y, k=2, feature_names=['age', 'taille', 'poids', 'salaire'])
assert all(isinstance(n, str) for n in result['features_gardees'])
Indices (3 disponibles)
Solution officielle
import numpy as np
from sklearn.feature_selection import SelectKBest, f_classif
def selectionner_features(X, y, k=5, feature_names=None):
selector = SelectKBest(score_func=f_classif, k=k)
X_selected = selector.fit_transform(X, y)
if feature_names is None:
feature_names = list(range(X.shape[1]))
scores = {name: float(s) for name, s in zip(feature_names, selector.scores_)}
mask = selector.get_support()
features_gardees = [name for name, keep in zip(feature_names, mask) if keep]
return {
'X_selected': X_selected,
'scores': scores,
'features_gardees': features_gardees,
}