İçeriğe geç
academia.sh

Ders 06 / 15

Yorumlanabilirlik İhtiyacı

Bir karar hakkında sorulabilecek on iki sorunun kaçının modelin çıktısıyla, kaçının bir açıklamayla, kaçının hiçbiriyle kapanmadığının sayılması: çıktı tek başına 4 soruyu kapatıyor, açıklama ortalamada 8,58'e çıkarıyor, üç soru hiçbir açıklamayla kapanmıyor. Kararın döndüğü tek adımlık değişim sınama kümesinin 159 abonesinde bulunuyor, batı bölgesinde otuz iki abonenin ikisinde bulunuyor; on üç alt grupta kapanan soru sayısı en iyi 8,89 ile en kötü 7,25 arasında değişiyor ve açıklık 1,64 sorudur.

İçindekiler

Önceki konu beş derste sayının ne olduğunu ve kimin için olduğunu ölçtü: bölmenin şişirdiği pay, bedel yapısının oynattığı işletme noktası, tabanın seçimi, iki model farkının payı ve dağılım kayması. Beşinde de ölçülen şey modelin çıktısıydı. Modelin o çıktıyı neye dayanarak ürettiği hiç sorulmadı.

Bu soru bir tercih meselesi gibi anlatılır ve genellikle bir gereklilik listesiyle desteklenir. Burada gereklilik listesi yazılmaz; ölçülen şey bir işlevdir: bir abone hakkında verilmiş kararın gerekçesinin belgelenebilir olması. Belgelenebilirlik somut bir sayıya iner. Bir karar hakkında sorulabilecek soruların bir kümesi vardır; o kümenin kaçı modelin çıktısına bakarak, kaçı bir açıklamaya bakarak cevaplanır, kaçı hiçbirine bakarak cevaplanmaz. Bu dersin ölçüsü budur ve alt gruplarda ayrı ayrı okunur.

  • YO1. Küme, etiket, tohum ve bölme M27/K01–K07 boyunca kullanılan kurgudur: bölgesel ölçüm ağından türetilen abone tablosu, kaçak/arıza şüphesi etiketi, tohum 20260218, bölme 756/252/252, sınama kümesinde taban çizgisi 0,7579.
  • YO2. Açıklanacak model M27/K03’ün seçtiği doğrusal modeldir: on iki ölçekli sütun, öğrenme adımı 0,3, tur 300, sınamada 0,8016. Bu konuda model seçilmez, verili alınır; ölçülen şey modelin başarımı değil, kararının okunabilirliğidir.
  • YO3. Alt gruplar bu konu boyunca sabittir ve M27/K08’in Değerlendirme Tasarımı konusunda kurulan dört ekseni izler: beş bölge, üç tarife basamağı (10, 25 ve 40 metreküp), üç hane büyüklüğü aralığı ve iki okuma düzeyi (üç dönemin hepsinde okuması olan abone ile daha az olan). Bakılan alt grup sayısı 13’tür.
  • YO4. Bir alt grubun sayısı ancak sınama kümesinde en az 25 kaydı varsa okunur. Eşiğin altında kalan grup tabloya girer ama sayısı bir bulgu sayılmaz.
  • YO5. Karşıt örnek tek sütunda bir adımlık değişimdir. Adım, sayısal sütunlarda eğitim kümesindeki standart sapma, iki değerli sütunda değerin dönmesi, bölgede başka bir bölgeye geçiştir. Bu üç adım aynı büyüklükte değildir ve karşılaştırmayı zorlaştıran şey budur.
  • YO6. Kişi başına tüketim ortalama tüketimden ve hane büyüklüğünden türetilir; kaynağı oynatıldığında yeniden hesaplanır, kendisi tek başına oynatılmaz.
  • YO7. Bir soru, cevabı modelin çıktısından ya da bir açıklamadan mekanik olarak okunabilir ise kapalı sayılır. Uzman yorumu, saha doğrulaması ya da politika kararı gerektiren soru açıktır.

Bir Karar Hakkında Sorulabilecek Sorular

Kurgudaki abone şüpheli olarak işaretlendiğinde onu telefonda dinleyecek kişinin, sahaya gidecek ekibin ve kararı sonradan denetleyecek kişinin soruları aynı değildir. On iki soru bu üç kişinin sorularının birleşimidir.

Modelin çıktısının kapattıkları dörttür: abone şüpheli işaretini aldı mı, puanı kaç ve eşiğe ne kadar yakın, karar hangi eşikte veriliyor, aynı satır yeniden verildiğinde aynı işaret çıkıyor mu.

