---
title: 'Veri Sızıntısı'
source: 'https://academia.sh/tr/kurslar/makine-ogrenmesine-giris/veri-sizintisi'
course: 'Makine Öğrenmesine Giriş'
language: tr
updated: '2026-08-17T18:10:12+00:00'
license: 'CC BY-SA 4.0'
---

# Veri Sızıntısı

Ayrılmış küme sayısını öğrenme dışındaki kaynakların şişirmesinin ölçülmesi: dürüst çizgi taban 0,7579 karşısında sınamada 0,7778 doğruluk verirken ayrımdan önce ölçekleme bu sayıyı 0,0119, geleceği gören öznitelik 0,0754, yinelenen kayıt 0,0542 ve hedeften türetilmiş öznitelik 0,1429 şişirir; dördünün de işareti aynı yöndedir. Öznitelikleri tümüyle rastgele altı sütunla değiştirilmiş bir model, yinelenen kayıt varken ayrılmış kümede 0,8757 doğruluk okuyup 0,7857'lik tabanı 9 puan geçer; ikizini görmediği satırlarda ise tabanın 9,2 puan altında kalır. Kurs kapanışında on bir dersin taban çizgisi, eğitim ve ayrılmış küme sayıları tek tabloda toplanır.

Önceki dersin kurulumunda sessizce doğru yapılmış bir karar vardı: sütunların ölçeği yalnız eğitim
kümesinden hesaplandı. Karar tersine çevrilebilir. Ölçek bütün kümeden hesaplandığında ayrılmış
kümenin satırları modelin göreceği sayıların üretilmesine katkıda bulunur ve ayrılmış küme, o katkı
kadar ayrılmamış olur.

Bu, **veri sızıntısının** en sessiz biçimidir. Sızıntı, tahmin anında elde olmayacak bir bilginin
eğitim ya da ölçüm yoluna karışmasıdır ve sonucu her zaman aynı yöndedir: ayrılmış küme sayısı
yükselir. Bu ders dört türü tek tek uygular, her birinin şişmesini kendi dürüst karşılığına göre
ölçer ve müfredatın ikinci iddiasını sayar — **fark her zaman öğrenmeden gelmez.**

- **GE31.** Küme, etiket, bölme, tohum ve ölçü kurs boyunca aynıdır. Ayrılmış küme sınama
  kümesidir: 252 satır. Dürüst çizgi birinci dersin modelidir: derinlik 6 karar ağacı, taban
  0,7579, eğitimde 0,8466, sınamada 0,7778.
- **GE32.** Birinci sızıntı bölgeye göre ölçeklemedir: bölge ortalaması ve saçılması dürüst biçimde
  yalnız eğitim kümesinden, sızıntılı biçimde bütün kümeden hesaplanır.
- **GE33.** İkinci sızıntı dördüncü dönem okumasıdır ve **kurgudur**: etiket yazıldıktan sonra
  oluşur, şüphelilerde 0,55 olasılıkla sıfır çıkar, çıkmazsa değeri 1,45 katıdır.
- **GE34.** Üçüncü sızıntı bir birleştirme hatasıdır: her abone kaydı üç kez üretilir, 1.260 abone
  3.780 satıra çıkar ve bölme **satır** düzeyinde yapılır.
- **GE35.** Dördüncü sızıntı denetim ekibi atamasıdır ve **kurgudur**: şüphelilerde 0,88,
  ötekilerde 0,06 olasılıkla birdir ve etiketten sonra kaydedilir.
- **GE36.** Şişme her zaman **kendi dürüst karşılığına** göre ölçülür; birinci sızıntının karşılığı
  aynı özniteliğin dürüst hesaplanmış hâlidir.
- **GE37.** Son bölümde öznitelikler tümüyle rastgele altı sütunla değiştirilir. Bu sütunların
  etiketle hiçbir ilişkisi yoktur ve bir abonenin üç kopyasında aynıdır.

## Dört Sızıntı, Dört Şişme

Kurulum kursun ilk dersindekiyle aynıdır ve aynı tohumla aynı kümeyi üretir.

