---
title: 'Girdi ve Çıktı Süzgeçleri'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/girdi-ve-cikti-suzgecleri'
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'
---

# Girdi ve Çıktı Süzgeçleri

Kural temelli ve model temelli denetimin aynı kayıt kümesinde durdurduğu zararlıyla birlikte yanlışlıkla durdurduğu temiz kaydın da sayılması: kural süzgeci girdi tarafı ile çıktı tarafına ayrıldığında biri 55, öbürü 44 zararlı durduruyor ve birleşimleri 74'e çıkıyor; model temelli süzgeç 0,50 eşiğinde daha az zararlı durdurup çok daha az temiz kaydı engelliyor; ikisini üst üste koymak kural süzgecinin tek başına verdiğinden kötüdür — duyarlılık 0,7957'de aynı kalıyor, kesinlik 0,7629'dan 0,7551'e düşüyor, yanlış engelleme payı 0,1565'ten 0,1633'e çıkıyor ve katman bir tek yeni zararlı yakalamadan bir temiz kaydı fazladan engelliyor.

Sekiz derste saldırı yüzeyi sayıldı: beş zararlı sınıf, her birinin kaynak dağılımı ve savunmanın
o sınıfta yakaladığı pay. Bütün o derslerde savunma tarafında duran şey **tek bir süzgeçti** ve ona
tek bir soru soruldu — bu sınıfın ne kadarını durduruyor. Süzgecin kendisi hiç açılmadı.

Oysa bir süzgecin iki yeri vardır. Bir bölümü **modele girmeden önce** okunabilen şeye bakar, bir
bölümü ise **yanıtın dışarı taşıdığına**. Bu iki yer aynı kaydı görmez ve aynı sınıfı yakalamaz.
Üstelik hiç sorulmamış ikinci bir soru daha var: bir süzgecin üstüne ikinci bir süzgeç konduğunda
ne oluyor. Bu ders ikisini de sayar ve ikincisinin yanıtı kursun geri kalanını belirler.

- **SV1.** Kayıt kümesi, sınıflar ve savunma katmanları **kurgudur**; gerçek bir model uç noktası
  çağrılmaz. Tohum **20260218**, ikinci koşum **20260219**.
- **SV2.** **Bu bir saldırı dersi değildir.** Koşan kodun tamamı savunma tarafındadır: süzgeç,
  sayım ve ölçü. Çalışan bir saldırı, yük ya da atlatma yordamı yazılmaz.
- **SV3.** **Saldırı bir metin değil bir öznitelik profilidir.** Kayıtların taşıdığı `metin` alanı
  altı sıradan destek talebinden birine eşittir ve **sınıfla hiçbir ilişkisi yoktur**; sınıf bilgisi
  yalnızca yapısal öznitelik profilinde durur.
- **SV4.** Taban çizgisi **savunmasız kurulumdur**: hiçbir süzgeç yok, durdurulan zararlı 0, yanlış
  alarm 0.
- **SV5.** Kural süzgecinin girdi ve çıktı tarafına ayrılması bir kurgudur; ayrım, özniteliğin
  modele girmeden mi yoksa yanıt üretildikten sonra mı okunabildiğine göre yapılır.
- **SV6.** Girdi doğrulamanın genel yordamı Güvenli Kodlama kursunda ölçüldü ve burada
  tekrarlanmaz; bu ders yalnız **dil modeline giden metne** özgü olanı ekler.
- **SV7.** Kümenin çözünürlüğü ölçüm bandının alt sınırıdır: duyarlılığın adımı **0,0108**, yanlış
  engelleme payının adımı **0,0068**.

## Kayıt Kümesi ve Savunmanın İki Sayısı