Bir açıklamanın kapatabildikleri beştir: puanı en çok hangi sütun itiyor, o sütun hangi yönde itiyor, hangi tek sütunun bir adımlık değişimi işareti döndürür, aynı işareti alan öbür aboneler de aynı sütuna mı dayanıyor, bu abonenin alt grubunda işaret oranı bütündekinden farklı mı.

Hiçbirinin kapatmadıkları üçtür: işaret doğru mu, şüphe kaçaktan mı arızadan mı geliyor, bu işaretten sonra ne yapılmalı. Birincisi saha doğrulaması ister, ikincisi kurgunun etiketinde zaten ayrılmamıştır, üçüncüsü bir politika kararıdır.

# yorum.py — MODELDIR. M27/K01–K07'nin KURGU abone tablosu ayni tohumla uretilir;
# on iki sutunluk oznitelik kumesi ve bolme kurs boyunca sabittir.
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),
         "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35),
         "bolge": k["bolge"][0]}
    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, DOG, SIN = K[:756], K[756:1008], K[1008:]
ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "kisi_basi", "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]
TABAN = sum(x["supheli"] == 0 for x in SIN) / len(SIN)


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 olcek(egt, alan):
    return ({a: statistics.fmean(x[a] for x in egt) for a in alan},
            {a: max(1e-9, statistics.pstdev([x[a] for x in egt])) for a in alan})


def egit(egt, alan, o, s, adim=0.3, tur=300):    # MODELDIR: lojistik baglanim
    X = [[1.0] + [(x[a] - o[a]) / s[a] for a in alan] for x in egt]
    Y = [x["supheli"] for x in egt]
    w = [0.0] * len(X[0])
    for _ in range(tur):
        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] -= adim * g[j] / len(X)
    return w


def puan(w, alan, o, s, x):
    return sikistir(w[0] + sum(w[j + 1] * (x[a] - o[a]) / s[a]
                               for j, a in enumerate(alan)))


def karar(w, alan, o, s, x):
    return int(puan(w, alan, o, s, x) > 0.5)


O, S = olcek(EGT, ALAN)
W = egit(EGT, ALAN, O, S)
DOGRULUK = sum(karar(W, ALAN, O, S, x) == x["supheli"] for x in SIN) / len(SIN)
print(f"egitim {len(EGT)}, dogrulama {len(DOG)}, sinama {len(SIN)}")
print(f"taban cizgisi {TABAN:.4f}, dogrusal modelin sinama dogrulugu {DOGRULUK:.4f}")
egitim 756, dogrulama 252, sinama 252
taban cizgisi 0.7579, dogrusal modelin sinama dogrulugu 0.8016

Kararın Döndüğü Tek Adım

Beş açıklama sorusundan üçü her abone için kapanır, çünkü doğrusal modelin puanı sütun başına bir terimin toplamıdır ve o terimler her zaman okunabilir. Dördüncüsü — hangi tek sütunun bir adımlık değişimi işareti döndürür — kapanmayabilir. Karar sınırından yeterince uzakta duran bir abone için tek adımlık hiçbir değişim işareti döndürmez ve o soru cevapsız kalır. Bu, açıklama yönteminin bir eksikliği değil, o abonenin kararının kesinliğidir; ama sonuç aynı kapıya çıkar: gerekçe belgesinde o satır boş kalır.

def basamak(x):
    return ("tarife 10" if x["ort_tuketim"] <= 10 else
            "tarife 25" if x["ort_tuketim"] <= 25 else "tarife 40")


def hane_grup(x):
    return "hane 1-2" if x["hane"] <= 2 else ("hane 3-4" if x["hane"] <= 4
                                              else "hane 5+")


def okuma_grup(x):
    return "okuma az" if x["donem"] <= 2 else "okuma tam"


def esitse(f, deger):
    return lambda x: f(x) == deger


ALTGRUP = ([("bolge " + b[0], esitse(lambda x: x["bolge"], b[0])) for b in BOLGE]
           + [(t, esitse(basamak, t)) for t in ("tarife 10", "tarife 25", "tarife 40")]
           + [(h, esitse(hane_grup, h)) for h in ("hane 1-2", "hane 3-4", "hane 5+")]
           + [(o, esitse(okuma_grup, o)) for o in ("okuma az", "okuma tam")])
ENAZ, BOY = 25, {}
for ad, f in ALTGRUP:
    BOY[ad] = sum(1 for x in SIN if f(x))