```python
# genelleme.py — MODELDIR. M26'nin kurgu olcum agi ayni tohumla uretilir; okumalar
# abone duzeyinde ozetlenir ve uzerine KURGU bir kacak/ariza suphesi etiketi eklenir.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


ABONE = []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() >= 0.046:
        ABONE.append({"no": 10001 + i, "bolge": b, "hane": hane, "memnuniyet": memnun})
VERI = []
for k in ABONE:
    r, v = uretec(TOHUM + 7000 + k["no"]), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            k["bolge"][2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + k["no"])
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn
         + 0.24 * (k["hane"] >= 5) - 0.20 * (k["memnuniyet"] >= 4) + k["bolge"][3]
         + 0.9 * (k["no"] - 10001) / 1399 + (r() + r() + r() - 1.5) * 1.30)
    x = {"no": k["no"], "hane": k["hane"], "memnuniyet": k["memnuniyet"],
         "donem": len(v), "ort_tuketim": round(ort, 2), "oynaklik": round(oyn, 2),
         "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35)}
    for b in BOLGE:
        x["b_" + b[0]] = int(k["bolge"][0] == b[0])
    VERI.append(x)

ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]


def karistir(veri, tohum):
    r, s = uretec(tohum), list(range(len(veri)))
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return [veri[i] for i in s]


K = karistir(VERI, TOHUM + 90000)
EGT, SIN = K[:756], K[1008:]


def gini(s):
    p = sum(x["supheli"] for x in s) / len(s) if s else 0.0
    return 2 * p * (1 - p)


def agac(s, derinlik, enaz=2):
    p = sum(x["supheli"] for x in s) / len(s)
    en = None
    if derinlik and len(s) >= 2 * enaz and 0.0 < p < 1.0:
        for a in ALAN:
            d = sorted({x[a] for x in s})
            for v in (d[1:] if len(d) < 10 else
                      [d[int(i * len(d) / 10)] for i in range(1, 10)]):
                sol = [x for x in s if x[a] < v]
                sag = [x for x in s if x[a] >= v]
                if min(len(sol), len(sag)) < enaz:
                    continue
                k = gini(s) - (len(sol) * gini(sol) + len(sag) * gini(sag)) / len(s)
                if en is None or k > en[0]:
                    en = (k, a, v, sol, sag)
    if en is None or en[0] <= 1e-9:
        return {"tahmin": int(p > 0.5)}
    return {"alan": en[1], "esik": en[2], "sol": agac(en[3], derinlik - 1, enaz),
            "sag": agac(en[4], derinlik - 1, enaz)}


def tahmin(d, x):
    while "tahmin" not in d:
        d = d["sol"] if x[d["alan"]] < d["esik"] else d["sag"]
    return d["tahmin"]


def dogruluk(d, s):
    return sum(tahmin(d, x) == x["supheli"] for x in s) / len(s)


def taban(egt, s):
    c = int(sum(x["supheli"] for x in egt) * 2 > len(egt))
    return sum(x["supheli"] == c for x in s) / len(s)
```

Dört sızıntı sırayla kurulur ve her biri kendi dürüst karşılığıyla ölçülür.

