İçeriğe atla
SinaptikLabAI KNOWLEDGE PLATFORM
RehberOrtaMakine Öğrenmesi

Veri sızıntısı olmadan eğitim, doğrulama ve test bölmek

Bölme ölçütü veri değil kullanım senaryosudur: tahmin geleceğe yapılacaksa zaman temelli, aynı kişi veya cihazdan birden çok satır varsa gruba göre, sınıf dağılımı dengesizse katmanlı bölme kullanılır; koşullar bir arada ise birleştirilir. Bölme özellik çıkarımından önce yapılır ve ölçekleme, eksik doldurma, kodlama parametreleri yalnızca eğitim bölmesinden öğrenilir. Test bölmesi sürüm kararına kadar açılmaz.

ÖNKOŞULLAR

  • Satır düzeyinde kimlik taşıyan bir veri kümesi: kayıt kimliği, varsa grup kimliği (kişi, cihaz, müşteri, belge) ve olay zaman damgası
  • Modelin üretimde hangi anda ve hangi alanlar elindeyken çalışacağının yazılı tanımı
  • Özellik çıkarımını ve eğitimi tek komutla yeniden koşturabilen bir hat; elle hazırlanmış ara dosyalar sızıntıyı gizler
  • Hedef değişkenin hangi sistemde ve ne zaman doldurulduğunu bilen bir alan uzmanı

