---
title: 'Yorumlanabilirlik İhtiyacı'
source: 'https://academia.sh/tr/kurslar/model-etik-ve-yorum/yorumlanabilirlik-ihtiyaci'
course: 'Model Değerlendirme, Yorumlanabilirlik ve Etik'
language: tr
updated: '2026-08-17T18:10:14+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```python
# 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.

```python
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.

```python
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.