```python
TEMEL, SONUC = list(ALAN), []
for x in VERI:
    x["bolge_ad"] = [b[0] for b in BOLGE if x["b_" + b[0]]][0]


def olc(alanlar, egt, ayr, derinlik=6):
    global ALAN
    ALAN = alanlar
    m = agac(egt, derinlik)
    ALAN = TEMEL
    return taban(egt, ayr), dogruluk(m, egt), dogruluk(m, ayr)


def bolge_z(kaynak):
    for b in {x["bolge_ad"] for x in VERI}:
        v = [x["ort_tuketim"] for x in kaynak if x["bolge_ad"] == b]
        o = sum(v) / len(v)
        s = max(1e-6, (sum((q - o) ** 2 for q in v) / len(v)) ** 0.5)
        for x in VERI:
            if x["bolge_ad"] == b:
                x["bolge_z"] = round((x["ort_tuketim"] - o) / s, 3)


DURUST = olc(TEMEL, EGT, SIN)
bolge_z(EGT)
S1D = olc(TEMEL + ["bolge_z"], EGT, SIN)
bolge_z(VERI)
SONUC.append(("1 ayrimdan once olcekleme", S1D, olc(TEMEL + ["bolge_z"], EGT, SIN)))

for x in VERI:
    r, t = uretec(TOHUM + 71000 + x["no"]), 0
    for b in BOLGE:
        t = b[2] if x["bolge_ad"] == b[0] else t
    x["dorduncu"] = 0.0 if (x["supheli"] and r() < 0.55) else round(
        t * math.exp((r() + r() + r() - 1.5) * 0.62) * (1 + 0.45 * x["supheli"]), 2)
SONUC.append(("2 gelecegi goren oznitelik", DURUST, olc(TEMEL + ["dorduncu"], EGT, SIN)))

IKIZ = []
for x in VERI:
    for c in range(3):
        y = dict(x)
        y["kimlik"], y["no"] = x["no"], x["no"] + 50000 * c
        IKIZ.append(y)
D = karistir(IKIZ, TOHUM + 93000)
DE, DS = D[:int(len(D) * 0.6)], D[int(len(D) * 0.8):]
EK = {x["kimlik"] for x in DE}
VAR = [x for x in DS if x["kimlik"] in EK]
YOK = [x for x in DS if x["kimlik"] not in EK]
SONUC.append(("3 yinelenen kayit", DURUST, olc(TEMEL, DE, DS)))

for x in VERI:
    r = uretec(TOHUM + 81000 + x["no"])
    x["denetim"] = int(r() < (0.88 if x["supheli"] else 0.06))
SONUC.append(("4 hedeften turetilmis oznitelik", DURUST,
              olc(TEMEL + ["denetim"], EGT, SIN)))

print(f"{'':<32} {'taban':>7} {'egitimde':>9} {'durust':>8} {'sizintili':>10} {'sisme':>8}")
print(f"{'durust cizgi':<32} {DURUST[0]:>7.4f} {DURUST[1]:>9.4f} {DURUST[2]:>8.4f}")
for ad, d, s in SONUC:
    print(f"{ad:<32} {s[0]:>7.4f} {s[1]:>9.4f} {d[2]:>8.4f} {s[2]:>10.4f} "
          f"{s[2] - d[2]:>+8.4f}")
print(f"\nyinelenmis kume {len(D)} satir; ayrilmis {len(DS)}, ikizi egitimde olan "
      f"{len(VAR)}, olmayan {len(YOK)}")
print(f"3. sizintinin ici: ikizli satirlarda {olc(TEMEL, DE, VAR)[2]:.4f}, "
      f"ikizsizlerde {olc(TEMEL, DE, YOK)[2]:.4f}")
```

```
                                   taban  egitimde   durust  sizintili    sisme
durust cizgi                      0.7579    0.8466   0.7778
1 ayrimdan once olcekleme         0.7579    0.8492   0.7659     0.7778  +0.0119
2 gelecegi goren oznitelik        0.7579    0.9312   0.7778     0.8532  +0.0754
3 yinelenen kayit                 0.7857    0.8646   0.7778     0.8320  +0.0542
4 hedeften turetilmis oznitelik   0.7579    0.9590   0.7778     0.9206  +0.1429

yinelenmis kume 3780 satir; ayrilmis 756, ikizi egitimde olan 626, olmayan 130
3. sizintinin ici: ikizli satirlarda 0.8514, ikizsizlerde 0.7385
```

Şişme sütununun dört değeri de **aynı işaretlidir**: +0,0119, +0,0754, +0,0542, +0,1429. Bu bir
rastlantı değil, sızıntının tanımıdır: ayrılmış kümeye karışan bilgi her zaman modelin işine yarar.
İşaretin sabitliği sızıntıyı gürültüden ayıran ilk işarettir.

İkinci sütun bir tuzağa dikkat çekiyor. Eğitim sayısı da 0,8466'dan 0,9590'a yükseliyor, ama bu
tek başına hiçbir şey söylemez — ikinci ders kapasiteyi artırmanın da aynı sütunu yükselttiğini
gösterdi. Sızıntının imzası **ayrılmış küme sayısının** yükselmesidir.

Sıralama, tehlike sıralamasının tersidir. En büyük şişmeyi hedeften türetilmiş öznitelik üretiyor:
0,1429 ile modeli 0,9206'ya taşıyor. Ama o sütunun adı `denetim` ve birinin "bu sütun ne zaman
yazılıyor" diye sorması olasıdır. En küçük şişme ayrımdan önce ölçeklemeden geliyor: 0,0119, yani
3 abone. Hiçbir sütun eklenmemiştir, kod doğru görünür ve 1,2 puanlık bir fark hiçbir raporda
sorgulanmaz. Sızıntının tehlikesi büyüklüğüyle değil **görünürlüğüyle** ters orantılıdır.

Üçüncü sızıntı kendi içinde okunuyor. Yinelenmiş kümede ayrılmış kümenin 756 satırının 626'sının
ikizi eğitim kümesindedir; model bu satırlarda 0,8514, ikizi olmayan 130 satırda 0,7385 veriyor.
Bölme satırları ayırdı ama **aboneyi** ayırmadı, ve bunu bölme oranına bakarak görmek olanaksızdır.

