İçeriğe geç
academia.sh

Ders 11 / 11

Birliktelik Kuralları

Kurgu abone tablosunun 1.329 sepetinde destek tabanını geçen 166 kuralın ölçülmesi: güvene göre ilk altı kuralın altısı da aynı sık öğeyi sonuç gösterir ve kaldıraçları 1,0139 ile 1,0489 arasındadır; güveni 0,50'nin üstündeki 97 kuralın 75'inin kaldıracı 1'e 0,05'ten yakındır. Taban çizgisi rastgele eşleşmenin ürettiği destektir — öğe sütunları ayrı ayrı karıştırıldığında gecikme ile taksitlendirmenin 0,1279 desteği altmış karıştırmanın hiçbirinde 0,0467'yi aşmaz, ama güveni 0,9246 olan bir kuralın desteği rastgele aralığın içinde kalır. Kurs kapanışı on bir dersin tabanını, yöntemin sayısını ve farkını tek tabloda toplar.

İçindekiler

Önceki ders bir satırın tek başına durup durmadığını sordu ve yanıtı beş sayısal sütunda aradı. Abone kayıtlarının sayı olmayan bir yanı daha var: dönem içinde o abonede hangi olayların birlikte geçtiği. Soru biçimini koruyor: iki olayın birlikte görülmesi bir bulgu mudur, yoksa ikisinin ayrı ayrı ne kadar sık olduğuyla zaten açıklanabilir mi.

Birliktelik kuralları bu soruyu üç ölçütle yanıtlar ve biri tek başına yanıltır. Dersin sayısı, güvene göre seçilen kuralların kaçının yalnız sık öğeden geldiğidir; tabanı, öğeler birbirine rastgele eşlendiğinde çıkan destektir.

  • BA36. Küme M27/K01–K03’ün kurgu abone tablosudur, tohum 20260218, 1.329 abone. Her abone bir öğe kümesi olarak okunur: dönem içinde o abonede geçen hizmet kayıtları.
  • BA37. Bağımlılıklar üretece bilerek konmuştur ve hangisinin gerçek olduğu yalnız ölçüm için bilinir; hiçbir ölçüt bu bilgiyi görmez.
  • BA38. Üç ölçüt: destek, öğe kümesinin sepetlerdeki payı; güven, öncül geçtiğinde sonucun da geçme payı; kaldıraç, güvenin sonucun desteğine bölümü. Kaldıraç 1’den sapma olarak okunur; 1 birlikteliğin yokluğudur.
  • BA39. Taban çizgisi rastgele eşleşmenin ürettiği destektir: her öğenin sütunu sepetler arasında ayrı karıştırılır, sıklıklar korunur, birlikte geçme bağı kopar.
  • BA40. Bu ders yalnız kural çıkarmanın ölçütlerini kurar; hangi kuralın kime gösterileceği M27/K07’ye bırakılır.

Sepetler ve Öğe Destekleri

# ORTAK — KURGUDUR. M27/K01-K03'un abone tablosu ayni tohumla kurulur; bu kez her
# abonenin donem icindeki hizmet kayitlari bir OGE KUMESI olarak tutulur.
# Bagimliliklar uretece BILEREK konmustur ve yalniz olcum icin bilinir.
TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF


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


ABONE = []
for i in range(HAM):
    r = uretec(TOHUM + i)
    r(), r(), r()          # bolge, hane ve memnuniyet bu derste okunmuyor
    if r() >= 0.046:
        ABONE.append(10001 + i)

