2026'da Scikit-Learn Pipeline: Özellik Mühendisliği ve Mülakat Soruları

Scikit-learn Pipeline ve ColumnTransformer için kapsamlı kılavuz. Özellik mühendisliği, veri sızıntısı önleme ve makine öğrenimi mülakat sorularını kapsar.

Scikit-learn Pipeline ve Python'da özellik mühendisliği

Scikit-learn pipeline'ları kaotik ön işleme kodunu tekrarlanabilir, üretime hazır iş akışlarına dönüştürür. Haziran 2026'da yayınlanan sürüm 1.9 ile Pipeline ve ColumnTransformer, artık callback izleme, geliştirilmiş HTML görselleştirme ve Array API desteği ile her ciddi makine öğrenimi projesinin temeli olmaya devam ediyor.

Mülakat İpucu

Mülakatçılar sıklıkla şunu sorar: "Çapraz doğrulama sırasında veri sızıntısını nasıl önlersiniz?" Cevap pipeline'lardır. Ön işleme adımlarının CV döngüsü içinde fit edilmesi, test verilerinin ölçekleme veya kodlama kararlarını asla etkilememesini sağlar.

Pipeline'lar Veri Sızıntısını Neden Ortadan Kaldırır

Veri sızıntısı, test setinden gelen bilgilerin ön işlemeyi etkilediğinde meydana gelir. Yaygın bir hata: bölmeden önce StandardScaler'ı tüm veri seti üzerinde fit etmek. Ölçekleyici, test örneklerinden ortalama ve varyansı öğrenir ve çapraz doğrulama skorlarını yapay olarak yükseltir.

Pipeline'lar, transformer'ları ve tahmin edicileri tüm adımları birlikte fit eden tek bir nesneye zincirleyerek bu sorunu çözer:

python
# pipeline_basics.py
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# Create a pipeline that scales features and trains a classifier
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # Step 1: Normalize features
    ('classifier', LogisticRegression(max_iter=1000))  # Step 2: Train model
])

# cross_val_score fits the scaler separately for each fold
# No data leakage: test fold is never seen during scaler.fit()
scores = cross_val_score(pipeline, X, y, cv=5, scoring='accuracy')
print(f"Mean accuracy: {scores.mean():.3f} (+/- {scores.std():.3f})")

Pipeline nesnesi fit, predict ve score metodlarını uygular, bu da onu herhangi bir scikit-learn tahmin edicisi ile değiştirilebilir kılar. Bu, GridSearchCV, RandomizedSearchCV ve tüm çapraz doğrulama yardımcı programlarının değişiklik olmadan çalışacağı anlamına gelir.

Karışık Veri Türleri İçin ColumnTransformer

Gerçek veri setleri sayısal sütunlar (yaş, maaş) ve kategorik sütunlar (ülke, ürün_türü) içerir. ColumnTransformer farklı sütun alt kümelerine farklı ön işlemeler uygular ve ardından sonuçları birleştirir:

python
# column_transformer_example.py
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
import pandas as pd

# Sample dataset with mixed types
df = pd.DataFrame({
    'age': [25, 30, None, 45],
    'salary': [50000, 60000, 75000, None],
    'country': ['US', 'UK', 'DE', 'US'],
    'education': ['Bachelor', 'Master', 'PhD', 'Bachelor']
})

# Define numeric preprocessing: impute missing values, then scale
numeric_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

# Define categorical preprocessing: impute with mode, then one-hot encode
categorical_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('encoder', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])

# Combine transformers with ColumnTransformer
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, ['age', 'salary']),
        ('cat', categorical_transformer, ['country', 'education'])
    ],
    verbose_feature_names_out=True  # Prefix output names with transformer name
)

# Fit and inspect output shape
X_transformed = preprocessor.fit_transform(df)
print(f"Transformed shape: {X_transformed.shape}")
print(f"Feature names: {preprocessor.get_feature_names_out()}")

