Ders 05 / 15
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.
İçindekiler
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.
# 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.
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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.