GEREKEN ARAÇLAR

  • Grup ve katman destekli bölme fonksiyonları taşıyan bir makine öğrenmesi kütüphanesi
  • Veri çerçevesi kütüphanesi
  • Dönüşümleri modelle birlikte zincirleyen bir hat (pipeline) soyutlaması
  • Bölme tohumunu ve sınırlarını koşuyla birlikte kaydeden bir deney izleyici
  • Not defteri veya betik ortamı
  1. 01

    Tahmin anını yaz

    Modelin üretimde hangi anda, hangi alanlar elindeyken çalışacağını tek cümleyle yazın; bu cümle hangi alanın özellik, hangisinin sızıntı olduğunu belirler.

    Sızıntı tartışmalarının çoğu, herkesin farklı bir tahmin anı varsaymasından çıkıyor. Cümle şu biçimde yazılır: "Model, sipariş oluşturulduktan hemen sonra, ödeme sonucu henüz belli değilken çalışacak." Bu cümle yazıldığı anda veri sözlüğündeki alanların yarısı tartışma dışı kalır: tahmin anında henüz doldurulmamış bir alan, ne kadar güçlü bir sinyal verirse versin özellik olamaz.

    AlanTahmin anında dolu mu?Karar
    Sipariş tutarıEvetÖzellik olabilir
    Ödeme sonucuHayır, dakikalar sonra dolarSızıntı
    Müşteri kayıt tarihiEvetÖzellik olabilir
    İptal nedeniHayır, hedefle birlikte dolarSızıntı
    Son 30 günlük sipariş sayısıEvet, tahmin anına kadar sayılırsaKoşullu: pencere tahmin anında kapanmalı
    Son satır en çok hata yapılan yer: geriye dönük türetilen pencere özellikleri, pencereyi tahmin anından sonraya taşırsa sessizce sızıntı üretir.
  2. 02

    Kayıt, grup ve zaman kimliklerini çıkar

    Her satır için kayıt kimliğini, varsa grup kimliğini ve olay zaman damgasını ayrı sütunlara çıkarın; bölme kararı yalnızca bu üç sütuna dayanır.

    Grup kimliği, aynı gerçek dünya varlığından gelen satırları birbirine bağlayan sütundur. Sağlıkta hasta, endüstride cihaz, destek verisinde müşteri, belge işlemede kaynak dosya. Bu sütun çıkarılmadan yapılan her bölme, satırların bağımsız olduğu varsayımına dayanır ve o varsayım çoğu kurumsal veri kümesinde yanlıştır.

    • Kayıt kimliği: satırı tekil olarak belirler, tekilleştirme kontrolünde kullanılır.
    • Grup kimliği: aynı varlıktan gelen satırları bağlar; yoksa neden olmadığı yazılır.
    • Olay zaman damgası: satırın gerçekleştiği an — kayda geçtiği an değil.
    • Katman anahtarı: sınıf etiketi veya bölmeler arasında dağılımı korunacak alan.
    • Kaynak sistemi: aynı olayın iki sistemden iki kez gelmesi yakın kopya üretir.

    Doğrulama adımı: grup başına satır sayısının dağılımına bakın. Ortalama birin belirgin üzerindeyse rastgele bölme baştan elenir. Tek bir grubun toplam satırların büyük bir bölümünü taşıdığı durumlarda ise bölme dengesizleşir; o grubun hangi bölmeye düştüğü sonucu tek başına oynatabilir.

  3. 03

    Bölme stratejisini senaryoya göre seç

    Geleceğe tahminde zaman temelli, tekrar eden varlıklarda gruba göre, dengesiz sınıfta katmanlı bölme seçin; birden çok koşul geçerliyse bunları birleştirin.

    Strateji seçimi bir tercih değil, bir çıkarım: tahmin anı ve grup yapısı yazıldıysa strateji zaten belirlenmiştir. Tartışma çıkıyorsa genellikle birinci veya ikinci adım eksik yapılmıştır.

    SenaryoBölmeGerekçe
    Geleceğe tahmin, zaman damgalı olaylarZaman temelliÜretimde model hep geçmişten öğrenip geleceği tahmin eder
    Aynı varlıktan çok sayıda satırGruba göreModel varlığı ezberler, örüntüyü değil
    Seyrek pozitif sınıfKatmanlıRastgele bölmede test bölmesi pozitif örneksiz kalabilir
    Birden çok kurum veya bölgeKaynağa göre ayrılmışYeni bir kuruma genellemeyi ölçer
    Bağımsız, zamansız, dengeli satırlarRastgeleDiğer koşullar yoksa geçerlidir
    Son satır varsayılan değil, istisna: rastgele bölme ancak dört koşulun dördü de sağlanmadığında doğrudur.

    Koşullar çoğu zaman birlikte gelir, ama gruba göre bölmeyi zaman temelli bölmeyle birleştirmeden önce hangi soruyu ölçtüğünüze karar verin. Model üretimde geçmişini zaten gördüğü müşterileri puanlayacaksa kesim tarihi yeterlidir ve o müşterilerin kesim öncesi satırları eğitimde kalır — üretimde de o geçmiş elinizde olacaktır. Model hiç görmediği müşterileri puanlayacaksa bölme hem zaman temelli hem gruba göre kurulur ve test bölmesine düşen müşterilerin kesim öncesi satırları da eğitimden çıkarılır. İkisini karıştırmak ölçümü kötümser ya da iyimser tarafa kaydırır. Katmanlı gruplu bölme de aynı mantıkla kurulur — katman korunur ama katman uğruna grup bölünmez.

  4. 04

    Zaman temelli bölmede kesim noktası ve bekleme aralığı koy

    Eğitim, doğrulama ve test için zaman sırasını koruyan kesim tarihleri seçin ve her kesimin öncesine etiketin olgunlaşma süresi kadar bir bekleme aralığı bırakın.

    Etiketin olgunlaşma süresi, olayın gerçekleşmesi ile etiketinin kesinleşmesi arasında geçen zamandır: iade penceresi, tahsilat vadesi, arıza teyidi. Kesim tarihine kadar olan tüm satırları eğitime koyduğunuzda, kesime yakın satırların etiketi veri toplandığı anda henüz kesinleşmemiş olabilir. Bu satırlar hem yanlış etiket taşır hem de test dönemiyle örtüşür.

    python
    import pandas as pd
    
    # Kesim tarihleri ve bekleme süresi bu örnekte varsayımdır.
    KESIM_DOGRULAMA = pd.Timestamp("2025-11-01")
    KESIM_TEST = pd.Timestamp("2026-01-01")
    BEKLEME = pd.Timedelta(days=30)  # etiketin olgunlaşma süresi
    
    egitim = veri[veri.olay_zamani < KESIM_DOGRULAMA - BEKLEME]
    dogrulama = veri[
        (veri.olay_zamani >= KESIM_DOGRULAMA) & (veri.olay_zamani < KESIM_TEST - BEKLEME)
    ]
    test = veri[veri.olay_zamani >= KESIM_TEST]
    
    # Her kesimin öncesindeki bekleme aralığı hiçbir bölmeye girmez: etiketi
    # henüz kesinleşmemiş satırlar ne eğitime ne doğrulamaya alınır.
    assert egitim.olay_zamani.max() < dogrulama.olay_zamani.min()
    assert dogrulama.olay_zamani.max() < test.olay_zamani.min()

    Kesim tarihi keyfî seçilmez. Test döneminin, modelin üretimde karşılaşacağı mevsimselliği ve en az bir tam iş çevrimini içermesi gerekir; yalnızca kampanya dönemine denk gelen bir test bölmesi, kampanya dışı davranış hakkında hiçbir şey söylemez. Aynı nedenle tek bir kesim yerine kayan pencereli birkaç kesim kurup sonuçların tutarlılığına bakmak daha güvenilirdir. Doğrulama bölmesi de zaman sırasına uyar: eğitim bölmesinden rastgele ayrılan bir doğrulama kümesi geleceği eğitime geri taşır ve zaman temelli bölmeden kazanılanı geri verir.

  5. 05

    Grup sızıntısını kapat ve doğrula

    Aynı kişi, cihaz, müşteri veya belgeden gelen tüm satırlar tek bölmede kalmalı; bölme sonrası grup kesişimini boş küme testiyle otomatik doğrulayın.

    Grup sızıntısının etkisi, sızıntı türleri arasında en çok hafife alınanı. Aynı hastanın bir görüntüsü eğitimde, diğeri testteyse model hastalığı değil hastayı tanır; test skoru yüksek çıkar, yeni hastada düşer. Ölçüm ile üretim arasındaki bu fark, model değiştirerek kapatılamaz çünkü sorun modelde değil bölmede.

    python
    from sklearn.model_selection import GroupShuffleSplit
    
    bolucu = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
    egitim_idx, test_idx = next(bolucu.split(X, y, groups=veri.hasta_kimligi))
    
    egitim_gruplari = set(veri.hasta_kimligi.iloc[egitim_idx])
    test_gruplari = set(veri.hasta_kimligi.iloc[test_idx])
    
    # Bu doğrulama testlere konur; elle bir kez bakmak yetmez.
    assert not (egitim_gruplari & test_gruplari), "grup sızıntısı"

    Grup kimliği her zaman hazır gelmez. Metin kümelerinde aynı haberin farklı sitelerdeki sürümleri, görsel kümelerinde aynı sahnenin ardışık kareleri, destek kayıtlarında kopyalanmış şablon cevaplar farklı kimlik taşır ama aynı bilgiyi içerir. Bu durumda grup kimliği türetilir: yakın kopyalar kümelenir ve küme numarası grup olarak kullanılır.

  6. 06

    Dönüşümleri bölmeden sonra öğren

    Ölçekleme, eksik doldurma, kodlama ve özellik seçimi parametrelerini yalnızca eğitim bölmesinden öğrenin; doğrulama ve testte aynı parametreleri yeniden hesaplamadan uygulayın.

    Bu adımın kuralı tek cümlede özetlenir: bölmelerin dışında hiçbir istatistik hesaplanmaz. Kural basit ama ihlali kolay, çünkü keşif aşamasında tüm veri üzerinde hesaplanan bir ortalama, farkında olmadan modelleme koduna taşınıyor.

    • Ölçekleme: ortalama ve standart sapma yalnızca eğitim bölmesinden.
    • Eksik doldurma: medyan, mod veya tahmin modeli eğitim bölmesinden öğrenilir.
    • Kategori kodlama: hedefe dayalı kodlama sızıntının en sık kaynağıdır; bölme içi çapraz kodlama gerekir.
    • Özellik seçimi: tüm veride korelasyona bakıp sütun elemek de sızıntıdır.
    • Aykırı değer eşiği: yüzdelikler eğitim bölmesinden hesaplanır.
    • Örnekleme dengeleme: yalnızca eğitim bölmesine uygulanır, doğrulama ve test gerçek dağılımı korur.
    python
    from sklearn.compose import ColumnTransformer
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    
    hazirlik = ColumnTransformer([
        ("sayisal", Pipeline([
            ("doldur", SimpleImputer(strategy="median")),
            ("olcekle", StandardScaler()),
        ]), sayisal_sutunlar),
    ])
    
    hat = Pipeline([("hazirlik", hazirlik), ("model", model)])
    hat.fit(X_egitim, y_egitim)   # medyan ve ölçek yalnızca eğitimden öğrenilir
    skor = hat.score(X_dogrulama, y_dogrulama)
  7. 07

    Çapraz doğrulamayı aynı kurala uydur

    Çapraz doğrulama katlarını da grup ve zaman kuralına uydurun; rastgele k-kat, gruplu veride tek bölmedeki sızıntının aynısını k kez üretir.

    Çapraz doğrulama, tek bölmenin rastlantısını azaltmak için kullanılır; sızıntıyı azaltmaz. Bölme kuralı neyse katlama kuralı da odur. Bu nokta gözden kaçtığında ekip, tek bölmede fark edilebilecek bir sızıntıyı ortalamanın altında gizlemiş olur.

    Bölme kuralıKarşılığı olan çapraz doğrulamaDikkat
    Zaman temelliİleri doğru kayan pencereHer kat yalnızca kendinden önceki veriyle eğitilir
    Gruba göreGruplu k-katGrup, katlar arasında bölünmez
    KatmanlıKatmanlı k-katSınıf oranı her katta korunur
    Gruplu ve katmanlıKatmanlı gruplu k-katKatman yaklaşık korunur; grup bütünlüğü önceliklidir
    Kaynağa göreKaynak dışarıda bırakmaHer katta bir kurum veya bölge tamamen dışarıda kalır

    Katlar arasındaki skor dağılımı da bir bilgi taşır. Katlar arasında geniş bir yayılım, modelin kararsız olduğunu veya katların birbirinden yapısal olarak farklı olduğunu gösterir; ortalamayı tek başına raporlamak bu bilgiyi siler. Kat başına skorları ve hangi katın hangi dönemi ya da kaynağı kapsadığını birlikte yazın.

  8. 08

    Sızıntı izlerini denetle

    Beklenenden yüksek doğruluk, tek bir baskın özellik ve eğitim ile test farkının kapanması sızıntı işaretidir; her birini kaynağına kadar takip edin.

    Sızıntıyı kesin olarak gösteren tek bir test yok; birlikte görüldüğünde neredeyse hep sızıntıya çıkan belirtiler var. Ortak yanları şu: sonuç, alan uzmanının problemin zorluğu hakkındaki sezgisiyle çelişir. Bu yüzden ilk denetim aracı bir metrik değil, sonucun alan uzmanına gösterilmesidir.

    BelirtiMuhtemel kaynakBakılacak yer
    Doğruluk alan uzmanını şaşırtacak kadar yüksekHedeften türetilmiş alanÖzellik önem sıralamasının ilk üçü
    Tek özellik önemin neredeyse tamamını taşıyorHedefin vekili olan sütunO sütunun hangi sistemde ne zaman dolduğu
    Eğitim ve test skoru neredeyse eşitTest satırları eğitimde de varKayıt kimliği ve yakın kopya kontrolü
    Zaman temelli bölmede skor, rastgele bölmedekinden çok düşükRastgele bölmede sızıntı vardıPencere özelliklerinin kapanış anı
    Canlıda skor düşüyor, çevrimdışı yüksekTahmin anı yanlış varsayılmışÜretimde alanların dolma sırası
    Beş belirtinin beşi de modelde değil, hattın önceki adımlarında çözülür.

    Şüpheli bir alanı doğrulamanın en hızlı yolu onu çıkarıp modeli yeniden eğitmek. Skor sert biçimde düşüyorsa alan gerçekten taşıyıcıdır ve tahmin anında var olup olmadığı tek tek doğrulanmalıdır. İkinci yol hedefi karıştırmak: etiketler rastgele karıştırıldığında model hâlâ rastgeleden iyi sonuç veriyorsa, hat bir yerde etiket bilgisini girdiye taşıyor demektir.

  9. 09

    Bölmeyi dondur ve sürümle

    Kesim tarihi, grup listeleri ve tohum dâhil bölme sınırlarını kayıt altına alın; test bölmesini yalnızca sürüm kararında açın ve kaç kez açıldığını yazın.

    Bölme, veri kümesinin bir özelliği değil deneyin bir parçasıdır; yeniden üretilemiyorsa karşılaştırma da yapılamaz. İki modelin skorunu karşılaştırmanın ön koşulu ikisinin aynı bölmede ölçülmüş olmasıdır ve bu, tohumu koda gömmekle değil bölmeyi kaydetmekle sağlanır.

    1. 01Bölme stratejisini ve gerekçesini tek paragrafla yazın.
    2. 02Zaman temelli bölmede kesim tarihini ve bekleme aralığını kaydedin.
    3. 03Grup bölmesinde grup kimliği listelerini veya üretimi belirleyen tohumu saklayın.
    4. 04Bölme başına satır ve sınıf sayılarını kaydedin; sonraki koşularda karşılaştırma için.
    5. 05Test bölmesinin her açılışını tarih ve gerekçesiyle kaydedin.

