Ders 15 / 21
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.
İçindekiler
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.
# 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.
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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.