Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Scikit-learn โ€” Pipelines en ColumnTransformer

In de vorige notebook fitten we de scaler manueel op de trainingsset en transformeerden we train en test apart. Bij complexere workflows โ€” meerdere stappen, verschillende transformaties per kolom โ€” wordt dit al snel foutgevoelig.

Pipeline en ColumnTransformer lossen dit op:

ProbleemOplossing
Manueel fit/transform herhalenPipeline koppelt stappen aan elkaar
Verschillende preprocessing per kolomColumnTransformer verdeelt kolommen
Data leakage risicoPipeline past fit automatisch enkel op trainingsdata toe
Veel boilerplate codemake_pipeline / make_column_transformer
1.7.2
Train: (266, 5), Test: (67, 5)

Pipelineยถ

Een Pipeline is een aaneenschakeling van stappen. Elke stap (behalve de laatste) moet een Transformer zijn; de laatste stap mag ook een Estimator zijn.

Wanneer je pipeline.fit(X_train, y_train) roept:

  1. Elke Transformer-stap wordt fit_transform-ed op de output van de vorige stap

  2. De laatste stap (Estimator) wordt gefit op het eindresultaat

Wanneer je pipeline.predict(X_test) roept:

  1. Elke Transformer-stap doet enkel transform (geen nieuwe fit!)

  2. De Estimator maakt voorspellingen

Rยฒ on test set: 0.798
Learned mean: [ 44.1   17.16 201.  ]

make_pipelineยถ

make_pipeline is een snellere schrijfwijze: namen worden automatisch afgeleid van de klassenaam.

Rยฒ: 0.798
Steps: ['standardscaler', 'linearregression']

ColumnTransformerยถ

In de praktijk heb je bijna altijd een mix van numerieke en categorische kolommen die elk een andere preprocessing nodig hebben. ColumnTransformer past per kolomgroep de juiste transformer toe en plakt de resultaten samen.

Elke transformer wordt opgegeven als een tuple (naam, transformer, kolommen).

Shape after preprocessing: (266, 9)
Feature names: ['num__bill_length_mm' 'num__bill_depth_mm' 'num__flipper_length_mm'
 'cat__species_Adelie' 'cat__species_Chinstrap' 'cat__species_Gentoo'
 'cat__island_Biscoe' 'cat__island_Dream' 'cat__island_Torgersen']

Alles samenvoegen: ColumnTransformer in een Pipelineยถ

Het meest gebruikte patroon in scikit-learn: een ColumnTransformer als eerste stap in een Pipeline, gevolgd door een Estimator.

Rยฒ on test set (num + cat): 0.867

Merk op: we roepen gewoon fit(X_train, y_train) op de volledige pipeline โ€” alles wordt intern correct afgehandeld. X_test wordt enkel getransformeerd, nooit opnieuw gefit.

Pipeline inspecterenยถ

Je kan altijd in de pipeline duiken om geleerde parameters op te vragen.

Means of numerical features: [ 44.1   17.16 201.  ]
Species categories: ['Adelie' 'Chinstrap' 'Gentoo']
model: LinearRegression()
model__copy_X: True
model__fit_intercept: True
model__n_jobs: None
model__positive: False
model__tol: 1e-06

Oefeningenยถ

Oefening 1 โ€” Bouw een eenvoudige Pipeline met twee stappen: een MinMaxScaler gevolgd door een LinearRegression. Train op de numerieke features (bill_length_mm, bill_depth_mm, flipper_length_mm) van de penguins-trainingsset en evalueer de Rยฒ op de testset.

Oefening 2 โ€” Gebruik make_pipeline om dezelfde pipeline als oefening 1 te bouwen. Verifieer dat de stap-namen automatisch zijn ingevuld met named_steps.

Oefening 3 โ€” Bouw een ColumnTransformer voor de penguins-dataset:

  • Numerieke kolommen (bill_length_mm, bill_depth_mm, flipper_length_mm): StandardScaler

  • Categorische kolom (sex): OneHotEncoder

Fit op de trainingsset en transformeer. Druk de shape en de feature-namen af.

Oefening 4 โ€” Combineer de ColumnTransformer uit oefening 3 met een LinearRegression in รฉรฉn volledige Pipeline. Fit op de trainingsset (met bill_length_mm, bill_depth_mm, flipper_length_mm en sex als input en body_mass_g als target). Evalueer de Rยฒ op de testset.

Oefening 5 โ€” Haal uit de getrainede pipeline de geleerde gemiddelden op van de numerieke scaler (via named_steps en named_transformers_). Vergelijk ze met de werkelijke gemiddelden in de trainingsset (met X_train.mean()).