Veri Sızıntısı (Data Leakage): ML Projelerinin En Sık "Sessiz Katili"
Test setinde %99 doğruluk, üretimde %60. Aradaki fark sizi öldürür. Veri sızıntısı, ML hatalarının kralı.

"Modelim %99 doğru, ama üretimde patladı"
Her veri bilimci bunu yaşar. Nedeni: data leakage (veri sızıntısı).
Tanım: model eğitim sırasında, gerçek dünyada erişemeyeceği bilgiyi kullanır. Test seti aldatıcı yüksek skor verir.
Türler
1. Target leakage
Hedef değişken, özellik olarak modele veriliyor (doğrudan veya dolaylı).
Klasik örnek: hastalık tahmini.
- Özellikler arasında: "antibiyotik aldı mı?"
- Hasta antibiyotik aldıysa zaten hasta → mükemmel ama anlamsız tahmin.
Çözüm: hedefin sonucu olabilecek özellikleri çıkar.
2. Train-test contamination
Test verisi eğitime karışmış.
Örnek:
- Aynı müşteri hem train hem test sette.
- Aynı resim farklı augmentation ile her ikisinde.
- Hisse senedi: aynı şirket farklı tarihlerde.
Çözüm: dikkatli split (grup, zaman bazlı).
3. Time travel
Geleceğin bilgisini geçmişin tahminine kullanma.
Örnek: 2024 satış tahmini için 2024 ortalamasını feature kullanma.
Çözüm: rolling/expanding window — sadece o ana kadar olan bilgi.
4. Preprocessing sızıntısı
# YANLIŞ:
scaler.fit(X_all) # tüm veri ile fit
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Scaler test setinin istatistiklerini öğrendi.
# DOĞRU:
scaler.fit(X_train)
X_test = scaler.transform(X_test)
5. Cross-validation hatası
# YANLIŞ:
X_imputed = imputer.fit_transform(X)
cross_val_score(model, X_imputed, y, cv=5)
Imputer tüm veriden imputation öğrendi.
# DOĞRU:
pipeline = make_pipeline(imputer, model)
cross_val_score(pipeline, X, y, cv=5)
Pratik örnekler
Telekom churn
Sızıntı: "müşterinin iptal sebebi" özelliği — iptal sonrası giriliyor.
Çözüm: sadece iptal tarihinden ÖNCEKİ bilgiler.
Kredi onay
Sızıntı: "kredi sonrası gelir değişimi".
Çözüm: sadece başvuru tarihindeki bilgiler.
Tıbbi tanı
Sızıntı: görüntü dosya isminde "kanser_var" ibaresi (yanlışlıkla ID).
Çözüm: metaverileri temizle.
Reklam tıklama
Sızıntı: "kullanıcı sayfada ne kadar kaldı" — sadece tıkladıysa biliyoruz.
Çözüm: post-hoc bilgiler dışla.
Tespit yolları
1. Aşırı yüksek skor şüphesi
Test doğruluğunuz %99'a yakınsa: şüphelen. Çoğu ML problemi bu kadar kolay değil.
2. Feature importance
Tek bir özellik tüm açıklama gücüne sahipse: muhtemelen sızıntı.
3. Reverse engineering
"Bu özellik üretim zamanında var olur mu?" sorusunu her özellik için sor.
4. Train vs prod karşılaştırması
Üretim performansı eğitimden çok düşükse: sızıntı + overfitting karışımı.
Önleme stratejileri
1. Pipeline kullan
scikit-learn pipeline veya MLflow ile eğitim-değerlendirme akışını tek nesne olarak yönet.
2. Stratified, group, time-based split
- Sınıflandırma: stratified split.
- Müşteri tahmini: müşteri bazında split (aynı müşteri tek tarafta).
- Zaman serisi: zamana göre split (geleceği görme).
3. Cross-validation içinde tüm ön işleme
Imputation, scaling, feature engineering — hepsi CV içinde.
4. Hold-out test
CV ile model seçimi → hold-out sette son test.
5. Domain expert ile gözden geçirme
Tıbbi proje: doktor ile özellikleri kontrol et.
Modern AI'da
LLM çağında yeni sorun: benchmark contamination.
MMLU, HumanEval, GSM-8K test setlerinin internet üzerinde olması → model eğitiminde görür.
Sonuç: rapor edilen benchmark skorları şişirilmiş.
Çözüm: yeni, gizli benchmarks (LMSYS Arena, Hidden eval).
Türk vakaları
- Bir Türk fintek: kredi modeli %95 AUC → üretimde %72. Sızıntı: başvuru tarihinden sonraki ödeme.
- E-ticaret churn: müşteri ID'sinde gizli pattern.
- Sigorta tarama: COVID döneminde tıbbi veride zaman sızıntısı.
Kapanış
Veri sızıntısı görünmez ama öldürücü. Bir veri bilimci için en önemli beceri: şüpheci olmak. Her başarılı modeli sorgula: "Acaba sızıntı mı var?"
Kahin sözü: yüksek test skorunu kutlama → araştır. Çünkü asıl test üretimde başlar.
Etiketler
Kendinizi Test Edin
Cevaplarınız profilinizde istatistik olarak saklanır.
1. Data leakage nedir?
2. Klasik target leakage örneği?
3. Preprocessing sızıntısı nasıl önlenir?
4. Zaman serisi için doğru split?
5. Modern AI'da yeni sızıntı türü?
İlgili Yazılar
Patates Paradoksu: 100 Kilo Patates Biraz Kuruyunca Neden 50 Kiloya Düşer?
100 kilo patatesiniz var ve %99’u sudan oluşuyor. Biraz beklettiniz, su oranı %98’e düştü. Şimdi patatesler kaç kilo? Sezginiz "neredeyse 100" diyor. Doğru cevap ise tam 50 kilo — ve bu, oranların ne kadar aldatıcı olduğunu gösteriyor.
MatematikLanchester’ın Savaş Yasaları: Bir Ordunun Gücü Neden Asker Sayısının Karesiyle Artar?
İki ordu çarpışırken sonucu ne belirler? Sezgi "daha kalabalık olan kazanır" der. Ama bir mühendis, modern savaşta sayısal üstünlüğün etkisinin doğrusal değil, asker sayısının karesiyle orantılı olduğunu gösterdi. Bu, neden "böl ve yönet" işe yaradığını açıklar.
Matematik"Yüzde 30 Yağmur İhtimali" Tam Olarak Ne Demek? Çoğu Kişi Yanlış Anlıyor
Hava durumu "bugün yüzde 30 yağmur ihtimali" dediğinde ne anlıyorsunuz? Gökyüzünün yüzde 30’u mu kapanacak? Günün yüzde 30’unda mı yağacak? Aslında ikisi de değil — ve gerçek anlamı, olasılığın ne kadar incelikli olduğunu gösteriyor.