Birinci blok kursun ortak tanımını kurar. İki şeye dikkat etmek gerekir. Birincisi, `METIN`
listesindeki altı cümle sıradan abone talepleridir; hiçbiri yönerge, yük ya da atlatma metni
taşımaz ve hangi sınıfa ait bir kayda düştükleri **rastlantısaldır**. İkincisi, sınıfı belirleyen
şey `PROFIL` sözlüğüdür: her sınıfın hangi yapısal özniteliği hangi olasılıkla taşıdığı. Temiz
kayıtlarda da düşük paylar vardır, çünkü iyi niyetli bir talep de uzun olabilir ya da yönerge
kipinde yazılmış olabilir.

```python
# KURGUDUR. Kayit kumesi, siniflar, ozellikler ve savunma katmanlari ders icinde
# tanimlanir; gercek bir model uc noktasi cagrilmaz.
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


# ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR
SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
# Ozellikler yapisaldir; hicbiri calisan bir yuk degildir.
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
# Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var:
# gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir.
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;
# sinif bilgisi yalnizca ozellik profilinde durur.
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"


# ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir)
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)


# ---- SAVUNMA 2: model temelli suzgec (puan + esik)
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):
    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):
    return puan(k) >= esik


# ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir
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}
```

`olc` işlevi kursun kuralını koda geçirir: her karar için **durdurulan zararlı** (`dp`) ile
**yanlışlıkla durdurulan temiz** (`yp`) yan yana döner. Üçüncü sütun `yn`, yani **kaçan zararlı** ya
da **yanlış negatif**; kurs boyunca kaçan zararlı adıyla anılır. Tek başına kesinlik ya da tek
başına duyarlılık basan bir savunma bu kursta ölçülmemiş sayılır.

## Süzgeç Nerede Duruyor

Ortak tanımın kural süzgeci dört öznitelik okur. Bunlardan ikisi kayıt modele girmeden önce
bellidir: metin yönerge kipinde mi yazılmış (`yonerge_kipi`) ve kaydın taşıdığı kaynak damgası
geldiği yerle uyuşuyor mu (`kaynak_damgasi_uyusmuyor`). Öbür ikisi ise ancak yanıt üretilirken
görünür: yanıtın taşıdığı gizli alan adı (`gizli_alan_adi`) ve istenen yan etkili araç çağrısı
(`yan_etkili_arac_adi`). Birinci ikili **girdi süzgeci**, ikincisi **çıktı süzgecidir**.

```python
GIRDI_KURALI = ("yonerge_kipi", "kaynak_damgasi_uyusmuyor")
CIKTI_KURALI = ("gizli_alan_adi", "yan_etkili_arac_adi")


def girdi_suzgeci(k):
    """Modele girmeden once okunabilen yapisal ozellikler."""
    return kural_suzgeci(k, GIRDI_KURALI)


def cikti_suzgeci(k):
    """Yanitin disari tasiyacagi alan ve cagri adlari."""
    return kural_suzgeci(k, CIKTI_KURALI)


def yaz(ad, s):
    print(f"{ad:<20}{s['dp']:>4}{s['yp']:>4}{s['yn']:>4}{s['kesinlik']:>10.4f}"
          f"{s['duyarlilik']:>12.4f}{s['yanlis_engelleme_payi']:>12.4f}")


print("kayit:", len(KAYIT), " zararli:", sum(1 for k in KAYIT if zararli(k)),
      " temiz:", sum(1 for k in KAYIT if not zararli(k)))
print("kaynak:", {a: sum(1 for k in KAYIT if k["kaynak"] == a) for a in KAYNAK})
print()
print(f"{'kurulum':<20}{'dp':>4}{'yp':>4}{'yn':>4}{'kesinlik':>10}"
      f"{'duyarlilik':>12}{'yanlis eng.':>12}")
yaz("savunmasiz taban", olc(KAYIT, lambda k: False))
yaz("girdi suzgeci", olc(KAYIT, girdi_suzgeci))
yaz("cikti suzgeci", olc(KAYIT, cikti_suzgeci))
yaz("girdi + cikti", olc(KAYIT, lambda k: girdi_suzgeci(k) or cikti_suzgeci(k)))
yaz("kural suzgeci", olc(KAYIT, kural_suzgeci))

yalniz_cikti = [k for k in KAYIT if zararli(k) and cikti_suzgeci(k) and not girdi_suzgeci(k)]
yalniz_girdi = [k for k in KAYIT if zararli(k) and girdi_suzgeci(k) and not cikti_suzgeci(k)]
kacan = [k for k in KAYIT if zararli(k) and not girdi_suzgeci(k) and not cikti_suzgeci(k)]
print()
print(f"{'sinif':<20}{'yalniz girdi':>13}{'yalniz cikti':>14}{'kacan':>7}")
for s in SINIF[1:]:
    print(f"{s:<20}" + "".join(f"{sum(1 for k in u if k['sinif'] == s):>{g}}"
                               for u, g in ((yalniz_girdi, 13), (yalniz_cikti, 14), (kacan, 7))))
print(f"{'toplam':<20}{len(yalniz_girdi):>13}{len(yalniz_cikti):>14}{len(kacan):>7}")
```

