Bu örnek, yetersiz uyum ve aşırı uyumsuzluk problemlerini ve doğrusal olmayan fonksiyonlara yaklaşmak için polinom özellikli doğrusal regresyonu nasıl kullandığımızı göstermektedir.

Plot, kosinüs fonksiyonunun bir parçası olan yaklaşıklaştırmak istediğimiz fonksiyonu gösterir. Buna ek olarak, gerçek fonksiyonun örnekleri ve farklı modellerin yaklaşımları görüntülenir. Modellerin farklı derecelerde polinom özellikleri vardır. Doğrusal bir fonksiyonun (derecesi 1 olan polinom) eğitim numunelerine uyması için yeterli olmadığını görebiliriz. Buna yetersiz uyum denir. Derece 4 olan bir polinom, gerçek işleve neredeyse mükemmel bir şekilde yaklaşır. Bununla birlikte, daha yüksek dereceler için model eğitim verisine aşırı yük getirir, yani eğitim verilerinin gürültüsünü öğrenir. Karşılıklı doğrulama yöntemini kullanarak niceliksel olarak aşırı uyumu ve yetersiz uyumu değerlendiriyoruz.

Doğrulama kümesindeki ortalama karesel hatayı (MSE) hesaplarız, ne kadar yüksekse, modelin eğitim verilerinden doğru şekilde genelleme olasılığı da o kadar düşük olur.

Öncelikle kullanacağımız modülleri import edelim:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

Tohumu sıfırlıyoruz. Bu işlem her çağrılmada aynı sayı değerlerine sahip veri setini kullanmamıza olanak sağlıyor.


# Tohum sifirlanmasiyla ayni sayi seti her seferinde gorunecektir.
# Rastgele tohum sifirlanmazsa, her cagirrmada farkli sayilar gorunur.

# Tohumu sifirliyoruz cunku hep ayni sayi seti uzerinde calismak istiyoruz.
np.random.seed(0)

Şimdi kaç tane sayı üzerinde çalışacağımızı ve polinomların derecelerini ayarlayalım.


# kac adet ornek uzerinde calisagimizi ayarliyoruz.
sample_number = 30

# hedef orneklerimize uyabilecek polinomu saglamak icin
# polinom derecelerini belirliyoruz.
degrees = [1, 4, 15]

Fonksiyonumuzu hesaplayalim.


# fonksiyonumuzu hesaplayalim
function = lambda X: np.cos(1.5 * np.pi * X)
X = np.sort(np.random.rand(sample_number))
y = function(X) + np.random.randn(sample_number) * 0.1

# plot
plt.figure(figsize=(14, 5))

Modelimizi hesaplayalım ve sonuç:


# her polinom derecesi icin calistiralim.
for i in range(len(degrees)):
# plot
  ax = plt.subplot(1, len(degrees), i + 1)
  plt.setp(ax, xticks=(), yticks=())

  polynomial_features = PolynomialFeatures(degree=degrees[i],
  include_bias=False)

  linear_regression = LinearRegression()

  # boru hatti
  # Boru hattinin amaci,
  # farkli parametreler ayarlanirken
  # birbiriyle capraz gecerliligi olan birkac adimi bir araya getirmektir.
  pipeline = Pipeline([("polynomial_features", polynomial_features),
  ("linear_regression", linear_regression)])
  pipeline.fit(X[:, np.newaxis], y)

  # Modeli capraz dogrulama ile hesaplama
  scores = cross_val_score(pipeline, X[:, np.newaxis], y,
  scoring="neg_mean_squared_error", cv=10)

  X_test = np.linspace(0, 1, 100)

  # plot
  plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
  plt.plot(X_test, function(X_test), label="True function")
  plt.scatter(X, y, label="Samples")
  plt.xlabel("x")
  plt.ylabel("y")
  plt.xlim((0, 1))
  plt.ylim((-2, 2))
  plt.legend(loc="best")

  # mse skoru hesaplanmasi
  plt.title("Degree {}\nMSE = {:.2e}(+/- {:.2e})".format(
  degrees[i], -scores.mean(), scores.std()))
plt.show()

res1

Programın Tamamı:

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

# Tohum sifirlanmasiyla ayni sayi seti her seferinde gorunecektir.
# Rastgele tohum sifirlanmazsa, her cagirrmada farkli sayilar gorunur.

# Tohumu sifirliyoruz cunku hep ayni sayi seti uzerinde calismak istiyoruz.
np.random.seed(0)

# kac adet ornek uzerinde calisagimizi ayarliyoruz.
sample_number = 30

# hedef orneklerimize uyabilecek polinomu saglamak icin
# polinom derecelerini belirliyoruz.
degrees = [1, 4, 15]

# fonksiyonumuzu hesaplayalim
function = lambda X: np.cos(1.5 * np.pi * X)
X = np.sort(np.random.rand(sample_number))
y = function(X) + np.random.randn(sample_number) * 0.1

# plot
plt.figure(figsize=(14, 5))

# her polinom derecesi icin calistiralim
for i in range(len(degrees)):
  # plot
  ax = plt.subplot(1, len(degrees), i + 1)
  plt.setp(ax, xticks=(), yticks=())

  polynomial_features = PolynomialFeatures(degree=degrees[i],
  include_bias=False)
  linear_regression = LinearRegression()

  # boru hatti
  # Boru hattinin amaci,
  # farkli parametreler ayarlanirken
  # birbiriyle capraz gecerliligi olan birkac adimi bir araya getirmektir.
  pipeline = Pipeline([("polynomial_features", polynomial_features),
  ("linear_regression", linear_regression)])
  pipeline.fit(X[:, np.newaxis], y)

  # Modeli capraz dogrulama ile hesaplama
  scores = cross_val_score(pipeline, X[:, np.newaxis], y,
  scoring="neg_mean_squared_error", cv=10)

  X_test = np.linspace(0, 1, 100)

  # plot
  plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
  plt.plot(X_test, function(X_test), label="True function")
  plt.scatter(X, y, label="Samples")
  plt.xlabel("x")
  plt.ylabel("y")
  plt.xlim((0, 1))
  plt.ylim((-2, 2))
  plt.legend(loc="best")
  plt.title("Degree {}\nMSE = {:.2e}(+/- {:.2e})".format(
  degrees[i], -scores.mean(), scores.std()))
plt.show()

Referans:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_underfitting_overfitting.html