KISA = [ad for ad in BOY if BOY[ad] < ENAZ]
print(f"alt grup sayisi {len(ALTGRUP)}, esik {ENAZ} kayit, "
      f"esigin altinda kalan {KISA}")

TEK = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
       "bolge"]


def degistir(x, a, v):
    d = dict(x)
    d[a] = v
    if a in ("ort_tuketim", "hane"):
        d["kisi_basi"] = round(d["ort_tuketim"] / d["hane"], 3)
    if a == "bolge":
        for b in BOLGE:
            d["b_" + b[0]] = int(v == b[0])
    return d


def karsit(x):                       # tek sutunda bir adimlik degisim
    k = karar(W, ALAN, O, S, x)
    for a in TEK:
        if a == "sifir_okuma":
            adaylar = [1 - x[a]]
        elif a == "bolge":
            adaylar = [b[0] for b in BOLGE if b[0] != x["bolge"]]
        else:
            adaylar = [x[a] + S[a], x[a] - S[a]]
        for v in adaylar:
            if karar(W, ALAN, O, S, degistir(x, a, v)) != k:
                return a
    return None


KARSIT = [karsit(x) for x in SIN]
ORNEK = SIN[4]
print(f"\nornek abone: bolge {ORNEK['bolge']}, hane {ORNEK['hane']}, "
      f"okuma {ORNEK['donem']}, ortalama tuketim {ORNEK['ort_tuketim']}")
print(f"  puan {puan(W, ALAN, O, S, ORNEK):.4f}, karar "
      f"{karar(W, ALAN, O, S, ORNEK)}, karsit ornek sutunu {KARSIT[4]}")
print(f"butun sinama kumesinde karsit ornegi olan abone "
      f"{sum(1 for k in KARSIT if k)}/{len(SIN)} "
      f"({sum(1 for k in KARSIT if k) / len(SIN):.4f})")
alt grup sayisi 13, esik 25 kayit, esigin altinda kalan ['tarife 10']

ornek abone: bolge merkez, hane 4, okuma 2, ortalama tuketim 34.16
  puan 0.4768, karar 0, karsit ornek sutunu ort_tuketim
butun sinama kumesinde karsit ornegi olan abone 159/252 (0.6310)

Örnek abonenin puanı 0,4768 ile eşiğin hemen altında ve ortalama tüketimi bir standart sapma arttığında işaret dönüyor. Bu abone için gerekçe belgesindeki satır yazılabilir. Sınama kümesinin 252 abonesinin 159’unda böyle bir satır yazılabiliyor; kalan 93 abone için tek adımlık hiçbir değişim işareti döndürmüyor.

Alt Gruplarda Kapanan Soru Sayısı

Bütünde ölçülen 0,6310 tek başına okunmaz. Aynı sayı on üç alt grupta ayrı ayrı ölçülür ve kapanan soru sayısına çevrilir: her abone için dört soruyu çıktı, üç soruyu her zaman üretilebilen açıklama kapatır, dördüncü açıklama sorusu karşıt örnek varsa kapanır, beşincisi abonenin bütün alt grupları eşik boyunun üstündeyse kapanır.

SABIT = 4 + 3          # cikti dort soru, her zaman kapanan uc aciklama sorusu


def kapanan(i, x):
    okunur = all(BOY[ad] >= ENAZ for ad, f in ALTGRUP if f(x))
    return SABIT + (1 if KARSIT[i] else 0) + (1 if okunur else 0)


TUM = sum(kapanan(i, x) for i, x in enumerate(SIN)) / len(SIN)
print(f"{'alt grup':<14}{'kayit':>6}{'karsit orani':>14}{'kapanan soru':>14}")
SATIR = []
for ad, f in ALTGRUP:
    g = [(i, x) for i, x in enumerate(SIN) if f(x)]
    kar = sum(1 for i, x in g if KARSIT[i]) / len(g)
    kap = sum(kapanan(i, x) for i, x in g) / len(g)
    SATIR.append((ad, kap))
    print(f"{ad:<14}{len(g):>6}{kar:>14.4f}{kap:>14.2f}")
enk = min(SATIR, key=lambda t: t[1])
eni = max(SATIR, key=lambda t: t[1])
print(f"\nbutunde kapanan soru {TUM:.2f}/12; yalniz cikti 4/12; "
      f"hicbir aciklamayla kapanmayan 3/12")
print(f"en iyi alt grup {eni[0]} {eni[1]:.2f}, en kotu alt grup {enk[0]} "
      f"{enk[1]:.2f}, aciklik {eni[1] - enk[1]:.2f} soru")
