Ana içeriğe geç

Öğrenme Eğrileri Eğitimi: Öğrenme Eğrileri Nedir?

Öğrenme eğrilerinin verilerinizi değerlendirmenize ve en uygun çözümleri belirlemenize nasıl yardımcı olabileceğini öğrenin.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Makine öğrenmesi modellerindeki hataların iki ana nedeni vardır:

  • Önyargı (bias), hedef fonksiyonun yaklaşımını kolaylaştırmak için basitleştirilmiş varsayımlar yapan bir modeli ifade eder; örneğin bir model, dünyadaki her 5'9 erkek bedeninin medium üst giydiğini “öğrenebilir” – bu açıkça önyargıdır.
  • Varyans (variance), model tahminindeki değişkenliği açıklar; modeli eğitmek için kullandığımız verileri değiştirdiğimizde modelin tahmininin ne kadar değiştiği.

Daha doğru bir çözüme ulaşmak için modelimizdeki önyargı ve varyansı azaltmaya çalışırız. Bu, basit bir görev değildir. Önyargı ve varyans birbiriyle çekişme halindedir – birini azaltmak, önyargı-varyans dengesi olarak bilinen kavram nedeniyle diğerini artıracaktır.

Bu yazıda şunları öğreneceksiniz:

  • Bir modelin yüksek önyargı mı yoksa yüksek varyans mı gösterdiğini nasıl tespit edeceğiniz
  • Bu iki semptomdan biriyle sorun yaşayan bir modeli nasıl teşhis edeceğiniz
  • Nasıl iyi uyum sağlayan (good-fit) bir model kuracağınız

Hata belirtilerini tespit etmeye geçmeden önce, önyargı-varyans dengesini biraz daha derinlemesine ele alalım.

Önyargı-varyans dengesine bir bakış

Tüm gözetimli öğrenme algoritmaları aynı hedefe ulaşmaya çalışır: bazı girdi verileri (X) verildiğinde hedef değişken (y) için eşleme fonksiyonunu (f_hat) tahmin etmek. Bir makine öğrenmesi modelinin yaklaştırmaya çalıştığı fonksiyona hedef fonksiyon deriz.

Hedef değişkeni yaklaştırmak için kullanılan girdi verilerini değiştirmek, muhtemelen farklı bir hedef fonksiyonla sonuçlanacaktır; bu da modelin tahmin ettiği çıktıları etkileyebilir. Eğitim verileri değiştikçe hedef fonksiyonumuzun ne kadar değiştiğine varyans denir. Modelimizin yüksek varyansa sahip olmasını istemeyiz; çünkü algoritmamız eğitim sırasında kusursuz performans gösterse bile, görülmemiş örneklere genelleme yapamaz.

variance
[Kaynak: Wikipedia]

Yukarıdaki görselde, yaklaştırılan hedef fonksiyon yeşil çizgi, en iyi uyum hattı ise siyah çizgidir. Modelin yeşil çizgiyle eğitim verilerini ne kadar iyi öğrendiğine dikkat edin. Tüm kırmızı ve mavi gözlemlerin ayrılmasını sağlamaya çalışır. Bu modeli yeni gözlemlerle eğitsek, tamamen yeni bir hedef fonksiyon öğrenir ve aynı davranışı sergilemeye çalışırdı.

Hedef fonksiyonu yaklaştırmak için doğrusal regresyon gibi doğrusal bir yöntem kullandığımız bir senaryoyu düşünün. Doğrusal regresyonla ilgili ilk dikkat edilmesi gereken nokta, girdi verileriyle tahmin etmeye çalıştığımız hedef arasında doğrusal bir ilişki varsaymasıdır. Gerçek dünyadaki olaylar çok daha karmaşıktır. Bir miktar esneklikten ödün verme pahasına bu basit varsayım, hedef fonksiyonun çok daha hızlı öğrenilmesini ve anlaşılmasını sağlar. Bu yaklaşımı Önyargı (Bias) olarak adlandırırız.

Bias
[Kaynak: Wikipedia]