verbose_feature_names_out parametresi (1.6 sürümünde string ve callable kabul edecek şekilde geliştirildi) çıktı özellik adlandırmasını kontrol eder. True olarak ayarlandığında her özelliğe transformer adı ile ön ek ekler ve birden fazla transformer benzer sütun adları ürettiğinde ad çakışmalarını önler.

make_column_selector ile Otomatik Sütun Seçimi

Sabit kodlanmış sütun adları, veri setleri değiştiğinde bozulur. make_column_selector dtype'a göre sütunları otomatik olarak seçer:

python
# automatic_column_selection.py
from sklearn.compose import ColumnTransformer, make_column_selector
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# Select columns by dtype: no hardcoded column names
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), make_column_selector(dtype_include='number')),
        ('cat', OneHotEncoder(handle_unknown='ignore'),
         make_column_selector(dtype_include='object'))
    ],
    remainder='passthrough'  # Keep unprocessed columns as-is
)

# Works with any DataFrame that has numeric and object columns
X_processed = preprocessor.fit_transform(df)

remainder parametresi, herhangi bir transformer tarafından eşleştirilmeyen sütunlara ne olacağını kontrol eder. Seçenekler 'drop' (varsayılan), 'passthrough' (değiştirmeden koru) veya kalan sütunlara uygulanacak bir transformer'dır.

Data Science & ML mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Pipeline'lar İçinde Özellik Mühendisliği

Pipeline'lar, özellik mühendisliği adımlarını da içerecek şekilde ön işlemenin ötesine geçer. Özel transformer'lar BaseEstimator ve TransformerMixin'den miras alır:

python
# custom_transformer.py
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np

class DateFeatureExtractor(BaseEstimator, TransformerMixin):
    """Extract year, month, day, and weekday from datetime columns."""
    
    def __init__(self, date_column='date'):
        self.date_column = date_column
    
    def fit(self, X, y=None):
        # No fitting required for date extraction
        return self
    
    def transform(self, X):
        X = X.copy()
        dates = pd.to_datetime(X[self.date_column])
        
        # Extract temporal features
        X['year'] = dates.dt.year
        X['month'] = dates.dt.month
        X['day'] = dates.dt.day
        X['weekday'] = dates.dt.weekday
        X['is_weekend'] = (dates.dt.weekday >= 5).astype(int)
        
        # Drop original date column
        return X.drop(columns=[self.date_column])
    
    def get_feature_names_out(self, input_features=None):
        # Required for Pipeline.get_feature_names_out() to work
        return ['year', 'month', 'day', 'weekday', 'is_weekend']

# Integrate into a full pipeline
full_pipeline = Pipeline([
    ('date_features', DateFeatureExtractor(date_column='signup_date')),
    ('preprocessor', preprocessor),
    ('model', LogisticRegression())
])

get_feature_names_out metodunun uygulanması, scikit-learn 1.9'daki yeni HTML temsilinin çıktı özellik adlarını görüntülemesini sağlayarak hata ayıklama ve dokümantasyonu kolaylaştırır.

Pipeline Adımları Arasında Hiperparametre Ayarlama

GridSearchCV, adım__parametre adlandırma kuralını kullanarak tüm pipeline adımlarında parametreleri ayarlar:

python
# pipeline_gridsearch.py
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

# Build pipeline with tunable components
pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(random_state=42))
])

# Define parameter grid: note the double underscore syntax
param_grid = {
    'preprocessor__num__imputer__strategy': ['mean', 'median'],
    'classifier__n_estimators': [100, 200],
    'classifier__max_depth': [10, 20, None]
}

# GridSearchCV handles all combinations automatically
grid_search = GridSearchCV(
    pipeline,
    param_grid,
    cv=5,
    scoring='f1_weighted',
    n_jobs=-1
)

grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_:.3f}")

Çift alt çizgi (__) iç içe parametrelere erişim sağlar. ColumnTransformer için yol, transformer adını içerir: preprocessor__num__imputer__strategy sayısal transformer içindeki imputer'ın strategy parametresine ulaşır.

memory Parametresi ile Transformer'ları Önbelleğe Alma