# (oge, kosul ogesi, kosul saglaninca olasilik, saglanmayinca olasilik)
TABLO = [("mobil_bildirim", None, 0.91, 0.91),        # bagimsiz, cok sik
         ("kesinti_bildirimi", None, 0.55, 0.55),     # bagimsiz, cok sik
         ("gecikme", None, 0.22, 0.22),
         ("taksitlendirme", "gecikme", 0.58, 0.04),   # yerlestirilmis bagimlilik
         ("otomatik_odeme", "gecikme", 0.13, 0.47),   # yerlestirilmis ters bagimlilik
         ("itiraz", None, 0.16, 0.16),
         ("cagri_merkezi", "itiraz", 0.90, 0.58),     # zayif bagimlilik, sik oge
         ("adres_degisikligi", None, 0.08, 0.08),
         ("sayac_degisimi", "adres_degisikligi", 0.36, 0.09),
         ("saha_ziyareti", "sayac_degisimi", 0.86, 0.19),
         ("tarife_degisikligi", None, 0.12, 0.12),
         ("kacak_ihbari", None, 0.05, 0.05)]
OGELER = [t[0] for t in TABLO]

SEPET = []
for no in ABONE:
    r, s = uretec(TOHUM + 37000 + no), set()
    for oge, kosul, p1, p0 in TABLO:
        if r() < (p1 if kosul is None or kosul in s else p0):
            s.add(oge)
    SEPET.append(s)

N = len(SEPET)
D1 = {o: sum(1 for s in SEPET if o in s) / N for o in OGELER}
print(f"kurgu: {N} abone sepeti, {len(OGELER)} oge; "
      f"sepet basina ortalama {sum(len(s) for s in SEPET) / N:.2f} oge")
for o in sorted(OGELER, key=lambda x: -D1[x]):
    print(f"  {o:<20} destek {D1[o]:.4f}")
kurgu: 1329 abone sepeti, 12 oge; sepet basina ortalama 3.68 oge
  mobil_bildirim       destek 0.9120
  cagri_merkezi        destek 0.6388
  kesinti_bildirimi    destek 0.5403
  otomatik_odeme       destek 0.3973
  saha_ziyareti        destek 0.2671
  gecikme              destek 0.2220
  taksitlendirme       destek 0.1670
  itiraz               destek 0.1497
  sayac_degisimi       destek 0.1332
  tarife_degisikligi   destek 0.1151
  adres_degisikligi    destek 0.0835
  kacak_ihbari         destek 0.0512

Destekler geniş bir aralığa yayılıyor: en sık öğe sepetlerin 0,9120’sinde, en seyreği 0,0512’sinde. Bu dağılım sonraki bölümün tuzağını kurar.

Güven Tek Başına

# Kural cikarma: onculde bir ya da iki oge, sonucta bir oge. Destek tabani
# bir karardir ve olcumden once sabitlenir.
from itertools import combinations

DESTEK_TABANI, GUVEN_TABANI = 0.05, 0.50


def destek(kume):
    return sum(1 for s in SEPET if kume <= s) / N


KURAL = []
onculler = [frozenset([o]) for o in OGELER] + \
           [frozenset(c) for c in combinations(OGELER, 2)]
for X in onculler:
    dx = destek(X)
    if dx < DESTEK_TABANI:
        continue
    for y in OGELER:
        if y in X:
            continue
        d = destek(X | {y})
        if d < DESTEK_TABANI:
            continue
        g = d / dx
        KURAL.append({"X": X, "y": y, "destek": d, "guven": g,
                      "kaldirac": g / D1[y]})

BIR = sum(1 for k in KURAL if len(k["X"]) == 1)
yakin = [k for k in KURAL if abs(k["kaldirac"] - 1) <= 0.05]
print(f"destek tabani {DESTEK_TABANI:.2f} ve uzerinde {len(KURAL)} kural "
      f"({BIR} tek ogeli oncul, {len(KURAL) - BIR} iki ogeli)")
print(f"kaldiraci 1'e 0,05'ten yakin kural: {len(yakin)} "
      f"({len(yakin) / len(KURAL):.4f})\n")


def yaz(baslik, sirali, adet=8):
    print(baslik)
    print(f"  {'kural':<46} {'destek':>7} {'guven':>7} {'kaldirac':>9}")
    for k in sirali[:adet]:
        ad = " + ".join(sorted(k["X"])) + " -> " + k["y"]
        print(f"  {ad:<46} {k['destek']:>7.4f} {k['guven']:>7.4f} "
              f"{k['kaldirac']:>9.4f}")


