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.