SIK DÜŞÜLEN TUZAKLAR

  • Bölmeden önce ölçekleme yapmak

    Tüm veri üzerinde hesaplanan ortalama ve standart sapma, test satırlarının bilgisini eğitime taşır. Sonuç, üretimde tekrarlanmayan bir doğruluk artışıdır ve fark genellikle ancak canlıda görülür.

  • Yakın kopyaları tekilleştirmemek

    Aynı içerik iki bölmede birden bulunduğunda model test sırasında ezberlediği satırı görür. Metin ve görsel kümelerinde bu çoğunlukla tam kopya değil yakın kopya biçimindedir ve kayıt kimliği eşitliğiyle yakalanamaz.

  • Hedeften türetilmiş alanı özellik olarak bırakmak

    Hedefle birlikte doldurulan alanlar — kapanış nedeni, iptal tarihi, son durum kodu — neredeyse kusursuz bir model üretir. Bu alanlar tahmin anında henüz yoktur; model üretime çıktığında hepsi boş gelir.

  • Rastgele k-kat çapraz doğrulamayı varsayılan saymak

    Aynı hastanın, müşterinin veya cihazın satırları katlara dağıldığında her kat kendi sızıntısını üretir ve ortalama bunu gizler. Rastgele k-kat yalnızca satırlar gerçekten bağımsızsa doğrudur.

  • Test bölmesini defalarca açmak

    Her bakış, ekibin eşikleri ve özellik seçimini o bölmeye göre ayarlamasına yol açar. Test bölmesi bir süre sonra sessizce ikinci bir doğrulama bölmesine dönüşür ve koruma işlevini kaybeder.