yuksek = sorted(KURAL, key=lambda k: (-k["guven"], sorted(k["X"]), k["y"]))
yaz("guvene gore ilk alti kural", yuksek, 6)
ilk = [k for k in yuksek if k["guven"] >= GUVEN_TABANI]
sik = sum(1 for k in ilk if abs(k["kaldirac"] - 1) <= 0.05)
print(f"\nguveni {GUVEN_TABANI:.2f} ve uzerinde {len(ilk)} kural var; "
      f"bunlarin {sik} tanesinin kaldiraci 1'e 0,05'ten yakin ({sik / len(ilk):.4f})")
son = {}
for k in ilk:
    son[k["y"]] = son.get(k["y"], 0) + 1
print("  sonuc ogesine gore: " + ", ".join(
    f"{o} {son[o]} (destek {D1[o]:.4f})" for o in sorted(son, key=lambda x: -son[x])))

tek = [k for k in KURAL if len(k["X"]) == 1]
yaz("\nkaldirac'a gore ilk dort kural (tek ogeli oncul)",
    sorted(tek, key=lambda k: (-k["kaldirac"], sorted(k["X"]), k["y"])), 4)
en_dusuk = min(tek, key=lambda k: (k["kaldirac"], sorted(k["X"]), k["y"]))
print(f"  en dusuk kaldiracli kural: {' + '.join(sorted(en_dusuk['X']))} -> "
      f"{en_dusuk['y']}, destek {en_dusuk['destek']:.4f}, "
      f"guven {en_dusuk['guven']:.4f}, kaldirac {en_dusuk['kaldirac']:.4f}")
destek tabani 0.05 ve uzerinde 166 kural (64 tek ogeli oncul, 102 iki ogeli)
kaldiraci 1'e 0,05'ten yakin kural: 115 (0.6928)

guvene gore ilk alti kural
  kural                                           destek   guven  kaldirac
  kesinti_bildirimi + tarife_degisikligi -> mobil_bildirim  0.0662  0.9565    1.0489
  tarife_degisikligi -> mobil_bildirim            0.1076  0.9346    1.0249
  itiraz + otomatik_odeme -> mobil_bildirim       0.0602  0.9302    1.0200
  cagri_merkezi + tarife_degisikligi -> mobil_bildirim  0.0700  0.9300    1.0198
  adres_degisikligi -> mobil_bildirim             0.0775  0.9279    1.0175
  itiraz -> mobil_bildirim                        0.1384  0.9246    1.0139

guveni 0.50 ve uzerinde 97 kural var; bunlarin 75 tanesinin kaldiraci 1'e 0,05'ten yakin (0.7732)
  sonuc ogesine gore: mobil_bildirim 32 (destek 0.9120), cagri_merkezi 28 (destek 0.6388), kesinti_bildirimi 25 (destek 0.5403), saha_ziyareti 4 (destek 0.2671), gecikme 4 (destek 0.2220), taksitlendirme 4 (destek 0.1670)

kaldirac'a gore ilk dort kural (tek ogeli oncul)
  kural                                           destek   guven  kaldirac
  taksitlendirme -> gecikme                       0.1279  0.7658    3.4498
  gecikme -> taksitlendirme                       0.1279  0.5763    3.4498
  saha_ziyareti -> sayac_degisimi                 0.1159  0.4338    3.2572
  sayac_degisimi -> saha_ziyareti                 0.1159  0.8701    3.2572
  en dusuk kaldiracli kural: kesinti_bildirimi -> saha_ziyareti, destek 0.1362, guven 0.2521, kaldirac 0.9437

Güvene göre ilk altı kuralın altısının da sonucu aynı öğe: sepetlerin 0,9120’sinde geçen kayıt. Güvenleri 0,9246–0,9565, öncülleri birbiriyle ilgisiz. Hangi öncül seçilirse seçilsin güven 0,91 dolayına oturur; kaldıraç sütunu bunu söylüyor, 1,0139 ile 1,0489 arasında.

