---
title: 'Hata Çözümlemesi'
source: 'https://academia.sh/tr/kurslar/denetimli-ogrenme/hata-cozumlemesi'
course: 'Denetimli Öğrenme'
language: tr
updated: '2026-08-17T18:10:19+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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

```python
# 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.

```python
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.

```python
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.