Büyük veri setlerinde karmaşık ön işleme yavaş olabilir. memory parametresi fit edilmiş transformer'ları diske önbelleğe alır:

python
# cached_pipeline.py
from sklearn.pipeline import Pipeline
from tempfile import mkdtemp
import joblib

# Create a cache directory
cachedir = mkdtemp()

# Pipeline caches intermediate steps
cached_pipeline = Pipeline(
    [
        ('preprocessor', preprocessor),  # Cached after first fit
        ('classifier', RandomForestClassifier())
    ],
    memory=cachedir  # Or use joblib.Memory for more control
)

# First fit: slow (computes all transformations)
cached_pipeline.fit(X_train, y_train)

# Second fit with same X_train: fast (loads cached transformers)
cached_pipeline.fit(X_train, y_train)  # Skips preprocessor fitting

Önbelleğe alma, aynı ön işlemenin birden fazla model yapılandırmasına uygulandığı hiperparametre araması sırasında özellikle kullanışlıdır. Son tahmin edici (sınıflandırıcı veya regresör) asla önbelleğe alınmaz, sadece ara transformer'lar önbelleğe alınır.

Callback'ler ile Eğitim İzleme (scikit-learn 1.9)

Sürüm 1.9'daki callback API'si pipeline'lara ilerleme izleme ekler:

python
# callback_monitoring.py
from sklearn.callback import ProgressBar, ScoringMonitor
from sklearn.linear_model import LogisticRegression

# Display progress during GridSearchCV
with ProgressBar():
    grid_search = GridSearchCV(
        pipeline,
        param_grid,
        cv=5,
        n_jobs=1  # Progress bars require single-threaded execution
    )
    grid_search.fit(X_train, y_train)

# Monitor scoring metrics per iteration
with ScoringMonitor(X_val, y_val, scoring='accuracy') as monitor:
    logreg = LogisticRegression(solver='lbfgs', max_iter=500)
    logreg.fit(X_train, y_train)
    print(f"Scores per iteration: {monitor.scores_}")

Callback'ler Pipeline, StandardScaler, LogisticRegression (LBFGS solver) ve tüm search CV sınıfları ile çalışır. Bu deneysel özellik, özel loglama kodu olmadan uzun süren fit işlemlerine görünürlük sağlar.

Paralel Özellik Çıkarımı İçin FeatureUnion

FeatureUnion birden fazla transformer'ı paralel olarak çalıştırır ve çıktılarını yatay olarak birleştirir:

python
# feature_union_example.py
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest, f_classif

# Combine PCA and univariate selection
feature_union = FeatureUnion([
    ('pca', PCA(n_components=5)),
    ('select', SelectKBest(f_classif, k=10))
])

# Pipeline: preprocess, combine features, classify
pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('features', feature_union),
    ('classifier', LogisticRegression())
])

# Output contains 5 PCA components + 10 selected features = 15 features
pipeline.fit(X_train, y_train)

Sürüm 1.7.2, tüm transformer'ların 2D çıktılar döndürmesini sağlayan doğrulama ekledi. Bu, özel bir transformer yanlışlıkla 1D dizi döndürdüğünde hataları erken yakalar.

Serileştirme ve Dağıtım

Pipeline'lar, tüm fit edilmiş parametreleri koruyarak joblib ile serileştirilir:

python
# model_deployment.py
import joblib

# Save the entire pipeline (preprocessing + model)
joblib.dump(pipeline, 'churn_predictor.pkl')

# Load in production
loaded_pipeline = joblib.load('churn_predictor.pkl')

# Predict on new data (same preprocessing automatically applied)
new_data = pd.DataFrame({'age': [32], 'salary': [65000], ...})
predictions = loaded_pipeline.predict(new_data)

Serileştirilmiş dosya her şeyi içerir: sütun seçici mantığı, fit edilmiş ölçekleyici ortalamaları ve varyansları, encoder kategorileri ve model ağırlıkları. Dağıtım yalnızca scikit-learn ve joblib gerektirir, özel ön işleme kodu gerekmez.

Sürüm Uyumluluğu

