---
title: 'Değerlendirme Kümesi Tasarımı'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/degerlendirme-kumesi-tasarimi'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:34+00:00'
license: 'CC BY-SA 4.0'
---

# Değerlendirme Kümesi Tasarımı

Bir savunmanın sayısının kümenin bileşimiyle birlikte okunması: aynı kural süzgeci hiç değişmeden üç ayrı kümede üç ayrı sayı veriyor. Temsili kümede kesinlik 0,7629, zararlı ağırlıklı kümede 0,9136, sınırda örnek kümesinde 0,4444 çıkıyor; ilk iki kümede duyarlılık birebir aynı kalıyor çünkü zararlı alt küme hiç değişmedi. Sınırda örnek kümesinde duyarlılık 0,7957'den 0,6400'e iniyor ve yanlış engelleme payı 0,7143'e çıkıyor. Kümenin çözünürlüğü de yazılıyor: duyarlılığın adımı temsili kümede 0,0108, sınırda örnek kümesinde 0,0400 ve bu adımdan küçük hiçbir fark ölçülemez.

Bu kursun on dört dersi savunma kurdu. Girdi ve çıktı süzgeçleri yazıldı, içerik denetimi
sınıf sınıf ölçüldü, modele giden veride alan maskelendi, araç yetkisi daraltıldı, erişilen
içerik yönerge değil veri olarak işaretlendi ve geri döndürülemez eylemlerin önüne insan onayı
kapısı kondu. Her katmanın durdurduğu pay ile yanlışlıkla durdurduğu pay yan yana yazıldı.

Bir soru hiç sorulmadı: bu sayılar **nereden** geliyor. Her oran bir kayıt kümesi üzerinde
hesaplandı ve o kümenin nasıl toplandığı hiç tartışılmadı. Bu ders o kümeyi bir tasarım nesnesi
olarak ele alır ve tek bir iddiası vardır: **bir savunmanın sayısı, savunmanın olduğu kadar
kümenin de sayısıdır.** Savunma hiç değişmeden, kümenin bileşimi değiştirilerek aynı süzgeçten
üç ayrı oran okunacak.

- **DG1.** Kayıt kümesi, sınıflar ve savunmalar **kurgudur** ve ders içinde üretilir. Hiçbir
  gerçek kurum, ürün ya da sistem yoktur.
- **DG2.** Saldırı bir **metin değil, bir öznitelik profilidir**. Kayıtların metni tümüyle
  zararsız destek talepleridir ve sınıfla **hiçbir ilişkisi yoktur**; sınıf yalnız yapısal
  bayraklarda durur. Bu yüzden derste çalışan hiçbir saldırı yordamı bulunmaz.
- **DG3.** Ölçü tek bir oran değildir: durdurulan zararlı, yanlış alarm, kaçan zararlı,
  kesinlik, duyarlılık ve **yanlış engelleme payı** birlikte yazılır.
- **DG4.** Taban çizgisi her kümede **savunmasız kurulumdur**: hiçbir süzgeç yok, durdurulan
  zararlı 0 ve yanlış alarm 0.
- **DG5.** Üç küme **aynı havuzdan** türetilir ve savunma hiç değişmez. **Temsili küme**
  havuzun tamamıdır; **zararlı ağırlıklı küme** bütün zararlılar ile her üçüncü temiz kayıttır;
  **sınırda örnek kümesi** tam bir bayrak taşıyan kayıtlardır.
- **DG6.** Sınırda örnek ölçütü **yapısaldır** ve hiçbir süzgecin kararına bakmaz; seçim
  ölçütünü bir savunmanın çıktısından almak o savunmayı kendi seçtiği kümede ölçmek olurdu.
- **DG7.** Bir kümenin **çözünürlüğü**, tek bir kaydın oynattığı en küçük farktır. Duyarlılığın
  adımı zararlı kayıt sayısının tersi, yanlış engelleme payının adımı temiz kayıt sayısının
  tersidir.
- **DG8.** Kural süzgeci yalnız bayrakları okur ve **koşumdan bağımsızdır**; model süzgecinin
  puanı tohuma bağlıdır ve ikinci koşum tohum 20260219 ile alınır.

## Kümenin Kendisi Bir Tasarım Kararıdır

Havuz iki yüz kırk kayıttır. Her kaydın bir sınıfı, bir kaynağı ve yedi yapısal bayraktan
oluşan bir profili vardır. Savunma bu bayrakları okur; metni değil. İlk blok havuzu kurar,
üç kümeyi ayırır ve aynı kural süzgecini üçünde de koşturur.

```python
# KURGUDUR. Kayitlar, siniflar ve savunmalar ders icinde uretilir; hicbir gercek
# kurum, urun ya da sistem yoktur. Saldiri bir METIN degil, bir OZELLIK PROFILIDIR.
TOHUM, M32 = 20260218, 0xFFFFFFFF


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


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
PROFIL = {
    "temiz":              [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05],
    "dolayli_yonerge":    [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12],
    "gizli_alan_istegi":  [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08],
    "yetki_asimi":        [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07],
    "kaynak_taklidi":     [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06],
    "bozulmus_girdi":     [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62],
}
KAYNAK_PAYI = {
    "temiz":             [0.72, 0.20, 0.08],
    "dolayli_yonerge":   [0.05, 0.70, 0.25],
    "gizli_alan_istegi": [0.55, 0.30, 0.15],
    "yetki_asimi":       [0.40, 0.35, 0.25],
    "kaynak_taklidi":    [0.10, 0.60, 0.30],
    "bozulmus_girdi":    [0.65, 0.20, 0.15],
}
# Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR.
METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi",
         "sayac endeksi yanlis girilmis olabilir",
         "mahallede kesinti ne zaman bitecek",
         "tarife basamagimi ogrenmek istiyorum",
         "ariza kaydim icin ekip ne zaman gelir",
         "adres degisikligi nasil yapilir"]

KAYIT = []
for i in range(240):
    r = uretec(TOHUM + 6151 * i)
    s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                  "metin": METIN[int(r() * len(METIN))],
                  "uzunluk": 40 + int(r() * 260)})


def zararli(k):
    return k["sinif"] != "temiz"


def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
                               "kaynak_damgasi_uyusmuyor")):
    return any(k["ozellik"][o] for o in kurallar)


def olc(kayitlar, karar):
    dp = yp = dn = yn = 0
    for k in kayitlar:
        isaret, gercek = karar(k), zararli(k)
        if isaret and gercek:
            dp += 1
        elif isaret and not gercek:
            yp += 1
        elif not isaret and gercek:
            yn += 1
        else:
            dn += 1
    kesinlik = dp / (dp + yp) if dp + yp else 0.0
    duyarlilik = dp / (dp + yn) if dp + yn else 0.0
    return {"dp": dp, "yp": yp, "yn": yn, "dn": dn,
            "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4),
            "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}


def bayrak_sayisi(k):
    return sum(1 for o in OZELLIK if k["ozellik"][o])


TEMIZ = [k for k in KAYIT if not zararli(k)]
ZAR = [k for k in KAYIT if zararli(k)]
KUME = {"temsili": KAYIT,                                  # havuzun tamami
        "zararli agirlikli": ZAR + TEMIZ[::3],             # her zararli, her ucuncu temiz
        "sinirda ornek": [k for k in KAYIT if bayrak_sayisi(k) == 1]}

print(f"{'kume':<18} {'kayit':>6} {'zararli':>8} {'temiz':>6} {'zararli payi':>13}")
for ad, K in KUME.items():
    z = sum(1 for k in K if zararli(k))
    print(f"{ad:<18} {len(K):>6} {z:>8} {len(K) - z:>6} {z / len(K):>13.4f}")

print("\nsavunmasiz taban (hicbir suzgec yok), her uc kumede")
for ad, K in KUME.items():
    t = olc(K, lambda k: False)
    print(f"{ad:<18} durdurulan zararli {t['dp']} , yanlis alarm {t['yp']} , "
          f"kacan zararli {t['yn']}")

print("\nkural suzgeci , ayni savunma uc kumede")
print(f"{'kume':<18} {'dp':>4} {'yp':>4} {'yn':>4} {'kesinlik':>10} {'duyarlilik':>11}"
      f" {'yanlis engelleme':>17}")
for ad, K in KUME.items():
    o = olc(K, kural_suzgeci)
    print(f"{ad:<18} {o['dp']:>4} {o['yp']:>4} {o['yn']:>4} {o['kesinlik']:>10.4f}"
          f" {o['duyarlilik']:>11.4f} {o['yanlis_engelleme_payi']:>17.4f}")
```

```
kume                kayit  zararli  temiz  zararli payi
temsili               240       93    147        0.3875
zararli agirlikli     142       93     49        0.6549
sinirda ornek          53       25     28        0.4717

savunmasiz taban (hicbir suzgec yok), her uc kumede
temsili            durdurulan zararli 0 , yanlis alarm 0 , kacan zararli 93
zararli agirlikli  durdurulan zararli 0 , yanlis alarm 0 , kacan zararli 93
sinirda ornek      durdurulan zararli 0 , yanlis alarm 0 , kacan zararli 25

kural suzgeci , ayni savunma uc kumede
kume                 dp   yp   yn   kesinlik  duyarlilik  yanlis engelleme
temsili              74   23   19     0.7629      0.7957            0.1565
zararli agirlikli    74    7   19     0.9136      0.7957            0.1429
sinirda ornek        16   20    9     0.4444      0.6400            0.7143
```

## Değişmeyen Duyarlılık, Oynayan Kesinlik

İkinci tablo tabanı verir ve üç kümede de aynıdır: hiçbir süzgeç kurulmadığında durdurulan
zararlı 0, yanlış alarm 0'dır. Taban çizgisinin bu kadar yalın olması bir kolaylık değil bir
kısıttır; savunmanın kazandığı her kayıt buradan sayılır ve savunmanın engellediği her temiz
kayıt da buraya karşı yazılır. Kaçan zararlı sayısı kümeden kümeye değişiyor çünkü kümelerin
zararlı sayısı farklıdır: temsili ve zararlı ağırlıklı kümede doksan üç, sınırda örnek
kümesinde yirmi beş.

Üçüncü tablonun üç satırında süzgeç aynıdır: aynı dört kural, aynı bayraklar, tek satır kod bile
değişmedi. Yine de kesinlik **0,7629**, **0,9136** ve **0,4444** okunuyor. Aradaki en büyük
fark **0,4692**, yani bir savunmanın "kesinliği" tek başına söylendiğinde neredeyse hiçbir şey
söylenmemiş oluyor.

İlk iki satır bu farkın kaynağını açık eder. Zararlı ağırlıklı kümede duyarlılık **0,7957**,
temsili kümedekiyle **birebir aynı**. Şaşırtıcı değildir: iki kümenin zararlı alt kümesi
aynı doksan üç kayıttır, atılan şey yalnız temiz kayıtlardır. Duyarlılık yalnız zararlı
kayıtlara bakar, bu yüzden temiz tarafı seyreltmek onu oynatamaz. Kesinlik ise
`dp / (dp + yp)` oranıdır ve paydası temiz kayıt sayısıyla birlikte küçülür: doksan sekiz
temiz kayıt atıldığında yanlış alarm yirmi üçten yediye düşüyor ve kesinlik **0,1507**
yükseliyor. Süzgeç bir kayıt fazla yakalamadı; yalnız yanılabileceği yer daraldı.

Bu, değerlendirme kümelerinde en sık yapılan hatanın kaynağıdır. Zararlı ağırlıklı bir küme
toplamak doğal bir tercihtir, çünkü nadir sınıflardan yeterince örnek gerekir. Ama o kümede
ölçülen kesinlik **üretimdeki kesinlik değildir** ve aradaki fark savunmanın kalitesinden
değil, kümenin zararlı payından gelir. Kural şudur: **kesinlik, kümenin zararlı payı yazılmadan
raporlanamaz.**

Yanlış engelleme payı iki küme arasında 0,1565'ten 0,1429'a iniyor. Bu farkın büyüklüğü
**0,0136** ve birazdan görüleceği gibi zararlı ağırlıklı kümenin çözünürlüğünün altındadır;
bir bulgu değil, seyreltmenin artığıdır.