Güveni 0,50’nin üstünde 97 kural var ve 75’inin kaldıracı 1’e 0,05’ten yakın: 0,7732. Sonuç öğesine göre 32, 28 ve 25 kural en sık üç öğeyi gösteriyor — 97’nin 85’i. Eşiği yükseltmek bunu düzeltmez; eşik yükseldikçe onu yalnız sık öğeler geçebilir.

Kaldıraca göre sıralama başka bir liste veriyor: ilk dörtte iki çift, her çift iki yönde — taksitlendirme ile gecikme 3,4498, sayaç değişimi ile saha ziyareti 3,2572. Aynı satırlarda güvenin bakışımsız, kaldıracın bakışımlı olduğu okunuyor: gecikmeden taksitlendirmeye güven 0,5763, ters yönde 0,7658, kaldıraç ikisinde de aynı. En düşük kaldıraç 0,9437; 1’in altına düşen bir kaldıraç birlikte geçmenin rastlantıdan daha seyrek olduğunu söyler.

Rastgele Eşleşme Tabanı

# TABAN CIZGISI: rastgele eslesmenin urettigi destek. Her ogenin sutunu
# sepetler arasinda ayri ayri karistirilir; oge sikliklari birebir korunur,
# birlikte gecme bagi kopar. Kaldirac bu tabanin kapali bicimidir.
BIT = {o: 1 << b for b, o in enumerate(OGELER)}
SUTUN = [[1 if o in s else 0 for s in SEPET] for o in OGELER]
TEKRAR = 60


def ustkume_toplami(maskeler):
    # Her desen icin o deseni kapsayan sepet sayisi: 12 bitlik tek gecis.
    h = [0] * (1 << len(OGELER))
    for m in maskeler:
        h[m] += 1
    for b in range(len(OGELER)):
        for m in range(len(h)):
            if not m & (1 << b):
                h[m] += h[m | (1 << b)]
    return h


def karistirilmis(tohum):
    rr, yeni = uretec(tohum), [0] * N
    for b, sut in enumerate(SUTUN):
        c = list(sut)
        for i in range(N - 1, 0, -1):
            j = int(rr() * (i + 1))
            c[i], c[j] = c[j], c[i]
        for i in range(N):
            if c[i]:
                yeni[i] |= 1 << b
    return yeni


RAST = [ustkume_toplami(karistirilmis(TOHUM + 41000 + t)) for t in range(TEKRAR)]
ORNEK = (("gecikme", "taksitlendirme"), ("sayac_degisimi", "saha_ziyareti"),
         ("tarife_degisikligi", "mobil_bildirim"), ("itiraz", "mobil_bildirim"))
desen = lambda k: sum(BIT[o] for o in k["X"]) | BIT[k["y"]]
rastgele = lambda k: [R[desen(k)] / N for R in RAST]

print(f"{TEKRAR} karistirmada rastgele eslesmenin urettigi destek\n")
print(f"  {'kural':<38} {'gercek':>7} {'rastgele':>9} {'en cok':>7} {'kaldirac':>9}")
for k in sorted((k for k in KURAL if len(k["X"]) == 1
                 and (sorted(k["X"])[0], k["y"]) in ORNEK),
                key=lambda k: -k["kaldirac"]):
    r = rastgele(k)
    print(f"  {sorted(k['X'])[0] + ' -> ' + k['y']:<38} {k['destek']:>7.4f} "
          f"{sum(r) / len(r):>9.4f} {max(r):>7.4f} {k['kaldirac']:>9.4f}")

DISARIDA = {i: k["destek"] > max(rastgele(k)) or k["destek"] < min(rastgele(k))
            for i, k in enumerate(KURAL)}
print(f"\n{len(KURAL)} kural iki olcute gore ayni anda ayriliyor")
print(f"  {'':<22} {'aralik icinde':>14} {'aralik disinda':>15}")
for ad, kosul in (("kaldirac 1'e yakin", True), ("kaldirac 1'den uzak", False)):
    g = [i for i, k in enumerate(KURAL) if (abs(k["kaldirac"] - 1) <= 0.05) == kosul]
    ic = sum(1 for i in g if not DISARIDA[i])
    print(f"  {ad:<22} {ic:>14} {len(g) - ic:>15}")