KONTROL LİSTESİ

  • Tahmin anı ve o anda erişilebilir alanlar tek cümleyle yazılı
  • Her satırda kayıt kimliği var; tekrar eden varlıklar için grup kimliği tanımlı
  • Bölme stratejisi kullanım senaryosuna gerekçelendirilerek seçildi
  • Zaman temelli bölmede kesim tarihi ve bekleme aralığı belgelendi
  • Bölmeler arası grup kesişimi otomatik bir testle boş küme olarak doğrulanıyor
  • Tüm dönüşüm parametreleri yalnızca eğitim bölmesinden öğreniliyor
  • Çapraz doğrulama katları aynı grup ve zaman kuralına uyuyor
  • Test bölmesinin kaç kez ve hangi gerekçeyle açıldığı kayıtlı

Maddelerin tamamı işaretlenmeden kurulum üretime alınmamalı.

Sık sorulan sorular

Eğitim, doğrulama ve test oranı kaça bölünmeli?

Sabit bir oran yok; belirleyici olan test bölmesinin kararı taşıyıp taşımadığı. Oranı seçmeden önce şunu hesaplayın: seçtiğiniz oranla test bölmesinde en seyrek sınıftan kaç örnek kalıyor? O sayı, iki model arasındaki farkı görmenize yetmeyecek kadar küçükse oran yanlıştır. Küçük kümelerde tek bir doğrulama bölmesi ayırmak yerine çapraz doğrulama artı ayrı tutulmuş bir test bölmesi daha güvenilir sonuç verir.

