İçeriğe geç
academia.sh

Ders 20 / 20

Hata Çözümlemesi

Sınama kümesindeki 51 hatanın bölge, tarife basamağı, hane büyüklüğü ve okuma sayısına göre kırılması: on dört ölçülebilir dilimin ikisinde model taban çizgisinin altında kalıyor ve merkez bölgesi satırların yüzde 23'ünü tutarken hataların yüzde 35,3'ünü taşıyor. Dilim sayısı 14'ten 41'e, 41'den 50'ye çıkarken bulunan kötü dilim sayısı 2'den 6'ya, 6'dan 9'a çıkıyor — ama aynı hatalar satırlara rastgele dağıtıldığında ortalama 4,41, 14,26 ve 18,46 kötü dilim çıkıyor, yani gözlenen sayı her üç kümede de rastlantının altında. Kurs kapanışı yirmi dersin ailesini, aday sayısını ve taban çizgisi üstünü tek tabloda toplar.

İçindekiler

Önceki ders bir sayıyla bitti: sınama kümesinin 252 satırının 201’inde doğru karar, 51’inde yanlış. O 51 satır kurs boyunca tek bir orana sıkıştırıldı; hangi bölgelerden, hangi tarife basamaklarından, hangi hane büyüklüklerinden ve kaç okumadan geldikleri sorulmadı.

Hata çözümlemesi bu soruyu sorar: hata kümeye eşit mi dağılmış, yoksa bir dilimde mi yoğunlaşmış. Sorunun bir tuzağı var ve bu ders onu da ölçer: yeterince çok dilim tanımlanırsa bir kısmı rastlantıyla kötü görünür.

  • MD56. Model, önceki dersin seçtiği biçimdedir: derece 1, dokuz sütun. Ceza ve eşik aynı tohumla, 200 adaylık aramayla ve yalnız doğrulama kümesinden seçilir. Çözümleme sınama kümesinde yapılır ve buradan hiçbir seçim yapılmaz.
  • MD57. Dilim eksenleri dörttür: bölge (beş değer), tarife basamağı (10, 25 ve 40 m³ sınırlarıyla dört aralık), hane büyüklüğü (1–2, 3–4, 5–6) ve okuma sayısı (1, 2, 3). Bir dilim en az 10 satır taşımıyorsa ölçülemez sayılır; eşik ölçümden önce sabitlenmiştir.
  • MD58. Dilim içindeki taban, kursun tabanıyla aynı yordamdır: eğitim kümesinin en sık sınıfını söylemek. Sınıf bileşimi değiştiği için taban dilimden dilime değişir.
  • MD59. Rastlantı ölçüsü, doğru/yanlış kararların satırlar arasında yeniden karıştırılmasıdır; yordam M26/K05’te kuruldu ve tekrarlanmaz.
  • MD60. Bu ders dilimlerde başarım farkını ölçer. Farkın kime ne yaptığı ve modelin kimin için kurulduğu M27/K08’e bırakılır.

Hata Nerede Yoğunlaşıyor

# ORTAK — MODELDIR. Kume ve model M27/K01'in KURGU abone tablosundan gelir;
# ayar, onceki dersin 200 adaylik aramasiyla ve yalniz dogrulama kumesinden secilir.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]


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


ABONE, VERI = [], []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() >= 0.046:
        ABONE.append({"no": 10001 + i, "bolge": b, "hane": hane, "memnuniyet": memnun})
for k in ABONE:
    r, v = uretec(TOHUM + 7000 + k["no"]), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            k["bolge"][2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + k["no"])
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn
         + 0.24 * (k["hane"] >= 5) - 0.20 * (k["memnuniyet"] >= 4) + k["bolge"][3]
         + 0.9 * (k["no"] - 10001) / 1399 + (r() + r() + r() - 1.5) * 1.30)
    x = {"no": k["no"], "hane": k["hane"], "memnuniyet": k["memnuniyet"],
         "donem": len(v), "ort_tuketim": round(ort, 2), "oynaklik": round(oyn, 2),
         "sifir_okuma": int(min(v) == 0.0), "supheli": int(z > 1.35),
         "bolge_ad": k["bolge"][0]}
    for b in BOLGE:
        x["b_" + b[0]] = int(k["bolge"][0] == b[0])
    VERI.append(x)


