---
title: 'Dağılım Kayması'
source: 'https://academia.sh/tr/kurslar/model-etik-ve-yorum/dagilim-kaymasi'
course: 'Model Değerlendirme, Yorumlanabilirlik ve Etik'
language: tr
updated: '2026-08-17T18:10:13+00:00'
license: 'CC BY-SA 4.0'
---

# Dağılım Kayması

Eğitim ile üretim verisi arasındaki farkın tek bir sayıya indirilmesi ve bu sayının başarım düşüşüyle yan yana konması: ayırt edici bir model girdi kaymasında 0,1172'lik pay veriyor ve modelin tabanın üstündeki farkı 0,0198'den 0,0066'ya iniyor, ama etiket kaymasında aynı gösterge 0,0063'te kalırken şüpheli oranı 0,2421'den 0,4865'e çıkıyor. İki kayma iki ayrı çözüm istiyor: önsel düzeltmesi etiket kaymasında doğruluğu 0,6306'dan 0,6622'ye çıkarırken girdi kaymasında hiçbir kararı değiştirmiyor, girdi dağılımına göre yeniden eğitim ise girdi kaymasında 0,7318'i 0,7384'e çıkarıp etiket kaymasında 0,6261'e düşürüyor. Zaman sıralı üretim kümesinde alt grup açıklığı 0,3576'dan 0,2573'e iniyor ve on iki alt grubun hiçbirinde model tabanın altında kalmıyor.

Dört derste ölçünün kendisi tasarlandı: küme kime göre ayrıldı, eşik hangi bedelden okundu, taban
nasıl seçildi, fark hangi payla söylendi. Dördünün ortak varsayımı, sınama kümesinin modelin
karşılaşacağı veriyle **aynı dağılımdan** geldiğidir. Bir ölçüm ağı zamanla değişir: yeni bölgeler
katılır, tarife basamakları kayar, sayaç değişimiyle sıfır okuma oranı düşer.

Bu ders o varsayımı ölçer. **Dağılım kayması** iki ayrı şekilde gelir ve ikisi aynı ad altında
toplandığında yanlış çözüm seçilir. **Girdi kaymasında** özniteliklerin dağılımı değişir ama bir
abonenin öznitelikleri verildiğinde şüpheli olma olasılığı aynı kalır. **Etiket kaymasında**
şüphelilik oranı değişir. Veri kayması M27/K01'de anıldı ve zaman sıralı bölme orada ölçüldü;
burada eklenen şey kaymanın **tek bir sayıya indirilmesi** ve iki türün ayrılmasıdır.

- **DT31.** Kurgu, bölme (**756/252/252**), tohum, ölçüt (**doğruluk**), model (**derinlik 6 karar
  ağacı**, yaprakta şüpheli oranı) ve alt grup tanımları önceki derslerden aynen sürer: dört eksen,
  **13 alt grup**. Eğitim kümesinin şüpheli oranı **0,2222**'dir.
- **DT32.** **Kayma payı** bir **ayırt edici modelle** ölçülür: satırın eğitim kümesinden mi üretim
  kümesinden mi geldiğini kestiren derinlik 4 bir ağaç, iki kümeden eşit sayıda satırla eğitilir ve
  ayrılmış yarıda ölçülür. Sayı **doğruluk eksi 0,5**'tir; sıfıra yakın değer "ayırt edilemiyor"
  demektir. Beş koşumun ortalaması alınır ve etiket sütunu ayırt ediciye **verilmez**.
- **DT33.** Kayma payı yalnız **girdi** dağılımını görür. Etiket dağılımının kaymasını göremez ve
  bu dersin ölçtüğü şeylerden biri budur.
- **DT34.** Üç kurgu üretim kümesi doğrulama ve sınama kümelerinin birleşiminden (504 abone)
  türetilir. **Girdi kayması**: yüksek ortalama tüketimli abonelerin seçilme olasılığı yükseltilir,
  etiket kuralına dokunulmaz. **Etiket kayması**: şüpheli aboneler korunur, şüphesizlerin yalnız
  yüzde 30'u tutulur. **Zaman sıralı üretim**: abone numarasına göre sıralanmış kümenin son yüzde
  20'si; abone numarası ağa katılma sırasıdır.
