Featureselectie: Variance Threshold en SelectKBest
Cursisten verwijderen features met vrijwel geen variantie, rangschikken de overgebleven features met univariate statistische tests en behouden alleen de K meest informatieve features.
Featureselectie: Variance Threshold en SelectKBest is een gratis Machine Learning Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Machine Learning Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Machine Learning Academy bevat in totaal 4 lessen.
Waarom kenmerken verwijderen?
Meer kenmerken toevoegen is niet altijd beter. Irrelevante kenmerken voegen ruis zonder signaal toe, waardoor het risico op overfitting toeneemt, het trainen wordt vertraagd en geheugen wordt verspild. Redundante kenmerken leveren dubbele informatie en kunnen sommige modellen instabiel maken. Kenmerkselectie identificeert en verwijdert deze onbruikbare invoer, zodat een compacte verzameling informatieve kenmerken overblijft. Het resultaat: sneller trainen, minder geheugengebruik, minder overfitting en vaak een betere generalisatie — vooral bij modellen zonder ingebouwde regularisatie, zoals KNN of Naive Bayes.
Variantiegrens: bijna constante kenmerken verwijderen
VarianceThreshold verwijdert kenmerken waarvan de variantie onder een opgegeven drempel ligt. Een kenmerk met variantie nul is constant: het heeft voor elk voorbeeld dezelfde waarde en levert daarom geen onderscheidende informatie. Bijna-constante kenmerken (met een zeer lage variantie) zijn vrijwel even weinig informatief. Met threshold=0 verwijder je alleen perfect constante kenmerken; met threshold=0.01 verwijder je elk kenmerk waarvan 99% of meer van de waarden gelijk is. Dit is een snelle, modelonafhankelijke eerste stap om de verzameling kenmerken op te schonen.
from sklearn.feature_selection import VarianceThreshold
import numpy as np
# Create feature matrix with some constant/near-constant columns
X = np.array([
[1, 2, 1, 5], # col 3: near constant (mostly 1)
[2, 4, 1, 3],
[3, 6, 1, 4],
[4, 8, 2, 7], # col 3 varied
[5, 10, 1, 2]
], dtype=float)
print('Column variances:', X.var(axis=0).round(2))
vt = VarianceThreshold(threshold=0.5) # remove columns with variance < 0.5
X_filtered = vt.fit_transform(X)
print('Features kept:', vt.get_support())
print('X shape before:', X.shape, '-> after:', X_filtered.shape)Variance Threshold toepassen op echte gegevens
De variantiedrempel is vooral nuttig na one-hotcodering, wanneer sommige categorieën maar heel weinig voorbeelden hebben (waardoor een binaire kolom met bijna nulvariantie ontstaat), of wanneer je werkt met genomica-, tekst- of sensorgegevens waarin de meeste kenmerken bijna nul zijn. Stel de drempel in op basis van het verwachte aandeel nullen: als 95% van de waarden nul is, is de variantie maximaal 0.95 × 0.05 = 0.0475. Met threshold=0.05 verwijder je dus elk kenmerk dat voor minstens 95% constant is.
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_breast_cancer
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
print('Original n_features:', X.shape[1])
vt = VarianceThreshold(threshold=10.0) # remove low-variance features
X_filtered = vt.fit_transform(X)
print('After threshold=10.0, n_features:', X_filtered.shape[1])
print('Removed features:', (~vt.get_support()).sum())SelectKBest: rangschikken met een statistische test
SelectKBest beoordeelt elk kenmerk afzonderlijk met een univariate statistische test en behoudt de beste K kenmerken. Gebruik voor classificatie chi2 (chi-kwadraat, voor niet-negatieve kenmerken) of f_classif (ANOVA-F-statistiek). Gebruik voor regressie f_regression (lineaire correlatie) of mutual_info_regression. De tests geven aan in hoeverre elk kenmerk afzonderlijk met het doel correleert. Met k='all' worden alle kenmerken op basis van hun score gerangschikt in plaats van een vast aantal te selecteren.
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.datasets import load_breast_cancer
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
skb = SelectKBest(score_func=f_classif, k=10)
X_new = skb.fit_transform(X, y)
print('Original shape:', X.shape)
print('After SelectKBest(k=10):', X_new.shape)
print('Top feature mask:', skb.get_support())
scores = skb.scores_
top5_idx = np.argsort(scores)[::-1][:5]
print('Top 5 feature indices:', top5_idx)
print('Top 5 F-scores:', np.round(scores[top5_idx], 2))Mutual information: niet-lineaire scores
De F-test in f_classif detecteert alleen lineaire relaties tussen kenmerken en het doel. Mutual information (mutual_info_classif, mutual_info_regression) meet elke statistische afhankelijkheid, lineair of niet-lineair. Een kenmerk met een niet-lineaire relatie tot het doel krijgt met de F-test een score van nul, maar met mutual information een hoge score. Mutual information is langzamer te berekenen, maar informatiever, vooral voor modellen op basis van bomen waarin niet-lineaire relaties belangrijk zijn.
from sklearn.feature_selection import SelectKBest, mutual_info_classif, f_classif
from sklearn.datasets import load_breast_cancer
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
feature_names = load_breast_cancer().feature_names
# Compare F-test and mutual information rankings
f_scores = f_classif(X, y)[0]
mi_scores = mutual_info_classif(X, y, random_state=42)
import pandas as pd
df = pd.DataFrame({'feature': feature_names, 'f_score': f_scores, 'mi_score': mi_scores})
print('Top 5 by F-test:'); print(df.sort_values('f_score', ascending=False).head(5)['feature'].values)
print('Top 5 by MI: '); print(df.sort_values('mi_score', ascending=False).head(5)['feature'].values)K kiezen: cross-validatie over aantallen kenmerken
Hoeveel kenmerken moet je behouden? De juiste manier om K te kiezen is om het als een hyperparameter te behandelen en de waarde te vinden die de score bij cross-validatie maximaliseert. Gebruik SelectKBest binnen een Pipeline en voeg selectkbest__k toe aan de parameters van je grid search. Zo voorkom je de veelgemaakte fout om K te kiezen op basis van de prestaties op de trainingsgegevens (die altijd verbeteren naarmate je meer kenmerken gebruikt). In plaats daarvan vind je de K die het best generaliseert.
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
pipe = Pipeline([('sel', SelectKBest(f_classif)), ('clf', LogisticRegression(max_iter=1000))])
param_grid = {'sel__k': [5, 10, 15, 20, 30]}
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X, y)
print('Best k:', grid.best_params_['sel__k'])
print('Best CV score:', round(grid.best_score_, 4))SelectPercentile: relatieve kenmerkselectie
SelectPercentile is een verwant onderdeel van SelectKBest dat de bovenste percentile% van de kenmerken behoudt in plaats van een vast aantal K. Dit is robuuster wanneer het aantal kenmerken per gegevensverzameling verschilt of wanneer je dezelfde pipeline op verschillende problemen toepast. Zo behoudt SelectPercentile(f_classif, percentile=20) de beste 20% van de kenmerken, ongeacht hoeveel kenmerken er zijn. Het nadeel: je krijgt een relatief budget in plaats van een absoluut aantal.
from sklearn.feature_selection import SelectPercentile, f_classif
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
for pct in [20, 50, 80]:
sel = SelectPercentile(f_classif, percentile=pct)
X_new = sel.fit_transform(X, y)
print(f'percentile={pct}: kept {X_new.shape[1]} of {X.shape[1]} features')Kenmerkselectie versus regularisatie
Kenmerkselectie en regularisatie zijn aanvullende maar verschillende benaderingen. Kenmerkselectie verwijdert kenmerken expliciet vóór het trainen, waardoor een ijler model met minder invoer ontstaat. Regularisatie (L1/L2-straf) behoudt alle kenmerken, maar verkleint onbelangrijke coëfficiënten richting nul; L1 (Lasso) levert zelfs exact nul op. Kenmerkselectie is expliciet en interpreteerbaar; regularisatie is continu en behoudt meer informatie. Voor interpreteerbaarheid heeft expliciete kenmerkselectie de voorkeur. Voor voorspellende kracht wint regularisatie vaak, omdat het zachte, datagestuurde beslissingen over het belang van kenmerken neemt.
Beperking: kenmerken zijn niet onafhankelijk
De belangrijkste beperking van univariate selectie (VarianceThreshold, SelectKBest) is dat elk kenmerk onafhankelijk wordt beoordeeld. Een kenmerk dat geen marginale correlatie met het doel heeft, kan toch zeer nuttig zijn in combinatie met een ander kenmerk (een interactie). Twee redundante kenmerken kunnen afzonderlijk allebei hoog scoren, maar na het eerste kenmerk geen extra waarde meer bieden. Deze methoden kunnen zulke afhankelijkheden niet detecteren. Recursive Feature Elimination (RFECV), dat in de volgende les aan bod komt, lost dit op door het model zelf kenmerken te laten rangschikken op basis van hun gezamenlijke voorspellende bijdrage.
Praktische werkwijze voor kenmerkselectie
Een aanbevolen werkwijze voor kenmerkselectie: (1) begin met VarianceThreshold om constante en bijna-constante kenmerken te verwijderen; (2) pas SelectKBest met mutual information toe voor een snelle rangschikking van de overgebleven kenmerken; (3) teken de CV-score uit tegen K om het knikpunt te vinden; (4) neem de geselecteerde kenmerken op in een volledige pipeline met cross-validatie; (5) gebruik permutation importance voor een tweede controle als het model ingebouwd belang heeft (op bomen gebaseerd). Neem selectie altijd op in een Pipeline om gegevenslekken te voorkomen.
from sklearn.feature_selection import VarianceThreshold, SelectKBest, f_classif
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
pipe = Pipeline([
('vt', VarianceThreshold(threshold=0.1)), # step 1
('sel', SelectKBest(f_classif, k=15)), # step 2
('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])
scores = cross_val_score(pipe, X, y, cv=5)
print('Pipeline CV score:', round(scores.mean(), 4))SelectFromModel: laat het model beslissen
SelectFromModel gebruikt de kenmerkbelangen (of coëfficiënten) van een getraind model om kenmerken boven een drempel te selecteren. Geef na het trainen van een random forest of Lasso het model door aan SelectFromModel met een threshold zoals 'mean' (behoud kenmerken met een belang boven het gemiddelde) of 'median'. Dit is vooral nuttig als stap in een pipeline vóór een secundaire schatter: de selectie op basis van belang wordt rechtstreeks in de cross-validatielus opgenomen, waardoor gegevenslekken worden voorkomen.
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
X, y = load_breast_cancer(return_X_y=True)
pipe = Pipeline([
('sel', SelectFromModel(RandomForestClassifier(n_estimators=50, random_state=42), threshold='mean')),
('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])
scores = cross_val_score(pipe, X, y, cv=5)
print('SelectFromModel CV:', round(scores.mean(), 4))Snelle controle
Test je begrip van VarianceThreshold en SelectKBest uit deze les.
Samenvatting van de les
In deze les heb je geleerd dat VarianceThreshold constante en bijna-constante kenmerken verwijdert als snelle eerste stap, dat SelectKBest kenmerken rangschikt met univariate tests (F-test of mutual information) en de beste K behoudt, en dat je kenmerkselectie altijd binnen een Pipeline moet opnemen en K als hyperparameter met cross-validatie moet bepalen. Hierna bekijken we Recursive Feature Elimination with Cross-Validation (RFECV), waarmee het model zelf de minst nuttige kenmerken kan wegstemmen.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Featureselectie: Variance Threshold en SelectKBest” gratis?
Ja — de volledige tekst van “Featureselectie: Variance Threshold en SelectKBest” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Machine Learning Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Machine Learning Academy bevat in totaal 4 lessen.
Wat leer ik in “Featureselectie: Variance Threshold en SelectKBest”?
Cursisten verwijderen features met vrijwel geen variantie, rangschikken de overgebleven features met univariate statistische tests en behouden alleen de K meest informatieve features. Je oefent met Machine Learning Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Machine Learning Academy te beginnen?
Ervaring vooraf is niet nodig. Machine Learning Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Featureselectie: Variance Threshold en SelectKBest”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Machine Learning Academy?
Ja. Elke les over Machine Learning Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Nieuwe features maken: logtransformaties, binning en interacties
- Features uit datum en tijd extraheren
- Featureselectie: Variance Threshold en SelectKBest
- Recursieve feature-eliminatie met crossvalidatie