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.