İçeriğe geç
academia.sh

Ders 05 / 22

Yanlış Pozitif ve Yanlış Negatif

900 aday kalemin 20'si kurgu kalemdir ve dört öznitelikten çıkan puanların dağılımları 37–88 bandında üst üste biner: bu bantta 157 meşru ve 17 kurgu kalem vardır, hiçbir eşik ikisini birden ayıramaz. Eşik 40'ta yanlış pozitif 124 ve kaçırılan 1, eşik 80'de yanlış pozitif 1 ve kaçırılan 11; toplam hatayı en aza indiren 70 eşiğinde bile 4 yanlış pozitif ve 4 kaçırılan kalır. Günde 144 analist-dakikalık bütçe eşiği 72'ye çiviliyor: 16 uyarı, 7 kaçırılan kalem ve 42 erişilen ek kalem. Beşinci bir öznitelik bandı 49–75'e ve 15 meşru ile 7 kaleme daraltıyor, bütçe eşiğini 66'ya çekiyor, ama sıfır-sıfır veren eşik yine yok.

İçindekiler

Bir önceki dersin dört ölçütü sabit eşiklerle çalıştı ve 43 işaretin 39’u meşru çıktı. Akla gelen ilk düzeltme eşikleri sıkılaştırmaktır: değişim katsayısını 0,15 yerine 0,05 istemek, çıkış oranını yirmi yerine iki yüz istemek. Bu ders o düzeltmeyi bir tarama olarak koşturur ve iki eğriyi aynı eksende çizer.

Sonuç tek bir eşiğin doğru olup olmadığı değildir. Sayılan şey, iki dağılımın üst üste bindiği banttır: o bantta bulunan kalemler için hiçbir eşik hem yanlış pozitifi hem kaçırılanı azaltamaz. Bu, kursun geri kalanının üzerine kurulduğu ölçümdür. Aşağıdaki puan dağılımı bir modeldir; puanlar kurgu özniteliklerden türetilir, gerçek bir ölçüm değildir.

  • TA23. Aday kümesi 900 kalemdir: 880 meşru iş, 20 kurgu kalem. Etiket modelin doğrusudur ve puanlamaya girmez.
  • TA24. Puan dört öznitelikten ağırlıklı toplamla çıkar: düzenlilik, çıkış oranı, hedef yeniliği ve saat dışılık. Ağırlıklar model verisidir.
  • TA25. İki dağılım da kuyrukludur: bazı meşru kalemler yüksek puan alır, bazı kurgu kalemler düşük. Bu, modelin bir kusuru değil, dersin konusudur.
  • TA26. Örtüşme bandı, en düşük kurgu kalem puanı ile en yüksek meşru puan arasındaki aralıktır. Bandın dışındaki kalemler her eşikte doğru sınıflanır.
  • TA27. Bedel iki yönlüdür ve ikisi de model verisiyle sayılır: uyarı başına 9 dakika inceleme, kaçırılan kalem başına gün sonuna kadar erişilen 6 ek kalem, bu kurala ayrılan günlük 144 analist-dakika.

Puan Dağılımı ve Eşik Taraması

// esik.mjs — aday kalemler puanlanir, esik taranir ve ortusme bandi sayilir. MODELDIR.
export const TOHUM = 20260405;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Dort oznitelik, her biri 0-1 arasi. Agirliklar model verisidir.
export const AGIRLIK = { duzenlilik: 0.30, cikisOrani: 0.30, hedefYeniligi: 0.25, saatDisi: 0.15 };
const dusuk = () => r() ** 3;            // mesru kalem: cogu dusuk, kuyrugu var
const yuksek = () => 1 - r() ** 3;       // kurgu kalem: cogu yuksek, kuyrugu var

export const puanla = (o) => Math.round(100 *
  Object.entries(AGIRLIK).reduce((a, [k, w]) => a + w * o[k], 0));

export const ADAY = [];
for (let k = 0; k < 880; k++)
  ADAY.push({ duzenlilik: dusuk(), cikisOrani: dusuk(), hedefYeniligi: dusuk(),
    saatDisi: dusuk(), etiket: "mesru" });
