Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Finale Estimator | Pipelines
Introductie tot Machine Learning met Python

Finale Estimator

Veeg om het menu te tonen

Pipeline werd eerder gebruikt voor preprocessing, maar het echte doel is om preprocessing te koppelen aan een uiteindelijke voorspeller. De laatste stap in een pipeline kan elke estimator zijn (meestal een model) die voorspellingen genereert.

Note
Opmerking

Bij het aanroepen van .fit() voert elke transformer .fit_transform() uit. Bij het aanroepen van .predict() gebruikt de pipeline .transform() voordat de gegevens naar de uiteindelijke estimator worden gestuurd. Dit is vereist omdat nieuwe gegevens exact hetzelfde moeten worden getransformeerd als de trainingsgegevens.

Waarom .transform()?

Het gebruik van .fit_transform() op nieuwe gegevens kan coderingen wijzigen (bijvoorbeeld in OneHotEncoder), wat leidt tot niet-overeenkomende kolommen en onbetrouwbare voorspellingen. .transform() garandeert consistente preprocessing, negeert onbekende categorieën en behoudt dezelfde kolomvolgorde.

Hier is de originele dataset vóór enige transformatie. Deze ruwe gegevens vormen het startpunt voor het transformatieproces. Er is nog geen codering of preprocessing toegepast—elke rij toont een instantie met de kleurkenmerk als een string. Dit zijn de gegevens die getransformeerd zullen worden met preprocessing-stappen in de pipeline.

Deze tabel toont de dataset voor one-hot encoding. De kolom Color is categorisch—deze bevat tekenreekswaarden in plaats van getallen. Je zult deze kolom in de volgende stap omzetten naar afzonderlijke binaire kolommen met behulp van one-hot encoding, wat essentieel is voor de meeste machine learning-modellen om categorische gegevens correct te verwerken.

Hier zie je hoe one-hot encoded trainingsdata eruitziet:

De onderstaande tabel toont de dataset na het toepassen van one-hot encoding. De oorspronkelijke kolom Color is vervangen door afzonderlijke binaire kolommen—Color_Red, Color_Blue en Color_Green. Elke kolom geeft aan of het exemplaar die specifieke kleur heeft (1) of niet (0).

Let op hoe de oorspronkelijke enkele kolom Color is vervangen door drie aparte kolommen: Color_Red, Color_Blue en Color_Green. Elke kolom geeft aan of een specifieke kleur aanwezig is voor dat exemplaar, waarbij 1 staat voor ja en 0 voor nee. Deze transformatie wordt one-hot encoding genoemd.

Deze wijziging is essentieel voor machine learning-modellen omdat de meeste algoritmen niet direct met tekst of categorische gegevens kunnen werken. Door categorieën om te zetten in aparte binaire kolommen, krijgt het model duidelijke, numerieke kenmerken waarmee het patronen kan leren en voorspellingen kan doen. Deze aanpak voorkomt ook dat het model een ordinale relatie aanneemt tussen de oorspronkelijke categorieën, wat tot onjuiste conclusies kan leiden.

Hier zijn de nieuwe exemplaren om te voorspellen:

Hier zijn de nieuwe gegevens waarop je wilt voorspellen. Dit is de ruwe invoer—de 'voor'-toestand—precies zoals deze verschijnt vóór enige transformatie of preprocessing. De pipeline zal deze gegevens transformeren zodat ze overeenkomen met het formaat dat tijdens de training is gebruikt, voordat er voorspellingen worden gedaan.

De volgende stap is om deze nieuwe instanties te transformeren met behulp van de eerder getrainde encoder. Dit garandeert dat de nieuwe gegevens op dezelfde manier worden verwerkt als de trainingsgegevens, wat zorgt voor consistentie en betrouwbare voorspellingen van het model.

Als .fit_transform() wordt toegepast op nieuwe instanties, kan de OneHotEncoder kolommen in een andere volgorde genereren of zelfs nieuwe kolommen toevoegen. Hierdoor wordt de nieuwe data niet consistent met de trainingsset getransformeerd, waardoor voorspellingen onbetrouwbaar worden.

Als je .fit_transform() gebruikt op nieuwe data in plaats van .transform(), behandelt de encoder de nieuwe data alsof deze voor het eerst wordt gezien. Dit zorgt ervoor dat:

  • De categorieën opnieuw worden geleerd op basis van de nieuwe data;
  • De volgorde van de kolommen verandert op basis van de nieuwe set categorieën;
  • Er een nieuwe kolom wordt toegevoegd voor elke onbekende categorie, zoals 'Color_Yellow' in dit geval.

Dit veroorzaakt een mismatch tussen de trainings- en predictiedata, waardoor voorspellingen onbetrouwbaar worden en mogelijk fouten in je pipeline ontstaan.

