Machine Learning Academy · Les

Ontbrekende waarden verwerken: verwijderen, imputeren en markeren

U detecteert null-waarden, past imputatie met het gemiddelde, de mediaan of de meest voorkomende waarde toe met SimpleImputer en bepaalt wanneer rijen verwijderen veiliger is dan waarden invullen.

Les 1 van 413 stappen

Ontbrekende waarden verwerken: verwijderen, imputeren en markeren is een gratis Machine Learning Academy-les op CoddyKit. Dit is les 1 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 ontbrekende waarden gevaarlijk zijn

Ontbrekende waarden — weergegeven als NaN, None of lege cellen — zijn een van de meest voorkomende problemen met gegevenskwaliteit in datasets uit de echte wereld. Als je ze niet verwerkt, veroorzaken ze fouten in scikit-learn-estimators, die volledig numerieke matrices verwachten. Elke ML-pijplijn moet ontbrekende waarden verwerken voordat het trainen begint. Er zijn drie hoofdstrategieën: rijen/kolommen verwijderen, waarden imputeren (geschatte waarden invullen) of het ontbreken van waarden markeren als een afzonderlijk kenmerk.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': [25, np.nan, 35, np.nan, 50],
    'income': [40000, 55000, np.nan, 72000, 90000],
    'score': [85, 90, 78, np.nan, 95]
})

print(df.isnull().sum())  # Count nulls per column
print(df.isnull().mean())  # Fraction missing per column

Nullwaarden detecteren met Pandas

Voordat je bepaalt hoe je ontbrekende waarden verwerkt, moet je het probleem kwantificeren. Pandas biedt df.isnull() om een booleaans masker te maken en df.isnull().sum() om nullwaarden per kolom te tellen. De methode df.info() toont ook het aantal niet-nullwaarden. Bekijk altijd het aandeel ontbrekende waarden — als meer dan 50% van een kolom ontbreekt, moet je die kolom mogelijk volledig verwijderen in plaats van imputeren.

import pandas as pd
import numpy as np

df = pd.read_csv('housing.csv')

# Fraction missing per column (sorted)
missing_frac = df.isnull().mean().sort_values(ascending=False)
print(missing_frac[missing_frac > 0])

# Heat map of missing values
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False)
plt.show()

Rijen en kolommen verwijderen

df.dropna() verwijdert standaard rijen die een nullwaarde bevatten. Geef axis=1 door om in plaats daarvan kolommen te verwijderen. Met de parameter thresh kun je rijen behouden die ten minste N niet-nullwaarden hebben. Verwijderen is veilig wanneer het ontbreken volledig willekeurig is (MCAR) en het aandeel zeer klein is — minder dan 1-5% van de rijen. Te agressief verwijderen veroorzaakt echter informatieverlies en kan vertekening introduceren als de gegevens niet willekeurig ontbreken.

# Drop rows with ANY null
df_no_null = df.dropna()

# Drop columns where MORE than 40% of values are missing
df_cleaned = df.dropna(axis=1, thresh=int(0.6 * len(df)))

# Drop rows only if specific columns are null
df_subset = df.dropna(subset=['age', 'income'])

print('Original shape:', df.shape)
print('After drop:', df_no_null.shape)

Imputatie met gemiddelde en mediaan

Bij imputatie worden ontbrekende waarden ingevuld met geschatte vervangingen. Bij imputatie met het gemiddelde worden nullwaarden vervangen door het kolomgemiddelde. Dit werkt goed voor symmetrisch, normaal verdeeldte gegevens. Imputatie met de mediaan is beter bestand tegen uitschieters en heeft de voorkeur bij scheve verdelingen. Beide methoden zijn eenvoudig en snel, maar verlagen de variantie kunstmatig, omdat alle geïmputeerde waarden identiek zijn. Gebruik SimpleImputer uit scikit-learn voor imputatie die geschikt is voor een pijplijn.

from sklearn.impute import SimpleImputer
import numpy as np

X = np.array([[1, 2], [np.nan, 3], [7, 6], [np.nan, np.nan]])

# Mean imputation
imp_mean = SimpleImputer(strategy='mean')
X_mean = imp_mean.fit_transform(X)
print('Mean imputed:\n', X_mean)

# Median imputation (more robust)
imp_median = SimpleImputer(strategy='median')
X_median = imp_median.fit_transform(X)
print('Median imputed:\n', X_median)

Imputatie met de meest voorkomende waarde voor categorische variabelen

