Ders 09 / 11
Yanlılık–Değişkenlik Dengesi
Ayrılmış kümedeki hatanın iki bileşene ayrılması: 30 geri koyarak örneklemle kurulan eğitim kümeleri üzerinde toplam kare hata taban çizgisinde 41,242, derinlik 3 ağacında 29,768 ve derinlik 12 ağacında 33,810 m³ kare çıkar; değişkenlik bileşeni 0,040'tan 4,409'a yükselirken yanlılık ve gürültü bileşeni 41,202'den 28,448'e iner ve orada durur. Kapasitenin sökebildiği yanlılık 12,754 m³ karedir, geri kalan 28,4 m³ kareyi hiçbir kapasite sökemez. Aynı abone için 30 modelin verdiği tahminin ortalama açıklığı derinlik 1'de 3,587 m³, derinlik 12'de 8,172 m³'tür.
İçindekiler
Önceki ders kapasiteyi artırıp iki sayının ayrıştığını gösterdi, ama ölçümün tamamı tek bir eğitim kümesi üzerinde yapıldı. Oysa o 756 satır, 1.260 abone arasından çekilmiş bir örneklemdir. Başka bir çekimde başka bir ağaç kurulur, başka eşikler seçilir ve aynı abone için başka bir yanıt üretilir. Ayrılmış kümedeki hatanın bir kısmı işte buradan gelir: modelin yanıldığından değil, modelin oynadığından.
Bu ders hatayı iki bileşene ayırır. Birincisi aynı yordamın eğitim örneklemi değiştikçe ne kadar oynadığı — değişkenlik. İkincisi bütün örneklemler üzerinden alınan ortalama tahminin gerçek değerden ne kadar saptığı — yanlılık. İkisi aynı düğmeye, kapasiteye, ters yönlerde bağlıdır ve toplamları ortada en küçüktür.
- GE16. Bu derste problem bağlanımdır (regression): sayısal bir değeri kestirmek. M26’nın İstatistiksel Analiz ve Keşifsel Veri Analizi kursunda “regresyon” bir ilişkinin katsayısını yorumlamak için kullanılmıştı; burada ölçü katsayı değil, görülmemiş bir abone için üretilen sayının hatasıdır.
- GE17. Hedef abonenin ortalama tüketimidir (m³) ve okumalardan türetilir. Öznitelikler okumalardan türetilen hiçbir alanı içermez: bölge, hane büyüklüğü, memnuniyet, dönem sayısı.
- GE18. Ölçü kök ortalama kare hatadır (m³). Bileşenlere ayırma kare birimde yapılır, çünkü toplanabilirlik yalnız orada geçerlidir.
- GE19. Küme, bölme ve tohum önceki derslerden aynen sürer: 1.260 abone, 756 eğitim, 252 ayrılmış küme. Sınama kümesi yine açılmaz.
- GE20. Geri koyarak örnekleme M26’nın aynı kursunda kurulmuştur ve yöntemi burada tekrarlanmaz. Tek kullanımı, elde bir eğitim kümesi varken otuz eğitim kümesi varmış gibi ölçüm yapabilmektir.
- GE21. Sabit bir abone ve model için şu eşitlik tamdır: ortalama kare hata, tahminlerin kendi arasındaki saçılması ile ortalama tahminin gerçek değerden uzaklığının karesinin toplamıdır. Tablodaki üç sütun bu eşitliktir.
- GE22. Üçüncü sütun yanlılığı ve indirgenemez gürültüyü birlikte taşır; tek bir gözlemle ikisi ayrılamaz. Gürültü kapasiteden bağımsız olduğu için o sütundaki farklar yanlılık farkıdır.
Bağlanımda Aynı İki Sayı
Kurulum aynı kurgu ağı aynı tohumla üretir, hedefi abonenin ortalama tüketimi olarak alır ve bir bağlanım ağacı kurar. Ağaç sınıflandırma ağacıyla aynı yapıdadır; tek farkı, yaprakta çoğunluk sınıfı yerine ortalama söylemesi ve bölmeyi sınıf saflığına göre değil kare sapmaya göre seçmesidir.
# baglanim.py — MODELDIR. M26'nin kurgu olcum agi ayni tohumla uretilir; hedef # abonenin ortalama tuketimidir ve okumalardan turetilir. import math TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26), ("bati", 0.14, 14), ("merkez", 0.18, 23)] 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 = [] 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}) VERI = [] 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 = {"no": k["no"], "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) ALAN = ["hane", "memnuniyet", "donem", "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] K = karistir(VERI, TOHUM + 90000) EGT, DOG = K[:756], K[756:1008] def sapma(s): m = sum(x["hedef"] for x in s) / len(s) return sum((x["hedef"] - m) ** 2 for x in s) / len(s) def bagac(s, derinlik, enaz=5): en = None if derinlik and len(s) >= 2 * enaz: for a in ALAN: d = sorted({x[a] for x in s}) for v in (d[1:] if len(d) < 9 else [d[int(i * len(d) / 9)] for i in range(1, 9)]): 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 = sapma(s) - (len(sol) * sapma(sol) + len(sag) * sapma(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": sum(x["hedef"] for x in s) / len(s)} return {"alan": en[1], "esik": en[2], "sol": bagac(en[3], derinlik - 1, enaz), "sag": bagac(en[4], derinlik - 1, enaz)} def tah(d, x): while "tahmin" not in d: d = d["sol"] if x[d["alan"]] < d["esik"] else d["sag"] return d["tahmin"] def kok(f, s): return math.sqrt(sum((f(x) - x["hedef"]) ** 2 for x in s) / len(s)) ORT = sum(x["hedef"] for x in EGT) / len(EGT) print(f"egitim {len(EGT)}, ayrilmis {len(DOG)}, egitim ortalamasi {ORT:.3f} m3") print(f"\n{'yordam':<14} {'egitimde':>9} {'ayrilmis':>9}") print(f"{'taban':<14} {kok(lambda x: ORT, EGT):>9.3f} {kok(lambda x: ORT, DOG):>9.3f}") for dr in (1, 3, 12): m = bagac(EGT, dr) print(f"{'derinlik ' + str(dr):<14} {kok(lambda x: tah(m, x), EGT):>9.3f} " f"{kok(lambda x: tah(m, x), DOG):>9.3f}")
egitim 756, ayrilmis 252, egitim ortalamasi 19.767 m3 yordam egitimde ayrilmis taban 6.200 6.419 derinlik 1 5.696 5.979 derinlik 3 5.105 5.380 derinlik 12 4.639 5.594
Taban çizgisi burada “ortalamayı söylemektir”: her aboneye eğitim kümesinin ortalaması olan 19,767 m³ atanır. Ayrılmış kümede 6,419 m³ hata veriyor. Derinlik 3 ağacı bunu 5,380 m³’e indiriyor. Derinlik 12 ağacı eğitim kümesinde 4,639 m³ ile en iyisidir ama ayrılmış kümede 5,594 m³’e çıkıyor — önceki dersin şekli, bu kez metre küp cinsinden.
Tablo neyin bozulduğunu söylemiyor. Derinlik 12 ağacı yanlış bir yeri mi hedefliyor, yoksa doğru yeri hedefleyip her seferinde başka bir yere mi düşüyor. İki durumun düzeltmesi farklıdır ve ayrılmaları gerekir.
Hatayı İkiye Ayırmak
Ayırmanın yolu tek eğitim kümesini çoğaltmaktır. Geri koyarak örnekleme aynı eğitim kümesinden 30 farklı 756 satırlık küme kuruyor; her birinde aynı yordam çalıştırılıp aynı ayrılmış kümedeki abonelere 30 ayrı yanıt üretiliyor.
B = 30 ORNEK = [] for b in range(B): r = uretec(TOHUM + 61000 + b * 13) ORNEK.append([EGT[int(r() * len(EGT))] for _ in range(len(EGT))]) def coz(ad, egit, tahminci): MOD = [egit(o) for o in ORNEK] T = [[tahminci(m, x) for x in DOG] for m in MOD] top = deg = yan = 0.0 for i, x in enumerate(DOG): p = [T[b][i] for b in range(B)] m = sum(p) / B top += sum((q - x["hedef"]) ** 2 for q in p) / B deg += sum((q - m) ** 2 for q in p) / B yan += (m - x["hedef"]) ** 2 n = len(DOG) print(f"{ad:<14} {top / n:>9.3f} {deg / n:>9.3f} {yan / n:>9.3f} " f"{math.sqrt(top / n):>7.3f}") print(f"{B} geri koyarak ornek, her biri {len(EGT)} satir") print(f"\n{'yordam':<14} {'toplam':>9} {'degisken':>9} {'yanlilik':>9} {'kok':>7}") coz("taban", lambda o: sum(y["hedef"] for y in o) / len(o), lambda m, x: m) for dr in (1, 2, 3, 5, 8, 12): coz(f"derinlik {dr}", lambda o, dr=dr: bagac(o, dr), tah)
30 geri koyarak ornek, her biri 756 satir yordam toplam degisken yanlilik kok taban 41.242 0.040 41.202 6.422 derinlik 1 36.158 2.138 34.020 6.013 derinlik 2 31.840 2.218 29.622 5.643 derinlik 3 29.768 1.321 28.448 5.456 derinlik 5 30.745 2.274 28.471 5.545 derinlik 8 32.922 3.983 28.939 5.738 derinlik 12 33.810 4.409 29.400 5.815
İkinci ve üçüncü sütun her satırda birinciyi tam olarak veriyor; eşitlik bir yaklaşıklık değil, tanımın kendisidir. Sütunlar ters yönlerde hareket ediyor. Değişkenlik 0,040’tan 4,409’a, yani yüz katından fazlasına çıkıyor. Yanlılık ve gürültü 41,202’den 28,448’e iniyor ve orada duruyor: derinlik 3’ten sonra bu sütun düşmüyor, hafifçe yükseliyor.
Taban çizgisi dengenin bir ucudur ve tablodaki yeri bunu gösteriyor. Değişkenliği 0,040 ile neredeyse sıfırdır — hangi örneklemle eğitilirse eğitilsin neredeyse aynı sayıyı söyler. Karşılığı 41,202’lik yanlılıktır: hep aynı yerde durur ve hep aynı yerde yanılır. Kararlılık kendi başına bir erdem değildir.
Üçüncü sütunun tabanı dersin en önemli sayısıdır. Kapasite ne yapılırsa yapılsın bu sütun 28,4 m³ karenin altına inmiyor; bu, hiçbir öznitelikle açıklanamayan kalan gürültüdür. Kapasitenin gerçekten söktüğü yanlılık 41,202 ile 28,448 arasındaki 12,754 m³ karedir, yani taban çizgisinin hatasının yüzde 30,9’u. Geri kalan yüzde 69,1 ne daha derin bir ağaçla ne daha çok veriyle sökülür; ölçüm ağının kendi saçılmasıdır.
Üçüncü sütunun ikinci bir okuması var ve bir yöntem ailesinin gerekçesini veriyor. O sütun, otuz modelin ortalamasını alan bir yordamın ayrılmış kümedeki hatasıdır: ortalama alındığında tanım gereği değişkenlik bileşeni kaybolur ve geriye yalnız üçüncü sütun kalır. Derinlik 12 için tek bir ağaç 33,810 m³ kare hata yaparken otuz ağacın ortalaması 29,400 yapar, yani hatanın yüzde 13,0’ü yalnız ortalama alarak silinir; kök ölçüsünde 5,815 m³ yerine 5,422 m³. Bu sayı tek bir derinlik 3 ağacının 5,456 m³’ünden de küçüktür. Topluluk yöntemleri tam olarak bunu yapar: yanlılığı düşürmeye çalışmak yerine yüksek kapasiteli ve oynak modelleri çoğaltıp değişkenliği ortalamaya bırakır. Kapasite düğmesine hiç dokunmadan hata düşürmenin yolu buradan geçer.
Değişkenlik sütunu kapasitenin tek yönlü bir işlevi değil ve bunun sebebi okunabilir. Derinlik 3’te değişkenlik 1,321 ile derinlik 2’nin 2,218’inin altındadır. Derinlik 1 ve 2’de ağaç beş bölgeyi tek ya da iki bölmeyle ayırmak zorunda ve hangi bölgeyi ayıracağı örneklemden örnekleme değişiyor; derinlik 3’te beş bölge hemen her örneklemde kendi yaprağını alıyor ve otuz model birbirine benziyor. Kapasite yetersizken oynama, modelin öğrendiğinden değil, seçmek zorunda kaldığı şeyden gelir.
Aynı Abone, Otuz Model
Bileşenler ortalamalardır; tek bir abonede ne göründükleri ayrıca sorulur.
print(f"{'kapasite':<12} {'ortalama acikli':>16} {'en genis abone':>16}") MODEL = {} for dr in (1, 3, 12): MODEL[dr] = [bagac(o, dr) for o in ORNEK] a = [max(t) - min(t) for t in ([tah(m, x) for m in MODEL[dr]] for x in DOG)] print(f"{'derinlik ' + str(dr):<12} {sum(a) / len(a):>16.3f} {max(a):>16.3f}") print(f"\n{'abone':>7} {'bolge':<8} {'gercek':>7}", end="") for dr in (1, 3, 12): print(f" {'d' + str(dr) + ' ortalama':>12} {'acikli':>7}", end="") print() for x in (DOG[3], DOG[11], DOG[40]): b = [k for k in ("kuzey", "guney", "dogu", "bati", "merkez") if x["b_" + k]][0] print(f"{x['no']:>7} {b:<8} {x['hedef']:>7.2f}", end="") for dr in (1, 3, 12): p = [tah(m, x) for m in MODEL[dr]] print(f" {sum(p) / len(p):>12.2f} {max(p) - min(p):>7.2f}", end="") print()
kapasite ortalama acikli en genis abone derinlik 1 3.587 5.246 derinlik 3 4.595 16.362 derinlik 12 8.172 24.236 abone bolge gercek d1 ortalama acikli d3 ortalama acikli d12 ortalama acikli 10227 kuzey 18.92 20.25 2.87 20.52 2.92 21.36 6.54 10683 bati 11.99 15.66 5.25 13.80 5.16 13.72 5.48 10424 guney 26.22 20.25 2.87 16.94 4.05 16.15 9.17
Birinci satırda yanlılık çıplak duruyor. Derinlik 1’de kuzeyli 10227 ile güneyli 10424 aynı sayıyı alıyor: 20,25 m³. İki abonenin gerçek değerleri 18,92 ve 26,22 m³ olduğu halde model ikisini ayıramıyor, çünkü tek bölmesi bu iki bölgeyi aynı yaprakta bırakıyor. Açıklığı 2,87 ile dardır — kararlı biçimde yanlıştır.
Derinlik 3’te 10424’ün tahmini 16,94 m³’e düşüyor ve bu daha kötü değil, daha doğru bir sayıdır: güney bölgesinin gerçek ortalamasına yakındır. Abonenin kendi değerinin 26,22 m³ olması bir yanlılık belirtisi değil, gürültünün ta kendisidir — o abonenin okumaları bölgesinin üstünde çıkmıştır ve kümedeki hiçbir öznitelik bunu haber vermez. Bir modelden bunu bilmesini beklemek, üçüncü sütunun tabanını sökmesini beklemektir.
Derinlik 12’de ortalama tahmin 16,15 ile neredeyse aynı kalıyor ama açıklık 4,05’ten 9,17 m³’e çıkıyor. Bütün ayrılmış küme üzerinde aynı şey oluyor: ortalama açıklık derinlik 1’de 3,587, derinlik 12’de 8,172 m³. En geniş abonede otuz modelin yanıtı 24,236 m³’lük bir aralığa yayılıyor ve bu, hedefin kendi ortalaması olan 19,767 m³’ten büyüktür. Yüksek kapasitenin verdiği yanıt yanlış değil, rastgeledir; hangi eğitim örnekleminin çekildiğine bağlıdır.
Özet
- Ayrılmış kümedeki ortalama kare hata iki bileşenin tam toplamıdır: tahminlerin örneklemden örnekleme saçılması ve ortalama tahminin gerçek değerden uzaklığı.
- Kapasite arttıkça değişkenlik 0,040’tan 4,409’a yükseliyor, yanlılık ve gürültü 41,202’den 28,448’e iniyor; toplam derinlik 3’te 29,768 ile en küçüktür ve kök ölçüsü 5,456 m³’tür.
- Üçüncü sütunun tabanı 28,4 m³ karedir ve indirgenemez gürültüdür; kapasitenin söktüğü yanlılık 12,754 m³ kare, yani taban çizgisi hatasının yüzde 30,9’udur. Aynı sütun, otuz modelin ortalamasını alan bir topluluk yönteminin hatasıdır ve derinlik 12’de 33,810’u 29,400’e indirir.
- Taban çizgisi dengenin bir ucudur: değişkenliği 0,040 ile neredeyse sıfır, yanlılığı 41,202 ile en büyüktür; kararlılık tek başına bir erdem değildir.
- Değişkenlik kapasitenin tek yönlü işlevi değildir; derinlik 1 ve 2’de ağacın hangi bölgeyi ayıracağı örneklemden örnekleme değiştiği için oynama derinlik 3’tekinden büyüktür.
- Tek abone düzeyinde derinlik 1 iki ayrı bölgenin abonesine 20,25 m³ ile aynı sayıyı veriyor, derinlik 12 ise otuz modelde 9,17 m³’lük bir açıklık üretiyor.
Sonraki Adım
Denge bulundu ama bulunma biçimi kaba: derinlik tam sayıdır ve 3 ile 5 arasında ara değer yoktur. Kapasiteyi kesip atmak yerine cezalandırmak daha ince bir düğme verir — modelin karmaşıklığı hata ölçüsüne bir bedel olarak eklenir ve ceza katsayısı sürekli olarak ayarlanır. Sonraki ders ceza katsayısını adım adım büyütür, eğitim sayısının kesintisiz kötüleştiğini ama ayrılmış küme sayısının önce iyileşip sonra kötüleştiğini basar ve en iyi noktanın hangi kümeden okunacağını gösterir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.