İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat