CodeBlanks Logo Icon CodeBlanks

Aşırı öğrenme

Çok derin ağaçlar veriyi ezberler; budama (pruning) ile önlenir.

Aşırı öğrenme

Model eğitim verisindeki gürültüyü de öğrenirse eğitimde çok iyi, yeni veride kötü sonuç verir; buna aşırı öğrenme denir. Sınırsız ağaçlar bunun en bilinen örneğidir:

m = DecisionTreeClassifier(random_state=0).fit(X_train, y_train)
print(m.score(X_train, y_train))   # 1.0
print(m.score(X_test, y_test))     # belirgin biçimde düşük

Eğitim ve test skorları arasındaki büyük fark aşırı öğrenmenin işaretidir.

Budama

Çözüm ağacı küçük tutmaktır: max_depth, min_samples_leaf ya da maliyet-karmaşıklık budaması (ccp_alpha). ccp_alpha büyüdükçe az katkı veren dallar kesilir:

for a in [0.0, 0.01, 0.05]:
    m = DecisionTreeClassifier(ccp_alpha=a, random_state=0).fit(X_train, y_train)
    print(a, m.get_n_leaves(), m.score(X_test, y_test))

Tersi de bir sorundur: çok basit model (örneğin derinlik 1) hem eğitimde hem testte kötüdür; buna eksik öğrenme denir.

Uygulama Aşırı öğrenmeyi gör

Gürültülü veride sınırsız bir DecisionTreeClassifier(random_state=0) ve max_depth=2 olan bir ağaç eğit. Her biri için eğitim ve test doğruluğunu round(..., 2) ile aynı satırda yazdır (önce sınırsız).

Başlangıç kodu

model.py
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

rng = np.random.default_rng(0)
X = rng.uniform(0, 10, size=(200, 2))
y = (X[:, 0] + rng.normal(0, 2, 200) > 5).astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

rng = np.random.default_rng(0)
X = rng.uniform(0, 10, size=(200, 2))
y = (X[:, 0] + rng.normal(0, 2, 200) > 5).astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

for m in [DecisionTreeClassifier(random_state=0), DecisionTreeClassifier(max_depth=2, random_state=0)]:
    m.fit(X_train, y_train)
    print(round(m.score(X_train, y_train), 2), round(m.score(X_test, y_test), 2))

Beklenen çıktı

1.0 0.78
0.85 0.82

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Eğitim doğruluğu 0.99, test doğruluğu 0.70 ise ne olmuştur?

  • Veri sızıntısı yoktur, model iyidir
  • Test kümesi hatalıdır
  • Aşırı öğrenme Doğru cevap
  • Eksik öğrenme

Açıklama: Model eğitim verisini ezberlemiş, genelleme yapamıyor.

2 Maliyet-karmaşıklık budaması uygula.

Soru
m = DecisionTreeClassifier(____=0.02)
Cevap
m = DecisionTreeClassifier(ccp_alpha=0.02)

Açıklama: ccp_alpha arttıkça ağaç küçülür.

3 Durumları eşleştir.

Kavram Anlamı
Eğitim yüksek, test düşük Aşırı öğrenme
İkisi de düşük Eksik öğrenme
ccp_alpha Budama
min_samples_leaf Küçük yaprakları önler

Başlangıç bölümündeki tüm dersler