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ı.

Öznitelik mühendisliği, bir makine öğrenmesi modelinin başarısını belirleyen en kritik aşamadır. Ham veriler, algoritmaların doğrudan işleyebileceği bir biçimde nadiren gelir; bu verilerin anlamlı özniteliklere dönüştürülmesi, veri toplama ile model doğruluğu arasındaki boşluğu kapatır. 2026 yılında veri bilimi mülakatlarında öznitelik mühendisliği bilgisi, model seçimi kadar belirleyici bir değerlendirme kriteri haline gelmiştir.
Araştırmalar tutarlı olarak göstermektedir ki ön işleme ve öznitelik mühendisliği kararları, hiperparametre ayarlamaya kıyasla model doğruluğu üzerinde çok daha büyük etkiye sahiptir. İyi tasarlanmış bir öznitelik seti, basit bir lojistik regresyon modelinin; kötü beslenmiş bir gradient boosting modelinden daha yüksek performans göstermesini sağlayabilir.
ML Modelleri İçin Kategorik Kodlama Stratejileri
Makine öğrenmesi algoritmalarının büyük çoğunluğu sayısal girdi gerektirir. Kategorik değişkenler — "yüksek", "orta", "düşük" gibi metin etiketleri veya ülke adları — modelin işleyebileceği sayılara dönüştürülmelidir. Seçilen kodlama stratejisi, model performansını ve yorumlanabilirliğini doğrudan etkiler.
Üç temel kodlama tekniği, gerçek dünya senaryolarının büyük çoğunluğunu kapsar: sıralı veriler için etiket kodlama (label encoding), nominal kategoriler için tek-sıcak kodlama (one-hot encoding) ve yüksek kardinaliteli öznitelikler için hedef kodlama (target encoding).
# encoding_strategies.py
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer
df = pd.DataFrame({
"size": ["small", "medium", "large", "medium", "small"],
"color": ["red", "blue", "green", "red", "blue"],
"price": [10, 25, 40, 22, 12]
})
# Label encoding for ordinal feature (size has natural order)
le = LabelEncoder()
df["size_encoded"] = le.fit_transform(df["size"]) # large=0, medium=1, small=2
# One-hot encoding for nominal feature (color has no order)
ct = ColumnTransformer(
transformers=[
("onehot", OneHotEncoder(drop="first", sparse_output=False), ["color"])
],
remainder="passthrough" # Keep other columns unchanged
)
result = ct.fit_transform(df[["color", "price"]])
# Produces: color_green, color_red columns (blue dropped as reference)Etiket kodlama, sayısal sıranın kategori sırasıyla eşleştiği sıralı öznitelikler için uygundur. Tek-sıcak kodlama ise modelin nominal kategoriler arasında sahte sıralı ilişkiler çıkarmasını engeller. drop="first" parametresi, fazladan bir sütunu kaldırarak kukla değişken tuzağını önler.
Hedef kodlama, her kategoriyi o grubun ortalama hedef değeri ile değiştirir. Yüksek kardinaliteli öznitelikler (posta kodları, ürün kimlikleri) için güçlü bir yöntem olsa da hedef bilgisini özniteliklere sızdırır. Aşırı iyimser değerlendirme metriklerini önlemek için hedef kodlamayı her zaman çapraz doğrulama kıvrımları içinde scikit-learn'ün TargetEncoder sınıfını kullanarak uygulamak gerekir.
Öznitelik Ölçekleme: StandardScaler, MinMaxScaler ve RobustScaler Karşılaştırması
Mesafe tabanlı algoritmalar (KNN, SVM, K-Means) ve gradyan iniş optimizasyoncuları varsayılan olarak tüm özniteliklere eşit ağırlık verir. 30.000 ile 200.000 arasında değişen bir maaş sütunu, ölçekleme yapılmadığında 0 ile 40 arasında değişen bir deneyim yılı sütununa baskın çıkar.
Ölçekleyici seçimi, verinin dağılımına ve aykırı değerlere duyarlılığa bağlıdır.
# feature_scaling.py
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# Simulated dataset: salary with outliers
data = np.array([[35000], [42000], [55000], [67000], [450000]]) # 450k is an outlier
# StandardScaler: mean=0, std=1 (sensitive to outliers)
standard = StandardScaler().fit_transform(data)
# Result: [-0.72, -0.68, -0.60, -0.53, 2.53] — outlier distorts the scale
# MinMaxScaler: maps to [0, 1] (very sensitive to outliers)
minmax = MinMaxScaler().fit_transform(data)
# Result: [0.0, 0.017, 0.048, 0.077, 1.0] — most values crushed near zero
# RobustScaler: uses median and IQR (robust to outliers)
robust = RobustScaler().fit_transform(data)
# Result: [-0.77, -0.5, 0.0, 0.46, 15.38] — outlier isolated, core data preservedStandardScaler, kullanım alanlarının büyük bölümünde tercih edilir; doğrusal modeller, yapay sinir ağları ve PCA, standartlaştırılmış öznitelikler bekler. MinMaxScaler, sınırlı aktivasyon fonksiyonları (sigmoid, tanh) ve görüntü piksel normalizasyonu için uygundur. Veri setinde aykırı değerler bulunduğunda RobustScaler varsayılan tercih olmalıdır; çünkü medyan ve çeyrekler arası aralık (IQR) kullanarak çekirdek verilerin bozulmasını önler. Detaylı karşılaştırmalar için scikit-learn ön işleme kılavuzuna başvurulabilir.
Çarpık Dağılımlar İçin Matematiksel Dönüşümler
Çarpık öznitelikler, doğrusal modellerin normallik varsayımını ihlal eder ve uç değerlerin etkisini orantısız biçimde artırır. Logaritmik, karekök ve Box-Cox dönüşümleri, çarpık dağılımların kuyruğunu sıkıştırarak normal dağılıma yaklaştırır.
# skew_transformations.py
import numpy as np
from sklearn.preprocessing import PowerTransformer
# Right-skewed income data (common in real datasets)
income = np.array([[25000], [32000], [41000], [55000], [72000],
[150000], [320000], [890000]])
# Log transform: simple, effective for right-skewed data
log_income = np.log1p(income) # log1p handles zero values safely
# Box-Cox: finds optimal power parameter automatically
pt = PowerTransformer(method="box-cox") # Requires strictly positive values
income_boxcox = pt.fit_transform(income)
print(f"Optimal lambda: {pt.lambdas_[0]:.3f}") # Shows learned parameter
# Yeo-Johnson: works with zero and negative values too
pt_yj = PowerTransformer(method="yeo-johnson")
income_yj = pt_yj.fit_transform(income)PowerTransformer, Box-Cox veya Yeo-Johnson yöntemleriyle optimum dönüşüm parametresini otomatik olarak öğrenir. Yeo-Johnson sıfır ve negatif değerleri de işleyebildiğinden daha güvenli bir varsayılan tercihtir. Dönüşümün normalliği iyileştirip iyileştirmediğini doğrulamak için her zaman Q-Q grafiği veya Shapiro-Wilk testi ile kontrol edilmelidir.
Öznitelik Seçimi: Eğitim Öncesi Gürültüyü Azaltmak
Daha fazla öznitelik her zaman daha iyi tahmin anlamına gelmez. İlgisiz veya tekrarlayan öznitelikler gürültü ekler, eğitim süresini uzatır ve aşırı öğrenmeye yol açar; özellikle öznitelik sayısının örneklem sayısına yaklaştığı veya aştığı yüksek boyutlu veri setlerinde bu durum belirginleşir.
Öznitelik seçim yöntemleri üç kategoride incelenir: filtre yöntemleri (istatistiksel testler), sarmalayıcı yöntemler (model tabanlı değerlendirme) ve gömülü yöntemler (eğitim sürecine entegre).
# feature_selection.py
from sklearn.datasets import make_classification
from sklearn.feature_selection import (
SelectKBest, f_classif, # Filter method
SequentialFeatureSelector, # Wrapper method
SelectFromModel # Embedded method
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LassoCV
# Dataset: 20 features, only 5 are informative
X, y = make_classification(
n_samples=1000, n_features=20,
n_informative=5, n_redundant=3, random_state=42
)
# Filter: ANOVA F-test selects top k features by statistical significance
selector_filter = SelectKBest(f_classif, k=8)
X_filtered = selector_filter.fit_transform(X, y)
print(f"Selected features: {selector_filter.get_support(indices=True)}")
# Embedded: L1 regularization (Lasso) zeros out irrelevant feature weights
lasso = LassoCV(cv=5, random_state=42).fit(X, y)
selector_embedded = SelectFromModel(lasso, prefit=True)
X_lasso = selector_embedded.transform(X)
print(f"Lasso kept {X_lasso.shape[1]} features out of {X.shape[1]}")Filtre yöntemleri (ANOVA, ki-kare, karşılıklı bilgi) hızlı çalışır ancak öznitelikleri birbirinden bağımsız olarak değerlendirir ve öznitelik etkileşimlerini yakalar. Lasso düzenlileştirme gibi gömülü yöntemler ise seçimi eğitim sırasında gerçekleştirerek daha iyi genelleyen seyrek modeller üretir. Bu modellerin arkasındaki algoritmaları derinlemesine anlamak için makine öğrenmesi algoritmaları rehberine başvurulabilir.
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.
ColumnTransformer ile Üretime Hazır Pipeline Yapıları
Ön işleme adımlarının notebook hücrelerine dağınık şekilde yerleştirilmesi, kırılgan ve tekrarlanamaz iş akışları oluşturur. Scikit-learn'ün Pipeline ve ColumnTransformer bileşenleri, tüm öznitelik mühendisliği sürecini tek bir serileştirilebilir nesne içinde kapsülleyerek çapraz doğrulama sırasında veri sızıntısını önler.
# production_pipeline.py
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
# Define column groups by type
numeric_features = ["age", "income", "credit_score"]
categorical_features = ["education", "employment_type", "region"]
# Numeric pipeline: impute missing values, then scale
numeric_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="median")), # Median resists outliers
("scaler", StandardScaler())
])
# Categorical pipeline: impute missing, then one-hot encode
categorical_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("encoder", OneHotEncoder(handle_unknown="ignore", sparse_output=False))
])
# Combine into a single preprocessor
preprocessor = ColumnTransformer([
("num", numeric_pipeline, numeric_features),
("cat", categorical_pipeline, categorical_features)
])
# Full pipeline: preprocessing + model in one object
full_pipeline = Pipeline([
("preprocessor", preprocessor),
("classifier", GradientBoostingClassifier(n_estimators=200, random_state=42))
])
# Cross-validation applies preprocessing correctly within each fold
scores = cross_val_score(full_pipeline, X, y, cv=5, scoring="roc_auc")
print(f"AUC: {scores.mean():.3f} +/- {scores.std():.3f}")Pipeline yapısı; eksik değer doldurma istatistiklerinin, ölçekleme parametrelerinin ve kodlama eşlemelerinin yalnızca her çapraz doğrulama kıvrımındaki eğitim verisi üzerinde hesaplanmasını garanti eder. full_pipeline.fit(X_train, y_train) ardından full_pipeline.predict(X_test) çağrısı, bilgi sızıntısı olmaksızın aynı dönüşümleri uygular. Tüm pipeline, dağıtım için joblib.dump() ile serileştirilebilir.
Featuretools ile Otomatik Öznitelik Mühendisliği
Manuel öznitelik mühendisliği, birkaç düzine sütuna sahip yapılandırılmış veri setleri için etkili bir yöntemdir. Ancak birden fazla tabloyu kapsayan ilişkisel veri setleri — müşterilere bağlı işlemler, işlemlere bağlı satıcılar — öznitelik kombinasyonlarını sistematik olarak keşfetmek için otomatik yaklaşımlar gerektirir.
Featuretools, varlık ilişkilerini gezerek dönüşüm ve toplama ilkellerini uygulayan Deep Feature Synthesis (DFS) algoritmasını uygular ve otomatik olarak yüzlerce aday öznitelik üretir.
# automated_feature_engineering.py
import featuretools as ft
import pandas as pd
# Define entities from relational tables
customers = pd.DataFrame({
"customer_id": [1, 2, 3],
"signup_date": pd.to_datetime(["2024-01-15", "2024-03-22", "2024-06-01"]),
"region": ["US", "EU", "APAC"]
})
transactions = pd.DataFrame({
"txn_id": range(1, 8),
"customer_id": [1, 1, 1, 2, 2, 3, 3],
"amount": [50, 120, 30, 200, 85, 340, 15],
"category": ["food", "tech", "food", "tech", "travel", "food", "tech"]
})
# Create an EntitySet with relationships
es = ft.EntitySet(id="retail")
es = es.add_dataframe(dataframe=customers, dataframe_name="customers",
index="customer_id", time_index="signup_date")
es = es.add_dataframe(dataframe=transactions, dataframe_name="transactions",
index="txn_id")
es = es.add_relationship("customers", "customer_id",
"transactions", "customer_id")
# DFS generates features: COUNT, MEAN, MAX, STD of transactions per customer
feature_matrix, feature_defs = ft.dfs(
entityset=es, target_dataframe_name="customers",
max_depth=2, # Controls complexity of generated features
trans_primitives=["month", "weekday"], # Transformation primitives
agg_primitives=["count", "mean", "std", "max"] # Aggregation primitives
)
print(f"Generated {len(feature_defs)} features from 2 tables")DFS, MEAN(transactions.amount), STD(transactions.amount) ve COUNT(transactions) gibi öznitelikleri üretir. Bunlar bir veri bilimcinin manuel olarak oluşturacağı toplamalar olsa da DFS bunu çok daha kısa sürede gerçekleştirir. max_depth parametresi öznitelik karmaşıklığını kontrol eder: derinlik 2, STD(transactions.MONTH(signup_date)) gibi iç içe geçmiş toplamalar üretir.
Mülakat yapanlar adaylardan sıklıkla belirli bir iş problemi (müşteri kaybı tahmini, dolandırıcılık tespiti, öneri sistemleri) için öznitelik tasarlamalarını ister. Öznitelikleri yakınlık (recency), sıklık (frequency) ve parasal değer (monetary value) boyutlarında — yani RFM analizi çerçevesinde — ifade etme pratiği yapmak büyük avantaj sağlar. Bu üç boyut, müşteri odaklı hemen her makine öğrenmesi problemine uygulanabilir.
Sık Sorulan Öznitelik Mühendisliği Mülakat Soruları
2026 yılındaki veri bilimi mülakatları, öznitelik mühendisliğinin hem teorik anlayışını hem de pratik uygulamasını test etmektedir. Aşağıdaki sorular FAANG şirketleri ve startup mülakatlarında sıklıkla karşılaşılan sorulardır.
S: 10.000'den fazla benzersiz değere sahip bir kategorik özniteliği nasıl işlersiniz?
Yüksek kardinaliteli kategorik değişkenler için tek-sıcak kodlama kullanılamaz; bu yöntem 10.000 seyrek sütun oluşturur. Etkili stratejiler şunlardır: hedef kodlama (sızıntıyı önlemek için çapraz doğrulama içinde uygulanmalıdır), frekans kodlama (kategorileri görülme sıklıkları ile değiştirme), hashing (HashingVectorizer ile kategorileri sabit boyutlu bir alana eşleme) ve yapay sinir ağlarında gömme katmanları (embedding layers).
S: Öznitelikleri ölçeklememeniz gereken durumlar nelerdir?
Ağaç tabanlı modeller (Random Forest, XGBoost, LightGBM) monoton öznitelik dönüşümlerine karşı değişmezdir. Bu modellerde ölçekleme, bölmeleri etkilemeden gereksiz hesaplama yükü ekler. Buna karşın mesafe tabanlı modeller ve yapay sinir ağları her zaman ölçekleme gerektirir.
S: Öznitelik seçimi ile boyut indirgeme arasındaki farkı açıklayın.
Öznitelik seçimi, orijinal özniteliklerin bir alt kümesini korur ve seçilen öznitelikler yorumlanabilirliğini sürdürür. Boyut indirgeme (PCA, t-SNE, UMAP) ise orijinal özniteliklerin doğrusal veya doğrusal olmayan birleşimlerinden yeni sentetik öznitelikler oluşturur. PCA bileşenleri açıklanan varyansı maksimize eder ancak doğrudan yorumlanabilirliği kaybeder. Doğru seçim, model açıklanabilirliğinin proje gereksinimlerinden biri olup olmadığına bağlıdır.
S: Çoklu doğrusal bağlantıyı (multicollinearity) nasıl tespit eder ve ele alırsınız?
Varyans Şişirme Faktörü (VIF) değerinin 5-10 üzerinde olması sorunlu çoklu doğrusal bağlantıya işaret eder. Korelasyon matrisleri ikili ilişkileri yakalar ancak çok değişkenli bağımlılıkları atlayabilir. Çözüm yolları arasında ilişkili özniteliklerden birini çıkarmak, bunları birleştirmek (ilişkili alt küme üzerinde PCA uygulamak) veya çoklu doğrusal bağlantıyı dahili olarak ele alan düzenlileştirme yöntemleri (Ridge/Lasso) kullanmak sayılabilir.
Öznitelik mühendisliği için temel Python veri işleme kütüphanelerinin uygulamalı pratiği için Python Veri Bilimi rehberine başvurulabilir; bu rehber NumPy, Pandas ve scikit-learn iş akışlarını derinlemesine ele almaktadır.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Sonuç
- Kategorik değişkenler bilinçli olarak kodlanmalıdır: sıralı veriler için etiket kodlama, nominal veriler için tek-sıcak kodlama, yüksek kardinaliteli öznitelikler için hedef kodlama (CV kıvrımları içinde) tercih edilmelidir
- Öznitelik ölçekleme model gereksinimlerine göre belirlenmelidir: doğrusal modeller ve yapay sinir ağları için
StandardScaler, ağaç tabanlı modeller için ölçekleme atlanabilir - Normallik varsayımına dayanan algoritmalara veri beslemeden önce çarpıklığı azaltmak için güç dönüşümleri (
PowerTransformer) uygulanmalıdır - Öznitelik seçimi sistematik olarak yapılmalıdır: hız için filtre yöntemleri, doğruluk için gömülü yöntemler (Lasso) kullanılmalı ve her zaman çapraz doğrulama ile doğrulanmalıdır
- Tüm ön işleme adımları veri sızıntısını önlemek ve tekrarlanabilirliği sağlamak için scikit-learn
Pipeline+ColumnTransformeryapısı içinde sarılmalıdır - Birden fazla tabloyu kapsayan ilişkisel veri setlerinde Featuretools DFS ile otomatik öznitelik üretimi değerlendirilmelidir
- Mülakatlarda öznitelik mühendisliği kararlarının iş terimleriyle açıklanması pratik edilmelidir; mülakat yapanlar hem teknik beceriyi hem de iletişim netliğini değerlendirir
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
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.

PyTorch ve TensorFlow 2026 Karsilastirmasi: Hangi Derin Ogrenme Framework'u Secilmeli?
PyTorch ve TensorFlow'un 2026 yilindaki kapsamli karsilastirmasi. torch.compile, XLA, Keras 3 coklu backend destegi, dagitim stratejileri, performans farklari ve mulakat sorulari. Kod ornekleri ve pratik rehber.

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.