- **DT35.** **Önsel düzeltmesi** modelin yaprak oranını, üretim ve eğitim şüphelilik oranlarının
  oran oranıyla çarpar; üretimde etiket bilmeyi gerektirir ve bu bir maliyettir. **Yeniden eğitim**
  aynı ağacı, girdi kayması kuralıyla örneklenmiş **439** satırlık bir eğitim kümesinde kurar;
  756 satırın 317'si düşer ve kayıp veri bir bedeldir.
- **DT36.** Model bir kez eğitilir ve dört kümede aynı model ölçülür; fark modelden değil veriden
  gelir. Üretim kümelerinin boyları eşit değildir (302, 222, 252) ve pay hesapları önceki derste
  ölçüldü, burada tekrarlanmaz.

## Kaymanın Büyüklüğü Bir Sayıdır

İlk blok kurguyu kurar, üç üretim kümesini üretir, her biri için kayma payını ölçer ve aynı satırda
tabanı, modelin sayısını ve iki düzeltmenin sonucunu basar.

```python
# 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, OKUMA, VERI = [], {}, []
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})
for k in ABONE:
    r = uretec(TOHUM + 7000 + k["no"])
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        OKUMA.setdefault(k["no"], []).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()
    v = OKUMA.get(k["no"])
    if v is None:
        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),
         "bolge": k["bolge"][0]}
    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]


def uce_bol(K):
    a, b = int(len(K) * 0.6), int(len(K) * 0.8)
    return K[:a], K[a:b], K[b:]


def safsizlik(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, alanlar, enaz=2):
    p, en = sum(x["supheli"] for x in s) / len(s), None
    if derinlik and len(s) >= 2 * enaz and 0.0 < p < 1.0:
        for a in alanlar:
            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 = safsizlik(s) - (len(sol) * safsizlik(sol) + len(sag) * safsizlik(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 {"p": p}
    return {"alan": en[1], "esik": en[2], "sol": agac(en[3], derinlik - 1, alanlar),
            "sag": agac(en[4], derinlik - 1, alanlar)}


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


def gruplar(x):                    # dort eksen, on uc alt grup; 01'den aynen surer
    return [("bolge", x["bolge"]),
            ("tarife", "10" if x["ort_tuketim"] <= 10 else
             ("25" if x["ort_tuketim"] <= 25 else "40")),
            ("hane", "1-2" if x["hane"] <= 2 else ("3-4" if x["hane"] <= 4 else "5+")),
            ("okuma", "az" if x["donem"] <= 2 else "tam")]


ADLAR = sorted({g for x in VERI for g in gruplar(x)})
EGT, DOG, SIN = uce_bol(karistir(VERI, TOHUM + 90000))
M = agac(EGT, 6, ALAN)
P0 = sum(x["supheli"] for x in EGT) / len(EGT)
CS = int(P0 > 0.5)


def dog(f, s):
    return sum(f(x) == x["supheli"] for x in s) / len(s)


def kayma(a, b, tohum, tekrar=5):
    # AYIRT EDICI MODEL: satirin hangi kumeden geldigini kestiren derinlik 4 agac
    t = 0.0
    for j in range(tekrar):
        n = min(len(a), len(b))
        ka = [dict(x, supheli=0) for x in karistir(a, tohum + j)[:n]]
        kb = [dict(x, supheli=1) for x in karistir(b, tohum + 500 + j)[:n]]
        d = agac(karistir(ka[:n // 2] + kb[:n // 2], tohum + 900 + j), 4, ALAN)
        s = ka[n // 2:] + kb[n // 2:]
        t += sum((puan(d, x) > 0.5) == x["supheli"] for x in s) / len(s)
    return t / tekrar - 0.5


def girdi_kay(s, tohum, guc=0.12):      # yuksek tuketim agir basar; etiket kurali AYNI
    r = uretec(tohum)
    return [x for x in s if r() < min(0.98, 0.03 + guc * max(0.0, x["ort_tuketim"] - 14))]


def etiket_kay(s, tohum, tut=0.30):     # supheliler korunur, supheslerin %30'u kalir
    r = uretec(tohum)
    return [x for x in s if x["supheli"] or r() < tut]


HAVUZ = DOG + SIN
ZU = uce_bol(sorted(VERI, key=lambda x: x["no"]))[2]
GK, EK = girdi_kay(HAVUZ, 83000), etiket_kay(HAVUZ, 84000)
MG = agac(girdi_kay(EGT, 86000), 6, ALAN)


def onsel(s):                           # onsel duzeltmesi: oranlarin orani ile
    p1 = sum(x["supheli"] for x in s) / len(s)
    o = (p1 / (1 - p1)) / (P0 / (1 - P0))
    return lambda x: int(puan(M, x) * o / (puan(M, x) * o + 1 - puan(M, x)) >= 0.5)


print(f"{'kume':<16} {'n':>4} {'supheli':>8} {'kayma':>8} {'taban':>7} {'model':>7} "
      f"{'fark':>8} {'onsel':>7} {'yenidn':>7}")
for ad, s in (("ayni dagilim", SIN), ("girdi kaymasi", GK), ("etiket kaymasi", EK),
              ("zaman sirali", ZU)):
    tb = dog(lambda x: CS, s)
    print(f"{ad:<16} {len(s):>4} {sum(x['supheli'] for x in s)/len(s):>8.4f} "
          f"{kayma(EGT, s, 85000):>+8.4f} {tb:>7.4f} "
          f"{dog(lambda x: int(puan(M, x) > 0.5), s):>7.4f} "
          f"{dog(lambda x: int(puan(M, x) > 0.5), s)-tb:>+8.4f} "
          f"{dog(onsel(s), s):>7.4f} {dog(lambda x: int(puan(MG, x) > 0.5), s):>7.4f}")
```