Voor categorische kolommen hebben het gemiddelde en de mediaan geen betekenis. Gebruik in plaats daarvan strategy='most_frequent' in SimpleImputer. Hiermee worden ontbrekende waarden ingevuld met de modus (de meest voorkomende categorie). Dit behoudt de vorm van de verdeling beter dan willekeurige toewijzing. Train de imputor altijd uitsluitend op de trainingsgegevens en gebruik de getrainde imputor om zowel de trainings- als de testset te transformeren — zo voorkom je dat gegevens uit de testset de geïmputeerde waarden beïnvloeden.

from sklearn.impute import SimpleImputer
import numpy as np

X_cat = np.array([
    ['cat'],
    ['dog'],
    [np.nan],
    ['cat'],
    [np.nan]
])

imp = SimpleImputer(strategy='most_frequent')
X_imputed = imp.fit_transform(X_cat)
print(X_imputed.flatten())
# Output: ['cat' 'dog' 'cat' 'cat' 'cat']

Constante en aangepaste imputatie

Soms is de beste geïmputeerde waarde een domeinspecifieke constante en geen statistische waarde. Het ontbreken van het aantal eerdere aankopen betekent bijvoorbeeld waarschijnlijk nul. Gebruik strategy='constant' met fill_value=0 in SimpleImputer. Geef voor complexere logica — zoals het invullen van een ontbrekende stad met 'Unknown' — een tekenreeksconstante door. Imputatie met een constante is begrijpelijk en veilig wanneer afwezigheid daadwerkelijk een specifieke waarde betekent, in plaats van dat er een probleem was bij het verzamelen van de gegevens.

from sklearn.impute import SimpleImputer
import numpy as np

# Numeric: fill 0 (e.g., previous purchases)
imp_zero = SimpleImputer(strategy='constant', fill_value=0)

# Categorical: fill with 'Unknown'
imp_unknown = SimpleImputer(strategy='constant', fill_value='Unknown')

X_num = np.array([[5], [np.nan], [3], [np.nan]])
X_cat = np.array([['Paris'], [None], ['Tokyo'], [None]])

print(imp_zero.fit_transform(X_num).flatten())
print(imp_unknown.fit_transform(X_cat).flatten())

KNN- en iteratieve imputatie

Geavanceerdere imputors modelleren de relatie tussen kenmerken om betere schattingen te produceren. KNNImputer vult een ontbrekende waarde in door de k dichtstbijzijnde volledige rijen te bekijken en hun waarden te middelen — zo blijft de lokale gegevensstructuur behouden. IterativeImputer (experimenteel) traint voor elk kenmerk met nullwaarden een afzonderlijk regressiemodel, waarbij alle andere kenmerken als voorspellers worden gebruikt. Beide zijn nauwkeuriger dan imputatie met het gemiddelde, maar ze zijn langzamer en kunnen op kleine datasets overfitten.

from sklearn.impute import KNNImputer
import numpy as np

X = np.array([
    [1, 2, np.nan],
    [3, 4, 3],
    [np.nan, 6, 5],
    [8, 8, 7]
])

imp = KNNImputer(n_neighbors=2)
X_filled = imp.fit_transform(X)
print('KNN imputed:\n', X_filled)

Ontbrekende waarden markeren met een indicator

Soms is het feit dat een waarde ontbreekt op zichzelf informatief. Een ontbrekend salarisveld kan bijvoorbeeld wijzen op werkloosheid. Door een binaire indicator kolom toe te voegen die markeert of elke waarde oorspronkelijk null was, kan het model leren van het patroon van ontbrekende waarden. MissingIndicator in scikit-learn maakt deze markeringskolommen. Gebruik dit samen met imputatie in een FeatureUnion of ColumnTransformer, zodat het model zowel de geïmputeerde waarde als de markering ziet.

from sklearn.impute import SimpleImputer, MissingIndicator
from sklearn.pipeline import FeatureUnion
import numpy as np

X = np.array([[1, 2], [np.nan, 3], [7, 6], [np.nan, np.nan]])

indicator = MissingIndicator()
flags = indicator.fit_transform(X)
print('Missing flags:\n', flags)
# Adds True/False columns marking original NaN positions

Imputatie van training en test zonder gegevenslek

Een belangrijke regel: train de imputor altijd uitsluitend op de trainingsgegevens en gebruik de getrainde imputor vervolgens om zowel de trainings- als de testset te transformeren. Als je de imputor op de volledige dataset traint, lekken statistieken uit de testset naar de training, wat leidt tot te optimistische evaluatieresultaten. Dit geldt voor elke statistiek die tijdens de voorbewerking wordt berekend — het gemiddelde, de mediaan, de modus of afstanden tot naburige rijen. Gebruik scikit-learn Pipeline om dit automatisch af te dwingen: de pijplijn voert de stappen voor voorbewerking tijdens kruisvalidatie alleen uit op de trainingsvouw.