Yukarıdaki görselde kırmızı çizgi öğrenilen hedef fonksiyonu temsil eder. Gözlemlerin çoğu, modelin tahmin ettiği değerlerden oldukça uzakta kalmaktadır.

Bir modeli daha esnek hale getirerek önyargıyı azaltabiliriz, ancak bu varyansı artırır. Tersine, bir modeli basitleştirerek varyansı azaltabiliriz, fakat bu da önyargı ekler. Bu ilişkiden kaçış yoktur. En iyi alternatif, önyargı ile varyans arasındaki dengede makul bir nokta yakalayacak şekilde modeli seçmek ve yapılandırmaktır.

tradeoff between bias and variance.
[Kaynak: Wikipedia]

Hedef fonksiyonu etkileyen bilinmeyen faktörler nedeniyle, modelde her zaman bir miktar hata bulunacaktır; buna azaltılamaz hata denir. Bunu, yukarıdaki görselde Toplam Hata eğrisinin en düşük noktasının altında kalan hata miktarına bakarak gözlemleyebiliriz. İdeal modeli kurmak için, toplam hatayı en aza indirecek şekilde önyargı ile varyans arasında bir denge bulmalıyız. Bu, En Uygun Model Karmaşıklığı olarak adlandırılan kesikli çizgiyle gösterilmiştir.

Önyargı ve varyansı, öğrenme eğrilerini kullanarak açalım.

Öğrenme eğrisinin anatomisi

Öğrenme eğrileri, eğitim kümesi boyutu arttıkça bir modelin performansını gösteren grafiklerdir. Bir diğer kullanım şekli de modelin belirli bir zaman aralığındaki performansını göstermektir. Genellikle veriden artımlı olarak öğrenen algoritmaları teşhis etmek için kullanılırlar. Eğitim ve doğrulama veri kümelerinde bir model değerlendirilir ve ölçülen performanslar çizilir.

Örneğin, bazı girdiler ile çıktılar arasındaki ilişkiyi bir makine öğrenmesi algoritmasıyla modellediğimizi varsayalım. Modele bir örnek üzerinde eğitim verip, yüz örnek üzerinde doğrulamayla başlıyoruz. Ne olacağını düşünüyorsunuz? “Model eğitim verisini kusursuz öğrenecek” dediyseniz haklısınız – hiç hata olmayacaktır.

Bir girdinin bir çıktıyla olan ilişkisini modellemek zor değildir; yapmanız gereken tek şey o ilişkiyi “hatırlamaktır”. Zor olan kısım, yeni ve görülmemiş örneklerle karşılaşıldığında doğru tahminler yapmaktır. Modelimiz eğitim verisini çok iyi öğrendiği için, daha önce görmediği verilere genelleme yapmakta zorlanacaktır. Bunun sonucunda doğrulama verisinde zayıf performans gösterecektir. Bu da modelimizin eğitim verisi ile doğrulama verisindeki performansı arasında büyük bir fark olacağı anlamına gelir. Bu farka genelleme hatası diyoruz.

Algoritmamızın doğrulama veri kümesinde daha iyi tahminlerde bulunma şansı olması için daha fazla veri eklememiz gerekir. Eğitim verisine yeni örnekler eklemek, kaçınılmaz olarak modelimizin hedef fonksiyonunu değiştirecektir. Eğitim veri kümesini büyüttükçe modelin performansı izlenip çizilerek eğitim ve doğrulama hata puanlarının nasıl evrildiği ortaya konabilir.

Bu, grafikte iki farklı sonucun gösterileceği anlamına gelir:

  • Eğitim eğrisi: Eğitim verilerinden hesaplanan eğri; bir modelin ne kadar iyi öğrendiğini gösterir.
  • Doğrulama eğrisi: Doğrulama verilerinden hesaplanan eğri; modelin görülmemiş örneklere ne kadar iyi genelleme yaptığını gösterir.

Bu eğriler, veri büyüdükçe modelin ne kadar iyi performans gösterdiğini ortaya koyar; bu nedenle adı öğrenme eğrileridir.

