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'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çı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:
# 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:
# 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:
# 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:
# 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:
# 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:
# 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:
# 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:
# 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:
# 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.
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_selectorkullanın - Üretimde yeni kategorileri işlemek için
OneHotEncoder'dahandle_unknown='ignore'ayarlayın - Geliştirme sırasında pahalı ön işlemeyi
memoryparametresi 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
Pipeline'ıGridSearchCViçinde kullanın, asla tersini yapmayın
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
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.

Yazan:
Anthony Fillion-MailletSharpSkill 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
Paylaş
İlgili makaleler

Veri Bilimi icin Python: 2026'da NumPy, Pandas ve Scikit-Learn Rehberi
NumPy dizi islemleri, Pandas veri manipulasyonu ve Scikit-Learn model egitimini kapsayan uygulamali bir rehber. Ham CSV verisinden egitilmis modele uzanan eksiksiz bir veri hatti, uretim ortamina hazir Python kod ornekleriyle adim adim olusturulmaktadir.

Makine Öğrenmesi İçin Öznitelik Mühendisliği: Teknikler ve Mülakat Soruları 2026
Makine öğrenmesi öznitelik mühendisliği tekniklerini Python ile uygulamalı olarak öğrenin. Kodlama, ölçekleme, öznitelik seçimi, scikit-learn pipeline yapıları ve veri bilimi mülakat soruları.

Makine Öğrenmesi Algoritmaları: Teknik Mülakatlar İçin Kapsamlı Rehber
Makine öğrenmesi algoritmalarını derinlemesiyle öğrenin: denetimli öğrenme, karar ağaçları, kümeleme, model değerlendirme metrikleri ve düzenlileştirme yöntemleri. 2026 veri bilimi mülakatlarına hazırlık için Python kod örnekleriyle.