```
kayit: 240  zararli: 93  temiz: 147
kaynak: {'kullanici': 137, 'erisilen_belge': 72, 'arac_ciktisi': 31}

kurulum               dp  yp  yn  kesinlik  duyarlilik yanlis eng.
savunmasiz taban       0   0  93    0.0000      0.0000      0.0000
girdi suzgeci         55  13  38    0.8088      0.5914      0.0884
cikti suzgeci         44  12  49    0.7857      0.4731      0.0816
girdi + cikti         74  23  19    0.7629      0.7957      0.1565
kural suzgeci         74  23  19    0.7629      0.7957      0.1565

sinif                yalniz girdi  yalniz cikti  kacan
dolayli_yonerge                11             1      0
gizli_alan_istegi               2             8      1
yetki_asimi                     0             6      1
kaynak_taklidi                 15             1      3
bozulmus_girdi                  2             3     14
toplam                         30            19     19
```

## Yakalanan ve Kaçan

Taban satırı kursun her dersinde aynıdır: savunma yokken durdurulan zararlı **0**, yanlış alarm
**0**, kaçan zararlı **93**. Her savunma bu sıfırın üstüne bir bedel koyar.

Girdi süzgeci tek başına **55 zararlı** durduruyor ve **13 temiz** kaydı engelliyor: duyarlılık
0,5914, yanlış engelleme payı 0,0884. Çıktı süzgeci **44 zararlı** durduruyor, **12 temiz** kaydı
engelliyor: duyarlılık 0,4731. İki sayı tek başına okunduğunda girdi tarafı açık ara üstün görünür.
İkinci tablo bunun yanıltıcı olduğunu gösterir: çıktı süzgecinin durdurduğu **19 zararlı**, girdi
süzgecinin **hiç görmediği** kayıtlardır ve bunların 8'i gizli alan isteği, 6'sı yetki aşımı
sınıfındandır. Bu iki sınıfın yapısı zaten böyledir — kaydın girdi tarafı sıradan bir talep gibi
görünür, ayırt edici şey yanıtın taşıyacağı alan adıdır. Simetrik olarak girdi süzgecinin yalnız
başına yakaladığı 30 kaydın 15'i kaynak taklidi, 11'i dolaylı yönergedir.

Birleşim satırı iki tarafın gerçekten farklı işler yaptığını doğrular: 55 ile 44 toplandığında 99
değil **74** çıkar, yani 25 kayıtta ikisi de aynı şeyi yakalamıştır. Duyarlılık 0,5914'ten
0,7957'ye çıkıyor — çözünürlüğün on dokuz katı bir fark. Bedeli de aynı tabloda: yanlış engelleme payı 0,0884'ten 0,1565'e çıkıyor, engellenen
temiz kayıt 13'ten 23'e. Dört kurallı süzgeç ile girdi artı çıktı birleşimi **birebir aynı satırı**
verir; ayrım kümeyi bozmuyor.

Son sütun savunmanın körlüğünü adıyla yazar. İki süzgecin birlikte kaçırdığı 19 zararlının **14'ü
bozulmuş girdi sınıfındandır**. O sınıfın profili dört kuralın hiçbirini yüksek olasılıkla
taşımaz; ayırt edici öznitelikleri damga dağılımı ve aşırı uzunluktur ve kural kümesi bunlara
bakmaz. Bir sınıfın tamamına yakınının kaçması, ortalama duyarlılık 0,7957 yazıldığında görünmez.

## Katman Üstüne Katman

Kaçırılan sınıf için akla gelen ilk çözüm ikinci bir süzgeç eklemektir. Model temelli süzgeç yedi
özniteliğin hepsine ağırlıklı bir puan verir, kaynağa göre ek puan ekler ve bir eşikle karar
üretir; kural süzgecinin bakmadığı damga dağılımını da okur.

```python
def puan_ikinci(k):
    """Ayni model, ikinci kosum: yalnizca gurultunun tohumu degisir."""
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(20260219 ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


print(f"{'kurulum':<20}{'dp':>4}{'yp':>4}{'yn':>4}{'kesinlik':>10}"
      f"{'duyarlilik':>12}{'yanlis eng.':>12}")
yaz("kural suzgeci", olc(KAYIT, kural_suzgeci))
yaz("model suzgeci 0,50", olc(KAYIT, lambda k: model_suzgeci(k, 0.50)))
yaz("kural VEYA model", olc(KAYIT, lambda k: kural_suzgeci(k) or model_suzgeci(k, 0.50)))

ek = [k for k in KAYIT if not kural_suzgeci(k) and model_suzgeci(k, 0.50)]
print("\nkatmanin kural suzgecine ekledigi kayit:", len(ek),
      " sinifi:", [k["sinif"] for k in ek])
print("katmanin ekledigi yeni zararli:", sum(1 for k in ek if zararli(k)))

print("\nikinci kosum, ayni kayitlar, gurultu tohumu 20260219:")
yaz("kural suzgeci", olc(KAYIT, kural_suzgeci))
yaz("model suzgeci 0,50", olc(KAYIT, lambda k: puan_ikinci(k) >= 0.50))
print("iki kosumda karari degisen kayit:",
      sum(1 for k in KAYIT if model_suzgeci(k, 0.50) != (puan_ikinci(k) >= 0.50)))
print("duyarlilik adimi:", round(1 / 93, 4), " yanlis engelleme adimi:", round(1 / 147, 4))
```

```
kurulum               dp  yp  yn  kesinlik  duyarlilik yanlis eng.
kural suzgeci         74  23  19    0.7629      0.7957      0.1565
model suzgeci 0,50    66   8  27    0.8919      0.7097      0.0544
kural VEYA model      74  24  19    0.7551      0.7957      0.1633

katmanin kural suzgecine ekledigi kayit: 1  sinifi: ['temiz']
katmanin ekledigi yeni zararli: 0

ikinci kosum, ayni kayitlar, gurultu tohumu 20260219:
kural suzgeci         74  23  19    0.7629      0.7957      0.1565
model suzgeci 0,50    69   8  24    0.8961      0.7419      0.0544
iki kosumda karari degisen kayit: 11
duyarlilik adimi: 0.0108  yanlis engelleme adimi: 0.0068
```

## Savunma da Bozar

Üçüncü satır bu kursun ikinci iddiasının kanıtıdır ve adıyla yazılmalıdır: **kural süzgeci ile
model süzgecini üst üste koymak, kural süzgecinin tek başına verdiğinden kötüdür.** Kesinlik
0,7629'dan **0,7551**'e düşüyor, yanlış engelleme payı 0,1565'ten **0,1633**'e çıkıyor ve
duyarlılık **0,7957'de aynı kalıyor**. Katmanın kural süzgecine eklediği kayıt sayısı **1**'dir ve
o kayıt **temiz** sınıfındandır. Cümle şudur: katman **bir tek yeni zararlı yakalamadı, bir temiz
kaydı fazladan engelledi.**