def karistir(dizi, tohum):
    r, s = uretec(tohum), list(range(len(dizi)))
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return [dizi[i] for i in s]


K = karistir(VERI, TOHUM + 90000)
EGT, DOG, SIN = K[:756], K[756:1008], K[1008:]
ALAN = ["ort_tuketim", "sifir_okuma", "oynaklik", "hane", "memnuniyet", "donem",
        "b_dogu", "b_bati", "b_guney"]


def coz(A, b):
    n = len(A)
    M = [list(A[i]) + [b[i]] for i in range(n)]
    for i in range(n):
        p = max(range(i, n), key=lambda r: abs(M[r][i]))
        M[i], M[p] = M[p], M[i]
        for r in range(n):
            if r != i:
                f = M[r][i] / M[i][i]
                for c in range(i, n + 1):
                    M[r][c] -= f * M[i][c]
    return [M[i][n] / M[i][i] for i in range(n)]


def ogren(s, ceza):
    d = len(ALAN) + 1
    A = [[0.0] * d for _ in range(d)]
    b = [0.0] * d
    for x in s:
        v = [1.0] + [float(x[a]) for a in ALAN]
        for i in range(d):
            b[i] += v[i] * x["supheli"]
            for j in range(i, d):
                A[i][j] += v[i] * v[j]
    for i in range(d):
        for j in range(i):
            A[i][j] = A[j][i]
        if i:
            A[i][i] += ceza
    return coz(A, b)


ONBELLEK = {}


def kararlar(aday, kume):
    ceza, esik = aday
    if ceza not in ONBELLEK:
        ONBELLEK[ceza] = ogren(EGT, ceza)
    w = ONBELLEK[ceza]
    return [1 if w[0] + sum(w[i + 1] * float(x[a]) for i, a in enumerate(ALAN))
            >= esik else 0 for x in kume]


r = uretec(TOHUM + 4100)
ADAYLAR = [(10 ** (-3 + 6 * r()), 0.20 + 0.40 * r(), r(), r()) for _ in range(200)]
SECIM, EN = None, -1.0
for a in ADAYLAR:
    d = sum(k == x["supheli"] for k, x in zip(kararlar(a[:2], DOG), DOG)) / len(DOG)
    if d > EN:
        EN, SECIM = d, a[:2]

C = int(sum(x["supheli"] for x in EGT) * 2 > len(EGT))
DOGRU = [k == x["supheli"] for k, x in zip(kararlar(SECIM, SIN), SIN)]
TABAN = [C == x["supheli"] for x in SIN]
G = sum(DOGRU) / len(SIN)
print(f"secilen aday: ceza {SECIM[0]:.4g}, esik {SECIM[1]:.4f}, dogrulama {EN:.4f}")
print(f"sinama kumesi {len(SIN)} satir, model {G:.4f}, "
      f"taban {sum(TABAN) / len(SIN):.4f}, hata {len(SIN) - sum(DOGRU)}")
secilen aday: ceza 0.00372, esik 0.5540, dogrulama 0.8452
sinama kumesi 252 satir, model 0.7976, taban 0.7579, hata 51

Aşağıda 51 hata dört eksende kırılıyor. Modelin sayısı, dilimdeki taban, farkı ve iki pay basılıyor: hata payı (hataların kaçı orada) ve satır payı (satırların kaçı orada). İki pay ayrıştığında hata yoğunlaşmıştır.