Not: Aynı süreç, modelimizin zaman içinde nasıl öğrendiğini görmek için de kullanılabilir. Modelin veri büyüdükçe nasıl performans gösterdiğini izlemek yerine, zaman içinde ne kadar iyi öğrendiğini izleriz. Örneğin, yeni bir dil öğrenmeye karar verebilirsiniz. O dile hâkimiyetiniz 52 hafta boyunca nasıl ilerlediğinizi göstermek üzere sayısal bir puanla değerlendirilebilir.

Artık bir öğrenme eğrisinin anatomisini öğrendiniz; size görsel bir anlayış kazandırmak için bunu gerçek bir veri kümesiyle uygulamaya koyalım.

Kullanım durumu: Gayrimenkul değerlemelerini tahmin etme

Şu veri setini kullanacağız: gayrimenkul değerlemesine ilişkin piyasa tarihsel veri seti. Bu veriler, Yeni Taipei, Tayvan, Sindian Bölgesi'nden toplanmış piyasa tarihsel verilerinden oluşur.

Görevimiz, aşağıdaki özellikler verildiğinde gayrimenkul değerlemesini tahmin etmektir:

  • X1= işlem tarihi (örneğin, 2013.250=2013 Mart, 2013.500=2013 Haziran vb.)
  • X2= evin yaşı (birim: yıl)
  • X3= en yakın MRT istasyonuna uzaklık (birim: metre)
  • X4= yürüme mesafesindeki yaşam çevresindeki market (convenience store) sayısı (tamsayı)
  • X5= coğrafi koordinat, enlem (birim: derece)
  • X6= coğrafi koordinat, boylam (birim: derece)

Hedef değişken şu şekilde tanımlanır:

  • Y= birim alan başına konut fiyatı (10000 Yeni Tayvan Doları/Ping; Ping yerel bir birimdir, 1 Ping = 3,3 metrekare)

Tahmin etmeye çalıştığımız hedef süreklidir; dolayısıyla sorun regresyon teknikleri gerektirecektir.

Veriye göz atarak başlayalım:

import pandas as pd

data = pd.read_excel("/content/gdrive/MyDrive/real_estate_valuation_data.xlsx")
print(data.info())
data.head()

>>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 414 entries, 0 to 413
Data columns (total 8 columns):
 #   Column                                  Non-Null Count  Dtype  
---  ------                                  --------------  -----  
 0   No                                      414 non-null    int64  
 1   X1 transaction date                     414 non-null    float64
 2   X2 house age                            414 non-null    float64
 3   X3 distance to the nearest MRT station  414 non-null    float64
 4   X4 number of convenience stores         414 non-null    int64  
 5   X5 latitude                             414 non-null    float64
 6   X6 longitude                            414 non-null    float64
 7   Y house price of unit area              414 non-null    float64
dtypes: float64(6), int64(2)
memory usage: 26.0 KB
None

No    X1 transaction date    X2 house age    X3 distance to the nearest MRT station    X4 number of convenience stores    X5 latitude    X6 longitude    Y house price of unit area
0    1    2012.916667    32.0    84.87882    10    24.98298    121.54024    37.9
1    2    2012.916667    19.5    306.59470    9    24.98034    121.53951    42.2
2    3    2013.583333    13.3    561.98450    5    24.98746    121.54391    47.3
3    4    2013.500000    13.3    561.98450    5    24.98746    121.54391    54.8
4    5    2012.833333    5.0    390.56840    5    24.97937    121.54245    43.1

Belgelerde (documentation) bahsi geçmeyen No adlı fazladan bir özellik var. Bunun bir indeks olduğunu ima ediyor olabilir, ancak basitlik adına bunu kaldıracağız. Ayrıca özellik adları belgelerde verilenlerle örtüşmüyor; bunu da temizleyeceğiz.

# sütunları yeniden adlandır
renamed_columns = [col.split()[0] for col in data.columns]
renamed_columns_map = {data.columns[i]:renamed_columns[i] for i in range(len(data.columns))}

