İçeriğe geç
academia.sh

Ders 11 / 11

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.

İçindekiler

Ö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.

# 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.

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.

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.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat