yazılar

Feature Engineering: Aykırı Değerler, Eksik Veriler, Encoding

Machine Learning · Feature Engineering · Veri Bilimi · Python

Model başarısı çoğunlukla feature engineering’e bağlıdır. Doğru veri hazırlığı yapılmadan en güçlü model bile beklenen performansı vermez. Bu yazıda üç temel konuya odaklanıyoruz: aykırı değerler, eksik veriler ve kategorik encoding.

Örnekler boyunca Iris veri setini (150 örnek, 4 özellik) kullanacağız.

Aykırı Değerler (Outliers)

Aykırı değerler modeli yanıltır, özellikle uzaklık tabanlı algoritmalarda (KNN, SVM, linear regression) ciddi sorun yaratır.

Standart Sapma Yöntemi

Ortalamadan ±3 standart sapma dışındaki değerleri aykırı kabul et:

mean = df['feature'].mean()
std  = df['feature'].std()

outliers = df[(df['feature'] < mean - 3*std) |
              (df['feature'] > mean + 3*std)]

Z-Score

Her değerin ortalamadan kaç standart sapma uzakta olduğunu ölçer:

from scipy import stats

z_scores = stats.zscore(df['feature'])
outliers  = df[abs(z_scores) > 3]

IQR (Interquartile Range)

Normal dağılım varsayımı gerektirmez — çarpık verilerde Z-score’dan daha güvenilir:

Q1  = df['feature'].quantile(0.25)
Q3  = df['feature'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['feature'] < lower) | (df['feature'] > upper)]

Öneri: Veri dağılımı bilinmiyorsa IQR’ı tercih et.

Eksik Değerler (Missing Values)

Eksik veri her veri setinde karşına çıkar. Strateji seçimi veri miktarına, dağılımına ve kullanılacak modele göre değişir.

# Eksik değer oranı
df.isnull().sum() / len(df) * 100

Doldurma Stratejileri

Strateji Ne zaman?
Sabit değer (0, “bilinmiyor”) Eksiklik anlamlıysa
Ortalama (mean) Normal dağılımlı sayısal
Medyan Çarpık dağılımlı sayısal
Mod Kategorik
Forward/backward fill Zaman serisi
İnterpolasyon Düzgün değişen seri
Gruba göre ortalama Alt grup örüntüsü varsa
ML ile tahmin Karmaşık örüntü varsa
# Ortalama ile doldurma
df['feature'].fillna(df['feature'].mean(), inplace=True)

# Gruba göre medyan
df['feature'] = df.groupby('group')['feature'] \
                  .transform(lambda x: x.fillna(x.median()))

Not: Tree-based modeller (Random Forest, XGBoost) eksik değeri kendi başına idare edebilir; bu modelleri kullanıyorsan doldurma zorunlu değil.

Kategorik Encoding

Model sayısal girdi bekler — kategorik değişkenleri dönüştürmek şart.

Label Encoding

Sıralı (ordinal) kategoriler için:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['kategori_encoded'] = le.fit_transform(df['kategori'])
# küçük → 0, orta → 1, büyük → 2

One-Hot Encoding

Nominal (sırasız) kategoriler için:

df = pd.get_dummies(df, columns=['renk'], drop_first=True)
# mavi → [1, 0], kırmızı → [0, 1], yeşil → [0, 0]

drop_first=True ile çoklu doğrusallık (multicollinearity) önlenir.

Target Encoding

Yüksek kardinaliteli kategoriler için (şehir, ürün ID):

target_mean = df.groupby('şehir')['hedef'].mean()
df['şehir_encoded'] = df['şehir'].map(target_mean)

Özet

Veri hazırlığı doğrudan model başarısını etkiler. Yöntem seçimi kural değil, veriye özgü karar:

  • Aykırı değer: dağılıma göre IQR veya Z-score
  • Eksik veri: örüntüye göre doldur ya da modele bırak
  • Encoding: sıralıysa label, sırasızsa one-hot, yüksek kardinaliteyse target

Bu yazının orijinali Medium’da yayınlanmıştır.