Out-of-bag-fout: gratis validatie in het forest
U activeert oob_score, begrijpt dat elke boom slechts ongeveer 63% van de gegevens ziet en gebruikt OOB-steekproeven als een onbevooroordeelde validatieset.
Out-of-bag-fout: gratis validatie in het forest 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.
Wat is een out-of-bag-fout?
Wanneer een Random Forest elke boom traint op een bootstrapsteekproef, wordt ongeveer 37% van de trainingsvoorbeelden niet in die steekproef opgenomen. Deze out-of-bag (OOB)-voorbeelden zijn tijdens de training onzichtbaar voor de boom, waardoor de voorspelling van de boom voor deze voorbeelden een eerlijke voorspelling op achtergehouden gegevens is. Door OOB-voorspellingen te verzamelen van alle bomen die een bepaald voorbeeld niet hebben gezien, krijgen we een vrijwel onbevooroordeelde schatting van de generalisatiefout van het model — helemaal gratis, zonder dat een afzonderlijke validatiesplitsing nodig is.
Hoe OOB-voorspellingen worden berekend
Voor elk trainingsvoorbeeld x_i bepaalt scikit-learn welke bomen niet x_i in hun bootstrapsteekproef hebben gezien. Alleen die bomen brengen een stem uit voor de voorspelling van x_i. De uiteindelijke OOB-voorspelling voor x_i is de meerderheid van de stemmen (classificatie) of het gemiddelde (regressie) van die bomen. Dit proces wordt voor elk trainingsvoorbeeld uitgevoerd, waardoor we een OOB-voorspelling voor de volledige trainingsset krijgen. Door deze voorspellingen met de echte labels te vergelijken, verkrijgen we de OOB-fout.
OOB-score inschakelen in scikit-learn
Stel oob_score=True in bij het maken van een RandomForestClassifier of RandomForestRegressor. Nadat je .fit() hebt aangeroepen, bevat het attribuut oob_score_ de OOB-nauwkeurigheid (of R² voor regressie). Voor gedetailleerde OOB-voorspellingen per voorbeeld gebruik je oob_decision_function_ (klassekansen) of oob_prediction_ (regressie). De OOB-score is in feite een leave-one-forest-out-schatting van kruisvalidatie, die gratis als bijproduct van de training wordt berekend.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)
print('OOB score:', round(rf.oob_score_, 4))
cv_score = cross_val_score(rf, X, y, cv=5).mean()
print('5-fold CV score:', round(cv_score, 4))OOB-fout versus kruisvalidatie
De OOB-fout benadert de nauwkeurigheid van kruisvalidatie nauwkeurig (doorgaans binnen 1–2%), maar wordt berekend tegen geen enkele extra trainingskost. Bij kruisvalidatie wordt het model meerdere keren getraind (5 of 10 keer voor respectievelijk 5-voudige of 10-voudige validatie), terwijl de OOB-score de ene trainingsrun gebruikt. De afweging: OOB vereist voldoende bomen (doorgaans 100 of meer), zodat elk trainingspunt bij meerdere bomen out-of-bag is. In zeer kleine bossen zijn sommige punten mogelijk bij te weinig bomen out-of-bag, waardoor de OOB-schatting ruisachtig wordt.
OOB-score als functie van n_estimators
Naarmate je n_estimators verhoogt, stabiliseert de OOB-score. Bij zeer weinig bomen kunnen sommige trainingsvoorbeelden slechts in 1-2 bomen out-of-bag zijn, waardoor voorspellingen per voorbeeld ruis bevatten. Naarmate het bos groeit, wordt elk voorbeeld over meer OOB-bomen gemiddeld en convergeert de schatting. Een grafiek van de OOB-score tegen n_estimators is een snelle manier om het punt van afnemende meeropbrengst te vinden: het punt waarop extra bomen de score niet langer betekenisvol verbeteren.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
for n in [10, 50, 100, 200, 500]:
rf = RandomForestClassifier(n_estimators=n, oob_score=True, random_state=42)
rf.fit(X, y)
print(f'n_estimators={n:4d}: OOB={rf.oob_score_:.4f}')OOB voor regressiebossen
Voor RandomForestRegressor retourneert het inschakelen van oob_score=True standaard de R²-score op OOB-voorspellingen. Je hebt ook toegang tot oob_prediction_: de werkelijke voorspelde waarden voor elk trainingspunt, afkomstig van de OOB-bomen. Vervolgens kun je elke gewenste metriek berekenen, zoals MAE of RMSE. Dit is handig wanneer R² niet de juiste metriek is voor je probleem, bijvoorbeeld wanneer de absolute schaal van de fouten belangrijk is.
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_absolute_error
import numpy as np
X, y = fetch_california_housing(return_X_y=True)
rfr = RandomForestRegressor(n_estimators=100, oob_score=True, random_state=42)
rfr.fit(X, y)
print('OOB R²:', round(rfr.oob_score_, 4))
oob_mae = mean_absolute_error(y, rfr.oob_prediction_)
print('OOB MAE:', round(oob_mae, 4))OOB gebruiken voor het afstellen van hyperparameters
Omdat het berekenen van de OOB-score niets extra kost, kun je deze gebruiken om hyperparameterinstellingen snel te verkennen zonder een validatiefold apart te houden. Doorloop eenvoudig kandidaatwaarden, train één keer per configuratie en vergelijk oob_score_. Dit is vooral nuttig voor snelle kenmerkselectie (verwijder kenmerken en bekijk de verandering in de OOB-score) of voor het instellen van max_features en min_samples_leaf. Houd er rekening mee dat de OOB-schatting bij zeer hoog-dimensionale instellingen enigszins optimistisch kan zijn.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
results = []
for msl in [1, 3, 5, 10, 20]:
rf = RandomForestClassifier(n_estimators=200, min_samples_leaf=msl, oob_score=True, random_state=42)
rf.fit(X, y)
results.append((msl, round(rf.oob_score_, 4)))
best = max(results, key=lambda x: x[1])
for msl, score in results:
print(f'min_samples_leaf={msl:3d}: OOB={score}')
print('Best:', best)OOB-beslissingsfunctie voor waarschijnlijkheidsschattingen
Na het trainen met oob_score=True bevat het attribuut oob_decision_function_ een matrix met vorm (n_samples, n_classes) die de klassewaarschijnlijkheden bevat die uit OOB-voorspellingen zijn afgeleid. Je kunt deze waarschijnlijkheden gebruiken om kalibratiecurven, ROC-curven of precisie-recallcurven te tekenen op de trainingsset zelf, zonder de testset aan te raken. Dit is krachtig om het gedrag van een model vroeg in de ontwikkeling te diagnosticeren.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import roc_auc_score
X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)
oob_probs = rf.oob_decision_function_[:, 1] # prob of positive class
auc = roc_auc_score(y, oob_probs)
print('OOB AUC-ROC:', round(auc, 4))Zorgen voor voldoende OOB-dekking
Een trainingsvoorbeeld wordt gedekt door een OOB-boom als de bootstrapsteekproef van die boom het voorbeeld uitsluit. Volgens de wet van de grote aantallen zal elk voorbeeld bij voldoende bomen in veel OOB-bomen voorkomen. Bij zeer kleine gegevenssets en weinig bomen kunnen sommige voorbeelden echter slechts in 1-2 bomen OOB zijn, wat leidt tot ruis in afzonderlijke voorspellingen. Een vuistregel: gebruik ten minste 100 bomen voor betrouwbare OOB-schattingen. Je kunt de dekking controleren door na te gaan of alle waarden in oob_decision_function_ ongelijk aan nul zijn.
OOB-fout in de volledige ML-werkstroom
In een gebruikelijke werkstroom voor een Random Forest doe je het volgende: (1) train je op alle beschikbare gelabelde gegevens met oob_score=True, (2) gebruik je de OOB-score om hyperparameters af te stellen via snelle iteraties, (3) train je, zodra je tevreden bent, opnieuw met de definitieve hyperparameters (waarbij je OOB nog steeds gebruikt voor een eerlijke score), en (4) maak je slechts één keer voorspellingen op de echte achtergehouden testset. Met deze werkstroom benut je de trainingsgegevens maximaal: je hoeft nooit een validatiefold apart te houden en krijgt toch tijdens de ontwikkeling een betrouwbare prestatie-inschatting.
Overwegingen voor geheugen en snelheid
Als je OOB-scoring inschakelt, moet scikit-learn tijdens het trainen extra administratieve gegevens opslaan, waardoor het geheugengebruik iets toeneemt. Bij zeer grote gegevenssets (miljoenen rijen) met veel bomen kan deze overhead aanzienlijk worden. Gebruik in zulke gevallen in plaats daarvan een kleine achtergehouden set of één validatiefold. Houd er ook rekening mee dat OOB-voorspellingen alleen beschikbaar zijn voor de trainingsvoorbeelden: je hebt nog steeds het model nodig om op de gebruikelijke manier via .predict() voorspellingen te doen voor nieuwe, ongeziene testvoorbeelden.
Snelle controle
Test je begrip van de concepten rond Out-of-Bag-fouten uit deze les.
Samenvatting van de les
In deze les heb je geleerd dat OOB-voorbeelden de ongeveer 37% van de trainingsgegevens zijn die uit elke bootstrapsteekproef worden weggelaten, dat het samenvoegen van OOB-voorspellingen een gratis, eerlijke schatting van de generalisatiefout oplevert en dat oob_score_ kan worden gebruikt om hyperparameters snel af te stellen zonder een aparte validatiefold. Hierna bekijken we Voting Ensembles die verschillende modeltypen combineren.
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 “Out-of-bag-fout: gratis validatie in het forest” gratis?
Ja — de volledige tekst van “Out-of-bag-fout: gratis validatie in het forest” 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 “Out-of-bag-fout: gratis validatie in het forest”?
U activeert oob_score, begrijpt dat elke boom slechts ongeveer 63% van de gegevens ziet en gebruikt OOB-steekproeven als een onbevooroordeelde validatieset. 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 “Out-of-bag-fout: gratis validatie in het forest”?
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
- Bootstrapaggregatie (bagging) uitgelegd
- Willekeurige featureselectie: de truc van Random Forest
- Out-of-bag-fout: gratis validatie in het forest
- Voting-ensembles: hard vote versus soft vote