```
kume                n  supheli    kayma   taban   model     fark   onsel  yenidn
ayni dagilim      252   0.2421  -0.0127  0.7579  0.7778  +0.0198  0.7817  0.7698
girdi kaymasi     302   0.2748  +0.1172  0.7252  0.7318  +0.0066  0.7318  0.7384
etiket kaymasi    222   0.4865  +0.0063  0.5135  0.6306  +0.1171  0.6622  0.6261
zaman sirali      252   0.3532  -0.0056  0.6468  0.7500  +0.1032  0.7579  0.7381
```

Birinci satır ölçüyü doğruluyor. Eğitim ve sınama kümeleri aynı bölmeden geldiği için ayırt edici
model onları ayıramıyor ve kayma payı **−0,0127**; eksi işaret bir yön değil, sıfırdan ayırt
edilemeyen bir sayının koşum gürültüsüdür.

İkinci satırda kayma payı **+0,1172**: ayırt edici model bir satırın hangi kümeden geldiğini
rastgele tahminden 11,7 puan iyi kestiriyor, yani öznitelik düzeyinde gerçek bir fark var. Başarım
tarafında karşılığı şudur: model 0,7778'den 0,7318'e iniyor ve tabanın üstündeki farkı **0,0198'den
0,0066'ya** düşüyor. Kaymanın büyüklüğü ile katkının erimesi aynı satırda okunuyor.

Üçüncü ve dördüncü satırlar dersin ayrımını veriyor. Etiket kaymasında şüpheli oranı 0,2421'den
**0,4865**'e, zaman sıralı üretimde **0,3532**'ye çıkıyor — kümeler tanınmayacak kadar başka. Ama
kayma payı **+0,0063** ve **−0,0056**, yani sıfır. Girdi kaymasını ölçen gösterge, veri kümesinin
yarısının etiketi değişmiş olsa bile hiçbir şey görmüyor, çünkü baktığı tek şey özniteliklerin
dağılımıdır. **Kayma göstergesinin sessizliği, kayma olmadığı anlamına gelmez.**

## İki Kayma İki Ayrı Çözüm İstiyor

Son iki sütun aynı tabloda iki düzeltmeyi taşıyor ve ikisi de yalnız kendi kaymasında çalışıyor.

Önsel düzeltmesi modelin yaprak oranını yeni şüphelilik oranına göre yeniden ölçekler. Etiket
kaymasında doğruluğu **0,6306'dan 0,6622'ye**, zaman sıralı üretimde **0,7500'den 0,7579'a**
çıkarıyor. Girdi kaymasında sayıyı hiç oynatmıyor: 0,7318 ve 0,7318. Sebep aritmetiktir — orada
şüpheli oranı yalnız 0,2748'e gitmiş, oranların oranı bire yakın ve hiçbir kararın işareti
dönmüyor. Bedeli de var: üretimdeki şüphelilik oranını bilmek orada etiket toplamayı gerektirir.