data.rename(renamed_columns_map, axis=1, inplace=True)

# No sütununu kaldır
data.drop("No", axis=1, inplace=True)

print(data.head())

# özellikler ve hedef verisini ayır
features, target = data.columns[:-1], data.columns[-1]

X = data[features]
y = data[target]

Özellikleri ve hedefi ayırmadan önceki son veri kümesi şöyle görünüyor:


        X1          X2          X3      X4      X5          X6        Y
0   2012.916667     32.0    84.87882    10  24.98298    121.54024   37.9
1   2012.916667     19.5    306.59470   9   24.98034    121.53951   42.2
2   2013.583333     13.3    561.98450   5   24.98746    121.54391   47.3
3   2013.500000     13.3    561.98450   5   24.98746    121.54391   54.8
4   2012.833333     5.0     390.56840   5   24.97937    121.54245   43.1

Önyargı, varyans ve iyi uyum çözümlerini göstermek için üç model kuracağız: bir karar ağacı regresörü, regresyon için bir destek vektör makinesi ve bir rastgele orman regresörü. Modeli kurduktan sonra her biri için öğrenme eğrilerini çizecek ve bazı teşhis tekniklerini paylaşacağız.

Öğrenme eğrilerini teşhis etme

Öğrenme eğrileri, şekilleri değerlendirilerek yorumlanır. Şekil ve dinamikler yorumlandıktan sonra, bir makine öğrenmesi modelinin davranışındaki sorunları teşhis etmek için kullanılabilirler.

Scikit-learn'deki learning_curve() işlevi, bir öğrenme eğrisi çizmek için gereken eğitim ve doğrulama puanlarını izlemeyi kolaylaştırır.

learning_curve() işlevine geçirdiğimiz parametreler şunlardır:

  • estimator: hedef fonksiyonu yaklaştırmak için kullanılan model
  • X: girdi verisi
  • y: hedef
  • cv: çapraz doğrulama bölme stratejisi
  • scoring: modelin performansını değerlendirmede kullanılan metrik
  • train_sizes: öğrenme eğrisini oluşturmak için kullanılacak eğitim örneklerinin mutlak sayıları; kullandığımız değerler tamamen rastgeledir.

Model 1: Karar ağacı regresörü

Yüksek varyansa sahip bir model aşırı uyumlu (overfit) olarak adlandırılır. Eğitim verisini ve rastgele gürültüyü son derece iyi öğrenir; bu da eğitim verisinde başarılı ancak görülmemiş örneklerde genelleme yapamayan bir modele yol açar. Bu davranış, kullanılan algoritma çözülen problem için fazla esnek olduğunda veya model çok uzun süre eğitildiğinde ortaya çıkar.

Örneğin, karar ağacı regresörü doğrusal olmayan bir makine öğrenmesi algoritmasıdır. Doğrusal olmayan algoritmalar tipik olarak düşük önyargı ve yüksek varyansa sahiptir. Bu, veri kümesine yapılan değişikliklerin hedef fonksiyonda büyük oynamalara neden olacağını ima eder.

Karar ağacı regresörümüzle yüksek varyansı gösterelim:

from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# overfitting
decision_tree = DecisionTreeRegressor()