Zaman serisinde rastgele bölme neden yanlış?

Rastgele bölme, geleceğe ait satırları eğitime karıştırır; model üretimde asla sahip olmayacağı bilgiyle öğrenir. Etkisi iki yönlü: aynı döneme ait komşu satırlar hem eğitimde hem testte bulunur ve modele o dönemin genel eğilimi doğrudan verilmiş olur. Doğrusu bir kesim tarihi seçmek, eğitimi kesimden önceye, testi kesimden sonraya almak ve ikisinin arasına etiketin olgunlaşma süresi kadar bir bekleme aralığı koymaktır.

Veri sızıntısı olduğunu nasıl anlarım?

Kesin bir test yok; üç işaret birlikte görüldüğünde neredeyse hep sızıntı vardır: sonuç alan uzmanının beklentisini aşar, özellik önemi tek bir sütunda toplanır ve eğitim ile test skoru arasındaki fark beklenmedik biçimde kapanır. Doğrulama yolu şüpheli sütunu çıkarıp yeniden eğitmek; skor sert düşüyorsa o sütunun tahmin anında dolu olup olmadığını yazan sisteme sorun.

Aynı kişiden birden çok kayıt varsa nasıl bölerim?

Gruba göre bölersiniz: o kişinin tüm satırları tek bir bölmede kalır. Kütüphanelerin gruplu bölme fonksiyonları bunu yapar, ama asıl iş grup kimliğini doğru tanımlamaktır — aynı kişi iki farklı müşteri numarasıyla kayıtlıysa grup kimliği kişiyi değil numarayı temsil eder ve sızıntı sürer. Bölme sonrası kesişim testini otomatik testlere ekleyin; elle yapılan tek seferlik kontrol yeni veri geldiğinde tekrarlanmaz.

Kaynaklar

  1. 01Makine öğrenmesi kütüphanelerinin bölme ve çapraz doğrulama dokümantasyonları — Açık kaynak kütüphane projeleri · Dokümantasyon
  2. 02Veri kümesi künyesi (datasheet) ve veri kartı uygulamaları — Araştırma topluluğu · Makale
  3. 03Sinaptik Research — veri hattı denetim notları — Sinaptik Lab · Teknik rapor

BUILD

Bu rehberi kurumunuzda uygulayalım mı?

Aynı mimariyi kendi verinizle kurmak için discovery oturumundan üretime kadar birlikte ilerliyoruz.