Yeniden eğitim ters yönde çalışıyor. Girdi kayması kuralıyla örneklenmiş 439 satırlık bir eğitim
kümesinde kurulan ağaç, girdi kaymasında **0,7318'den 0,7384'e** çıkıyor; öbür üç kümede sayıyı
**düşürüyor** (0,7698, **0,6261**, 0,7381). Eğitim kümesinin üçte biri atıldığı için model daha az
veriden öğreniyor ve bu kayıp yalnız hedeflenen kaymada telafi ediliyor.

Kural şudur: kaymanın **türü belirlenmeden** seçilen düzeltme zarar verir. Girdi kayması için
etiket toplamak, etiket kayması için veri atmak — ikisi de bu tabloda sayıyı aşağı çekiyor.

## Alt Gruplarda Kayma Eşit Değil

Zaman sıralı üretim kümesi dördü içinde en gerçekçi olanıdır: ağ büyüdükçe sonradan katılan
aboneler kümeye giriyor. İkinci blok o kümede alt grupların payını ve şüphelilik oranını eğitim
kümesindekilerle karşılaştırır.

```python
print(f"{'alt grup':<14} | {'egitim pay':>10} {'uretim pay':>10} | {'egitim sup':>10} "
      f"{'uretim sup':>10} | {'n':>4} {'taban':>7} {'model':>7} {'fark':>8}")
ol, fr = [], []
for g in ADLAR:
    e = [x for x in EGT if g in gruplar(x)]
    u = [x for x in ZU if g in gruplar(x)]
    tb, md = dog(lambda x: CS, u), dog(lambda x: int(puan(M, x) > 0.5), u)
    if len(u) >= 25:
        ol.append(md)
        fr.append(md - tb)
    print(f"{' '.join(g):<14} | {len(e)/len(EGT):>10.4f} {len(u)/len(ZU):>10.4f} | "
          f"{sum(x['supheli'] for x in e)/len(e):>10.4f} "
          f"{sum(x['supheli'] for x in u)/len(u):>10.4f} | {len(u):>4} {tb:>7.4f} "
          f"{md:>7.4f} {md-tb:>+8.4f}{'  n<25' if len(u) < 25 else ''}")
print(f"\nuretim kumesinde aciklik ({len(ol)} alt grup): en iyi {max(ol):.4f}, en kotu "
      f"{min(ol):.4f}, aciklik {max(ol)-min(ol):.4f}; tabanin altinda "
      f"{sum(1 for v in fr if v < 0)}/{len(fr)}")
```

```
alt grup       | egitim pay uretim pay | egitim sup uretim sup |    n   taban   model     fark
bolge bati     |     0.1667     0.1429 |     0.0714     0.1389 |   36  0.8611  0.8889  +0.0278
bolge dogu     |     0.1799     0.1548 |     0.4706     0.6667 |   39  0.3333  0.7692  +0.4359
bolge guney    |     0.1865     0.2183 |     0.1064     0.2727 |   55  0.7273  0.8000  +0.0727
bolge kuzey    |     0.2897     0.2937 |     0.1963     0.2973 |   74  0.7027  0.7027  +0.0000
bolge merkez   |     0.1772     0.1905 |     0.2761     0.4375 |   48  0.5625  0.6458  +0.0833
hane 1-2       |     0.3148     0.3135 |     0.2227     0.4177 |   79  0.5823  0.6962  +0.1139
hane 3-4       |     0.5265     0.5476 |     0.2060     0.3188 |  138  0.6812  0.7754  +0.0942
hane 5+        |     0.1587     0.1389 |     0.2750     0.3429 |   35  0.6571  0.7714  +0.1143
okuma az       |     0.3373     0.3294 |     0.1725     0.2892 |   83  0.7108  0.7831  +0.0723
okuma tam      |     0.6627     0.6706 |     0.2475     0.3846 |  169  0.6154  0.7337  +0.1183
tarife 10      |     0.0384     0.0476 |     0.2069     0.4167 |   12  0.5833  0.6667  +0.0833  n<25
tarife 25      |     0.7804     0.7262 |     0.1712     0.2732 |  183  0.7268  0.7923  +0.0656
tarife 40      |     0.1812     0.2262 |     0.4453     0.5965 |   57  0.4035  0.6316  +0.2281

uretim kumesinde aciklik (12 alt grup): en iyi 0.8889, en kotu 0.6316, aciklik 0.2573; tabanin altinda 0/12
```