for (let k = 0; k < 20; k++)
  ADAY.push({ duzenlilik: yuksek(), cikisOrani: yuksek(), hedefYeniligi: yuksek(),
    saatDisi: yuksek(), etiket: "kalem" });
for (const o of ADAY) o.puan = puanla(o);
ADAY.sort((a, b) => a.puan - b.puan);

export const mesru = ADAY.filter((o) => o.etiket === "mesru");
export const kalem = ADAY.filter((o) => o.etiket === "kalem");
export const tara = (esik) => ({
  esik,
  yanlisPozitif: mesru.filter((o) => o.puan >= esik).length,
  kacirilan: kalem.filter((o) => o.puan < esik).length,
  uyari: ADAY.filter((o) => o.puan >= esik).length,
});

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([8, 9, 15, 13, 13, 12]);
  console.log(`model (tohum ${TOHUM}): ${ADAY.length} aday kalem, ${kalem.length} tanesi ` +
    `kurgu kalem; puan dort oznitelikten agirlikli toplamla cikiyor`);
  console.log(`mesru puan araligi ${mesru[0].puan}-${mesru[mesru.length - 1].puan}, ` +
    `kurgu kalem araligi ${kalem[0].puan}-${kalem[kalem.length - 1].puan}`);
  const yd = gen([16, 10, 14]);
  console.log();
  console.log(yd(["puan araligi", "mesru", "kurgu kalem"]));
  for (let a = 0; a < 100; a += 20) {
    const ic = (l) => l.filter((o) => o.puan >= a && o.puan < a + 20).length;
    console.log(yd([`${a}-${a + 19}`, ic(mesru), ic(kalem)]));
  }
  console.log();
  console.log(yz(["esik", "uyari", "yanlis pozitif", "kacirilan", "toplam hata", "kesinlik"]));
  for (const e of [10, 20, 30, 40, 50, 60, 70, 80]) {
    const t = tara(e);
    console.log(yz([e, t.uyari, t.yanlisPozitif, t.kacirilan,
      t.yanlisPozitif + t.kacirilan,
      t.uyari ? `${Math.round(100 * (t.uyari - t.yanlisPozitif) / t.uyari)}%` : "-"]));
  }
  // Ortusme bandi: en dusuk kurgu kalem puani ile en yuksek mesru puan arasi.
  const alt = kalem[0].puan, ust = mesru[mesru.length - 1].puan;
  const bandM = mesru.filter((o) => o.puan >= alt && o.puan <= ust).length;
  const bandK = kalem.filter((o) => o.puan >= alt && o.puan <= ust).length;
  console.log(`\nortusme bandi ${alt}-${ust}: bu bantta ${bandM} mesru ve ${bandK} kurgu kalem ` +
    `var; hicbir esik ikisini birden ayiramaz`);
  const en = [...Array(101).keys()].map(tara)
    .reduce((a, b) => (b.yanlisPozitif + b.kacirilan < a.yanlisPozitif + a.kacirilan ? b : a));
  console.log(`toplam hatayi en aza indiren esik ${en.esik}: yanlis pozitif ` +
    `${en.yanlisPozitif}, kacirilan ${en.kacirilan}; sifir-sifir veren esik yok`);
}
model (tohum 20260405): 900 aday kalem, 20 tanesi kurgu kalem; puan dort oznitelikten agirlikli toplamla cikiyor
mesru puan araligi 0-88, kurgu kalem araligi 37-97

puan araligi         mesru   kurgu kalem
0-19                   357             0
20-39                  399             1
40-59                  108             2
60-79                   15             8
80-99                    1             9

esik        uyari yanlis pozitif    kacirilan  toplam hata    kesinlik
10            766            746            0          746          3%
20            543            523            0          523          4%
30            302            282            0          282          7%
40            143            124            1          125         13%
50             74             56            2           58         24%
60             33             16            3           19         52%
70             20              4            4            8         80%
80             10              1           11           12         90%

ortusme bandi 37-88: bu bantta 157 mesru ve 17 kurgu kalem var; hicbir esik ikisini birden ayiramaz
toplam hatayi en aza indiren esik 70: yanlis pozitif 4, kacirilan 4; sifir-sifir veren esik yok

