Dağılımı İyileştir, Modeli Rahatlat
Makine öğrenimi modelleri genellikle "normal dağılıma yakın" verilerle daha iyi çalışır. Özellik dönüşümleri, çarpık verileri düzeltip model performansını artırmanın en basit yollarından biridir.
NEDEN ÖZELLİK DÖNÜŞÜMÜ YAPARIZ?
🚨 PROBLEM: Çarpık Veriler
- Gelir dağılımı gibi düşün: Çoğu insan az, çok azı çok kazanıyor
- Ev fiyatları: Çoğu ev 500K-2M, ama 10M'luk saraylar da var
- Bu uç değerler (outlier) modelleri yanıltıyor
- Lineer modeller "normal dağılım" bekliyor
✅ ÇÖZÜM: Dönüşümler
- Log: Büyük sayıları küçült, küçükleri büyüt
- Sqrt: Hafif çarpıklıkları düzelt
- Box-Cox: Akıllıca otomatik ayar
- Sonuç: Model daha iyi öğrenir, tahminler daha doğru olur!
🏠 GERÇEK HAYAT ÖRNEKLERİ
💰 GELİR VERİSİ
[20K, 25K, 30K, 35K, 1.000K] → Log sonrası daha dengeli!
🏡 EV FİYATLARI
[500K, 750K, 1.2M, 15M] → Sqrt ile uç değer yumuşar
📊 WEB TRAFİĞİ
[100, 150, 200, 1.000.000] → Box-Cox ile normalize
Log Dönüşümü
Ne zaman?: Gelir, fiyat, nüfus gibi sağa çarpık verilerde
Formül: log(x) veya log(x+1) [sıfır varsa]
Karekök Dönüşümü
Ne zaman?: Orta derecede çarpıklık, sayım verileri
Formül: √x (karekök x)
Box-Cox Dönüşümü
Ne zaman?: En iyi dönüşümü bilmiyorsan, otomatik ayar
Formül: (x^λ - 1)/λ [λ=0 ise log(x)]
🎯 PRATİK KURALLAR
✅ YAPILACAKLAR
- Sağa çarpıksa → Log (pozitif değerler)
- Hafif çarpıksa → Sqrt (sayım verileri)
- Emin değilsen → Box-Cox (en iyi λ'yı bul)
- Daima kontrol et: Dönüşüm öncesi/sonrası histogram
❌ YAPILMAYACAKLAR
- Negatiflerle log alma → log(x+min+1) kullan
- Aşırı dönüşüm → Veriyi tanıyamaz hale getirme
- Test verisini unutma → Aynı dönüşümü uygula
- Anlamsız dönüşüm → Yorumlanabilir olmalı
🔬 KENDİ DENEYİNİZİ YAPIN
Aşağıdaki gerçek hayat örneklerini deneyin veya kendi verinizi girin:
A) Sayı Dizisi
Dönüşüm Yöntemi
Box-Cox Ayarları
B) Önce / Sonra Karşılaştırması
Önce
Sonra
📊 İstatistikler
🐍 PRATİK PYTHON KODLARI
Basit Uygulama
import numpy as np
import pandas as pd
# Örnek veri - gelir dağılımı
gelirler = [30000, 45000, 52000, 2500000]
# 1. Log dönüşümü (en yaygın)
log_gelir = np.log1p(gelirler) # log(x+1)
print("Log dönüşümü:", log_gelir)
# 2. Karekök dönüşümü
sqrt_gelir = np.sqrt(gelirler)
print("Karekök:", sqrt_gelir)
# 3. Manuel Box-Cox (λ=0.5)
lambda_val = 0.5
bc_gelir = (np.power(gelirler, lambda_val) - 1) / lambda_val
print("Box-Cox:", bc_gelir)
Sklearn ile Profesyonel
from sklearn.preprocessing import PowerTransformer
from sklearn.pipeline import Pipeline
import pandas as pd
# DataFrame örneği
df = pd.DataFrame({
'gelir': [30000, 45000, 52000, 2500000],
'yas': [25, 30, 35, 40]
})
# Box-Cox transformer (otomatik en iyi lambda)
bc = PowerTransformer(method='box-cox')
# Sadece gelir sütununa uygula
df['gelir_boxcox'] = bc.fit_transform(df[['gelir']])
print("Dönüşüm öncesi çarpıklık:", df['gelir'].skew())
print("Dönüşüm sonrası çarpıklık:", df['gelir_boxcox'].skew())
# Pipeline ile kullanım
pipe = Pipeline([
('transform', PowerTransformer()),
('model', YourRegressionModel())
])
Modül 3 Tamamlandı!
Artık çarpık verileri düzeltmek için doğru dönüşümü seçebilir ve model performansınızı önemli ölçüde artırabilirsiniz!