İçeriğe geç
academia.sh

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ı ss, duyarlılık dd, kesinlik kk ve taban oran tt ise, işaretlenen doğru sayısı iki yoldan yazılabilir ve

s=dtks = \frac{d \cdot t}{k}

çı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 sA/sB=tA/tBs_A / s_B = t_A / t_B 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat