---
title: 'Yanlılık–Değişkenlik Dengesi'
source: 'https://academia.sh/tr/kurslar/makine-ogrenmesine-giris/yanlilik-degiskenlik-dengesi'
course: 'Makine Öğrenmesine Giriş'
language: tr
updated: '2026-08-17T18:10:12+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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 $B$ 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.

```python
# 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.

```python
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.

```python
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.
