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.