Let op het verschil tussen de onjuiste transformatie en de correcte transformatie. De tabel met de onjuiste transformatie bevat een nieuwe kolom (Color_Yellow) en wijzigt de volgorde van de kolommen ten opzichte van de trainingsdata. Dit verstoort de consistentie tussen training en voorspelling:

  • Het model verwacht dezelfde kolommen en volgorde als tijdens de training;
  • Nieuwe of herordende kolommen zorgen voor verwarring bij het model, waardoor het de verkeerde kenmerken gebruikt;
  • Voorspellingen worden onbetrouwbaar omdat de structuur van de invoer niet meer overeenkomt met wat het model heeft geleerd.

Zorg er altijd voor dat nieuwe data wordt getransformeerd met .transform() na het fitten, zodat de kolommen en volgorde consistent blijven. Dit is essentieel voor nauwkeurige, betrouwbare voorspellingen.

Het gebruik van .transform() zorgt er echter voor dat de nieuwe data exact hetzelfde wordt gecodeerd als de trainingsdata, waarbij categorieën die niet tijdens de training zijn gezien, worden genegeerd:

Wanneer je .transform() gebruikt op nieuwe data, worden alleen de kolommen uit de training opgenomen in de uitvoer. Alle categorieën die niet tijdens de training zijn gezien—zoals 'Yellow'—worden genegeerd. Dit garandeert dat de nieuwe data overeenkomt met de structuur die het model verwacht, zonder extra of ontbrekende kolommen.

Vergelijking van de drie tabellen:

  • De oorspronkelijke trainingsgegevens (na one-hot encoding) bevatten kolommen voor Color_Red, Color_Blue en Color_Green;
  • De onjuist getransformeerde nieuwe gegevens (met .fit_transform()) voegen een kolom Color_Yellow toe en laten Color_Green weg, waardoor de kolomvolgorde en structuur veranderen;
  • De correct getransformeerde nieuwe gegevens (met .transform()) behouden dezelfde kolommen en volgorde als de trainingsset, met nullen voor niet-herkende categorieën zoals Yellow.

Het gebruik van .transform() is de juiste aanpak omdat het garandeert dat nieuwe gegevens op exact dezelfde manier worden verwerkt als de trainingsgegevens. Dit zorgt ervoor dat het model gegevens ontvangt in het verwachte formaat, waardoor fouten worden voorkomen en voorspellingen betrouwbaar blijven.

De finale estimator toevoegen

Voeg het model eenvoudig toe als de laatste stap van de pipeline:

pipe = make_pipeline(
    ct,
    SimpleImputer(strategy='most_frequent'),
    StandardScaler(),
    KNeighborsClassifier()
)
pipe.fit(X, y)
pipe.predict(X_new)

Hierdoor kan de volledige workflow—preprocessing + voorspelling—met één aanroep worden uitgevoerd.

12345678910111213141516171819202122232425262728293031323334353637
from sklearn.pipeline import make_pipeline from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import pandas as pd # Example data data = pd.DataFrame({ 'color': ['red', 'blue', 'green'], 'value': [1, 2, 3] }) labels = [0, 1, 0] # Define a simple column transformer (placeholder for real preprocessing) ct = ColumnTransformer([ ('imputer', SimpleImputer(strategy='most_frequent'), ['color']) ]) # --- Before: Pipeline with only preprocessing steps --- # This pipeline only transforms the data; it cannot make predictions. pipeline_preprocessing = make_pipeline( ct, StandardScaler() ) # pipeline_preprocessing.fit(data) # Only fits transformers, no estimator at the end # --- After: Pipeline with a final estimator --- # Now the pipeline ends with a model, so it can fit and predict. pipeline_full = make_pipeline( ct, StandardScaler(), KNeighborsClassifier() ) pipeline_full.fit(data, labels) predictions = pipeline_full.predict(data) print("Predictions:", predictions)

Door de uiteindelijke estimator als laatste stap toe te voegen, wordt de pipeline een volledige end-to-end workflow. In plaats van alleen het voorbereiden van de data, verzorgt de pipeline nu zowel de voorbewerking als de voorspelling in één object. Hierdoor kun je direct fit() en predict() aanroepen op de pipeline, waarbij automatisch alle preprocessing-stappen worden toegepast voordat voorspellingen worden gedaan.

Deze aanpak is belangrijk omdat:

  • Het garandeert dat alle data op exact dezelfde manier wordt verwerkt tijdens zowel training als voorspelling;
  • Het vermindert het risico op fouten, zoals het vergeten van een preprocessing-stap bij het voorspellen op nieuwe data;
  • Het maakt de code overzichtelijker en eenvoudiger te onderhouden, omdat de volledige workflow op één plek wordt beheerd.

Door preprocessing en modellering te koppelen, zorg je voor consistentie, betrouwbaarheid en eenvoud in machine learning-projecten.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 5

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 3. Hoofdstuk 5
some-alt