from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
import numpy as np

X = np.array([[1, 2], [np.nan, 3], [7, 6], [5, np.nan], [9, 1]])
y = np.array([0, 1, 0, 1, 0])

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

imp = SimpleImputer(strategy='mean')
imp.fit(X_train)        # Fit ONLY on training data
X_train_imp = imp.transform(X_train)
X_test_imp = imp.transform(X_test)  # Apply same stats to test

Wanneer verwijderen, imputeren of markeren

De keuze van de juiste strategie hangt af van drie factoren: (1) het aandeel ontbrekende waarden — onder 5% is het acceptabel om rijen te verwijderen; boven 50% kun je overwegen de kolom te verwijderen; (2) het mechanisme — MCAR (volledig willekeurig) pleit voor verwijderen; MAR (willekeurig gegeven andere kenmerken) pleit voor imputatie; MNAR (niet willekeurig) pleit voor markeren; (3) het model dat hierna wordt gebruikt — modellen op basis van bomen verwerken ontbrekende gegevens van nature (stel allow_nan=True in XGBoost/LightGBM in), waardoor imputatie optioneel kan zijn. Gebruik altijd kruisvalidatie om te bevestigen dat je strategie de modelprestaties verbetert.

# Decision guide in code form
def imputation_strategy(fraction_missing, is_informative):
    if fraction_missing > 0.6:
        return 'drop column'
    elif fraction_missing < 0.02:
        return 'drop rows'
    elif is_informative:
        return 'impute + add flag column'
    else:
        return 'impute (mean/median/mode)'

print(imputation_strategy(0.7, False))   # drop column
print(imputation_strategy(0.01, False))  # drop rows
print(imputation_strategy(0.2, True))    # impute + flag

Voorbeeld van een volledige imputatiepijplijn

Hier volgt een volledig voorbeeld waarin imputatie wordt gecombineerd in een scikit-learn-pijplijn. ColumnTransformer past tegelijk SimpleImputer met strategy='median' toe op numerieke kolommen en strategy='most_frequent' op categorische kolommen. Het resultaat gaat naar een classifier en de volledige pijplijn wordt veilig gekruisvalideerd, zodat imputatiestatistieken nooit tussen vouwen lekken. Dit patroon is de productierijpe aanpak voor het verwerken van ontbrekende gegevens in elk echt ML-project.

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

num_features = ['age', 'income']
cat_features = ['city']

preprocessor = ColumnTransformer([
    ('num', SimpleImputer(strategy='median'), num_features),
    ('cat', SimpleImputer(strategy='most_frequent'), cat_features)
])

pipeline = Pipeline([
    ('prep', preprocessor),
    ('clf', RandomForestClassifier(random_state=42))
])

scores = cross_val_score(pipeline, X, y, cv=5)
print('CV accuracy:', scores.mean())

Korte controle

Toets je begrip van de concepten rond Machine Learning met Python uit deze les.

Samenvatting van de les

In deze les heb je geleerd hoe je ontbrekende waarden detecteert met isnull().sum() en info(), wat de drie hoofdstrategieën — verwijderen, imputeren en markeren — zijn en wanneer elke strategie geschikt is, en hoe je SimpleImputer, KNNImputer en MissingIndicator binnen een pijplijn gebruikt om gegevenslekken te voorkomen. Hierna bekijken we het schalen van kenmerken met StandardScaler en MinMaxScaler.

Gratis beginnen

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 “Ontbrekende waarden verwerken: verwijderen, imputeren en markeren” gratis?

Ja — de volledige tekst van “Ontbrekende waarden verwerken: verwijderen, imputeren en markeren” 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 “Ontbrekende waarden verwerken: verwijderen, imputeren en markeren”?

U detecteert null-waarden, past imputatie met het gemiddelde, de mediaan of de meest voorkomende waarde toe met SimpleImputer en bepaalt wanneer rijen verwijderen veiliger is dan waarden invullen. 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 1 van 4.

Hoe lang duurt de les “Ontbrekende waarden verwerken: verwijderen, imputeren en markeren”?

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

  1. Ontbrekende waarden verwerken: verwijderen, imputeren en markeren
  2. Features schalen: StandardScaler en MinMaxScaler
  3. Categorische variabelen coderen: OrdinalEncoder en OneHotEncoder
  4. Stappen combineren met ColumnTransformer
← Terug naar Machine Learning Academy