Ders 20 / 21
Geri Bildirim Döngüsü
Kullanıcı sinyalinin değerlendirmeye döndüğünde niçin yanlı döndüğünün ölçülmesi: eşik 0,50 kurulumunda 74 kayıt engelleniyor, 8'i yanlış alarm ve 27 zararlı kaçıyor; kaçan zararlının 0,6296'sı şikâyet üretiyor ama yanlış alarmın kapsanan payı itiraz kanalı kapalıyken 0,0000, dar bir itiraz kanalıyla 0,3750'dir ve gelen altı itirazın yalnız üçü gerçek yanlış alarmdır. Sinyalden okunan iki sayıyla beş tur ayarlanan eşik 0,50'den 0,30'a iniyor: yanlış alarm 8'den 27'ye, yanlış engelleme payı 0,0544'ten 0,1837'ye çıkıyor, duyarlılık 0,7097'den 0,9032'ye yükseliyor ve döngü yalnız ikincisini görüyor. Toplam hata 35'ten 36'ya gidiyor, yani döngü hatayı azaltmıyor, kimin ödediğini değiştiriyor.
İçindekiler
Bir önceki derste gösterge iki kaynaktan hesaplandı: her istek için tutulan iz kaydından ve engellenen kayıtların üçte birinin insan incelemesinden. İkincisi pahalıdır — üç yüz kayıtta otuz iki inceleme. Bedava görünen üçüncü bir kaynak vardır: kullanıcının kendisi. Yanıtı beğenmediğini söyler, düzeltme gönderir, aynı soruyu yeniden sorar. Bu sinyal değerlendirme kümesine dönebilir ve bir sonraki turun savunmasını ayarlayabilir.
Sorulmayan şey şudur: bu sinyali kim gönderebiliyor. Engellenen kullanıcı yanıtı hiç görmez; gördüğü tek şey bir engelleme iletisidir ve söyleyecek yeri yoktur. Döngüye yalnızca geçenlerin sesi ulaşır. Bu ders sinyalin kapsadığı payı ve yanlılığın yönünü ölçer, sonra o sinyalle beş tur ayarlanan bir savunmanın ne olduğunu sayar.
- DG57. Kayıtlar, sınıflar, savunma ve sinyal kurgudur. Kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnızca yapısal öznitelik profilinde durur. Küme kursun 240 kaydı, 93 zararlı ve 147 temiz.
- DG58. Üretimde kurulu savunma model süzgeci, eşik 0,50’dir. Savunmasız taban hiçbir süzgeç, işaretleme ya da kapı içermez.
- DG59. Geçen kayıtta kullanıcı yanıtı görür: kaydı zararlı olanların 0,55’i, temiz olanların 0,04’ü şikâyet üretir. Şikâyet payının zararlıda yüksek olması, kötü yanıtın görülmesindendir.
- DG60. Engellenen kullanıcı şikâyet üretemez. İtiraz kanalı kapalı ya da dardır; dar kanalda yanlışlıkla engellenen temiz kaydın 0,25’i, doğru engellenen zararlı kaydın 0,05’i itiraz eder.
- DG61. Döngünün kuralı: sinyalden okunan iki sayıdan büyük olan yönde eşik 0,05 oynatılır. Döngü gerçek etiketleri görmez; etiketli sütunlar yalnızca ölçüm içindir.
- DG62. Kümenin çözünürlüğü: duyarlılığın adımı 1/93 = 0,0108, yanlış engelleme payının adımı 1/147 = 0,0068. İki koşum tohum 20260218 ve 20260219 ile alınır.
Sinyalin Kapsadığı Pay
İlk blok kursun ortak tanımını kurar ve üzerine sinyal modelini ekler. Koşan her işlev savunma tarafındadır.
# KURGUDUR. Kayitlarin metni tumuyle zararsiz destek talepleridir ve sinifla # hicbir iliskisi yoktur; sinif yalnizca yapisal ozellik profilinde durur. 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], } 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" 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 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} # ---- KULLANICI SINYALI (kurgu). Engellenen kullanici yaniti hic gormez: # ona yalnizca dar bir itiraz kanali aciktir , o da acilmissa. ESIK = 0.50 # uretimde kurulu savunma SIKAYET_Z, SIKAYET_T = 0.55, 0.04 # gecen kaydin sikayet payi ITIRAZ_T, ITIRAZ_Z = 0.25, 0.05 # engellenen kaydin itiraz payi def sinyal(k, engellendi, tohum, kanal): r = uretec(tohum ^ izno(("sinyal", k["no"]))) if engellendi: if not kanal: return None return "itiraz" if r() < (ITIRAZ_T if not zararli(k) else ITIRAZ_Z) else None return "sikayet" if r() < (SIKAYET_Z if zararli(k) else SIKAYET_T) else None def dongu_turu(esik, tohum, kanal): """Bir tur: savunma kosar , sinyal toplanir. Sinif etiketi yalniz olcum icindir.""" kr = {k["no"]: model_suzgeci(k, esik) for k in KAYIT} m = olc(KAYIT, lambda k: kr[k["no"]]) s = [sinyal(k, kr[k["no"]], tohum, kanal) for k in KAYIT] sayi = {"itiraz": sum(x == "itiraz" for x in s), "sikayet": sum(x == "sikayet" for x in s), "dogru_itiraz": sum(1 for k, x in zip(KAYIT, s) if x == "itiraz" and not zararli(k)), "dogru_sikayet": sum(1 for k, x in zip(KAYIT, s) if x == "sikayet" and zararli(k)), "kapsam": sum(x is not None for x in s)} return m, sayi t = olc(KAYIT, lambda k: model_suzgeci(k, ESIK)) print(f"savunmasiz taban: engellenen 0 , yanlis alarm 0 , kacan zararli {t['dp'] + t['yn']}") print(f"esik {ESIK:.2f}: engellenen {t['dp'] + t['yp']} , yanlis alarm {t['yp']} ," f" kacan zararli {t['yn']}") print("\ntohum kanal sikayet(dogru) itiraz(dogru) kapsanan yn kapsanan yp kapsam") for tohum in (TOHUM, 20260219): for ad, kanal in (("kapali", False), ("dar", True)): m, s = dongu_turu(ESIK, tohum, kanal) print(f"{tohum} {ad:<7} {s['sikayet']:>7} ({s['dogru_sikayet']:>2})" f" {s['itiraz']:>9} ({s['dogru_itiraz']}) {s['dogru_sikayet'] / m['yn']:>12.4f}" f" {s['dogru_itiraz'] / m['yp']:>12.4f} {s['kapsam'] / len(KAYIT):>12.4f}")
savunmasiz taban: engellenen 0 , yanlis alarm 0 , kacan zararli 93 esik 0.50: engellenen 74 , yanlis alarm 8 , kacan zararli 27 tohum kanal sikayet(dogru) itiraz(dogru) kapsanan yn kapsanan yp kapsam 20260218 kapali 20 (17) 0 (0) 0.6296 0.0000 0.0833 20260218 dar 20 (17) 6 (3) 0.6296 0.3750 0.1083 20260219 kapali 25 (18) 0 (0) 0.6667 0.0000 0.1042 20260219 dar 25 (18) 8 (3) 0.6667 0.3750 0.1375
Savunmasız tabanda hiç kimse susturulmaz: hiçbir kayıt engellenmediği için sinyal kanalı herkese açıktır ve yanlış alarm zaten sıfırdır. Yanlılık savunmanın kendisinden doğar. Eşik 0,50 kurulumunda 74 kayıt engellenir, bunların 8’i yanlış alarmdır ve o sekiz kullanıcı yanıtı hiç görmemiştir.
Kapsanan pay iki tarafta apayrıdır. Kaçan 27 zararlının 0,6296‘sı şikâyet üretiyor. Yanlış alarm tarafında kanal kapalıyken pay 0,0000, dar kanalla 0,3750. Sinyalin toplam kapsamı 0,0833 ile 0,1375 arasında: on kayıttan ancak biri döngüye bir şey söylüyor. Dar kanalın kendisi de temiz bir ölçü değil — gelen 6 itirazın yalnız **3’ü** gerçek yanlış alarmdır, çünkü doğru engellenen 66 kayıt yanlış engellenen 8 kaydı sayıca ezer. Yanlış alarmı arayan sinyalin kesinliği 0,50’dir.
Beş Tur Ayarlama
İkinci blok sinyalden okunan iki sayıyla eşiği oynatır ve her turda gerçek sayıları yanına yazar.
# Dongunun kurali: sinyalden okunan iki sayidan buyuk olan yonde adim atilir. # Dongu gercek etiketleri GORMEZ; asagidaki gercek sutunlari yalniz olcum icindir. ADIM, TUR, TABAN_ESIK = 0.05, 5, 0.50 def dongu(tohum, kanal, tur_sayisi=TUR): esik, satir = TABAN_ESIK, [] for _ in range(tur_sayisi): m, s = dongu_turu(esik, tohum, kanal) satir.append((esik, m, s)) if s["sikayet"] > s["itiraz"]: esik = round(esik - ADIM, 2) # daha cok engelle elif s["itiraz"] > s["sikayet"]: esik = round(esik + ADIM, 2) # daha az engelle return satir print("tohum 20260218") print(" kanal tur esik gercek yp gercek yn yanlis eng. duyarlilik sikayet itiraz") for ad, kanal in (("kapali", False), ("dar", True)): for i, (e, m, s) in enumerate(dongu(TOHUM, kanal)): print(f" {ad:<7} {i + 1:>3} {e:>5.2f} {m['yp']:>10} {m['yn']:>10}" f" {m['yanlis_engelleme_payi']:>12.4f} {m['duyarlilik']:>11.4f}" f" {s['sikayet']:>8} {s['itiraz']:>7}") print("\ntohum 20260219: esik yolu ayni , sinyal sayilari farkli") for ad, kanal in (("kapali", False), ("dar", True)): d = dongu(20260219, kanal) print(f" {ad:<7} sikayet {[s['sikayet'] for _, _, s in d]}" f" itiraz {[s['itiraz'] for _, _, s in d]}") print("\nesik yp+yn (etiketli okuma , donguye kapali)") for e in (0.50, 0.45, 0.40, 0.35, 0.30): m = olc(KAYIT, lambda k, e=e: model_suzgeci(k, e)) print(f"{e:.2f} {m['yp'] + m['yn']:>7}")
tohum 20260218 kanal tur esik gercek yp gercek yn yanlis eng. duyarlilik sikayet itiraz kapali 1 0.50 8 27 0.0544 0.7097 20 0 kapali 2 0.45 15 20 0.1020 0.7849 16 0 kapali 3 0.40 20 16 0.1361 0.8280 14 0 kapali 4 0.35 23 12 0.1565 0.8710 11 0 kapali 5 0.30 27 9 0.1837 0.9032 10 0 dar 1 0.50 8 27 0.0544 0.7097 20 6 dar 2 0.45 15 20 0.1020 0.7849 16 6 dar 3 0.40 20 16 0.1361 0.8280 14 6 dar 4 0.35 23 12 0.1565 0.8710 11 10 dar 5 0.30 27 9 0.1837 0.9032 10 11 tohum 20260219: esik yolu ayni , sinyal sayilari farkli kapali sikayet [25, 20, 18, 16, 14] itiraz [0, 0, 0, 0, 0] dar sikayet [25, 20, 18, 16, 14] itiraz [8, 8, 9, 10, 11] esik yp+yn (etiketli okuma , donguye kapali) 0.50 35 0.45 35 0.40 36 0.35 35 0.30 36
Yanlılığın Yönü
Kanal kapalıyken itiraz sütunu beş turun beşinde de sıfırdır. Döngü bunu “yanlış alarm yok” diye okur ve her turda aynı yöne bir adım daha atar. Beş turun sonunda eşik 0,50’den 0,30’a inmiş, yanlış alarm 8’den 27’ye çıkmış, yanlış engelleme payı 0,0544’ten 0,1837‘ye yükselmiştir. İkisi de kümenin çözünürlüğünün çok üstünde: yanlış engelleme payının adımı 0,0068, gözlenen değişim onun on dokuz katı. Döngünün gördüğü tek sayı olan şikâyet ise 20’den 10’a inmiştir, yani döngü kendi ölçütünde her turda iyileşme raporlamıştır.
Aynı tabloda duyarlılık 0,7097’den 0,9032’ye çıkıyor ve bu gerçek bir kazançtır. Kursun kuralı tam burada devreye girer: durdurduğu pay ile yanlışlıkla durdurduğu pay birlikte yazılmayan savunma ölçülmemiş sayılır. Döngü ikinci payı yazamaz, çünkü o payı ödeyen kullanıcıların kanalı yoktur. Son tablo bunu tek satırda özetliyor: toplam hata beş eşikte 35, 35, 36, 35, 36’dır. Döngü hatayı azaltmadı; kimin ödediğini değiştirdi ve ödeyeni göremediği için bunu bir iyileşme olarak kaydetti.
Dar kanal bir ölçü değil, bir frendir. Beşinci turda itiraz 11, şikâyet 10 olur ve döngü ilk kez ters yöne dönecektir. Ama o noktada yanlış alarm zaten 3,4 katına çıkmıştır: fren üç tur geç tutuyor. İkinci koşum bu okumayı bozmuyor — eşik yolu iki tohumda birebir aynı, yalnız sinyal sayıları değişiyor (şikâyet 20 yerine 25, itiraz 6 yerine 8). Kararı yeniden üretilebilir, sayıları değil. Kapsanan pay okunurken çözünürlük de yazılmalıdır: yanlış alarm tarafının paydası sekiz kayıttır, adımı 0,1250’dir ve 0,3750 bu adımdan yalnız üç basamaktır.
Yanlılığın kaynağı sinyalin kalitesi değil, kanalın geometrisidir. Geçen kayıt kullanıcıya bir yanıt gösterir ve yanıt kötüyse söyleyecek bir şey doğar; engellenen kayıt hiçbir yanıt göstermez ve söylenecek şeyin kendisi oluşmaz. Bu yüzden kaçan zararlı tarafının kapsanan payı yanlış alarm tarafınınkinin dar kanalda 1,68 katı, kapalı kanalda sonsuz katıdır. Bunu düzelten şey daha çok sinyal toplamak değildir: yanlış alarm tarafının tek yansız okuması bir önceki dersin örneklenmiş insan incelemesidir ve bedeli üç yüz kayıtta otuz iki incelemedir. Bedava sinyal, ücretli ölçünün yerine geçmez.
Bu ders kursun ikinci iddiasının bir örneğidir. Eklenen şey bir süzgeç değil, bir denetim düzeneğidir: savunmayı kullanıcıdan gelen veriyle ayarlayan bir döngü. Hiçbir yeni zararlı sınıfı yakalamadı, yanlış alarmı 3,4 katına çıkardı ve bunu kendi göstergesinde göremedi.
Özet
- Yanlılık savunmadan doğar: savunmasız tabanda kimse engellenmediği için kanal herkese açıktır, eşik 0,50’de sekiz kullanıcı yanıtı hiç görmez ve söyleyecek yeri olmaz.
- Kaçan zararlının 0,6296’sı sinyal üretir, yanlış alarmın kapsanan payı kanal kapalıyken 0,0000, dar kanalla 0,3750’dir; toplam kapsam on kayıtta birdir.
- Dar kanalın kesinliği de düşüktür: altı itirazın üçü gerçek yanlış alarmdır, çünkü doğru engellenen 66 kayıt yanlış engellenen 8 kaydı sayıca ezer.
- Sinyalle beş tur ayarlanan eşik 0,50’den 0,30’a iner; yanlış alarm 8’den 27’ye, yanlış engelleme payı 0,0544’ten 0,1837’ye çıkar, döngü ise her turda iyileşme raporlar.
- Toplam hata 35 ile 36 arasında kalır: döngü hatayı azaltmaz, kimin ödediğini değiştirir.
Sonraki Adım
Yedi derste ölçüldü, izlendi ve ayarlandı. Bütün bu sayılar şimdiye kadar içeride kaldı: kümeyi kuran, göstergeyi okuyan ve eşiği oynatan aynı ekiptir. Sistemi kullanan, ona veri veren ve engellendiğinde itiraz edecek yeri olmayan taraf hiçbirini görmedi. Bir sistemin dışarıya ne söylediği, hangi ölçüyü yayımladığı, hangisini yayımlamadığı ve yayımlamadığı ölçünün ne anlama geldiği hiç sorulmadı. Son ders bunu ölçer: bir sistem kartının taşıdığı sayılar, taşımadığı sayılar ve taşımadığı her sayının bir iddia olarak kalması.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.