dt = destek(frozenset(["gecikme", "otomatik_odeme"]))
print(f"\ndestek tabaninin altinda kalan bir bagimlilik: gecikme + otomatik_odeme "
      f"destek {dt:.4f}, kaldirac {dt / (D1['gecikme'] * D1['otomatik_odeme']):.4f}; "
      f"taban {DESTEK_TABANI:.2f} oldugu icin kural listesine hic girmiyor")
60 karistirmada rastgele eslesmenin urettigi destek

  kural                                   gercek  rastgele  en cok  kaldirac
  gecikme -> taksitlendirme               0.1279    0.0362  0.0467    3.4498
  sayac_degisimi -> saha_ziyareti         0.1159    0.0354  0.0451    3.2572
  tarife_degisikligi -> mobil_bildirim    0.1076    0.1043  0.1099    1.0249
  itiraz -> mobil_bildirim                0.1384    0.1363  0.1407    1.0139

166 kural iki olcute gore ayni anda ayriliyor
                          aralik icinde  aralik disinda
  kaldirac 1'e yakin                107               8
  kaldirac 1'den uzak                26              25

destek tabaninin altinda kalan bir bagimlilik: gecikme + otomatik_odeme destek 0.0316, kaldirac 0.3584; taban 0.05 oldugu icin kural listesine hic girmiyor

Taban çizgisi ilk iki satırda. Gecikme ile taksitlendirme sepetlerin 0,1279’unda birlikte geçiyor; sütunlar karıştırıldığında aynı çift ortalama 0,0362’ye iniyor ve altmış karıştırmanın en yükseği 0,0467. Fark 0,0917 ve veriden geliyor.

Son iki satır tersini gösteriyor. Güveni 0,9246 olan kuralın desteği 0,1384; rastgele eşleşme aynı çifti ortalama 0,1363’e, en yüksek 0,1407’ye taşıyor. Gerçek destek rastgele aralığın içinde; kural yüksek güveni tümüyle sonucun kendi sıklığından alıyor. Kaldıraç bu tabanın kapalı biçimidir: desteklerin çarpımına bölmek, karıştırmanın ortalamada ürettiğine bölmektir.

İki ölçüt çaprazlandığında 166 kural dört kutuya dağılıyor: kaldıracı 1’e yakın 115 kuralın 107’si rastgele aralığın içinde, kaldıracı uzak 51 kuralın 26’sı da. Toplam 133 kural rastgele eşleşmenin ürettiğinden ayırt edilemiyor. Ters yöndeki 8 satır da anlamlıdır: destek büyüdükçe aralık daralır ve 1,04’lük bir kaldıraç bile dışarı düşer. Kaldıracın sapması yetmez, sapmanın rastlantıyla ne sıklıkta üretildiği de gerekir.

Son satır başka bir yüz açıyor. Gecikme ile otomatik ödeme arasındaki kurgu bağımlılığın kaldıracı 0,3584, listedeki her şeyden uzak; ama ikisi birlikte sepetlerin yalnız 0,0316’sında geçtiği için destek tabanının altında kalıyor ve listeye hiç girmiyor. Taban 0,03 olsaydı bu kural listenin başında olurdu.

Özet

  • Güvene göre ilk altı kuralın altısının da sonucu sepetlerin 0,9120’sinde geçen aynı öğedir; kaldıraçları 1,0139–1,0489.
  • Güveni 0,50’nin üstündeki 97 kuralın 75’inin kaldıracı 1’e 0,05’ten yakındır ve 85’i en sık üç öğeyi sonuç gösterir.
  • Taban rastgele eşleşmenin ürettiği destektir: gecikme ile taksitlendirmenin 0,1279’luk desteği altmış karıştırmanın hiçbirinde 0,0467’yi aşmaz, ama güveni 0,9246 olan kuralın desteği rastgele aralığın içinde kalır.
  • 166 kuralın 133’ü rastgele eşleşmenin ürettiğinden ayırt edilemiyor.
  • Destek tabanı bir karardır: kaldıracı 0,3584 olan gerçek bir bağımlılık, desteği 0,0316 olduğu için 0,05’lik tabanın altında kalır ve listeye hiç girmez.