İkinci sızıntıda dördüncü dönem okuması gerçek bir ölçümdür; sorun ölçümün yanlışlığı değil
**zamanıdır**. Kümedeki her sütun için tek bir soru yeter: bu değer, tahminin verileceği anda elde
midir.

## Hiçbir Şey Öğrenmemiş Bir Model

Dört sızıntı da gerçek bir modeli şişirdi. Sıradaki soru daha serttir: sızıntı, **hiçbir şey
öğrenmemiş** bir modeli taban çizgisinin üstüne taşıyabilir mi. Aşağıdaki kod yinelenmiş kümenin
bütün özniteliklerini atıp yerine tümüyle rastgele altı sütun koyuyor; öğrenilecek hiçbir şey
kalmıyor.

```python
for x in IKIZ:
    r = uretec(TOHUM + 31000 + x["kimlik"])
    for j in range(6):
        x["g" + str(j)] = round(r(), 4)
ALAN = ["g" + str(j) for j in range(6)]
print(f"{'kapasite':>11} {'egitimde':>9} {'ayrilmis':>9} {'ikizli':>8} {'ikizsiz':>8}")
print(f"{'taban':>11} {taban(DE, DE):>9.4f} {taban(DE, DS):>9.4f} "
      f"{taban(DE, VAR):>8.4f} {taban(DE, YOK):>8.4f}")
for dr in (8, 12, 16):
    m = agac(DE, dr)
    print(f"{'derinlik ' + str(dr):>11} {dogruluk(m, DE):>9.4f} {dogruluk(m, DS):>9.4f} "
          f"{dogruluk(m, VAR):>8.4f} {dogruluk(m, YOK):>8.4f}")
ALAN = TEMEL
```

```
   kapasite  egitimde  ayrilmis   ikizli  ikizsiz
      taban    0.7787    0.7857   0.7796   0.8154
 derinlik 8    0.8589    0.8228   0.8419   0.7308
derinlik 12    0.9528    0.8757   0.9073   0.7231
derinlik 16    0.9832    0.9061   0.9377   0.7538
```

Derinlik 12 satırı müfredatın ikinci iddiasının ölçülmüş hâlidir. Model ayrılmış kümede 0,8757
okuyor ve 0,7857'lik tabanı **9,0 puan** geçiyor. Bu sayı bir raporda tek başına durursa
savunulabilir görünür: tabanı geçmiştir, ayrılmış kümede ölçülmüştür, kursun istediği iki koşul da
sağlanmıştır. Oysa modelin baktığı altı sütun rastgele sayılardır.

Fark son iki sütunda görünüyor. İkizi eğitimde olan 626 satırda model 0,9073, ikizi olmayan 130
satırda 0,7231 veriyor ve o 130 satırın kendi tabanı 0,8154'tür. Model ikizini gördüğü satırlarda
ezberini geri çağırıyor, görmediklerinde tabanın 9,2 puan altında kalıyor. Öğrendiği tek şey,
rastgele altı sayının belirli birleşimlerine hangi etiketin yapıştığıdır.

Kapasite sütunu bunu doğruluyor: ayrılmış küme sayısı derinlik 8'de 0,8228, 12'de 0,8757, 16'da
0,9061. İkinci dersin eğrisi burada **ters işaretle** çalışıyor. Kursun verebileceği en kullanışlı
denetim kuralı budur — aşırı uyumun ayrılmış kümede ceza yememesi, o kümenin ayrılmamış olduğunun
en güvenilir işaretidir.

Kursun kuralı burada tamamlanıyor: ayrılmış sanılan bir kümede ölçülen başarım da ezber olabilir.
Ayrımın kendisi denetlenecek bir karardır ve denetimi bölme oranına değil, bölme **birimine** ve
her sütunun **zamanına** bakarak yapılır.

## Özet

- Dört sızıntı türünün de şişmesi aynı işaretlidir: ayrımdan önce ölçekleme +0,0119, geleceği gören
  öznitelik +0,0754, yinelenen kayıt +0,0542, hedeften türetilmiş öznitelik +0,1429.
- Sızıntının imzası eğitim sayısının değil, ayrılmış küme sayısının yükselmesidir; eğitim sayısını
  kapasite de yükseltir.
- Şişmenin büyüklüğü ile görünürlüğü ters orantılıdır; ve yinelenen kayıtta bölme satırları ayırıp
  aboneyi ayırmadığı için ikizi eğitimde olan 626 satırda doğruluk 0,8514, olmayan 130 satırda
  0,7385'tir.
