Ders 03 / 20
Düzenlileştirme Cezaları
Karesel, mutlak ve karma cezanın aynı 87 sütuna uygulanıp seyreklikle ölçülmesi: karesel ceza altı ayarın hiçbirinde tek bir katsayıyı bile tam sıfırlamaz, mutlak ceza 42'den 84'e kadar sıfırlar, karma ceza 24 ile 83 arasında kalır. Mutlak ceza 10'da 87 katsayının 65'i tam sıfırdır ve kalan 22 sütun sınamada 5,2909 m³ verir; karesel ceza aynı sayıya 87 sütunun hepsini tutarak 5,2954 ile ulaşır. Doğrulamadan okunan seçim karesel ceza 3'tür ve sınamada 5,2954 verir, sınamadan okunsaydı mutlak ceza 10 seçilirdi ve fark 0,0046 m³ olurdu. Mutlak ceza 3000'de 87 katsayının hepsi sıfırlanır ve model tam olarak taban çizgisine, 6,5324'e döner; karesel ceza 100000'de bile 6,5086'da kalır.
İçindekiler
Önceki ders bir düğmeyi tam sayı adımlarla çevirdi. Derece 4 ile 5 arasında ara durak yoktu ve derece 5’e geçmek yirmi bir sütunu birden ekledi. Sütun eklemek ya da silmek dışında üçüncü bir yol var: sütunları bırakıp katsayılarını cezalandırmak. M27/K01’in Genelleme konusu bu sezgiyi tek bir ceza türüyle kurmuş, ceza katsayısı büyüdükçe eğitim sayısının kesintisiz kötüleştiğini, ayrılmış küme sayısının önce iyileşip sonra kötüleştiğini ölçmüş ve en iyi noktanın doğrulama kümesinden okunduğunu göstermişti. O süpürme burada tekrarlanmaz.
Bu dersin sorusu cezanın büyüklüğü değil biçimidir. Katsayıların kare toplamını cezalandırmak ile mutlak değer toplamını cezalandırmak iki farklı yordam üretir ve fark hatada değil, kaç katsayının tam olarak sıfır olduğunda görünür. Ölçü budur: seyreklik. Hangi ceza kaç sütunu modelden atıyor, hangisi hepsini küçültüp bırakıyor, ve atılan sütunların ayrılmış kümedeki karşılığı ne.
- DM18. Küme, bölme, hedef ve taban çizgisi önceki iki dersteki gibidir: kurgu abone tablosu, tohum 20260218, 756/252/252, sınama kümesinde 6,5324 m³ kök hata.
- DM19. Sütun kümesi derece 6 polinomudur: dört bölge göstergesi ve üç sayısal sütunun toplam derecesi altıyı geçmeyen bütün tek terimlileri, toplam 87 sütun. Derece bu derste değişmez; değişen tek şey cezadır.
- DM20. Sütunlar eğitim kümesinden öğrenilen ortalama ve değişkenlikle ölçeklenir. Ceza ölçeğe duyarlıdır: ölçeklenmemiş sütunlarda aynı ceza katsayısı farklı sütunlara farklı şiddette uygulanır.
- DM21. Sabit terim cezalanmaz. Cezalansaydı bütün katsayılar sıfırlandığında model sıfır söylerdi; cezalanmadığında taban çizgisine, yani eğitim ortalamasına döner.
- DM22. Üç ceza biçimi: karesel ceza katsayıların kare toplamını, mutlak ceza mutlak değer toplamını, karma ceza ikisinin yarı yarıya karışımını cezalandırır. Ürün ya da mecaz ad kullanılmaz; ceza biçimiyle anılır.
- DM23. Çözüm eş güdümlü iniştir: her katsayı sırayla, ötekiler sabit tutularak güncellenir. Mutlak cezanın türevi sıfırda tanımsız olduğu için kapalı çözüm yoktur; iniş, eşik altında kalan katsayıyı tam sıfıra oturtur.
- DM24. Tur sayısı 120’dir ve bütün ayarlarda sabittir. Tur sayısı bir ayar değişkeni olarak süpürülmez; süpürülseydi aday sayısı üçe katlanırdı.
- DM25. “Tam sıfır” karşılaştırması
==ile yapılmaz; eşik ’dur ve iniş yordamının sıfırladığı katsayı tam olarak0.0atandığı için bu eşik yalnız bir güvencedir. - DM26. Denenen aday sayısı 18’dir: üç ceza biçimi, altı ceza katsayısı.
Üç Ceza Biçimi
Kurulum önceki iki dersin kurulumudur.
# ceza.py — MODELDIR. Ayni KURGU abone tablosu, ayni tohum ve ayni bolme. 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 x = {"bolge_ad": k["bolge"][0], "hane": k["hane"], "memnuniyet": k["memnuniyet"], "donem": len(v), "hedef": round(sum(v) / len(v), 2)} for b in BOLGE: x["b_" + b[0]] = int(k["bolge"][0] == b[0]) VERI.append(x) def karistir(veri, tohum): r, s = uretec(tohum), list(range(len(veri))) for i in range(len(s) - 1, 0, -1): j = int(r() * (i + 1)) s[i], s[j] = s[j], s[i] return [veri[i] for i in s] K = karistir(VERI, TOHUM + 90000) EGT, DOG, SIN = K[:756], K[756:1008], K[1008:] ORT = sum(x["hedef"] for x in EGT) / len(EGT) def kok(kestirim, s): return math.sqrt(sum((kestirim(x) - x["hedef"]) ** 2 for x in s) / len(s)) print(f"egitim {len(EGT)}, dogrulama {len(DOG)}, sinama {len(SIN)}, " f"taban cizgisi sinamada {kok(lambda x: ORT, SIN):.4f} m3")
egitim 756, dogrulama 252, sinama 252, taban cizgisi sinamada 6.5324 m3
Eş güdümlü iniş, üç ceza biçimini tek bir yordamda toplar. Her katsayı için ötekiler sabit tutulup en iyi değer hesaplanır; mutlak cezanın payı bu değeri sıfıra doğru iter ve eşiği aşamayan katsayı tam sıfıra oturur.
import itertools SAYISAL = ["hane", "memnuniyet", "donem"] GOSTERGE = ["b_guney", "b_dogu", "b_bati", "b_merkez"] DERECE = 6 US = [u for u in itertools.product(range(DERECE + 1), repeat=3) if 1 <= sum(u) <= DERECE] # h hane, m memnuniyet, d donem; h^2m^1 = hane karesi carpi memnuniyet AD = GOSTERGE + ["".join(f"{a}^{k}" for a, k in zip("hmd", u) if k) for u in US] def ham(x): return ([float(x[a]) for a in GOSTERGE] + [math.prod(x[a] ** k for a, k in zip(SAYISAL, u)) for u in US]) H = [ham(x) for x in EGT] P = len(AD) O = [sum(r[j] for r in H) / len(H) for j in range(P)] S = [max(1e-9, math.sqrt(sum((r[j] - O[j]) ** 2 for r in H) / len(H))) for j in range(P)] def uygula(x): h = ham(x) return [(h[j] - O[j]) / S[j] for j in range(P)] KOL = [[(H[i][j] - O[j]) / S[j] for i in range(len(H))] for j in range(P)] KK = [sum(v * v for v in KOL[j]) for j in range(P)] Y = [x["hedef"] for x in EGT] def inis(ceza, mutlak_pay, tur=120): # MODELDIR: cezali dogrusal baglanim w, sabit = [0.0] * P, sum(Y) / len(Y) art = [y - sabit for y in Y] for _ in range(tur): for j in range(P): if KK[j] < 1e-12: continue r = sum(KOL[j][i] * art[i] for i in range(len(art))) + KK[j] * w[j] c1, c2 = ceza * mutlak_pay, ceza * (1 - mutlak_pay) if r > c1: yeni = (r - c1) / (KK[j] + c2) elif r < -c1: yeni = (r + c1) / (KK[j] + c2) else: yeni = 0.0 fark = yeni - w[j] if fark: for i in range(len(art)): art[i] -= KOL[j][i] * fark w[j] = yeni d = sum(art) / len(art) sabit += d for i in range(len(art)): art[i] -= d return sabit, w def kestirici(m): return lambda x: m[0] + sum(a * b for a, b in zip(m[1], uygula(x))) CEZA = (3, 10, 30, 100, 300, 1000) BICIM = (("karesel", 0.0), ("mutlak", 1.0), ("karma", 0.5)) SONUC = [] print(f"sutun {P}, taban cizgisi sinamada {kok(lambda x: ORT, SIN):.4f} m3") print(f"\n{'ceza bicimi':<12} {'katsayi':>8} {'tam sifir':>10} {'egitimde':>9} " f"{'dogrulama':>10} {'sinama':>8}") for ad, pay in BICIM: for c in CEZA: m = inis(c, pay) g = kestirici(m) sifir = sum(1 for v in m[1] if abs(v) < 1e-9) SONUC.append((ad, c, sifir, kok(g, DOG), kok(g, SIN))) print(f"{ad:<12} {c:>8} {sifir:>10} {kok(g, EGT):>9.4f} " f"{kok(g, DOG):>10.4f} {kok(g, SIN):>8.4f}") print(f"\ndenenen aday sayisi {len(SONUC)}")
sutun 87, taban cizgisi sinamada 6.5324 m3 ceza bicimi katsayi tam sifir egitimde dogrulama sinama karesel 3 0 5.0348 5.2982 5.2954 karesel 10 0 5.0367 5.3009 5.2968 karesel 30 0 5.0408 5.3088 5.3053 karesel 100 0 5.0581 5.3313 5.3342 karesel 300 0 5.1289 5.4180 5.4387 karesel 1000 0 5.3907 5.6894 5.7325 mutlak 3 42 5.0371 5.3028 5.2933 mutlak 10 65 5.0429 5.3092 5.2909 mutlak 30 74 5.0515 5.3179 5.3077 mutlak 100 79 5.0810 5.3486 5.3443 mutlak 300 83 5.1447 5.4056 5.4420 mutlak 1000 84 5.6036 5.8955 5.9568 karma 3 24 5.0360 5.3015 5.2947 karma 10 47 5.0405 5.3058 5.2941 karma 30 68 5.0477 5.3158 5.3022 karma 100 72 5.0722 5.3458 5.3483 karma 300 75 5.1431 5.4192 5.4509 karma 1000 83 5.4757 5.7450 5.8260 denenen aday sayisi 18
Üçüncü sütun dersin yanıtıdır ve üç blok arasındaki fark tartışmasız. Karesel cezanın satırlarında o sütun altı ayarın altısında da sıfırdır: ceza bin katına çıkarıldığında bile 87 katsayının tek biri tam sıfır olmuyor. Mutlak ceza aynı aralıkta 42’den 84’e çıkıyor. Karma ceza tam ortada duruyor: 24’ten 83’e.
Ayrım katsayının sıfıra yaklaşırken hissettiği kuvvetten geliyor. Karesel cezanın türevi katsayıyla orantılıdır; katsayı küçüldükçe onu daha da küçültmeye çalışan kuvvet de küçülür ve sıfıra hiçbir zaman ulaşmaz. Mutlak cezanın türevi ise büyüklükten bağımsızdır — katsayı ne kadar küçük olursa olsun aynı sabit kuvvetle itilir — ve o kuvvet katsayının hata düşürme katkısını aştığı anda katsayı sıfırda kalır.
Son iki sütun aynı tabloyu hata tarafından okuyor ve orada fark küçüktür. Üç biçimin en iyi doğrulama sayıları 5,2982, 5,3028 ve 5,3015; aralarındaki mesafe 0,005 m³’ün altında. Ceza biçimi seçimi hata sayısında görünmüyor; sütun sayısında görünüyor.
Seyrekliğin Karşılığı
On sekiz aday arasından bir tanesini seçmek gerekiyor ve seyrekliğin bedeli tam burada okunur.
en_dogrulama = min(SONUC, key=lambda t: t[3]) en_sinama = min(SONUC, key=lambda t: t[4]) print(f"dogrulamadan okunan {en_dogrulama[0]} ceza {en_dogrulama[1]}: " f"{en_dogrulama[2]} tam sifir, sinama {en_dogrulama[4]:.4f}") print(f"sinamadan okunsaydi {en_sinama[0]} ceza {en_sinama[1]}: " f"{en_sinama[2]} tam sifir, sinama {en_sinama[4]:.4f}") print(f"iki secim arasindaki fark {en_dogrulama[4] - en_sinama[4]:.4f} m3\n") k, m = inis(3, 0.0), inis(10, 1.0) print(f"{'esik':>8} {'karesel ceza 3':>16} {'mutlak ceza 10':>16} (mutlak degeri altinda kalan katsayi)") for e in (1e-9, 0.001, 0.01, 0.1): print(f"{e:>8} {sum(1 for v in k[1] if abs(v) < e):>16} " f"{sum(1 for v in m[1] if abs(v) < e):>16}") kalan = [AD[j] for j in range(P) if abs(m[1][j]) > 1e-9] print(f"\nmutlak ceza 10'un birakigi {len(kalan)} sutun: {', '.join(kalan[:9])} ...") for c in (3000, 100000): for ad, pay in (("mutlak", 1.0), ("karesel", 0.0)): mm = inis(c, pay) print(f"{ad} ceza {c}: tam sifir {sum(1 for v in mm[1] if abs(v) < 1e-9)}/{P}, " f"sabit terim {mm[0]:.4f}, sinama {kok(kestirici(mm), SIN):.4f}") print(f"egitim ortalamasi {ORT:.4f}, taban cizgisi sinamada {kok(lambda x: ORT, SIN):.4f}")
dogrulamadan okunan karesel ceza 3: 0 tam sifir, sinama 5.2954
sinamadan okunsaydi mutlak ceza 10: 65 tam sifir, sinama 5.2909
iki secim arasindaki fark 0.0046 m3
esik karesel ceza 3 mutlak ceza 10 (mutlak degeri altinda kalan katsayi)
1e-09 0 65
0.001 0 65
0.01 5 66
0.1 29 71
mutlak ceza 10'un birakigi 22 sutun: b_guney, b_dogu, b_bati, b_merkez, d^1, m^1d^4, m^1d^5, m^3d^1, h^1 ...
mutlak ceza 3000: tam sifir 87/87, sabit terim 19.7665, sinama 6.5324
karesel ceza 3000: tam sifir 0/87, sabit terim 19.7665, sinama 6.0935
mutlak ceza 100000: tam sifir 87/87, sabit terim 19.7665, sinama 6.5324
karesel ceza 100000: tam sifir 0/87, sabit terim 19.7665, sinama 6.5086
egitim ortalamasi 19.7665, taban cizgisi sinamada 6.5324
Doğrulama kümesi karesel cezayı seçiyor ve o seçim 87 katsayının hepsini tutuyor. Sınamadan seçilseydi mutlak ceza 10 gelirdi: 65 katsayı tam sıfır, kalan 22 sütun ve 5,2909. İki seçim arasındaki fark 0,0046 m³’tür ve bu, 252 satırlık bir küme üzerinde on sekiz kez en küçüğü aramanın bedelidir.
Ama tablonun asıl söylediği fark bu değil. Aynı hata düzeyine iki ayrı sütun sayısıyla varılıyor: karesel ceza 87 sütunla 5,2954, mutlak ceza 22 sütunla 5,2909. Seyrekliğin ayrılmış kümedeki karşılığı bu kümede sıfırdır — 65 sütun modelden çıkıyor ve hata sayısı kötüleşmiyor. Seyreklik bir başarım kazancı değil, bir maliyet kazancıdır: kestirim için hesaplanacak, saklanacak ve açıklanacak sütun sayısı dörtte bire iniyor.
Eşik tablosu iki cezanın farkını daha keskin veriyor. Karesel cezanın 87 katsayısından hiçbiri ’un altında değil, ama 29’u 0,1’in altında. Yani karesel ceza da sütunları işlevsizleştiriyor — yalnız onları modelde tutuyor. Mutlak ceza ise 65’ini gerçekten atıyor ve 0,1 eşiğinde ancak 71’e çıkıyor; attıklarının dışında kalanları küçültmüyor.
Son dört satır iki biçimin sınırını gösteriyor. Mutlak ceza 3000’de 87 katsayının hepsi sıfırlanıyor, sabit terim eğitim ortalamasında kalıyor ve model sınamada tam olarak 6,5324, yani taban çizgisinin kendisini veriyor. Karesel ceza aynı ayarda 6,0935’te, yüz bin katsayıda ise 6,5086’da. Karesel ceza taban çizgisine yaklaşır ama sonlu bir ayarda ona ulaşmaz; mutlak ceza ulaşır. İki biçim arasındaki fark, hata eğrisinin herhangi bir yerinde değil, uçlarında görünür.
Özet
- Cezanın biçimi hata sayısında değil sütun sayısında görünür: üç biçimin en iyi doğrulama sayıları 5,2982, 5,3028 ve 5,3015 ile birbirinin 0,005 m³ içindedir.
- Karesel ceza altı ayarın hiçbirinde tek bir katsayıyı bile tam sıfırlamaz; mutlak ceza 42’den 84’e, karma ceza 24’ten 83’e çıkar. Sebep türevin biçimidir: karesel cezanın kuvveti katsayı küçüldükçe küçülür, mutlak cezanınki sabit kalır.
- Aynı hata düzeyine iki ayrı sütun sayısıyla varılıyor: karesel ceza 87 sütunla 5,2954, mutlak ceza 22 sütunla 5,2909. Seyrekliğin bu kümedeki karşılığı başarım değil maliyettir.
- Karesel ceza sütunları işlevsizleştirir ama atmaz: 87 katsayısından 29’u 0,1’in altındadır ve hiçbiri tam sıfır değildir.
- Mutlak ceza 3000’de bütün katsayılar sıfırlanır ve model tam olarak taban çizgisine, 6,5324’e döner; karesel ceza yüz bin katsayıda bile 6,5086’da kalır ve sonlu bir ayarda tabana ulaşmaz.
- Doğrulamadan okunan seçim karesel ceza 3’tür (sınamada 5,2954); sınamadan okunsaydı mutlak ceza 10 seçilirdi (5,2909) ve on sekiz adaylık bütçenin bedeli 0,0046 m³ olurdu.
Sonraki Adım
Üç derste hedef sürekli bir sayıydı ve model o sayıyı doğrudan söyledi. Kursun asıl through-line
problemi ise bir sınıflandırmadır: bir abonenin kaçak ya da arıza şüphesi taşıyıp taşımadığı, ve
oradaki taban çizgisi 0,7579. Aynı doğrusal model bu problemde doğrudan kullanılamaz, çünkü
düzlemin çıktısı eksi sonsuzdan artı sonsuza uzanır ve etiket yalnız sıfır ile birdir. Aradaki
köprü çıktının bir olasılığa sıkıştırılmasıdır. Sonraki ders bu sıkıştırmayı yazar ve ölçüsü
şudur: aynı model 0,5 eşiğiyle bir sayı, başka eşiklerle başka sayılar verir; eşiği seçmek ayrı
bir iştir ve model-degerlendirme konusuna bırakılır. Burada gösterilecek olan, çıktının eşikten
önce sürekli olduğu ve bu sürekliliğin tek bir sınıf etiketinden fazlasını taşıdığıdır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.