Sayıların çözünürlüğe göre okunması gerekir. Yanlış engelleme payındaki 0,0068'lik değişim tam
olarak bir adımdır, yani tek bir temiz kayıt. Duyarlılıktaki fark **sıfırdır** ve bu sıfır
çözünürlüğe bağlı bir bilinmezlik değil, gerçek bir sıfırdır: eklenen küme tek elemanlıdır ve o
eleman zararlı değildir.

Neden böyle olduğu ikinci satırda yazılıdır. Model süzgeci 0,50 eşiğinde **daha az** zararlı
durduruyor (66'ya karşı 74) ama **çok daha az** temiz kaydı engelliyor (8'e karşı 23) ve kesinliği
0,8919. Bu, kural süzgecinden daha kötü değil, **başka bir dengede** duran bir savunmadır. İkisini
VEYA ile birleştirmek iki savunmanın iyi yanlarını değil, **işaretledikleri kümelerin birleşimini**
alır; kesinliği yüksek olan savunmanın işaretlediği 74 kaydın 73'ü zaten kural süzgecinin
işaretlediği kümenin içindedir. Birleşim yalnızca yanlış alarmları toplar. Katmanı kesinliğin
yüksekliğine bakarak eklemek, kesinliğin **hangi küme üzerinde** ölçüldüğünü sormamak demektir.

Son blok belirsizliği ayırır. Kural süzgeci iki koşumda **birebir aynı** satırı verir; yapısal
özniteliklere bakar, puan üretmez, dolayısıyla koşumdan bağımsızdır. Model süzgeci ise oynar: aynı
240 kayıtta 11 kaydın kararı değişiyor, durdurulan zararlı 66'dan 69'a, duyarlılık 0,7097'den
0,7419'a çıkıyor. Fark 0,0322, yani çözünürlüğün üç katı — bant içinde değil, **gerçek** bir
oynama. Kesinlikteki 0,0042'lik ve yanlış engellemedeki sıfır fark ise ölçülemez. Bir savunmanın
tek koşumla bildirilen duyarlılığı, bu kümede en az üç adımlık bir bandın içindedir.

## Özet

- Savunmasız taban her derste aynıdır: durdurulan zararlı 0, yanlış alarm 0, kaçan zararlı 93.
- Kural süzgeci girdi tarafı (55 zararlı, 13 yanlış alarm) ile çıktı tarafına (44 zararlı, 12
  yanlış alarm) ayrılır; birleşimleri 74 zararlı ve 23 yanlış alarm verir, çünkü ayrı sınıfları
  yakalarlar.
- İkisinin birlikte kaçırdığı 19 zararlının 14'ü bozulmuş girdi sınıfındandır; ortalama duyarlılık
  0,7957 bu körlüğü gizler.
- Kural süzgeci ile model süzgecini üst üste koymak kesinliği 0,7629'dan 0,7551'e düşürür, yanlış
  engelleme payını 0,1565'ten 0,1633'e çıkarır ve duyarlılığı hiç değiştirmez: katman bir tek yeni
  zararlı yakalamadan bir temiz kaydı fazladan engeller.
- Kural süzgeci iki koşumda aynı sayıyı verir; model süzgecinin duyarlılığı 0,7097 ile 0,7419
  arasında oynar, bu üç çözünürlük adımıdır ve tek koşumla bildirilemez.

## Sonraki Adım

Bu dersin bütün sayıları tek bir karardan okundu: durdur ya da geçir. Süzgeç bir kaydın zararlı
olduğunu söylediğinde **hangi zararlı** olduğunu söylemiyor ve ölçü de tek bir çift sayıya
sıkışıyor. Oysa son sütun bir sınıfın neredeyse tamamının kaçtığını gösterdi. Bir savunma sınıf adı
da üretirse, durdurulan zararlının hangi sınıftan geldiği ve tek bir ortalama oranın hangi sınıfı
gizlediği sorulabilir hâle gelir. Sonraki ders süzgeci bir **içerik denetimine** çevirir ve
kesinlik ile duyarlılığı sınıf başına ayrı ayrı basar.
