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()
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