EKSEN = {"bolge": lambda x: x["bolge_ad"],
         "hane": lambda x: ("1-2", "3-4", "5-6")[min(2, (x["hane"] - 1) // 2)],
         "okuma": lambda x: str(x["donem"]),
         "tarife": lambda x: ("<10", "10-25", "25-40", ">=40")[
             0 if x["ort_tuketim"] < 10 else 1 if x["ort_tuketim"] < 25
             else 2 if x["ort_tuketim"] < 40 else 3]}
ENAZ = 10


def dilimle(kume):
    d = {}
    for eksenler in kume:
        for i, x in enumerate(SIN):
            d.setdefault((eksenler, tuple(EKSEN[e](x) for e in eksenler)), []).append(i)
    return d


TEK = [("bolge",), ("tarife",), ("hane",), ("okuma",)]
H = len(SIN) - sum(DOGRU)
print(f"{'eksen':<7} {'dilim':<7} {'n':>4} {'model':>7} {'taban':>7} {'fark':>8} "
      f"{'hata payi':>10} {'satir payi':>11}")
for k, idx in sorted(dilimle(TEK).items()):
    if len(idx) < ENAZ:
        print(f"{k[0][0]:<7} {k[1][0]:<7} {len(idx):>4}  olculemez ({ENAZ} satir alti)")
        continue
    m = sum(DOGRU[i] for i in idx) / len(idx)
    t = sum(TABAN[i] for i in idx) / len(idx)
    h = sum(1 for i in idx if not DOGRU[i])
    print(f"{k[0][0]:<7} {k[1][0]:<7} {len(idx):>4} {m:>7.4f} {t:>7.4f} {m - t:>+8.4f} "
          f"{h / H:>10.3f} {len(idx) / len(SIN):>11.3f}")
eksen   dilim      n   model   taban     fark  hata payi  satir payi
bolge   bati      32  1.0000  1.0000  +0.0000      0.000       0.127
bolge   dogu      36  0.6944  0.4722  +0.2222      0.216       0.143
bolge   guney     58  0.8448  0.8276  +0.0172      0.176       0.230
bolge   kuzey     68  0.8088  0.8235  -0.0147      0.255       0.270
bolge   merkez    58  0.6897  0.6552  +0.0345      0.353       0.230
hane    1-2       73  0.8219  0.7534  +0.0685      0.255       0.290
hane    3-4      143  0.7972  0.7692  +0.0280      0.569       0.567
hane    5-6       36  0.7500  0.7222  +0.0278      0.176       0.143
okuma   1         22  0.8636  0.8636  +0.0000      0.059       0.087
okuma   2         63  0.7460  0.7619  -0.0159      0.314       0.250
okuma   3        167  0.8084  0.7425  +0.0659      0.627       0.663
tarife  10-25    194  0.8402  0.8402  +0.0000      0.608       0.770
tarife  25-40     46  0.6522  0.4565  +0.1957      0.314       0.183
tarife  <10       11  0.6364  0.6364  +0.0000      0.078       0.044
tarife  >=40       1  olculemez (10 satir alti)

On beş dilimin on dördü ölçülebiliyor; en yüksek tarife basamağında tek bir abone var ve o basamak hakkında hiçbir şey söylenemeyeceği tabloda duruyor.

Fark sütununda iki eksi var: kuzey bölgesinde model 0,8088, taban 0,8235; iki okumalı abonelerde 0,7460’a karşı 0,7619. Genel sayının 0,7976 olması bu iki dilimde hiçbir şey söylemiyor.

Yoğunlaşma iki payın karşılaştırılmasında okunuyor. Merkez bölgesi satırların 0,230’unu tutarken hataların 0,353’ünü taşıyor, yani hata payı satır payının bir buçuk katı; 25–40 m³ basamağı 0,183’e karşı 0,314. Batı bölgesi ise satırların 0,127’sini tutuyor ve hiç hata üretmiyor — orada şüpheli etiketli tek bir abone yok, taban 1,0000 ve modelin yapabileceği en iyi şey tabana eşit kalmak. Doğu bölgesi ile 25–40 m³ basamağı hem tabana göre en çok kazandıran (+0,2222 ve +0,1957) hem de mutlak olarak en kötü olunan yerler (0,6944 ve 0,6522).

Dilim Sayısı Büyüdükçe

Eksenler çaprazlanırsa dilim sayısı hızla büyür ve bulunacak “kötü dilim” sayısı da büyür. Sorun, bu büyümenin ne kadarının gerçek olduğudur. Ölçüsü şudur: doğru ve yanlış kararlar satırlar arasında yeniden karıştırılır — hata sayısı 51’de sabit kalır, dilim yapısıyla bağı kopar — ve sayım yinelenir.

IKI = TEK + [("bolge", "tarife"), ("bolge", "okuma"),
             ("tarife", "hane"), ("hane", "okuma")]
UC = IKI + [("bolge", "tarife", "okuma")]


def kotu_say(d, dogru):
    olculur = say = 0
    for idx in d.values():
        if len(idx) < ENAZ:
            continue
        olculur += 1
        if (sum(dogru[i] for i in idx) / len(idx)
                < sum(TABAN[i] for i in idx) / len(idx)):
            say += 1
    return olculur, say


print(f"{'dilim kumesi':<14} {'tanimli':>8} {'olculur':>8} {'kotu':>5} "
      f"{'rastlanti ort':>14} {'rastlanti en':>13} {'taban>model':>12}")
for ad, kume in (("tek eksen", TEK), ("iki eksen", IKI), ("uc eksen", UC)):
    d = dilimle(kume)
    olculur, say = kotu_say(d, DOGRU)
    rast = [kotu_say(d, karistir(DOGRU, TOHUM + 8000 + i))[1] for i in range(200)]
    ust = sum(1 for idx in d.values() if len(idx) >= ENAZ
              and sum(TABAN[i] for i in idx) / len(idx) > G)
    print(f"{ad:<14} {len(d):>8} {olculur:>8} {say:>5} {sum(rast) / len(rast):>14.2f} "
          f"{max(rast):>13} {ust:>12}")

en_kotu = min(((sum(DOGRU[i] for i in idx) / len(idx)
                - sum(TABAN[i] for i in idx) / len(idx), k, len(idx))
               for k, idx in dilimle(IKI).items() if len(idx) >= ENAZ))
print(f"\nen kotu iki eksenli dilim: {en_kotu[1][0]} = {en_kotu[1][1]}, "
      f"{en_kotu[2]} satir, fark {en_kotu[0]:+.4f}")
dilim kumesi    tanimli  olculur  kotu  rastlanti ort  rastlanti en  taban>model
tek eksen            15       14     2           4.41             6            5
iki eksen            62       41     6          14.26            18           16
uc eksen             92       50     9          18.46            23           21

en kotu iki eksenli dilim: ('bolge', 'tarife') = ('dogu', '10-25'), 17 satir, fark -0.1176

Kötü dilim sayısı 2’den 6’ya, 6’dan 9’a çıkıyor. Tek başına okunduğunda bu, dilimleri inceltince modelin daha çok yerde çuvalladığının kanıtı gibi görünür. Rastlantı sütunları tersini söylüyor: aynı 51 hata satırlara rastgele dağıtıldığında ortalama 4,41, 14,26 ve 18,46 kötü dilim çıkıyor ve gözlenen sayı her üç kümede de bu ortalamanın altında.

Son sütun bunun nereden geldiğini söylüyor. Modelin genel sayısı 0,7976; tabanı bu sayının üstünde olan bir dilimde, hataları rastgele dağıtılmış bir model tabanın altına düşer. Böyle dilimler tek eksende 5, iki eksende 16, üç eksende 21 tane ve rastlantı ortalamaları bu sayıların hemen yanında. “Kötü dilim” ölçütü aslında tabanı genel başarımdan yüksek dilimleri sayıyor.

Gözlenenin rastlantının altında kalması modelin lehinedir. Bu, M26/K05’te ölçülen kuralın buradaki biçimi — bir sayı, aynı sayının rastlantıyla ne sıklıkta bulunacağı ölçülmeden bulgu değildir. Bulunan farkların kimin için ne anlama geldiği ise M27/K08’e bırakılır.

Özet

  • On beş dilimin on dördü ölçülebiliyor; en yüksek tarife basamağında tek bir abone var ve o basamak hakkında hiçbir şey söylenemiyor.
  • İki dilimde model tabanın altında: kuzey bölgesi (0,8088’e karşı 0,8235) ve iki okumalı aboneler (0,7460’a karşı 0,7619).
  • Merkez bölgesi satırların 0,230’unu tutup hataların 0,353’ünü taşıyor; doğu bölgesi hem tabana göre en çok kazandıran (+0,2222) hem de mutlak olarak en kötü olunan (0,6944) dilim.
  • Dilim sayısı 14’ten 50’ye çıkarken kötü dilim 2’den 9’a çıkıyor, ama rastgele dağıtılmış hatada 4,41’den 18,46’ya çıkıyor; gözlenen her kümede rastlantının altında.

Kurs Kapanışı

Yirmi dersin hesabı tek tabloda ve her sayı kendi dersinden okundu. İkinci sütun her derste doğrulama kümesinden seçilen adayın sınama kümesindeki sayısıdır. Sınıflandırma satırları doğruluktur, tabanı 0,7579; bağlanım satırları kök hatadır (m³), tabanı 6,5324.

Ders Ailenin sayısı Denenen aday Taban çizgisi üstü
Doğrusal 01 5,3096 m³ 1 +1,2228
Doğrusal 02 5,3775 m³ 8 +1,1549
Doğrusal 03 5,2954 m³ 18 +1,2370
Doğrusal 04 0,7937 9 +0,0358
Doğrusal 05 0,8056 8 +0,0477
Doğrusal olmayan 01 0,7937 24 +0,0357
Doğrusal olmayan 02 0,7817 20 +0,0238
Doğrusal olmayan 03 0,7857 17 +0,0278
Doğrusal olmayan 04 0,7857 12 +0,0278
Doğrusal olmayan 05 0,7897 31 +0,0317
Doğrusal olmayan 06 0,7738 1.279 +0,0159
Doğrusal olmayan 07 0,7778 3 +0,0199
Değerlendirme 01 0,8016 49 +0,0437
Değerlendirme 02 0,8016 5 +0,0437
Değerlendirme 03 181 bedel 99 −185 bedel
Değerlendirme 04 0,0242 kalibrasyon 5 −0,0044
Değerlendirme 05 0,4770 açıklanan değişim 3 +0,4770
Değerlendirme 06 0,8056 1 +0,0477
Değerlendirme 07 0,7976 200 +0,0397
Değerlendirme 08 0,7976 1 +0,0397

Üç satır kendi biriminde okunur. Değerlendirme 03’ün birimi bedeldir ve küçük olan iyidir: 181 birim, tabanın 366’sının 185 altında. Değerlendirme 04 kalibrasyon hatasıdır ve tablodaki tek eksi satırdır: sabit sayı söyleyen taban 0,0198 ile modelin 0,0242’sinden iyidir, yani öğrenmiş model orada öğrenmemiş yordamı geçemedi.

Kursun kuralı üçüncü sütundur: bir modelin sayısı, o sayıyı bulmak için kaç aday denendiği yazılmadan okunamaz; ayar bütçesi yazılmayan sayı ölçülmemiş sayılır. Sütun toplanınca kursta denenen aday sayısı çıkıyor: 1.793.

Kursun ikinci iddiası tablodan okunur. Sınıflandırma satırlarının en iyisi 0,8056, en kötüsü 0,7738: yedi ailenin tamamı 0,0318 puanlık bir bandın içinde. Ayar bütçesinin şişirdiği fark bu bandın büyüklüğündedir — Değerlendirme 07’de bütçe 200’de doğrulama ile sınama arasında 0,0476, tablonun en yüksek bütçesi olan 1.279 adaylık derste iki seçim arasında 0,0318. Yedi aile arasındaki bütün fark, tek bir dersin ayar bütçesinin ürettiği farka eşittir.

Yirmi derste yedi model ailesi denendi ve her sayının yanına bütçesi yazıldı. Ama bütün bu ölçümlerin ortak bir dayanağı vardı: etiket. Taban çizgisi en sık etiketi söylüyordu, ölçüt tahmin edilen etiketle gerçeğini karşılaştırıyordu, arama doğrulama kümesindeki etiketlere bakıyordu. Etiketin olmadığı bir kümede neyin öğrenildiği — hatta bir şey öğrenilip öğrenilmediği — hangi tabana karşı okunur, hiç sorulmadı. Sonraki kurs, Denetimsiz Öğrenme, bu soruyla açılır.

İ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