Help me bij het maken van efficiënte feature engineering pipelines met Pandas
description
Maakt het mogelijk om ruwe data om te zetten in betekenisvolle kenmerken, waardoor de prestaties van machine learning modellen verbeteren. Biedt praktische, stapsgewijze instructies met codevoorbeelden die zijn afgestemd op de dataset van de gebruiker, wat tijd bespaart en het begrip van feature engineering in Pandas vergroot.
prompt
Ik heb een Pandas DataFrame met de volgende data: <voer een beschrijving of voorbeeld van je DataFrame in>. Help me een feature engineering pipeline op te bouwen, inclusief het maken van nieuwe kenmerken uit bestaande kolo ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
no_answer_for_language
error: Generation failed [openai] prompt_id=3656 locale=nl err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=en err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=de err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=fr err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=pt err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=es err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3656 locale=zh err=OpenAI connection/timeout
provider: deepseek
model: deepseek-chat
Zeker, hier is een complete feature engineering pipeline voor jouw DataFrame in Python met Pandas en scikit-learn:
```python
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.base import BaseEstimator, TransformerMixin
# Voorbeeld data (vervang dit met jouw eigen DataFrame)
data = {
'leeftijd': [25, 35, 45, None, 30, 55, 28, 42],
'inkomen': [30000.0, 45000.0, None, 38000.0, 52000.0, 61000.0, 29000.0, 48000.0],
'geslacht': ['M', 'V', 'M', 'V', 'M', 'V', 'M', None],
'aankoopgeschiedenis': [
['P001', 'P003'],
['P002'],
['P001', 'P004', 'P005'],
['P003', 'P002'],
['P001'],
['P004', 'P005', 'P002'],
[],
['P003', 'P001']
]
}
df = pd.DataFrame(data)
# Aangepaste transformer voor het maken van nieuwe features
class FeatureEngineer(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
X = X.copy()
# 1. Nieuwe features uit aankoopgeschiedenis
X['aantal_aankopen'] = X['aankoopgeschiedenis'].apply(len)
X['heeft_aankoop_gedaan'] = (X['aantal_aankopen'] > 0).astype(int)
# 2. Leeftijdsgroepen maken
X['leeftijdsgroep'] = pd.cut(X['leeftijd'],
bins=[0, 30, 40, 50, 100],
labels=['jong', 'volwassen', 'middelbaar', 'senior'])
# 3. Inkomensratio (inkomen/leeftijd) - alleen voor niet-null waarden
mask = X['leeftijd'].notna() & X['inkomen'].notna()
X.loc[mask, 'inkomen_per_leeftijd'] = X.loc[mask, 'inkomen'] / X.loc[mask, 'leeftijd']
return X
# Pipeline opzetten
# Stap 1: Feature engineering
feature_engineering = FeatureEngineer()
# Stap 2: Preprocessing pipeline
numeric_features = ['leeftijd', 'inkomen', 'aantal_aankopen', 'inkomen_per_leeftijd']
categorical_features = ['geslacht', 'leeftijdsgroep']
binary_features = ['heeft_aankoop_gedaan']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])
binary_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent'))
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features),
('bin', binary_transformer, binary_features)
])
# Complete pipeline
complete_pipeline = Pipeline(steps=[
('feature_engineering', feature_engineering),
('preprocessing', preprocessor)
])
# Pipeline toepassen
X_processed = complete_pipeline.fit_transform(df)
# Om de getransformeerde kolomnamen te zien (na one-hot encoding)
# Eerst fit transformeren om de encoder te trainen
complete_pipeline.fit(df)
onehot_columns = complete_pipeline.named_steps['preprocessing'].named_transformers_['cat'].named_steps['onehot'].get_feature_names_out(categorical_features)
all_columns = numeric_features + list(onehot_columns) + binary_features
print("Originele dataset:")
print(df)
print(f"\nVorm na transformatie: {X_processed.shape}")
print(f"Kolomnamen: {all_columns}")
```
**Uitleg van elke stap en hoe het de dataset verbetert:**
### 1. **Nieuwe features maken**
```python
# Aantal aankopen en binaire indicator
X['aantal_aankopen'] = X['aankoopgeschiedenis'].apply(len)
X['heeft_aankoop_gedaan'] = (X['aantal_aankopen'] > 0).astype(int)
```
**Verbetering:** Transformeert lijst-data naar bruikbare numerieke features die patronen in koopgedrag blootleggen.
### 2. **Leeftijdsgroepen categoriseren**
```python
X['leeftijdsgroep'] = pd.cut(X['leeftijd'], bins=[0, 30, 40, 50, 100], ...)
```
**Verbetering:** Creëert betekenisvolle categorieën die niet-lineaire relaties met de target variabele kunnen vangen.
### 3. **Ontbrekende waarden afhandelen**
```python
SimpleImputer(strategy='median') # voor numerieke features
SimpleImputer(strategy='most_frequent') # voor categorische features
```
**Verbetering:** Behoudt alle datapunten door missing values intelligent te imputeren, wat sample size en statistische power behoudt.
### 4. **Categorische variabelen coderen**
```python
OneHotEncoder(handle_unknown='ignore', sparse_output=False)
```
**Verbetering:** Zet categorische variabelen om in numeriek formaat dat door machine learning modellen verwerkt kan worden, zonder ordinale assumpties.
### 5. **Numerieke features schalen**
```python
StandardScaler()
```
**Verbetering:** Zorgt voor gelijke schaal van alle features, wat essentieel is voor op afstand gebaseerde algoritmes (SVM, KNN) en gradient descent-based modellen.
### **Extra tips:**
```python
# Voor meer geavanceerde feature engineering:
# - Interactietermen: leeftijd * inkomen
# - Polynomiale features: leeftijd²
# - Time-based features als je timestamps hebt
# - Product category features uit product-ID's
```
Deze pipeline zorgt voor een consistente, reproduceerbare transformatie van je data en maakt deze optimaal geschikt voor machine learning modellering.