train_sizes, train_scores, test_scores = learning_curve(
    estimator=decision_tree,
    X=X,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 165, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Model 1: Decision tree regressor

Model, eğitim sırasında gördüğü örnekleri tahmin etmesi istendiğinde çok az hata yapar, ancak daha önce maruz kalmadığı yeni örneklerde kötü performans gösterir. Bu davranışı, eğitim eğrisi ile doğrulama eğrisi arasındaki genelleme hatasının ne kadar büyük olduğuna bakarak gözlemleyebilirsiniz. Bu davranışı iyileştirmek için bir çözüm, eğitim veri setimize daha fazla örnek eklemek olabilir; bu, önyargı ekler. Başka bir çözüm, modele düzenlileştirme (ör. ağacın tam derinliğine kadar büyümesini engelleme) eklemek olabilir.

Model 2: Destek Vektör Makinesi

Yüksek önyargıya sahip bir model yetersiz uyumlu (underfit) olarak adlandırılır. Eğitim verisi hakkında basitleştirici varsayımlar yapar; bu da alttaki kalıpları öğrenmesini zorlaştırır. Sonuç olarak model, eğitim ve doğrulama veri kümelerinde yüksek hataya sahip olur. Bu davranışı, kullanılan model çözülen problem için fazla basit olduğunda veya model yeterince uzun süre eğitilmediğinde gözlemleriz.

Örneğin, destek vektör makinesi doğrusal bir makine öğrenmesi algoritmasıdır. Doğrusal algoritmalar genellikle yüksek önyargı ve düşük varyansa sahiptir. Bu da hedef fonksiyonun biçimi hakkında daha fazla varsayım yapıldığı anlamına gelir. Modelimize daha fazla önyargı eklemek için modeldeki C parametresini ayarlayarak düzenlileştirme ekledik.

Destek vektör makinemizle yüksek önyargıyı gösterelim:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler

# Underfitting
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

svm = SVR(C=0.25)

train_sizes, train_scores, test_scores = learning_curve(
    estimator=svm,
    X=X_scaled,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 150, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Model 2: Support Vector Machine

Eğitim veri kümesi boyutu arttıkça eğitim ve doğrulama eğrileri arasındaki genelleme farkı son derece küçülür. Bu, modele daha fazla örnek eklemenin performansını artırmayacağını gösterir. Bu soruna bir çözüm, daha fazla özellik oluşturmak veya yapılan varsayımların sayısını azaltmak için modeli daha esnek hale getirmek olabilir.

Model 3: Rastgele Orman Regresörü

İyi uyum sağlayan bir model, yetersiz ve aşırı uyumlu modellerin arasında kalan gri alanda bulunur. Model, aşırı uyumlu durumda olduğu kadar eğitim verilerinde iyi olmayabilir; ancak görülmemiş örneklerle karşılaştığında çok daha az hata yapar. Bu davranış, eğitim hatası yükselirken yalnızca denge noktasına kadar yükselmesi, doğrulama hatasının ise denge noktasına kadar düşmesiyle gözlemlenebilir.

Bunu göstermek için karar ağaçlarından oluşan bir topluluk (ensemble) olan rastgele ormanı kullanacağız. Bu, modelin de doğrusal olmadığını gösterir; ancak çeşitli modeller yaratıp tahminlerini birleştirerek modele önyargı eklenir.

Ayrıca her ağacın maksimum derinliğini kontrol eden max_depth’i üç olarak ayarlayarak daha fazla düzenlileştirme ekledik.

Kodda bunun nasıl göründüğüne bakalım:

from sklearn.ensemble import RandomForestRegressor

# better
random_forest = RandomForestRegressor(max_depth=3)

train_sizes, train_scores, test_scores = learning_curve(
    estimator=random_forest,
    X=X,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 150, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Model 3: Random Forest Regressor

Artık doğrulama verisindeki hatayı azalttığımızı görebilirsiniz. Bu, eğitim verisindeki performansın zayıflaması pahasına geldi; ancak genel olarak daha iyi bir model.

Genelleme hatası çok daha küçük ve yapılan hata sayısı az. Ayrıca her iki eğri de 250 eğitim kümesi boyutunun ötesinde stabildir; bu da daha fazla örnek eklemenin bu modeli çok daha fazla iyileştirmeyebileceğini ima eder.

Özetle, bir modelin davranışı öğrenme eğrileri kullanılarak gözlemlenebilir. Makine öğrenmesi modelleri kurarken ideal senaryo, hatayı mümkün olduğunca düşük tutmaktır. Yüksek hataya yol açan iki faktör önyargı ve varyanstır; her ikisi arasında denge kurabilmek, daha iyi performans gösteren bir modelle sonuçlanacaktır.

Konular

İlgili