## Sınırda Örnekler ve Kümenin Çözünürlüğü

Üçüncü küme başka bir soruyu sorar: savunma **zor kayıtlarda** ne yapıyor. Tam bir bayrak
taşıyan kayıtlar hem temiz hem zararlı olabilir; kanıt incedir. Bu kümede kural süzgecinin
duyarlılığı **0,6400**, temsili kümedekinden **0,1557** aşağı; kesinliği 0,4444, yani
işaretlediği kayıtların yarısından çoğu temiz. Yanlış engelleme payı **0,7143**: bu kümedeki
temiz kayıtların dörtte üçü engelleniyor. Savunmanın bozduğu şey burada kendini gösterir.

İkinci blok aynı üç kümeyi model temelli süzgeçle koşturur, sonra her kümenin çözünürlüğünü
ve iki koşum farkını yazar.

```python
AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44,
           "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38,
           "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12}
KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12}


def puan(k, tohum=TOHUM):
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(tohum ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


def model_suzgeci(k, esik=0.40, tohum=TOHUM):
    return puan(k, tohum) >= esik


print("model suzgeci (esik 0,50) , ayni savunma uc kumede")
print(f"{'kume':<18} {'dp':>4} {'yp':>4} {'yn':>4} {'kesinlik':>10} {'duyarlilik':>11}"
      f" {'yanlis engelleme':>17}")
for ad, K in KUME.items():
    o = olc(K, lambda k: model_suzgeci(k, 0.50))
    print(f"{ad:<18} {o['dp']:>4} {o['yp']:>4} {o['yn']:>4} {o['kesinlik']:>10.4f}"
          f" {o['duyarlilik']:>11.4f} {o['yanlis_engelleme_payi']:>17.4f}")

print("\nkumenin cozunurlugu: bir kaydin oynattigi en kucuk fark")
print(f"{'kume':<18} {'zararli':>8} {'temiz':>6} {'duyarlilik adimi':>17}"
      f" {'yanlis engelleme adimi':>23}")
for ad, K in KUME.items():
    z = sum(1 for k in K if zararli(k))
    print(f"{ad:<18} {z:>8} {len(K) - z:>6} {1 / z:>17.4f} {1 / (len(K) - z):>23.4f}")

print("\niki kosum , temsili kume")
print(f"{'savunma':<26} {'kosum 1':>8} {'kosum 2':>9} {'fark':>8}")
a = olc(KAYIT, kural_suzgeci)["duyarlilik"]
print(f"{'kural suzgeci':<26} {a:>8.4f} {a:>9.4f} {0.0:>+8.4f}")
b1 = olc(KAYIT, lambda k: model_suzgeci(k, 0.50, TOHUM))["duyarlilik"]
b2 = olc(KAYIT, lambda k: model_suzgeci(k, 0.50, TOHUM + 1))["duyarlilik"]
print(f"{'model suzgeci (esik 0,50)':<26} {b1:>8.4f} {b2:>9.4f} {b2 - b1:>+8.4f}")
print(f"olculen: duyarlilik . adim 1/93 = {1 / 93:.4f} , fark {abs(b2 - b1) / (1 / 93):.0f} adim")
```

```
model suzgeci (esik 0,50) , ayni savunma uc kumede
kume                 dp   yp   yn   kesinlik  duyarlilik  yanlis engelleme
temsili              66    8   27     0.8919      0.7097            0.0544
zararli agirlikli    66    2   27     0.9706      0.7097            0.0408
sinirda ornek        10    5   15     0.6667      0.4000            0.1786

kumenin cozunurlugu: bir kaydin oynattigi en kucuk fark
kume                zararli  temiz  duyarlilik adimi  yanlis engelleme adimi
temsili                  93    147            0.0108                  0.0068
zararli agirlikli        93     49            0.0108                  0.0204
sinirda ornek            25     28            0.0400                  0.0357

iki kosum , temsili kume
savunma                     kosum 1   kosum 2     fark
kural suzgeci                0.7957    0.7957  +0.0000
model suzgeci (esik 0,50)    0.7097    0.7419  +0.0322
olculen: duyarlilik . adim 1/93 = 0.0108 , fark 3 adim
```

