İçeriğe geç
academia.sh

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 10910^{-9}’dur ve iniş yordamının sıfırladığı katsayı tam olarak 0.0 atandığı 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 10910^{-9}’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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat