İçeriğe geç
academia.sh

Ders 03 / 15

Temel Model

Taban çizgisinin bir araç değil bir tasarım nesnesi olduğunun ölçülmesi: aynı derinlik 6 karar ağacı sekiz ayrı taban adayına karşı -0,0119 ile +0,5357 arasında okunuyor ve seçim tek başına 0,5476 oynatıyor. Arama tablosu tabanı kendi kapasitesine sahiptir — beş hücrede 0,7579, on beş hücrede 0,7897 ile modeli geçiyor, otuz dokuz hücrede 0,7500'e düşüyor. Taban seçimi alt gruplarda da yön değiştiriyor: en sık sınıfa göre on iki alt grubun dördünde tabanın altında kalan model, bölge ve basamak arama tablosuna göre sekizinde altında kalıyor ve fark açıklığı 0,2173'ten 0,1351'e iniyor. M27'nin yedi kursunda seçilmiş taban çizgileri tek tabloda toplanıyor.

İçindekiler

Önceki ders taban çizgisini ikinci kez kendi başına bir soruya dönüştürdü. Bedel yapısı değişince taban da değişti: bir yapıda hiç kimseyi işaretlememek, öbüründe herkesi işaretlemek. Alt gruplarda ise her grubun kendi tabanı çıktı ve bir grupta 0,0000, başkasında 0,7882 oldu. Yedi kurs boyunca taban çizgisi bir araçtı — modelin sayısını okunur kılan, seçildikten sonra bir daha tartışılmayan sabit bir işaret.

Bu ders onun sabit olmadığını ölçer. Bir problemde kaç taban vardır, aralarında nasıl seçim yapılır, seçim aynı modeli hangi iki ayrı biçimde okutur. Taban çizgisi burada bir araç değil bir tasarım nesnesidir: kendi kapasitesi, kendi aşırı uyumu ve kendi alt grup davranışı olan bir yordamdır. Dersin sonunda M27’nin yedi kursunda fiilen seçilmiş tabanlar tek bir tabloda toplanır.

  • DT16. Kurgu, bölme (756/252/252), tohum, ölçüt (doğruluk) ve alt grup tanımları önceki iki dersten aynen sürer: dört eksen, 13 alt grup, n < 25 olan grup açıklığa girmez.
  • DT17. Karşılaştırılan model derinlik 6 karar ağacıdır ve sınama kümesinde 0,7778 verir. Bu sayı ders boyunca hiç değişmez; değişen tek şey karşısına konan tabandır.
  • DT18. Taban adayı, eğitim kümesinden öğrenilmiş olsa bile modelin kullandığı özniteliklerin tamamına bakmayan ve kendisi bir ayar araması yapmayan yordamdır. Sınır bir karardır.
  • DT19. Sekiz aday sınanır: hepsini şüpheli saymak, sınıf oranına göre rastgele atamak, en sık sınıfı söylemek, tek bölmeli bir kural, ve dört arama tablosu — bölge; bölge ve basamak; bunlara hane; dört eksenin tamamı. Arama tablosu bir hücredeki eğitim çoğunluğunu söyler, görülmemiş hücrede en sık sınıfı; hücre sayısı yazılır, çünkü ölçülen şey odur.
  • DT20. Rastgele atama yirmi koşumun ortalamasıdır; tek koşum basılsaydı sayı koşumdan koşuma oynardı.
  • DT21. Adaylar arasında seçim bu derste yapılmaz. Ölçülen şey seçimin sonucu değil, seçimin aynı modeli ne kadar oynatabildiğidir.
  • DT22. Son bölümdeki kurs tablosunun her sayısı kaynak dersten okunmuştur; birimler kurslar arasında ortak değildir ve satırlar birbiriyle toplanmaz.

Bir Problemde Kaç Taban Var

İlk blok kurguyu kurar, modeli eğitir ve sekiz taban adayını aynı sınama kümesinde ölçer.

# MODELDIR. M26'nin KURGU olcum agi ayni tohumla uretilir, okumalar abone duzeyinde
# ozetlenir ve uzerine KURGU bir kacak/ariza suphesi etiketi eklenir.
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, OKUMA, 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 = uretec(TOHUM + 7000 + k["no"])
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        OKUMA.setdefault(k["no"], []).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()
    v = OKUMA.get(k["no"])
    if v is None:
        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": k["bolge"][0]}
    for b in BOLGE:
        x["b_" + b[0]] = int(k["bolge"][0] == b[0])
    VERI.append(x)

ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]


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]


def uce_bol(K):
    a, b = int(len(K) * 0.6), int(len(K) * 0.8)
    return K[:a], K[a:b], K[b:]


def safsizlik(s):
    p = sum(x["supheli"] for x in s) / len(s) if s else 0.0
    return 2 * p * (1 - p)


def agac(s, derinlik, alanlar, enaz=2):
    p, en = sum(x["supheli"] for x in s) / len(s), None
    if derinlik and len(s) >= 2 * enaz and 0.0 < p < 1.0:
        for a in alanlar:
            d = sorted({x[a] for x in s})
            for v in (d[1:] if len(d) < 10 else
                      [d[int(i * len(d) / 10)] for i in range(1, 10)]):
                sol = [x for x in s if x[a] < v]
                sag = [x for x in s if x[a] >= v]
                if min(len(sol), len(sag)) < enaz:
                    continue
                k = safsizlik(s) - (len(sol) * safsizlik(sol) + len(sag) * safsizlik(sag)) / len(s)
                if en is None or k > en[0]:
                    en = (k, a, v, sol, sag)
    if en is None or en[0] <= 1e-9:
        return {"tahmin": int(p > 0.5)}
    return {"alan": en[1], "esik": en[2], "sol": agac(en[3], derinlik - 1, alanlar),
            "sag": agac(en[4], derinlik - 1, alanlar)}


def tahmin(d, x):
    while "tahmin" not in d:
        d = d["sol"] if x[d["alan"]] < d["esik"] else d["sag"]
    return d["tahmin"]


def dogruluk(d, s):
    return sum(tahmin(d, x) == x["supheli"] for x in s) / len(s)


def gruplar(x):                    # dort eksen, on uc alt grup; 01'den aynen surer
    return [("bolge", x["bolge"]),
            ("tarife", "10" if x["ort_tuketim"] <= 10 else
             ("25" if x["ort_tuketim"] <= 25 else "40")),
            ("hane", "1-2" if x["hane"] <= 2 else ("3-4" if x["hane"] <= 4 else "5+")),
            ("okuma", "az" if x["donem"] <= 2 else "tam")]


ADLAR = sorted({g for x in VERI for g in gruplar(x)})
EGT, DOG, SIN = uce_bol(karistir(VERI, TOHUM + 90000))
M, TEK = agac(EGT, 6, ALAN), agac(EGT, 1, ALAN)
ORAN = sum(x["supheli"] for x in EGT) / len(EGT)
CS = int(ORAN > 0.5)


def gr(x):
    return dict(gruplar(x))


def arama(anahtar):                # arama tablosu tabani: hucrede egitim cogunlugu
    c = {}
    for x in EGT:
        c.setdefault(anahtar(x), [0, 0])[x["supheli"]] += 1
    c = {k: int(v[1] > v[0]) for k, v in c.items()}
    return lambda x: c.get(anahtar(x), CS)


def rast(s, n=20):                 # sinif oranina gore atama, yirmi kosumun ortalamasi
    t = 0.0
    for j in range(n):
        r = uretec(TOHUM + 61000 + j)
        t += sum((1 if r() < ORAN else 0) == x["supheli"] for x in s) / len(s)
    return t / n


def oran(f, s):
    return sum(f(x) == x["supheli"] for x in s) / len(s)


ANAHTAR = (("bolge", lambda x: x["bolge"]),
           ("bolge+basamak", lambda x: (x["bolge"], gr(x)["tarife"])),
           ("+hane", lambda x: (x["bolge"], gr(x)["tarife"], gr(x)["hane"])),
           ("dort eksen", lambda x: (x["bolge"], gr(x)["tarife"], gr(x)["hane"],
                                     gr(x)["okuma"])))
ADAY = [("hepsi supheli", 1, lambda x: 1), ("en sik sinif", 1, lambda x: CS),
        ("tek kural", 2, lambda x: tahmin(TEK, x))]
