Aşırı öğrenme
- Makine Öğrenmesi kursu
- Başlangıç
- Ders 57/112
- 5 dk
Ç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üşükEğ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
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
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.
m = DecisionTreeClassifier(____=0.02)
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 |