alt grup       kayit  karsit orani  kapanan soru
bolge kuzey       68        0.8235          8.82
bolge guney       58        0.3793          8.31
bolge dogu        36        0.8333          8.81
bolge bati        32        0.0625          7.88
bolge merkez      58        0.8448          8.83
tarife 10         12        0.2500          7.25
tarife 25        193        0.5907          8.59
tarife 40         47        0.8936          8.89
hane 1-2          73        0.5753          8.49
hane 3-4         143        0.6503          8.62
hane 5+           36        0.6667          8.64
okuma az          85        0.5647          8.49
okuma tam        167        0.6647          8.63

butunde kapanan soru 8.58/12; yalniz cikti 4/12; hicbir aciklamayla kapanmayan 3/12
en iyi alt grup tarife 40 8.89, en kotu alt grup tarife 10 7.25, aciklik 1.64 soru

Bütünde açıklama kapanan soru sayısını 4’ten 8,58’e çıkarıyor. Alt gruplarda aynı sayı 7,25 ile 8,89 arasında dağılıyor ve açıklık 1,64 sorudur. Karşıt örnek oranı ise çok daha keskin ayrışıyor: merkez bölgesinde 0,8448, batı bölgesinde 0,0625. Batı bölgesinde otuz iki abonenin ikisi için kararın döndüğü tek adım gösterilebiliyor. Bunun nedeni kurguda okunabilir: batının taban tüketimi 14 metreküple beş bölgenin en düşüğüdür, dolayısıyla oradaki aboneler karar sınırından uzakta durur ve bir standart sapmalık hiçbir hareket onları öbür tarafa geçirmez.

Kararın değişip değişmediği burada okunur. Bütünde bakan biri “kararların gerekçesi belgelenebiliyor” cümlesini yazar. Alt gruba bakan biri aynı cümleyi batı bölgesi için yazamaz; oradaki abonelerin gerekçe belgesinde karşıt örnek satırı boştur. En düşük tarife basamağının sayısı ise okunmaz bile, çünkü sınama kümesinde 12 kaydı vardır ve eşik 25’tir. Bakılan alt grup sayısı 13, okunan 12’dir.

Üç sorunun hiçbir açıklamayla kapanmadığı da aynı tabloda durur ve bu ders bakımından en önemli satırdır. Açıklama, kararın nasıl üretildiğini anlatır; kararın doğru olup olmadığını, şüphenin kaynağını ve bundan sonra ne yapılacağını anlatmaz. Bu üç soruyu kapatmak için açıklama değil saha verisi, daha ince bir etiket ve yazılı bir politika gerekir.

Özet

  • Bir karar hakkında sorulabilecek on iki sorunun 4’ü modelin çıktısıyla, 5’i bir açıklamayla kapanabilir, 3’ü hiçbiriyle kapanmaz; kapanmayan üçü doğruluk, şüphenin kaynağı ve bundan sonra ne yapılacağıdır.
  • Bütünde ortalama kapanan soru sayısı 8,58/12’dir; açıklama olmadan bu sayı 4/12’de kalır.
  • Kararın döndüğü tek adımlık değişim sınama kümesinin 159 abonesinde bulunuyor, oran 0,6310.
  • On üç alt gruba bakıldı, 25 kayıtlık eşiği geçen 12’si okundu; kapanan soru sayısı 7,25 ile 8,89 arasında değişiyor ve açıklık 1,64 sorudur.
  • Karşıt örnek oranı merkez bölgesinde 0,8448, batı bölgesinde 0,0625’tir; batının taban tüketimi en düşük olduğu için oradaki aboneler karar sınırından uzakta durur.

Sonraki Adım

Bu derste beş açıklama sorusundan üçü “her zaman kapanır” diye geçildi ve gerekçesi doğrusal modelin puanının sütun başına bir terime ayrılabilmesiydi. O terimlerin sıralaması, modelin hangi sütuna dayandığının küresel cevabı olarak okunur ve M27/K02 ile K03 o sıralamayı zaten ölçmüştü. Ama bir sıralama tek bir yolla üretilmez. Sütunu modelden okumak yerine sütunu bozarak ölçmek — değerlerini birbirine karıştırıp başarımın ne kadar düştüğüne bakmak — ikinci bir sıralama verir ve iki sıralamanın aynı çıkması için hiçbir neden yoktur. Sonraki ders iki sıralamayı yan yana koyar, kaç sırada ayrıştıklarını sayar, ve aynı niceliğin iki biçimi olan ortalama tüketimle kişi başına tüketimin önemi nasıl bölüştüğünü ölçer.

İ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