İlk iki sütun neredeyse durağan: en büyük değişim tarife 25 basamağında 0,7804'ten 0,7262'ye. Alt
grupların bileşimi değişmemiş, yani girdi kayması bu kümede küçüktür ve kayma payının −0,0056'sı
onunla uyuşuyor. Sonraki iki sütunda ise **her alt grubun** şüphelilik oranı yükseliyor, ama eşit
değil: doğuda 0,4706'dan 0,6667'ye, hane 1–2 grubunda 0,2227'den 0,4177'ye, tarife 25 basamağında
yalnız 0,1712'den 0,2732'ye. Etiket kayması bütünde tek bir sayı gibi görünüyor, alt gruplarda on
üç ayrı sayı.

Son satır kursun üçlüsünü tamamlıyor ve beklenmedik yöndedir. Üretim kümesinde alt grup açıklığı
**0,2573**; birinci derste aynı model için ölçülen açıklık 0,3576'ydı. Kaymış küme grupları
birbirine **yaklaştırıyor**. Daha da sert olanı, on iki alt grubun **hiçbirinde** model tabanın
altında kalmıyor; aynı model aynı ölçütle, kaymamış kümede beş alt grupta tabanın altındaydı.
Sebep tabanın kendisidir: şüphelilik oranı yükseldikçe "hiçbiri şüpheli değil" demek her alt
grupta zayıflıyor ve model onu geçiyor. Kaymış bir kümede ölçülen sayı modelin iyileştiğini değil
tabanın kötüleştiğini gösteriyor, ve tabanı yanına yazmayan bir rapor bunu ayıramaz.

## Özet

- Kayma bir sayıya iner: ayırt edici bir model satırın eğitimden mi üretimden mi geldiğini
  kestirir ve doğruluğun 0,5'ten farkı **kayma payıdır**. Girdi kaymasında +0,1172, aynı dağılımda
  −0,0127.
- Kayma payı yalnız girdiyi görür. Etiket kaymasında şüpheli oranı 0,2421'den 0,4865'e çıkarken
  gösterge +0,0063'te, zaman sıralı üretimde −0,0056'da kalıyor: **göstergenin sessizliği kayma
  olmadığı anlamına gelmez**.
- Kaymanın büyüklüğü başarım düşüşüyle yan yana okunur: girdi kaymasında modelin tabanın üstündeki
  farkı 0,0198'den **0,0066**'ya iniyor.
- İki kayma iki ayrı çözüm istiyor. Önsel düzeltmesi etiket kaymasında 0,6306'yı 0,6622'ye
  çıkarıyor, girdi kaymasında hiçbir kararı değiştirmiyor. Girdi dağılımına göre yeniden eğitim
  girdi kaymasında 0,7318'i 0,7384'e çıkarıyor, öbür üç kümede sayıyı düşürüyor.
- Zaman sıralı üretimde alt grup payları durağan ama şüphelilik oranları eşitsiz yükseliyor
  (doğuda +0,1961, tarife 25'te +0,1020). Açıklık 0,3576'dan **0,2573**'e iniyor ve model artık
  hiçbir alt grupta tabanın altında değil — çünkü düşen şey model değil tabandır.

## Sonraki Adım

Beş derste bir sayının **ne olduğu** ve **kimin için** olduğu ölçüldü: ayırmanın birimi kime göre
seçildi, eşik hangi bedelden okundu, taban kaç türlü kurulabildi, fark hangi payla söylendi,
üretim verisi ne kadar kaydı. Her adımda aynı ağacın ürettiği sayı bir alt grupta başka bir şey
söyledi ve açıklık 0,2573 ile 0,8606 arasında yeniden ölçüldü. Bütün bunlarda model **kapalı bir
kutu** olarak kaldı. Modelin o sayıyı **neye dayanarak** ürettiği hiç sorulmadı — hangi öznitelik
kararı taşıyor, tek bir abone için verilen karar hangi değere dayanıyor, ve bu gerekçe yazıya
döküldüğünde modelin gerçekten yaptığı şeyi mi anlatıyor. Sonraki konu bu üç soruyu ölçer.