Dağılım tablosu dersin bütün konusunu beş satırda veriyor. Meşru kalemlerin 756’sı 40’ın altında, kurgu kalemlerin 17’si 40’ın üstündedir; bu, puanın işe yaradığı anlamına gelir. Ama üçüncü ve dördüncü satırlar iki dağılımın aynı kutuları paylaştığını gösteriyor: 40–59 aralığında 108 meşru kalemle 2 kurgu kalem, 60–79 aralığında 15 meşru kalemle 8 kurgu kalem yan yana durur. Bu satırlarda puan bir ayrım üretmez.

Eşik taraması aynı gerçeği karar diliyle yazıyor ve arada hiç düz bir bölge yoktur. Eşik 40’ta 124 yanlış pozitif ve 1 kaçırılan; eşik 80’de 1 yanlış pozitif ve 11 kaçırılan. Eşiği düşürmek kaçırılanı azaltır ve inceleme yükünü büyütür; yükseltmek incelemeyi hafifletir ve kaçırılanı büyütür. Aradaki geçiş süreklidir; iki sayının ikisini birden sıfıra indiren bir nokta yoktur.

Nedeni ikinci satırda yazılı: meşru puanlar 0 ile 88 arasında, kurgu kalem puanları 37 ile 97 arasındadır. Bu iki aralık 37–88 arasında üst üste biner ve o bantta 157 meşru kalem ile 17 kurgu kalem bulunur. Bir eşik bandın içinde nereye konursa konsun, altında kalan kurgu kalemleri kaçırır ve üstünde kalan meşru kalemleri işaretler. Bandın dışındaki 726 kalem her eşikte doğru sınıflanır; ölçülen belirsizlik yalnız bant kadardır.

Kesinlik sütunu bir başka yanılgıyı düzeltiyor. Eşik 10 için kesinlik yüzde 3 çıkıyor: uyarıların yüzde 98’i meşru iştir. Eşik 80’de kesinlik yüzde 90’a çıkar ama kaçırılan 11’e fırlar. Kesinlik tek başına bir kalite ölçüsü değildir, çünkü hiç uyarı üretmeyen bir kural için tanımsızdır ve az uyarı üreten her kural yüksek kesinlik gösterir.

Bütçe Eşiği ve Bandı Daraltmak

Toplam hatayı en aza indiren eşik 70’tir ve orada 4 yanlış pozitif ile 4 kaçırılan kalır. Ancak bu seçim pratikte yapılmaz, çünkü 70 eşiği 20 uyarı üretir ve her uyarı analist zamanı ister. Çalışma noktasını doğruluk değil, kapasite belirler.

// nokta.mjs — esigin iki yonlu bedeli dakika olarak, sonra besinci oznitelikle bant.
import { ADAY, tara } from "./esik.mjs";

// Model verisi (olcum degil): inceleme dakikasi, kacirilan kalemin gun sonuna kadar
// eristigi ek kalem sayisi ve bu kurala ayrilan gunluk analist dakikasi.
const INCELEME = 9, EK_KALEM = 6, BUTCE = 144;
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([8, 8, 13, 12, 15, 13]);
console.log(`gunluk butce ${BUTCE} analist-dakika, uyari basina inceleme ${INCELEME} dakika; ` +
  `kacirilan her kalem gun sonuna kadar ${EK_KALEM} ek kaleme erisiyor (model verisi)`);
console.log();
console.log(yz(["esik", "uyari", "inceleme dk", "kacirilan", "erisilen kalem", "butceye"]));
for (const e of [40, 50, 60, 70, 80, 90]) {
  const t = tara(e);
  console.log(yz([e, t.uyari, t.uyari * INCELEME, t.kacirilan, t.kacirilan * EK_KALEM,
    t.uyari * INCELEME <= BUTCE ? "sigiyor" : "sigmiyor"]));
}
const sigan = [...Array(101).keys()].map(tara).filter((t) => t.uyari * INCELEME <= BUTCE);
const secim = sigan[0];
console.log(`\nbutceye sigan en dusuk esik ${secim.esik}: ${secim.uyari} uyari, ` +
  `${secim.kacirilan} kacirilan kalem, ${secim.kacirilan * EK_KALEM} erisilen ek kalem`);

