Modelevaluatie en cross-validatie
Evalueer modellen met accuracy, F1, ROC-AUC en k-fold-CV.
Modelevaluatie en cross-validatie is een gratis Python Academy-les op CoddyKit. Dit is les 4 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 Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Splitsing in training, validatie en test
Gebruik een driedelige splitsing: training om het model aan te passen, validatie om hyperparameters af te stemmen en test om de uiteindelijke prestaties te rapporteren. Gebruik de testset nooit tijdens de ontwikkeling.
from sklearn.model_selection import train_test_split
import numpy as np
X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)
X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)Nauwkeurigheidsscore
accuracy_score is het aandeel correcte voorspellingen. Gebruik deze voor evenwichtige klassen; kies bij onevenwichtige gegevens liever F1 of AUC.
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))Precisie, sensitiviteit en F1
Voor onevenwichtige klassen geldt: precisie = TP/(TP+FP), sensitiviteit = TP/(TP+FN), F1 = het harmonische gemiddelde van precisie en sensitiviteit.
from sklearn.metrics import precision_score, recall_score, f1_score, classification_report
# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each classVerwarringsmatrix
Een verwarringsmatrix toont terecht-positieven, fout-positieven, terecht-negatieven en fout-negatieven.
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
# [FN TP]]ROC-curve en AUC
roc_auc_score meet het gebied onder de ROC-curve. AUC = 1,0 is perfect; 0,5 = willekeurig.
from sklearn.metrics import roc_auc_score, roc_curve
y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))
fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curveRegressiemaatstaven
Gebruik mean_squared_error (MSE), root_mean_squared_error (RMSE) en r2_score voor regressietaken.
from sklearn.metrics import mean_squared_error, r2_score
y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))k-voudige kruisvalidatie
cross_val_score deelt gegevens op in k delen, traint op k-1 delen, evalueert op 1 deel en herhaalt dit k keer. Dit is robuuster dan één splitsing.
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")StratifiedKFold
Gebruik StratifiedKFold om ervoor te zorgen dat elk deel dezelfde klassenverdeling heeft — cruciaal voor onevenwichtige gegevensverzamelingen.
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())Afweging tussen vertekening en variantie
Hoge vertekening = underfitting (model te eenvoudig). Hoge variantie = overfitting (model te complex). Kruisvalidatie laat zien welk probleem je hebt.
# Underfitting: low train score AND low val score
# → increase model complexity, add features
# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data
from sklearn.model_selection import validation_curve
import numpy as np
train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))Geneste kruisvalidatie
Gebruik geneste kruisvalidatie voor een onbevooroordeelde afstemming van hyperparameters én evaluatie: de binnenste lus stemt af en de buitenste lus evalueert.
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())Kalibratie
De waarschijnlijkheidsschattingen van een classificatiemodel zijn mogelijk slecht gekalibreerd. Gebruik CalibratedClassifierCV voor betere waarschijnlijkheidsschattingen.
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)
cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))Korte controle
Waarom heeft kruisvalidatie de voorkeur boven één splitsing in training en test voor het evalueren van modellen?
Samenvatting
Gebruik nauwkeurigheid voor evenwichtige problemen en F1/AUC voor onevenwichtige problemen. Evalueer met k-voudige cross_val_score, gebruik StratifiedKFold voor onevenwichtige gegevens en gebruik geneste kruisvalidatie bij het afstellen van hyperparameters voor een onbevooroordeelde eindschatting. Kijk tijdens de ontwikkeling nooit naar de testset.
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
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “Modelevaluatie en cross-validatie” gratis?
Ja — de volledige tekst van “Modelevaluatie en cross-validatie” 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 Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “Modelevaluatie en cross-validatie”?
Evalueer modellen met accuracy, F1, ROC-AUC en k-fold-CV. Je oefent met Python 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 Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python 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 4 van 4.
Hoe lang duurt de les “Modelevaluatie en cross-validatie”?
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 Python Academy?
Ja. Elke les over Python 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
- De scikit-learn-API: fit, transform, predict
- Lineaire modellen: regressie en classificatie
- Boommodellen: beslisbomen en random forests
- Modelevaluatie en cross-validatie