ADAY += [(ad, len({k(x) for x in EGT}), arama(k)) for ad, k in ANAHTAR]

mm = dogruluk(M, SIN)
print(f"model, derinlik 6 karar agaci: egitim {dogruluk(M, EGT):.4f} sinama {mm:.4f}\n\n"
      f"{'taban adayi':<16} {'hucre':>5} {'egitim':>7} {'sinama':>7} {'model farki':>12}")
print(f"{'rastgele atama':<16} {'--':>5} {rast(EGT):>7.4f} {rast(SIN):>7.4f} "
      f"{mm - rast(SIN):>+12.4f}")
fk = [mm - rast(SIN)]
for ad, n, f in ADAY:
    fk.append(mm - oran(f, SIN))
    print(f"{ad:<16} {n:>5} {oran(f, EGT):>7.4f} {oran(f, SIN):>7.4f} {fk[-1]:>+12.4f}")
print(f"\ntaban secimi ayni modeli {min(fk):+.4f} ile {max(fk):+.4f} arasinda okutuyor:"
      f" aralik {max(fk) - min(fk):.4f}")
model, derinlik 6 karar agaci: egitim 0.8466 sinama 0.7778

taban adayi      hucre  egitim  sinama  model farki
rastgele atama      --  0.6522  0.6450      +0.1327
hepsi supheli        1  0.2222  0.2421      +0.5357
en sik sinif         1  0.7778  0.7579      +0.0198
tek kural            2  0.7778  0.7579      +0.0198
bolge                5  0.7778  0.7579      +0.0198
bolge+basamak       15  0.7897  0.7897      -0.0119
+hane               39  0.7976  0.7500      +0.0278
dort eksen          66  0.8095  0.7738      +0.0040

taban secimi ayni modeli -0.0119 ile +0.5357 arasinda okutuyor: aralik 0.5476

Son sütun tek bir modelin sekiz ayrı okunuşudur. Model hiç değişmedi: sınama kümesinde 0,7778. Ama “hepsini şüpheli say” tabanına göre modelin katkısı +0,5357, “bölge ve basamak arama tablosu” tabanına göre −0,0119. Aradaki 0,5476, verinin ya da modelin değil yalnızca taban seçiminin ürettiği bir sayıdır. Aynı çalışma iki ayrı raporla anlatılabilir ve ikisi de doğru hesaplanmıştır.

Ortadaki üç satır ikinci sonucu veriyor. En sık sınıf, tek bölmeli bir kural ve bölgeye bakan bir arama tablosu aynı sayıyı üretiyor: 0,7579. Şüphelilik oranı hiçbir bölgede yarıyı geçmediği için bölge tablosunun beş hücresi de aynı yanıtı söylüyor. Bir tabanı karmaşıklaştırmak onu güçlendirmez; ancak hücrelerde çoğunluk değişirse güçlenir.

Asıl bulgu iki satır aşağıdadır. Bölge ile tarife basamağı birlikte alındığında on beş hücreden bazılarında çoğunluk dönüyor ve tablo 0,7897 okuyor — derinlik 6 karar ağacının üstünde. On bir öznitelikle eğitilmiş, yüzlerce bölme adayı denemiş bir ağaç, iki sütunlu bir arama tablosuna kaybediyor. Hane eklendiğinde hücre sayısı 39’a çıkıyor: eğitim sayısı 0,7976’ya yükselirken sınama sayısı 0,7500’e düşüyor. Dört eksenin tamamında 66 hücre, eğitim 0,8095, sınama 0,7738. Taban çizgisinin de bir kapasitesi vardır ve o kapasite aşıldığında taban da aşırı uyum gösterir. Bu, tabanı bir araçtan çıkarıp bir tasarım nesnesine çeviren şeydir: seçilirken model seçerken sorulan sorular sorulur.

Taban Seçimi Alt Gruplarda Yön Değiştiriyor

İki tabanın bütündeki farkı yalnız 0,0318’dir. Alt gruplara inildiğinde ikisi aynı şeyi söylemiyor.

AB = arama(lambda x: (x["bolge"], gr(x)["tarife"]))
print(f"{'alt grup':<14} {'n':>4} {'model':>7} {'A taban':>8} {'A fark':>8} "
      f"{'B taban':>8} {'B fark':>8}")
fa, fb = [], []
for g in ADLAR:
    s = [x for x in SIN if g in gruplar(x)]
    a, b, d = oran(lambda x: CS, s), oran(AB, s), dogruluk(M, s)
    if len(s) >= 25:
        fa.append(d - a)
        fb.append(d - b)
    print(f"{' '.join(g):<14} {len(s):>4} {d:>7.4f} {a:>8.4f} {d - a:>+8.4f} "
          f"{b:>8.4f} {d - b:>+8.4f}{'  n<25' if len(s) < 25 else ''}")
print(f"\nA en sik sinif   : fark {min(fa):+.4f} .. {max(fa):+.4f}, aciklik "
      f"{max(fa) - min(fa):.4f}, tabanin altinda {sum(1 for v in fa if v < 0)}/{len(fa)}")
print(f"B bolge+basamak  : fark {min(fb):+.4f} .. {max(fb):+.4f}, aciklik "
      f"{max(fb) - min(fb):.4f}, tabanin altinda {sum(1 for v in fb if v < 0)}/{len(fb)}")
alt grup          n   model  A taban   A fark  B taban   B fark
bolge bati       32  0.9688   1.0000  -0.0312   1.0000  -0.0312
bolge dogu       36  0.6111   0.4722  +0.1389   0.6944  -0.0833
bolge guney      58  0.8793   0.8276  +0.0517   0.8276  +0.0517
bolge kuzey      68  0.7794   0.8235  -0.0441   0.8235  -0.0441
bolge merkez     58  0.6724   0.6552  +0.0172   0.6552  +0.0172
hane 1-2         73  0.7945   0.7534  +0.0411   0.8219  -0.0274
hane 3-4        143  0.7762   0.7692  +0.0070   0.7832  -0.0070
hane 5+          36  0.7500   0.7222  +0.0278   0.7500  +0.0000
okuma az         85  0.7412   0.7882  -0.0471   0.7647  -0.0235
okuma tam       167  0.7964   0.7425  +0.0539   0.8024  -0.0060
tarife 10        12  0.5833   0.6667  -0.0833   0.6667  -0.0833  n<25
tarife 25       193  0.8290   0.8394  -0.0104   0.8394  -0.0104
tarife 40        47  0.6170   0.4468  +0.1702   0.6170  +0.0000

A en sik sinif   : fark -0.0471 .. +0.1702, aciklik 0.2173, tabanin altinda 4/12
B bolge+basamak  : fark -0.0833 .. +0.0517, aciklik 0.1351, tabanin altinda 8/12

Doğu bölgesi iki tabanın ayrıldığı yerdir. En sık sınıfa göre model orada tabanı 0,1389 geçiyor ve kursun en iyi katkılarından birini veriyor; bölge ve basamak tablosuna göre tabanın 0,0833 altında kalıyor. Tarife 40 basamağında da aynı şey oluyor: +0,1702 yerine 0,0000. İki sayı da doğru. Fark, birinci tabanın doğu bölgesinin yüksek şüphe oranından habersiz olması, ikincisinin ise o oranı zaten biliyor olmasıdır. Model bir alt grupta ne kattığını, ancak o alt grubu zaten bilen bir tabanla karşılaştırıldığında söyler.

İki özet satırı sonucu veriyor. En sık sınıf tabanına göre model on iki alt grubun dördünde tabanın altında; arama tablosu tabanına göre sekizinde. Fark açıklığı da 0,2173’ten 0,1351’e iniyor. Güçlü taban modelin katkısını hem küçültüyor hem de alt gruplar arasında düzleştiriyor; bu bir kusur değil, tabanın alt grubu zaten hesaba katmasının sonucudur. Hangi tabanın raporlanacağı bu yüzden çalışmanın ne iddia ettiğini belirleyen karardır.

M27’nin Yedi Kursunda Seçilmiş Tabanlar

Yedi kurs boyunca her ders bir taban seçti ve gerekçesini yazdı. Aşağıdaki tablo o seçimleri kaynak derslerden toplar. Birimler ortak değildir ve satırlar birbiriyle toplanmaz.

Kurs Seçilen öğrenmeyen yordam Birim Örnek sayı
K01 Makine Öğrenmesine Giriş eğitim kümesinin en sık sınıfı doğruluk sınamada 0,7579
K02 Veri Hazırlama ve Öznitelik Mühendisliği hazırlık kararı uygulanmamış aynı kurulum doğruluk 0,7302 ile 0,8294 arası
K03 Denetimli Öğrenme en sık sınıf; bağlanımda ortalamayı söylemek doğruluk, m³ hata karşılaştırma çizgileri 0,7857 ve 0,8016
K04 Denetimsiz Öğrenme rastgele atama, sütun ortalaması, tek küme küme içi uzaklık, geri kurma hatası rastgele atama 5,9790
K05 Derin Öğrenme her veri kümesi için ayrı en sık sınıf doğruluk abone 0,7579; ızgara 0,5850; dizi 0,7100
K06 Doğal Dil İşleme ve Bilgisayarla Görme alana özgü taban doğruluk, örtüşme, sözlük boyu oran birimli on iki taban 0,0400 ile 0,8731 arası
K07 Pekiştirmeli Öğrenme ve Öneri Sistemleri rastgele eylem; en çok seçilen kalem getiri; ilk beş isabeti 10,432 ve 0,6527

Tablodan iki şey okunur. Birincisi, taban çizgisi kurstan kursa tür değiştiriyor: bir sınıfı söylemek, bir ortalamayı söylemek, rastgele davranmak, en çok seçileni önermek, ya da bir kararın uygulanmadığı hâli koymak. İkincisi, K05 ve K06 satırları aynı kurs içinde bile tek bir taban olmadığını gösteriyor: dört ayrı veri kümesi dört ayrı taban. “Taban çizgisini geçti” cümlesi yazıldığında geçilen şey her seferinde başka bir yordamdı, ve bu dersin tablosu o farkın büyüklüğünü veriyor.

Özet

  • Taban çizgisi bir araç değil bir tasarım nesnesidir. Aynı derinlik 6 karar ağacı, sekiz taban adayına karşı −0,0119 ile +0,5357 arasında okunuyor; seçimin tek başına oynattığı 0,5476.
  • Bir tabanı karmaşıklaştırmak onu güçlendirmez: en sık sınıf, tek bölmeli kural ve bölge arama tablosu aynı 0,7579’u veriyor, çünkü hiçbir bölgede çoğunluk dönmüyor.
  • Taban çizgisinin de kapasitesi vardır. Arama tablosu 15 hücrede 0,7897 ile modeli geçiyor, 39 hücrede eğitimde 0,7976’ya çıkarken sınamada 0,7500’e düşüyor: taban da aşırı uyum gösterir.
  • Alt gruplarda taban seçimi yön değiştiriyor. Doğu bölgesinde model bir tabana göre +0,1389, öbürüne göre −0,0833. En sık sınıfa göre 12 alt grubun 4’ünde tabanın altında olan model, arama tablosuna göre 8’inde altında; fark açıklığı 0,2173’ten 0,1351’e iniyor.
  • M27’nin yedi kursunda taban çizgisi tür değiştirdi ve tek bir kursta bile birden çok taban kullanıldı; “tabanı geçti” cümlesinde geçilen şey her seferinde başka bir yordamdır.

Sonraki Adım

Üç derste on dört ayrı sayı çifti karşılaştırıldı ve hepsinde fark doğrudan okundu: 0,0198, −0,0119, +0,1702. Hiçbirinde sorulmayan şey, bu farkların 252 abonelik bir kümenin gürültüsünden ayırt edilip edilemeyeceğidir. Bir alt grupta 36 aboneden okunan 0,1389’luk bir katkı, birkaç abonenin sınıfı ters dönseydi kaybolabilir. Hipotez sınaması, yeniden karıştırma ve geri koyarak örnekleme M26/K05’te ölçüldü ve tekrarlanmayacak. Sonraki ders yalnız şunu ölçer: iki modelin farkının payı ne kadardır, aynı örneklerde ölçülen eşleştirilmiş karşılaştırma bağımsız karşılaştırmadan ne kadar dar bir pay verir, ve ayrılmış kümenin büyüklüğü o payı nasıl belirler.

İ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