// Besinci oznitelik: kimlik kaynaginda eslesen kayit var mi. Ayirt edici ama kusursuz degil.
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r2 = uretec(880517);
const AG2 = { duzenlilik: 0.21, cikisOrani: 0.21, hedefYeniligi: 0.18,
  saatDisi: 0.10, eslesmeyenKimlik: 0.30 };
const ADAY2 = ADAY.map((o) => ({ ...o,
  eslesmeyenKimlik: (o.etiket === "kalem" ? r2() < 0.8 : r2() < 0.03) ? 1 : 0 }));
for (const o of ADAY2) o.puan = Math.round(100 *
  Object.entries(AG2).reduce((a, [k, w]) => a + w * o[k], 0));

const bant = (liste) => {
  const m = liste.filter((o) => o.etiket === "mesru"), k = liste.filter((o) => o.etiket === "kalem");
  const alt = Math.min(...k.map((o) => o.puan)), ust = Math.max(...m.map((o) => o.puan));
  const say = (l) => l.filter((o) => o.puan >= alt && o.puan <= ust).length;
  // Calisma noktasi: butceye sigan EN DUSUK esik.
  const en = [...Array(101).keys()].map((e) => ({ e, n: liste.filter((o) => o.puan >= e).length,
    yp: m.filter((o) => o.puan >= e).length, kc: k.filter((o) => o.puan < e).length }))
    .find((x) => x.n * INCELEME <= BUTCE);
  return { alt, ust, m: say(m), k: say(k), en };
};
const yb = gen([18, 9, 16, 16, 13, 13]);
console.log();
console.log(yb(["puanlama", "bant", "banttaki mesru", "banttaki kalem", "butce esigi",
  "yp / kacan"]));
for (const [ad, liste] of [["dort oznitelik", ADAY], ["bes oznitelik", ADAY2]]) {
  const b = bant(liste);
  console.log(yb([ad, `${b.alt}-${b.ust}`, b.m, b.k, b.en.e, `${b.en.yp} / ${b.en.kc}`]));
}
console.log(`\nbesinci oznitelik banttaki kalem sayisini dusuruyor ama bandi kapatmiyor; ` +
  `sifir yanlis pozitif ve sifir kacirilan veren esik iki puanlamada da yok`);
gunluk butce 144 analist-dakika, uyari basina inceleme 9 dakika; kacirilan her kalem gun sonuna kadar 6 ek kaleme erisiyor (model verisi)

esik       uyari  inceleme dk   kacirilan erisilen kalem      butceye
40           143         1287           1              6     sigmiyor
50            74          666           2             12     sigmiyor
60            33          297           3             18     sigmiyor
70            20          180           4             24     sigmiyor
80            10           90          11             66      sigiyor
90             3           27          17            102      sigiyor

butceye sigan en dusuk esik 72: 16 uyari, 7 kacirilan kalem, 42 erisilen ek kalem

puanlama               bant  banttaki mesru  banttaki kalem  butce esigi   yp / kacan
dort oznitelik        37-88             157              17           72        3 / 7
bes oznitelik         49-75              15               7           66        1 / 5

besinci oznitelik banttaki kalem sayisini dusuruyor ama bandi kapatmiyor; sifir yanlis pozitif ve sifir kacirilan veren esik iki puanlamada da yok

Bütçe sütunu eşik seçimini elden alıyor. Toplam hatayı en aza indiren 70 eşiği 180 dakika inceleme ister ve 144 dakikalık bütçeye sığmaz. Sığan en düşük eşik 72’dir; orada 16 uyarı incelenir, 7 kurgu kalem kaçar ve model verisine göre bu 7 kalem gün sonuna kadar 42 ek kaleme erişir. Eşiği seçen şey doğruluk değil, analist dakikasıdır.

