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.