- Öznitelikleri tümüyle rastgele altı sütunla değiştirilmiş bir model ayrılmış kümede 0,8757 okuyup
  0,7857'lik tabanı 9,0 puan geçiyor, ikizini görmediği satırlarda tabanının 9,2 puan altında kalıyor.
- Kapasite arttıkça sızıntılı ölçüm iyileşiyor (0,8228, 0,8757, 0,9061); aşırı uyumun ayrılmış
  kümede ceza yememesi, o kümenin ayrılmamış olduğunun en güvenilir işaretidir.

## Kurs Kapanışı

On bir dersin hesabı tek tabloda duruyor ve her sayı kendi dersinden okundu. İlk altı ders 883/377,
son beş ders 756/252/252 bölmesini kullanır; taban çizgisi bu yüzden satırdan satıra değişir.

| Ders | Taban çizgisi | Eğitimde | Ayrılmış kümede |
|---|---|---|---|
| Kavram 01 makine öğrenmesi nedir | en sık sınıf 0,7533 | ağaç 0,8709 | ağaç 0,8594 |
| Kavram 02 öğrenme türleri | en sık sınıf 0,7533 | denetimli 0,8709 | denetimli 0,8594 |
| Kavram 03 kendi kendine denetimli | en sık sınıf 0,7533 | gösterimle 0,8313 | gösterimle 0,8037 |
| Kavram 04 uygulama alanları | en sık sınıf 0,7533 | ağaç 0,8709 | ağaç 0,8594 |
| Kavram 05 makine öğrenmesi iş akışı | rastgele sıra 14 kaçak | sıralama 30 kaçak | sıralama 30 kaçak |
| Kavram 06 roller | saha yordamı 13 kaçak | — | model sırası 30 kaçak |
| Genelleme 01 üç küme | en sık sınıf 0,7579 | derinlik 6 0,8466 | derinlik 6 0,7778 |
| Genelleme 02 aşırı ve eksik uyum | en sık sınıf 0,8135 | derinlik 14 0,9352 | derinlik 14 0,7302 |
| Genelleme 03 yanlılık–değişkenlik | ortalama 6,419 m³ | derinlik 3 5,105 m³ | derinlik 3 5,380 m³ |
| Genelleme 04 düzenlileştirme | ortalama 6,556 m³ | ceza 100 4,920 m³ | ceza 100 5,559 m³ |
| Genelleme 05 veri sızıntısı | en sık sınıf 0,7579 | sızıntılı 0,9590 | sızıntılı 0,9206 |

Kavram 04'ün satırı o dersteki dört sorunun yalnız sınıflandırma olanıdır. Kavram 06'nın satırında
eğitim sütunu boştur: o ders eğitim ile ayrılmış küme ayrımını değil, aynı ayrılmış küme ölçüsünün
üç iş tanımında üç ayrı tabana okunmasını sayar — 13, 23 ve 21 kaçak, kazanç 17, 7 ve 9. Genelleme
05'in satırı bilerek sızıntılıdır.

Üçüncü ile dördüncü sütun arasındaki fark **kursun kuralıdır**: ayrılmış bir kümede ölçülmemiş
başarım, başarım değil ezberdir. Tablodaki hiçbir satırda eğitimde ölçülen sayı ayrılmış kümede
ölçülenden kötü değildir.

İkinci sütun **müfredatın kuralıdır**: bir model, kendisinden daha aptal bir yordamı ne kadar
geçtiği kadar iyidir, ve taban çizgisi yazılmayan başarım ölçülmemiş sayılır. Tablonun en yüksek
doğruluğu 0,9206'dır ve hiçbir şey söylemez; en düşüğü 0,7302'dir ve tabanının 8,3 puan altında
kaldığı için bir şey söyler.

On bir derste ayrım kuruldu ve her sayının yanına tabanı yazıldı. Ama modele verilen
**öznitelikler** hep hazır kabul edildi: bölge bir gösterge sütununa, üç okuma bir ortalamaya
baştan çevrilmişti. Hangi sütunun nasıl bir sayıya çevrileceği, o çevirinin tabanla arasındaki
farkı ne kadar oynattığı ve hangi çevirinin bu dersteki gibi sessiz bir sızıntı taşıdığı hiç
sorulmadı. Sonraki kurs, Veri Hazırlama ve Öznitelik Mühendisliği, bu soruları ele alır.