Scikit-learn 1.8 ile serileştirilen pipeline'lar, kullanımdan kaldırılmış parametreler kullanıyorlarsa 1.9'da düzgün yüklenmeyebilir. Üretimde scikit-learn sürümünüzü her zaman sabitleyin ve dağıtmadan önce güncellemeleri test edin.

Scikit-Learn Pipeline Mülakat Soruları

S: Veri sızıntısı nedir ve pipeline'lar bunu nasıl önler?

Veri sızıntısı, doğrulama veya test setinden gelen bilgiler model eğitimini etkilediğinde meydana gelir. Klasik örnek: bölmeden önce tüm veri seti üzerinde StandardScaler fit etmek. Ölçekleyicinin ortalaması ve standart sapması test örneklerini içerir ve çapraz doğrulama skorlarını yapay olarak yükseltir.

Pipeline'lar, ön işlemeyi çapraz doğrulama döngüsü içine kapsülleyerek bunu önler. cross_val_score pipeline.fit() çağırdığında, her fold ölçekleyiciyi yalnızca eğitim verileri üzerinde fit eder. Test fold istatistikleri asla ön işlemeye sızmaz.

S: İç içe pipeline adımlarının parametrelerine nasıl erişilir ve değiştirilir?

Çift alt çizgi sözdizimi kullanılmalıdır: pipeline.set_params(classifier__n_estimators=200). ColumnTransformer için transformer adı dahil edilmelidir: pipeline.set_params(preprocessor__num__scaler__with_mean=False). get_params() metodu tüm iç içe parametreleri düz bir sözlük olarak döndürür, bu da inceleme ve loglama için kullanışlıdır.

S: FeatureUnion ve ColumnTransformer ne zaman kullanılmalı?

ColumnTransformer aynı girdinin farklı sütunlarına farklı transformer'lar uygular. FeatureUnion tüm girdiye farklı transformer'lar uygular ve yatay olarak birleştirir. Heterojen sütun ön işleme (sayısal vs kategorik) için ColumnTransformer kullanılmalıdır. FeatureUnion, birden fazla çıkarım yönteminin (PCA, polinom özellikleri, etki alanına özgü çıkarıcılar) aynı veriden tamamlayıcı özellikler ürettiği özellik artırma için kullanılır.

S: Başarısız bir pipeline nasıl hata ayıklanır?

Adım zamanlamalarını görmek için pipeline üzerinde verbose=True ayarlanmalıdır. Fit edilmiş bir pipeline için pipeline.named_steps['adım_adı'].transform(X) ile ara sonuçlara erişilebilir. Scikit-learn 1.9'da HTML temsili fit edilmiş nitelikleri ve çıktı özellik adlarını görüntüleyerek Jupyter notebook'larında hata ayıklamayı basitleştirir. Daha derin inceleme için pipeline[:-1].fit_transform(X, y) kullanılarak son tahmin ediciden hemen önce çıktı alınabilir.

ML Pipeline'ları İçin Üretim Kontrol Listesi

  • Serileştirme sorunlarından kaçınmak için requirements'ta scikit-learn sürümünü sabitleyin
  • Veri setleri değişebiliyorsa sabit kodlanmış sütun adları yerine make_column_selector kullanın
  • Üretimde yeni kategorileri işlemek için OneHotEncoder'da handle_unknown='ignore' ayarlayın
  • Geliştirme sırasında pahalı ön işlemeyi memory parametresi ile önbelleğe alın
  • Dağıtımdan önce testlerde pipeline çıktı şeklini ve özellik adlarını doğrulayın
  • Özellik önem analizi için get_feature_names_out() sonuçlarını modelle birlikte saklayın
  • Doğru CV davranışını sağlamak için PipelineGridSearchCV içinde kullanın, asla tersini yapmayın

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Günün meydan okuması

Data Science & ML kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

2 Eylül 2026 tarihinde güncellendi

Etiketler

#scikit-learn
#machine-learning
#python
#pipeline
#feature-engineering

Paylaş

İlgili makaleler