İki yönlü bedelin birimleri farklıdır ve bu, karşılaştırmayı zorlaştıran asıl güçlüktür. Sol taraf dakikadır ve doğrudan ödenir: 40 eşiğinde 1.287 dakika, yani dokuz kişilik bir günden fazla. Sağ taraf kalemdir ve gecikmeli ödenir: 90 eşiğinde 17 kaçırılan kalem, 102 erişilen ek kalem. İkisini aynı eksende toplamak ancak bir kalemin kaç dakikaya karşılık geldiği yazılırsa mümkündür ve o sayı teknik değil, kurumsal bir karardır.

Son tablo tek gerçek çıkış yolunu gösteriyor: bandı daraltmak. Beşinci öznitelik — kalemin kimlik kaynağında eşleşen bir kaydının bulunmaması — bandı 37–88’den 49–75’e, banttaki meşru kalemi 157’den 15’e, banttaki kurgu kalemi 17’den 7’ye indiriyor. Bütçe eşiği 72’den 66’ya iner ve o noktada yanlış pozitif 3’ten 1’e, kaçırılan 7’den 5’e düşer. İki sayı aynı anda iyileşiyor, çünkü değişen şey eşik değil, puanın kendisidir.

Beşinci özniteliğin de bir bedeli vardır ve o bedel ikinci derste ölçülmüştü. “Kimlik kaynağında eşleşen kayıt yok” diyebilmek için önce eşlemenin denenmiş olması gerekir; o eşleme beş dakikalık pencerede kayıtların bir bölümüne yanıt verebiliyordu ve kalanında sonuç belirsizdi. Belirsiz kalan kalemde bu öznitelik doldurulamaz. Yani bandı daraltan iyileştirme, hattın daha önce ölçülmüş bir eksikliğine dayanır ve o eksiklik büyüdükçe iyileştirme küçülür.

Yine de bant kapanmıyor. Beşinci öznitelik kurgu kalemlerin yüzde 80’inde bulunuyor, meşru kalemlerin yüzde 3’ünde de bulunuyor; kalan örtüşme bu iki oranın doğrudan sonucudur. Sıfır yanlış pozitif ve sıfır kaçırılan veren eşik iki puanlamada da yoktur ve daha fazla öznitelik eklemek bandı daraltır, kapatmaz.

Özet

  • 900 aday kalemin puanları 37–88 bandında örtüşüyor; o bantta 157 meşru ve 17 kurgu kalem vardır ve hiçbir eşik ikisini birden ayıramaz. Bandın dışındaki 726 kalem her eşikte doğru sınıflanır.
  • Eşik 40’ta 124 yanlış pozitif ve 1 kaçırılan, eşik 80’de 1 yanlış pozitif ve 11 kaçırılan çıkıyor; toplam hatayı en aza indiren 70 eşiğinde bile 4 ve 4 kalıyor.
  • Kesinlik tek başına kalite ölçüsü değildir: az uyarı üreten her kural yüksek kesinlik gösterir, eşik 80’de kesinlik yüzde 90 iken kaçırılan 11’dir.
  • Çalışma noktasını doğruluk değil bütçe seçiyor: 144 analist-dakikaya sığan en düşük eşik 72’dir ve orada 7 kurgu kalem kaçarak 42 ek kaleme erişiyor.
  • Beşinci öznitelik bandı 49–75’e, banttaki meşru kalemi 15’e ve kurgu kalemi 7’ye indiriyor; bütçe eşiğinde yanlış pozitif 3’ten 1’e, kaçırılan 7’den 5’e düşüyor, ama sıfır-sıfır veren eşik yok.

Sonraki Adım

Bandı daraltan şey eşik ayarı değil, yeni bir öznitelikti — yani puanlamanın kendisinin değişmesiydi. Bu, bir kuralın ayarlanması değil, yeniden yazılmasıdır ve düzenli yapılan bir iştir. Sonraki ders o işi bir döngü olarak ele alır: bir kural kümesinin iki sürümünü aynı teknik listesine karşı koşturur ve kapsanan teknik sayısını karşılaştırır. Ölçü orada kaç kural yazıldığı değil, taktik ve teknik matrisinin kaç gözünün en az bir kuralla kapsandığı, kaçının hiç kapsanmadığı ve kapsandığı yazılan gözlerin kaçında kuralın hiç ateşlenemeyeceğidir — çünkü o gözün kaynağı hattın hiç toplamadığı bir yerdedir.

İ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