Ders 12 / 15
Adalet Ölçütleri
Üç adalet ölçütünün aynı anda sağlanamadığının sayılması: taban oranı 0,4578 olan doğu bölgesi ile 0,1663 olan diğer dört bölge arasında tek eşikte oran açıklığı 0,3984, yakalama açıklığı 0,4842, isabet açıklığı 0,1242. Aynı sayıda abone işaretlenirken eşik çiftini oran eşitliğine ayarlamak isabet açıklığını 0,4800'e, yakalama eşitliğine ayarlamak 0,4262'ye, isabet eşitliğine ayarlamak ise yakalama açıklığını 0,7038'e çıkarıyor. Seçilme oranının duyarlılık ile taban oranın çarpımının kesinliğe bölümü olduğu kimliği doğrulanıyor ve iki ölçüt eşitlendiğinde seçilme oranlarının oranının taban oranların oranı olan 2,7535'e kilitlendiği gösteriliyor; kapasite sabitken üçünü birlikte veren eşik çifti yok, en iyi deneme 0,2727 açıklık bırakıyor.
İçindekiler
Önceki ders bir alt grubun sayısı öbüründen düşük çıktığında bunun bir zarar olduğunu varsaydı ve açıklığı doğrudan raporladı. Hangi sayının açıklığı sorusu ise açıkta kaldı. İki alt grupta işaretlenen abonelerin oranını eşitlemek, yakalanan şüphelilerin oranını eşitlemek ve işaretlenenlerin ne kadarının gerçekten şüpheli olduğunu eşitlemek üç ayrı taleptir. Üçü de makul, üçü de ölçülebilir, ve üçü aynı model üzerinde aynı anda karşılanamaz.
Bu ders o üç ölçütü kurar ve aralarındaki çatışmayı sayar. Sonuç bir ayar hatası değildir: iki grubun taban oranları farklı olduğu sürece ölçütlerin tanımları birbirini dışlar. Kursun ikinci iddiası budur ve burada bir kimlikle gösterilir.
- ME9. Küme, bölme, model ve alt grup tanımları önceki dersten aynen sürer: 756 satırlık eğitim kümesi, 504 abonelik ayrılmış küme, on iki sütunlu doğrusal model, on üç alt grup.
- ME10. Çatışmanın ölçüldüğü iki grup bölge ekseninden alınır: A doğu bölgesi, B geri kalan dört bölge. Seçimin gerekçesi taban oran farkıdır; batı bölgesi tek başına alınamaz, çünkü ayrılmış kümede tek bir şüphelisi vardır.
- ME11. Oran eşitliği, iki grupta işaretlenen abone oranlarının eşitliğidir.
- ME12. Yakalama eşitliği, iki grupta duyarlılıkların eşitliğidir: şüphelilerin ne kadarının işaretlendiği.
- ME13. İsabet eşitliği, iki grupta kesinliklerin eşitliğidir: işaretlenenlerin ne kadarının gerçekten şüpheli olduğu.
- ME14. Ölçütü sağlamanın aracı gruba ayrı eşik vermektir. Model, ağırlıkları ve puanları hiç değişmez; yalnız hangi puandan sonra işaretleneceği değişir.
- ME15. Eşik çiftleri 0,02’den 0,98’e 0,01 adımlı bir ızgarada aranır ve işaretlenen toplam abone sayısı sabit tutulur (63 abone, en çok üç kayma). Bu kısıt olmadan her ölçüt hiç kimseyi işaretlemeyerek sağlanır ve karşılaştırma anlamsızlaşır.
- ME16. Açıklık, iki grubun sayısı arasındaki mutlak farktır; sıfıra ne kadar yaklaştığından çok öbür iki açıklığın ne yaptığı okunur.
Üç Ölçüt, Üç Ayrı Eşitlik
Kurulum önceki dersin modelini yeniden üretir, ayrılmış kümedeki her aboneye bir puan verir ve beş bölgeyi tek eşikte yan yana koyar.
# adalet.py — MODELDIR. Ayni KURGU abone tablosu, ayni tohum, ayni bolme ve # onceki dersin on iki sutunlu dogrusal modeli; esik disinda hicbir sey degismez. import math import statistics 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, 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, 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 = {"hane": k["hane"], "memnuniyet": k["memnuniyet"], "donem": len(v), "ort_tuketim": round(ort, 2), "oynaklik": round(oyn, 2), "il": k["bolge"][0], "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35)} x["kisi_basi"] = round(x["ort_tuketim"] / x["hane"], 3) for b in BOLGE: x["b_" + b[0]] = int(k["bolge"][0] == b[0]) VERI.append(x) 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, AYR = K[:756], K[756:] ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma", "kisi_basi", "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"] ORT = {a: statistics.fmean(x[a] for x in EGT) for a in ALAN} SAP = {a: max(1e-9, statistics.pstdev([x[a] for x in EGT])) for a in ALAN} def olcekli(x): return [1.0] + [(x[a] - ORT[a]) / SAP[a] for a in ALAN] def sikistir(z): if z >= 0: return 1.0 / (1.0 + math.exp(-z)) if z < 700 else 1.0 e = math.exp(z) if z > -700 else 0.0 return e / (1.0 + e) def egit(kume, etiket): # MODELDIR: dogrusal model, egim inisi X = [olcekli(x) for x in kume] Y = [x[etiket] for x in kume] w = [0.0] * len(X[0]) for _ in range(200): g = [0.0] * len(w) for i in range(len(X)): h = sikistir(sum(w[j] * X[i][j] for j in range(len(w)))) - Y[i] for j in range(len(w)): g[j] += h * X[i][j] for j in range(len(w)): w[j] -= 0.3 * g[j] / len(X) return w def olasilik(w, x): return sikistir(sum(a * b for a, b in zip(w, olcekli(x)))) def gruplar(x): t = 10 if x["ort_tuketim"] <= 10 else 25 if x["ort_tuketim"] <= 25 else 40 return ["bolge " + x["il"], "tarife %d" % t, "hane " + ("1-2" if x["hane"] <= 2 else "3-4" if x["hane"] <= 4 else "5+"), "okuma " + ("az" if x["donem"] <= 2 else "tam")] W = egit(EGT, "supheli") PUAN = [(olasilik(W, x), x["supheli"], x["il"]) for x in AYR] A = [p for p in PUAN if p[2] == "dogu"] B = [p for p in PUAN if p[2] != "dogu"] def olc(s, e): # secilme, duyarlilik, kesinlik, dogru, isaretli sup = sum(y for _, y, _ in s) n = sum(1 for p, _, _ in s if p > e) dp = sum(y for p, y, _ in s if p > e) return (n / len(s), dp / sup, dp / n if n else float("nan"), sum(1 for p, y, _ in s if (p > e) == bool(y)), n) print(f"egitim {len(EGT)}, ayrilmis {len(AYR)}, bakilan alt grup " f"{len({g for x in AYR for g in gruplar(x)})}, taban " f"{sum(x['supheli'] == 0 for x in AYR) / len(AYR):.4f}") print(f"{'bolge':<10}{'n':>5}{'supheli':>9}{'taban oran':>12}{'secilme':>10}" f"{'duyarlilik':>12}{'kesinlik':>10}") for b in ("kuzey", "guney", "dogu", "bati", "merkez"): s = [p for p in PUAN if p[2] == b] m = olc(s, 0.5) print(f"{b:<10}{len(s):>5}{sum(y for _, y, _ in s):>9}" f"{sum(y for _, y, _ in s) / len(s):>12.4f}{m[0]:>10.4f}{m[1]:>12.4f}{m[2]:>10.4f}") ta = sum(y for _, y, _ in A) / len(A) tb = sum(y for _, y, _ in B) / len(B) a0, b0 = olc(A, 0.5), olc(B, 0.5) print(f"\nA = dogu: n {len(A)}, taban oran {ta:.4f} | B = diger dort bolge: " f"n {len(B)}, taban oran {tb:.4f}, oranlarin orani {ta / tb:.4f}") print(f"tek esik 0.50, isaretlenen {a0[4] + b0[4]}: oran acikligi " f"{abs(a0[0] - b0[0]):.4f}, yakalama acikligi {abs(a0[1] - b0[1]):.4f}, " f"isabet acikligi {abs(a0[2] - b0[2]):.4f}")
egitim 756, ayrilmis 504, bakilan alt grup 13, taban 0.7857 bolge n supheli taban oran secilme duyarlilik kesinlik kuzey 144 23 0.1597 0.0694 0.1739 0.4000 guney 117 17 0.1453 0.0256 0.1176 0.6667 dogu 83 38 0.4578 0.4578 0.6842 0.6842 bati 63 1 0.0159 0.0000 0.0000 nan merkez 97 29 0.2990 0.1237 0.2759 0.6667 A = dogu: n 83, taban oran 0.4578 | B = diger dort bolge: n 421, taban oran 0.1663, oranlarin orani 2.7535 tek esik 0.50, isaretlenen 63: oran acikligi 0.3984, yakalama acikligi 0.4842, isabet acikligi 0.1242
Tablonun okunması gereken sütunu taban orandır: doğuda şüpheli oranı 0,4578, batıda 0,0159. Bu fark modelin ürettiği değil kurgunun içinde duran bir şeydir; doğu bölgesinin gizli puanı 0,30 daha yüksektir. Model bu farkı görüyor ve doğuda abonelerin 0,4578’ini, güneyde 0,0256’sını işaretliyor.
Alt satır dersin başlangıç noktasıdır. Tek bir eşikle üç açıklık da sıfırdan uzaktır: oran açıklığı 0,3984, yakalama açıklığı 0,4842, isabet açıklığı 0,1242. Hangisinin düzeltileceği bir seçim hâline gelir, çünkü üçü ayrı taraftan bakar: oran eşitliği bir abonenin komşularından daha sık işaretlenmemesini, yakalama eşitliği hiçbir bölgede şüphelilerin öbüründen çok gözden kaçmamasını, isabet eşitliği ise işaretlenmenin her bölgede aynı şeyi ifade etmesini ister.
Birini Düzeltmek Öbürünü Bozar
Ölçütü sağlamanın yolu iki gruba ayrı eşik vermektir. Aşağıdaki arama, işaretlenen toplam abone sayısını sabit tutarak her ölçütü tek tek sıfıra en yakın noktaya çeker ve öbür iki açıklığı yanına yazar.
GRID = [i / 100 for i in range(2, 99)] CA = {e: olc(A, e) for e in GRID} CB = {e: olc(B, e) for e in GRID} HEDEF = a0[4] + b0[4] def esitle(k): # k: 0 secilme, 1 duyarlilik, 2 kesinlik en = None for ea in GRID: u = CA[ea] for eb in GRID: v = CB[eb] if abs(u[4] + v[4] - HEDEF) > 3 or v[2] != v[2] or u[2] != u[2]: continue f, d = abs(u[k] - v[k]), (u[3] + v[3]) / len(AYR) if en is None or f < en[0] - 1e-12 or (abs(f - en[0]) < 1e-12 and d > en[3]): en = (f, ea, eb, d) return en def yaz(ad, ea, eb): u, v = CA[ea], CB[eb] print(f"{ad:<22}{ea:>7.2f}{eb:>7.2f}{u[4] + v[4]:>12}" f"{abs(u[0] - v[0]):>12.4f}{abs(u[1] - v[1]):>14.4f}{abs(u[2] - v[2]):>12.4f}" f"{(u[3] + v[3]) / len(AYR):>10.4f}") print(f"{'yapilandirma':<22}{'esik A':>7}{'esik B':>7}{'isaretli':>12}" f"{'oran acik':>12}{'yakalama acik':>14}{'isabet acik':>12}{'dogruluk':>10}") yaz("tek esik", 0.5, 0.5) for k, ad in ((0, "oran esitligi"), (1, "yakalama esitligi"), (2, "isabet esitligi")): f, ea, eb, d = esitle(k) yaz(ad, ea, eb)
yapilandirma esik A esik B isaretli oran acik yakalama acik isabet acik dogruluk tek esik 0.50 0.50 63 0.3984 0.4842 0.1242 0.8194 oran esitligi 0.81 0.40 60 0.0017 0.0632 0.4800 0.7857 yakalama esitligi 0.76 0.40 63 0.0379 0.0105 0.4262 0.7877 isabet esitligi 0.34 0.65 66 0.6365 0.7038 0.0000 0.7976
Her satırda köşegen üstündeki sayı sıfıra iniyor ve öbürleri yükseliyor. Oran eşitliği isteniyorsa doğuya 0,81, geri kalana 0,40 eşiği verilir; işaretlenen abone oranları 0,0017 farkla eşitlenir, ama isabet açıklığı 0,1242’den 0,4800’e çıkar — doğuda işaretlenen abonelerin 0,9000’i gerçekten şüpheliyken geri kalanda 0,4200’ü şüphelidir. Yakalama eşitliği isteniyorsa eşikler 0,76 ve 0,40 olur, duyarlılıklar 0,0105 farkla buluşur, isabet açıklığı 0,4262’de kalır. İsabet eşitliği isteniyorsa doğuya 0,34, geri kalana 0,65 verilir; kesinlikler tam eşitlenir ama yakalama açıklığı 0,7038’e fırlar, çünkü doğuda şüphelilerin 0,7895’i, geri kalanda 0,0857’si yakalanır.
Bedelin bir kısmı doğruluktan gelir: bütün doğruluk üç yapılandırmada 0,7857, 0,7877 ve 0,7976’ya iniyor ve oran eşitliğinde model tabanın tam üstünde duruyor. Ama asıl bedel doğrulukta değil öbür iki açıklıktadır; hiçbir yapılandırma üç sütunu birden küçültemiyor.
Bu Bir Ayar Hatası Değil
Tablodaki örüntü daha iyi bir arama ya da daha ince bir ızgarayla düzelmez, çünkü kaynağı tanımların kendisidir. Üç ölçüt bağımsız değildir; aralarında bir kimlik vardır. Bir grupta seçilme oranı , duyarlılık , kesinlik ve taban oran ise, işaretlenen doğru sayısı iki yoldan yazılabilir ve
çıkar. Aşağıdaki blok önce bu kimliği iki grupta doğruluyor, sonra yakalama ile isabeti birlikte eşitlemeyi deniyor.
print(f"\nkimlik: secilme = duyarlilik * taban oran / kesinlik (esik 0.50)") for ad, m, t in (("A", a0, ta), ("B", b0, tb)): print(f" {ad}: {m[1] * t / m[2]:.6f} = {m[0]:.6f}") def birlikte(tol): en = None for ea in GRID: u = CA[ea] for eb in GRID: v = CB[eb] if v[2] != v[2] or u[2] != u[2]: continue if tol and abs(u[4] + v[4] - HEDEF) > tol: continue f = max(abs(u[1] - v[1]), abs(u[2] - v[2])) if en is None or f < en[0] - 1e-12: en = (f, ea, eb) return en SUP = sum(y for _, y, _ in PUAN) print(f"\nyakalama ile isabeti birlikte esitleme denemesi ({SUP} supheli var)") print(f"{'kapasite kisiti':<20}{'esik A':>7}{'esik B':>7}{'en buyuk aciklik':>18}" f"{'isaretli':>10}{'yakalanan':>11}{'secilme orani':>15}") for tol, ad in ((0, "yok"), (3, "63 kayma 3"), (15, "63 kayma 15")): f, ea, eb = birlikte(tol) u, v = CA[ea], CB[eb] yak = round(u[1] * sum(y for _, y, _ in A)) + round(v[1] * sum(y for _, y, _ in B)) print(f"{ad:<20}{ea:>7.2f}{eb:>7.2f}{f:>18.4f}{u[4] + v[4]:>10}{yak:>11}" f"{u[0] / v[0]:>15.4f}") print(f"taban oranlarin orani {ta / tb:.4f}")
kimlik: secilme = duyarlilik * taban oran / kesinlik (esik 0.50) A: 0.457831 = 0.457831 B: 0.059382 = 0.059382 yakalama ile isabeti birlikte esitleme denemesi (108 supheli var) kapasite kisiti esik A esik B en buyuk aciklik isaretli yakalanan secilme orani yok 0.86 0.82 0.0120 2 2 5.0723 63 kayma 3 0.74 0.43 0.2727 60 33 1.8445 63 kayma 15 0.72 0.46 0.2486 48 29 2.7816 taban oranlarin orani 2.7535
Kimlik iki grupta da altıncı basamağa kadar tutuyor. Sonucu şudur: duyarlılık ile kesinlik iki grupta eşitlenirse olur, yani seçilme oranlarının oranı taban oranların oranına, burada 2,7535’e kilitlenir. Oran eşitliği bu oranın 1 olmasını ister. İkisi ancak taban oranlar eşitse ya da hiç kimse işaretlenmiyorsa birlikte doğru olabilir.
Alt tablo bunu deneyerek gösteriyor. Kapasite kısıtı kaldırıldığında arama gerçekten üç açıklığı birden küçük yapan bir eşik çifti buluyor — 0,86 ve 0,82 — ama o noktada 504 abonenin yalnız ikisi işaretleniyor ve 108 şüphelinin ikisi yakalanıyor. Eşitlik hiçbir şey yapmayarak sağlanmıştır. Kapasite 63’e sabitlendiğinde en iyi deneme 0,2727 açıklık bırakıyor; 48 abonelik daha gevşek bir kısıtta açıklık 0,2486’ya iniyor ve seçilme oranlarının oranı 2,7816 ile taban oranların oranı olan 2,7535’e oturuyor — kimliğin öngördüğü yere.
Buradan çıkan kural bir öneri değil bir sınırdır: taban oranlar farklı olduğu sürece üç ölçüt aynı anda sağlanamaz. Yapılacak iş ölçütü seçmek, seçimi yazmak ve öbür iki açıklığı sayıyla birlikte raporlamaktır; “adil model” diye tek bir sayı yoktur.
Özet
- Doğu bölgesinde şüpheli oranı 0,4578, geri kalan dört bölgede 0,1663; bu taban oran farkı dersin bütün sonuçlarını belirler ve tek eşikte üç açıklık da büyüktür: oran 0,3984, yakalama 0,4842, isabet 0,1242.
- İşaretlenen abone sayısı sabit tutulduğunda oran eşitliği isabet açıklığını 0,4800’e, yakalama eşitliği 0,4262’ye, isabet eşitliği ise yakalama açıklığını 0,7038’e çıkarıyor; bütün doğruluk 0,7857 ile 0,7976 arasına iniyor.
- Seçilme oranı, duyarlılık ile taban oranın çarpımının kesinliğe bölümüne eşittir; iki ölçüt eşitlendiğinde seçilme oranlarının oranı taban oranların oranına, 2,7535’e kilitlenir.
- Kapasite sabitken üçünü birlikte veren eşik çifti yoktur: en iyi deneme 0,2727 açıklık bırakıyor, kısıt kaldırıldığında ise eşitlik yalnız iki abone işaretleyerek sağlanıyor.
Sonraki Adım
İki derste ölçülen şey modelin kime ne yaptığıydı. Modelin, üzerinde eğitildiği kayıtlar hakkında ne söylediği hiç sorulmadı. Eğitim kümesindeki tek bir abonenin tabloya girip çıkması çıktıyı ne kadar oynatıyor, ve abone numarasını silmek o aboneyi gerçekten görünmez kılıyor mu. Sonraki ders bunları sayar: tek bir kaydın çıktıda bıraktığı iz ölçülür, gürültü eklemenin doğruluktan ne götürdüğü süpürülür, ve kimliksizleştirilmiş bir tabloda kaç abonenin kendi alan birleşiminde tek başına kaldığı sayılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.