Model temelli süzgeç aynı örüntüyü tekrarlıyor ve bir yerde daha sert bozuluyor. Temsili
kümede kesinliği **0,8919** ile kural süzgecinin **0,7629**'undan belirgin biçimde iyidir;
seçen biri model süzgecini alırdı. Sınırda örnek kümesinde duyarlılığı **0,4000**, kural
süzgecinin **0,6400**'ünden aşağı. Yani iki savunmanın sıralaması **hangi kümeye baktığınıza
göre yer değiştiriyor**. Bu ders bir savunmayı seçmez; seçimin kümeyle birlikte verildiğini
gösterir.

Çözünürlük tablosu ölçüm bandının alt sınırını yazar. Temsili kümede duyarlılık ancak
**0,0108** adımlarla hareket edebilir, çünkü doksan üç zararlı kayıt vardır ve bir kaydın
kararı değiştiğinde oran tam bu kadar oynar. Sınırda örnek kümesinde aynı adım **0,0400**:
yirmi beş zararlı kayıtla ölçülen bir duyarlılık, dört kayıttan küçük hiçbir iyileşmeyi
gösteremez. Zor küme aynı zamanda **en kaba** kümedir ve bu bir çelişki değil, örnek sayısının
doğrudan sonucudur. İki koşum tablosu bandın ikinci kaynağını verir: kural süzgeci yalnız
bayrak okuduğu için iki koşumda **tam olarak aynı** sayıyı verirken, model süzgecinin
duyarlılığı 0,7097'den 0,7419'a, yani **üç adım** oynuyor. Modelin karıştığı bir savunmada
üç adımdan küçük hiçbir fark bir değişikliğe bağlanamaz.

Buradan kursun kuralı bir kez daha okunur ve bu derste bir maddesi eklenir: **durdurduğu pay
ile yanlışlıkla durdurduğu pay birlikte yazılmayan savunma ölçülmemiş sayılır**; ikisi de
yazılmışsa bile **hangi kümede ölçüldüğü ve o kümenin adımı** yazılmadıkça sayı okunamaz.

## Özet

- Savunma hiç değişmeden, yalnız kümenin bileşimi değiştirilerek kural süzgecinden üç ayrı
  kesinlik okundu: temsili kümede 0,7629, zararlı ağırlıklı kümede 0,9136, sınırda örnek
  kümesinde 0,4444.
- Duyarlılık ilk iki kümede **birebir aynı** kaldı (0,7957), çünkü zararlı alt küme
  değişmedi; oynayan tek şey temiz kayıt sayısıydı. Kesinlik kümenin zararlı payı yazılmadan
  raporlanamaz.
- Sınırda örnek kümesinde savunmanın bedeli görünür oluyor: duyarlılık 0,6400'e iniyor,
  yanlış engelleme payı **0,7143**'e çıkıyor, yani o kümedeki temiz kayıtların dörtte üçü
  engelleniyor.
- İki savunmanın sıralaması kümeye göre yer değiştiriyor: model süzgeci temsili kümede daha
  kesin (0,8919), sınırda örnek kümesinde daha duyarsız (0,4000).
- Kümenin çözünürlüğü ölçüm bandının alt sınırıdır: duyarlılığın adımı temsili kümede 0,0108,
  sınırda örnek kümesinde 0,0400. Kural süzgeci iki koşumda aynı sayıyı verirken model
  süzgecinin duyarlılığı üç adım oynuyor.

## Sonraki Adım

Bu derste her kararın doğruluğu kaydın gerçek sınıfına bakılarak belirlendi ve o sınıf hazır
verilmiş kabul edildi. Üretimde böyle bir sütun yoktur: yeni gelen bir kaydın zararlı olup
olmadığını birinin **söylemesi** gerekir. Bunu yapmanın iki yolu vardır; biri yapısal ölçütler
yazmak, öbürü bir dil modeline sormaktır. Sonraki ders bu iki yolu yan yana koyar ve ikisini
de aynı iki soruyla sınar: verdikleri etiket insanın verdiği etiketle ne kadar uyuşuyor, ve
aynı kayda **iki kez** sorulduğunda kaç kararı değişiyor.
