Ders 02 / 15
Ölçüt Seçimi
Aynı modelin iki bedel yapısında iki ayrı işletme noktası ve iki ayrı karar vermesi: denetimin pahalı olduğu yapıda seçilen eşik 0,95 ve 252 abonenin 17'si işaretleniyor, kaçağın pahalı olduğu yapıda eşik 0,25 ve 77'si işaretleniyor; 60 abonenin kararı iki yapı arasında ters dönüyor. Taban çizgisi de bedelle birlikte değişiyor — birinde hiç kimseyi işaretlememek 0,2421, öbüründe herkesi işaretlemek 0,7579. Tek eşiğin alt gruplardaki kazancı +0,4138 ile -0,4468 arasında dağılıyor, açıklık 0,8606, ve on iki alt grubun dördünde model kendi tabanının altında kalıyor; alt gruba özgü eşik seçmek ise sınama bedelini yalnız dördünde düşürüyor.
İçindekiler
Önceki ders ölçütü doğruluk olarak aldı ve hiç sorgulamadı. Doğruluk iki hata türünü aynı ağırlıkta sayar: şüphesiz bir aboneyi denetime göndermek ile şüpheli bir aboneyi kaçırmak eşit ağırlıkta yanlıştır. İşletmede eşit değildir. Bir denetim ekibinin yolu, zamanı ve boşa giden ziyaretin abonede bıraktığı iz bir bedeldir; kaçırılan bir kaçak ya da giderilmemiş bir arıza başka bir bedeldir, ve ikisinin oranı bir iş kararıdır.
Bu ders o oranı bedel yapısı olarak yazar ve tek şeyi ölçer: aynı model, aynı puanlar, iki ayrı bedel yapısı — kaç ayrı işletme noktası, kaç ayrı karar. Ölçüt tanımları, eşik ve eğriler M27/K03’ün model değerlendirme konusunda kuruldu ve burada tekrarlanmaz. Eklenen tek şey, eşiğin iş hedefinden okunmasıdır. Alt gruplar ve üçlü önceki dersten aynen sürer.
- DT8. Kurgu, bölme (756/252/252), tohum ve alt grup tanımları önceki dersten aynen sürer: dört eksen, 13 alt grup, her sayının yanına n yazılır ve n < 25 olan grup açıklığa girmez.
- DT9. Model aynı derinlik 6 karar ağacıdır, tek farkla: yaprakta sınıf değil şüpheli oranı durur. Bu oran modelin puanıdır; eşiğin üstündeki abone denetime gönderilir.
- DT10. Ölçüt abone başına bedeldir ve küçük iyidir. Yanlış alarm (işaretlenen ama şüphesiz abone) , kaçırma (işaretlenmeyen ama şüpheli abone) birim tutar; doğru kararlar sıfır tutar. Birim soyuttur ve para değildir.
- DT11. İki bedel yapısı sınanır. Denetim pahalı: , . Kaçak pahalı: , . İkisi de kurgudur ve bir iş kararını temsil eder.
- DT12. Eşik 10 aday üzerinde süpürülür (0,05’ten 0,95’e onda birlik adımlarla) ve doğrulama kümesinden seçilir; sınama kümesi yalnız rapor için okunur.
- DT13. Taban çizgisi her bedel yapısı için ayrı hesaplanır ve iki öğrenmeyen yordamın daha ucuz olanıdır: hiç kimseyi işaretlememek, ya da herkesi işaretlemek.
- DT14. Alt gruba özgü eşik, o alt grubun doğrulama satırlarından seçilir ve o alt grubun sınama satırlarında raporlanır. Alt grup doğrulama kümeleri küçüktür ve seçim payı buradan gelir.
- DT15. Doğruluk bu derste hiç basılmaz. Önceki dersin 0,7778’i ile bu dersin bedelleri aynı eksende değildir ve karşılaştırılmaz.
İki Bedel Yapısı, İki Eşik
İlk blok kurguyu kurar, ağacı yaprakta oran bırakacak biçimde eğitir ve on eşiği iki bedel yapısı altında süpürür.
# 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): # yaprakta sinif degil ORAN durur 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 {"p": p} return {"alan": en[1], "esik": en[2], "sol": agac(en[3], derinlik - 1, alanlar), "sag": agac(en[4], derinlik - 1, alanlar)} def puan(d, x): while "p" not in d: d = d["sol"] if x[d["alan"]] < d["esik"] else d["sag"] return d["p"] 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")] def bedel(s, e, ya, ka): # abone basina bedel; kucuk iyi t = 0 for x in s: t += ya * (1 - x["supheli"]) if puan(M, x) >= e else ka * x["supheli"] return t / len(s) def isaret(s, e): return sum(puan(M, x) >= e for x in s) / len(s) ADLAR = sorted({g for x in VERI for g in gruplar(x)}) EGT, DOG, SIN = uce_bol(karistir(VERI, TOHUM + 90000)) M = agac(EGT, 6, ALAN) ESIK = [0.05 + 0.10 * i for i in range(10)] YAPI = (("denetim pahali", 2, 1), ("kacak pahali", 1, 4)) print(f"{'esik':>5} | {'A dog':>7} {'A sin':>7} | {'B dog':>7} {'B sin':>7} " f"| {'isaret':>7}") for e in ESIK: print(f"{e:>5.2f} | {bedel(DOG, e, 2, 1):>7.4f} {bedel(SIN, e, 2, 1):>7.4f} " f"| {bedel(DOG, e, 1, 4):>7.4f} {bedel(SIN, e, 1, 4):>7.4f} " f"| {isaret(SIN, e):>7.4f}") SEC = {} for ad, ya, ka in YAPI: e = SEC[ad] = min(ESIK, key=lambda t: (bedel(DOG, t, ya, ka), t)) hic, hep = bedel(SIN, 1.1, ya, ka), bedel(SIN, -0.1, ya, ka) print(f"\n{ad:<14} esik {e:.2f} sinama bedeli {bedel(SIN, e, ya, ka):.4f} taban " f"{min(hic, hep):.4f} ({'hicbiri' if hic < hep else 'hepsi'}) kazanc " f"{min(hic, hep) - bedel(SIN, e, ya, ka):+.4f} isaretlenen " f"{sum(puan(M, x) >= e for x in SIN)}/{len(SIN)}")
esik | A dog A sin | B dog B sin | isaret 0.05 | 1.0952 0.9762 | 0.6032 0.5437 | 0.7063 0.15 | 0.7659 0.7659 | 0.4802 0.5913 | 0.5357 0.25 | 0.4802 0.4246 | 0.4762 0.5595 | 0.3056 0.35 | 0.3889 0.3214 | 0.5278 0.5913 | 0.2183 0.45 | 0.3492 0.2976 | 0.5079 0.6349 | 0.1825 0.55 | 0.2778 0.2579 | 0.5833 0.7262 | 0.1151 0.65 | 0.2540 0.2460 | 0.6548 0.7341 | 0.1032 0.75 | 0.2222 0.2302 | 0.6667 0.7540 | 0.0833 0.85 | 0.2222 0.2302 | 0.6667 0.7540 | 0.0833 0.95 | 0.2183 0.2222 | 0.6786 0.7778 | 0.0675 denetim pahali esik 0.95 sinama bedeli 0.2222 taban 0.2421 (hicbiri) kazanc +0.0198 isaretlenen 17/252 kacak pahali esik 0.25 sinama bedeli 0.5595 taban 0.7579 (hepsi) kazanc +0.1984 isaretlenen 77/252
İki bedel sütunu ters yönde iniyor. Denetimin pahalı olduğu yapıda bedel eşik yükseldikçe düşüyor ve en ucuz nokta 0,95; kaçağın pahalı olduğu yapıda en ucuz nokta 0,25 ve ondan sonra yükselmeye başlıyor. Model tek bir modeldir, puanlar tek bir puan kümesidir, ve iki yapı aynı tablodan iki ayrı satır seçiyor. 252 abonenin birinde 17’si, öbüründe 77’si denetime gidiyor.
Taban çizgisi de bedelle birlikte yer değiştiriyor. Denetim pahalıyken en ucuz öğrenmeyen yordam hiç kimseyi işaretlememektir ve 0,2421 tutuyor; kaçak pahalıyken herkesi işaretlemektir ve 0,7579 tutuyor. İkisi de aynı kümede, aynı etiketlerle hesaplanıyor. Modelin kazancı da buna göre değişiyor: birinci yapıda tabanın yalnız 0,0198 altına inebiliyor, ikincisinde 0,1984. Aynı model, aynı sınama kümesi — ve biri “az işe yarar”, öbürü “belirgin biçimde işe yarar” diye raporlanır.
Karar Kimde Değişiyor
İki işletme noktası arasındaki fark bir tabloda iki satırdır, ama abone tarafında somut bir şeydir: bazı aboneler bir yapıda denetime gider, öbüründe gitmez.
eA, eB = SEC["denetim pahali"], SEC["kacak pahali"] fark = [x for x in SIN if (puan(M, x) >= eA) != (puan(M, x) >= eB)] oran = sorted(((sum(g in gruplar(x) for x in fark) / sum(g in gruplar(x) for x in SIN), g) for g in ADLAR), reverse=True) print(f"karari degisen abone {len(fark)}/{len(SIN)}, {sum(x['supheli'] for x in fark)}" f" tanesi supheli; alt gruplarda oran:") for o, g in oran[:2] + oran[-1:]: print(f" {' '.join(g):<14} {o:.4f}")
karari degisen abone 60/252, 23 tanesi supheli; alt gruplarda oran: tarife 10 0.7500 bolge dogu 0.5556 bolge bati 0.0938
Altmış abonenin kararı ters dönüyor ve bunların 23’ü gerçekten şüpheli. Bedel yapısını seçmek bir ölçüt tercihi değil, altmış hanenin kapısının çalınıp çalınmamasıdır. Dağılım eşit de değil: doğu bölgesindeki abonelerin 0,5556’sı iki yapı arasında yer değiştirirken batıda bu oran 0,0938. Bedel yapısı bir kez seçildiğinde yükünü bütün alt gruplar aynı ölçüde taşımıyor.
Bedel Alt Gruplarda Aynı Değil
Kaçağın pahalı olduğu yapıda seçilen tek eşik 0,25’tir ve on üç alt grubun hepsine aynı biçimde uygulanır. Aşağıdaki blok o tek eşiğin her alt gruptaki bedelini, o alt grubun kendi tabanını, ve alt grup kendi eşiğini seçseydi ne olacağını yan yana basar.
ya, ka = 1, 4 print(f"{'alt grup':<14} {'n':>4} {'isaret':>7} {'bedel':>7} {'taban':>7} {'kazanc':>8}" f" | {'kendi':>5} {'bedeli':>7} {'ek':>8}") kz, ek = [], [] for g in ADLAR: d = [x for x in DOG if g in gruplar(x)] s = [x for x in SIN if g in gruplar(x)] b, tb = bedel(s, eB, ya, ka), min(bedel(s, 1.1, ya, ka), bedel(s, -0.1, ya, ka)) ke = min(ESIK, key=lambda t: (bedel(d, t, ya, ka), t)) kb = bedel(s, ke, ya, ka) if len(s) >= 25: kz.append(tb - b) ek.append(b - kb) print(f"{' '.join(g):<14} {len(s):>4} {isaret(s, eB):>7.4f} {b:>7.4f} {tb:>7.4f} " f"{tb - b:>+8.4f} | {ke:>5.2f} {kb:>7.4f} {b - kb:>+8.4f}" f"{' n<25' if len(s) < 25 else ''}") print(f"\nkazanc acikligi ({len(kz)} alt grup): en iyi {max(kz):+.4f}, en kotu " f"{min(kz):+.4f}, aciklik {max(kz) - min(kz):.4f}; tabanin altinda kalan " f"{sum(1 for v in kz if v < 0)}/{len(kz)}") print(f"kendi esigi sinama bedelini dusuren alt grup: {sum(1 for v in ek if v > 0)}" f"/{len(ek)}, degistirmeyen {sum(1 for v in ek if v == 0)}, yukselten " f"{sum(1 for v in ek if v < 0)}")
alt grup n isaret bedel taban kazanc | kendi bedeli ek bolge bati 32 0.0938 0.0938 0.0000 -0.0938 | 0.35 0.0625 +0.0312 bolge dogu 36 0.7500 0.7778 0.4722 -0.3056 | 0.45 0.7222 +0.0556 bolge guney 58 0.1897 0.2759 0.6897 +0.4138 | 0.15 0.5517 -0.2759 bolge kuzey 68 0.2500 0.6618 0.7059 +0.0441 | 0.15 0.6765 -0.0147 bolge merkez 58 0.3276 0.8448 0.6552 -0.1897 | 0.25 0.8448 +0.0000 hane 1-2 73 0.3562 0.5205 0.7534 +0.2329 | 0.15 0.6301 -0.1096 hane 3-4 143 0.2657 0.5944 0.7692 +0.1748 | 0.25 0.5944 +0.0000 hane 5+ 36 0.3611 0.5000 0.7222 +0.2222 | 0.55 0.7500 -0.2500 okuma az 85 0.2706 0.7059 0.7882 +0.0824 | 0.45 0.8471 -0.1412 okuma tam 167 0.3234 0.4850 0.7425 +0.2575 | 0.15 0.5509 -0.0659 tarife 10 12 0.7500 0.4167 0.6667 +0.2500 | 0.05 0.4167 +0.0000 n<25 tarife 25 193 0.1813 0.4870 0.6425 +0.1554 | 0.45 0.4560 +0.0311 tarife 40 47 0.7021 0.8936 0.4468 -0.4468 | 0.05 0.5957 +0.2979 kazanc acikligi (12 alt grup): en iyi +0.4138, en kotu -0.4468, aciklik 0.8606; tabanin altinda kalan 4/12 kendi esigi sinama bedelini dusuren alt grup: 4/12, degistirmeyen 2, yukselten 6
Bütünde 0,1984 olan kazanç alt gruplarda +0,4138 ile −0,4468 arasına dağılıyor; açıklık 0,8606. Dört alt grupta model kendi tabanının altında: batı, doğu, merkez ve tarife 40 basamağı. Tarife 40 basamağının kendi tabanı 0,4468, modelin bedeli 0,8936 — o basamakta model, “herkesi işaretle” demekten iki kat pahalı. Nedeni işaret sütununda: eşik 0,25 o basamaktaki abonelerin 0,7021’ini işaretliyor ama basamağın şüpheli oranı 0,553 olduğu için işaretlenmeyenler arasında kalan şüpheliler dört birimlik kaçırma bedelini ödüyor.
Son üç sütun bir düzeltme öneriyor ve düzeltmenin bedelini de gösteriyor. Her alt grup kendi doğrulama satırlarından kendi eşiğini seçtiğinde tarife 40 basamağı 0,05’e iniyor ve bedeli 0,8936’dan 0,5957’ye düşüyor. Ama aynı işlem on iki alt grubun yalnız dördünde sınama bedelini düşürüyor; ikisinde değiştirmiyor, altısında yükseltiyor — güneyde 0,2759, hane 5 ve üstünde 0,2500 birim. Sebep, alt grup doğrulama kümelerinin küçüklüğüdür: kırk yetmiş satırdan seçilen bir eşik, o satırların gürültüsünü seçiyor. Alt grup başına eşik ayarlamak alt grup başına doğrulama kümesi ister, ve bu kümeler bölmeden değil tasarımdan gelir.
Özet
- Bedel yapısı iş hedefini sayıya çevirir: yanlış alarm ile kaçırmanın oranı bir iş kararıdır ve eşik o orandan okunur. Ölçüt abone başına bedeldir ve küçük iyidir.
- Aynı model, aynı puanlar, iki bedel yapısı: denetim pahalıyken seçilen eşik 0,95 ve 252 abonenin 17’si işaretleniyor; kaçak pahalıyken eşik 0,25 ve 77’si işaretleniyor. 60 abonenin kararı ters dönüyor ve 23’ü gerçekten şüpheli.
- Taban çizgisi de bedelle değişiyor: birinci yapıda hiç kimseyi işaretlememek (0,2421), ikincide herkesi işaretlemek (0,7579) taban olur. Modelin kazancı buna göre +0,0198 ya da +0,1984.
- Tek eşik alt gruplarda tek sonuç vermiyor: kazanç +0,4138 ile −0,4468 arasında dağılıyor, açıklık 0,8606, ve 12 alt grubun 4’ünde model kendi tabanının altında kalıyor.
- Alt gruba özgü eşik seçmek 12 alt grubun yalnız 4’ünde sınama bedelini düşürüyor, altısında yükseltiyor; alt grup doğrulama kümesi küçüldükçe seçim payı büyüyor.
Sonraki Adım
Bu derste taban çizgisi ikinci kez kendi başına bir soruya dönüştü. Bedel yapısı değişince taban da değişti: birinde 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 sabit bir işaret. Burada sabit olmadığı görüldü. Sonraki ders tabanı doğrudan konu edinir: bir problemde kaç taban vardır, hangisi seçilir, seçim aynı modeli hangi iki ayrı biçimde okutur, ve M27’nin yedi kursunda seçilmiş tabanlar tek bir tabloda toplandığında ne görünür.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.