Kurs Kapanışı

On bir dersin hesabı tek tabloda ve her sayı kendi dersinden okundu. Üçlü her satırda aynıdır, ama satırlar ortak bir birim taşımaz: etiket yokken ölçütü de her ders kendisi seçer. Son sütun bunu yazar — uzaklık ve hata satırlarında küçük olan iyidir, oran ve puan satırlarında büyük olan. Fark, yöntemin sayısı eksi tabandır.

Ders Taban çizgisi Yöntemin sayısı Fark Ölçüt
Kümeleme 01 rastgele atama 5,9790 3,8910 −2,0880 küme içi uzaklık
Kümeleme 02 rastgele atama 5,9181 2,2570 −3,6611 küme içi uzaklık
Kümeleme 03 rastgele atama 6,2340 4,5419 −1,6922 küme içi uzaklık
Kümeleme 04 rastgele işaretleme 1,0200 1,7551 +0,7351 komşu uzaklığı
Kümeleme 05 rastgele atama −4,2424 −3,7755 +0,4669 uyum puanı
Kümeleme 06 tek küme 0,6539 0,5235 −0,1304 uyum göstergesi
Boyut azaltma 01 sütun ortalaması 3,3411 2,7762 −0,5650 geri kurma hatası
Boyut azaltma 02 sütun ortalaması 3,3411 2,7464 −0,5947 geri kurma hatası
Boyut azaltma 03 rastgele yerleşim 0,0390 0,5032 +0,4642 komşuluk korunma oranı
Boyut azaltma 04 rastgele işaretleme 0,0488 0,6190 +0,5702 kesinlik
Boyut azaltma 05 rastgele eşleşme 0,0362 0,1279 +0,0917 kuralın desteği

İkinci sütun her derste ayrı bir yordamla üretildi: rastgele atama, tek küme, rastgele işaretleme, sütun ortalamasıyla geri kurma, rastgele yerleşim, rastgele eşleşme. Denetimli kursta taban hazırdı — en sık etiketi söylemek — burada her ders tabanını kendisi kurdu. Kursun kuralı budur: etiketsiz bir sonuç, rastgele bir sonuçtan ne kadar ayrıldığı kadar vardır; tabanı kurulmayan kümeleme ölçülmemiş sayılır. Üç satır dipnotsuz okunamaz: Kümeleme 06’da 0,5235 tabanının altındadır, Kümeleme 04’ün +0,7351’i veriden değil ölçütten gelir, Boyut azaltma 03’ün 0,5032’si altı adayın en iyisidir ve dürüst aralık 0,3940–0,5032’dir.

Kursun ikinci iddiası aynı tablodan okunur: denetimsiz sonuçta doğru cevap yoktur, ölçüt seçimi cevabı belirler. Ölçüt değiştirildiğinde cevabın da değiştiği ders sayısı on — üç benzerlik tanımı üç bölmeleme, üç bağlantı ölçütü aynı yükseklikte 3, 37 ve 56 küme, üç iç geçerlilik ölçütü 3, 6 ve 10 seçti; kümeleme 04’te iki ölçüt ters sıralama verdi, boyut azaltma 03’te birinin koruduğunu öbürü attı, burada da güven ile kaldıraç iki ayrı liste çıkardı.

Yirmi bir derste — on biri etiketsiz — her yöntem özniteliklerin verildiği varsayımıyla çalıştı. Ölçekleme, kodlama, üretme ve azaltma hep elle karar verildi ve her kararın bedeli ayrı ayrı ölçüldü. Bu kararları da verinin kendisinden öğrenen bir yordamın neyi kazandırdığı ve neyi görünmez kıldığı hiç sorulmadı. Sonraki kurs, Derin Öğ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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat