Polinomsal (Polynomial) Regresyon ve Python Uygulaması

Yiğit Şener
5 min readMay 23, 2020

--

Polinomsal (polynomial) regresyon konusunu anlamak için öncelikle basit doğrusal regresyon konusunu incelemenizi tavsiye ederim.

Doğrusal bir regresyonda girdi (x) ve çıktı (y) arasında lineer (doğrusal/line) bir ilişki olduğu varsayılmaktadır. Öte yandan polinomsal regresyonda ise girdi ve çıktı arasındaki ilişki düz bir doğru biçiminde değildir. Burada bir doğru yerine eğriden (curve) bahsedebiliriz. Ve temelde polinomsal regresyon bize bu eğrinin fonksiyonunu vermektedir. Burada önemli olan kısım bu polinom fonksiyonunun hangi dereceyi alacağıdır (nth-degree polynomial).

Neden Polinomsal Regresyon?

Aşağıdaki Python kodunda yer alan örnekte; talep edilen miktar ve fiyat noktalarının birleşimi scatter plot üzerinden gösterilmiştir (Price Elasticity). Bu veriler üzerinden yola çıkarak basit doğrusal regresyon ile polinomsal regresyonu karşılaştırıp inceleyelim.

Not: makalede bulunan tüm kodlara buradan (GITHUB) ulaşabilirsiniz. Ayrıca modellerin karşılaştırılması ve anlaşılabilirliği için veri setini özellikle iki değişkenli olarak hazırladım.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# talep miktarı: x
quantity = [5,10,15,20,27,35,45,65,95,150,200]
# fiyat: y
price = [5,10,15,20,25,30,35,40,45,50,55]
# Dataframe objesi
df = pd.DataFrame({"quantity":quantity,
"price":price})
# scatter plot gösterimi
plt.scatter(df["quantity"],
df["price"],
s=100,
c="red",
edgecolors='red'
)
plt.title("Talep & Fiyat Esnekliği")
plt.xlabel("Quantity")
plt.ylabel("Price")
plt.grid(True)
plt.legend()
plt.show()

Yukarıdaki scripte görüldüğü üzere önce gerekli olan kütüphaneler verilmiştir. Ardından iki adet örnek miktar/fiyat listesi oluşturularak bunlar DataFrame yapısına alınmıştır. Ardından talep edilen miktar ve fiyat değerlerinin kesişim noktaları için scatter plot çizilmiştir.

El ile çözebileceğimiz bir problemden yola çıkarsak polinomsal regresyonun temel mantığını anlamaya çalışalım.

Örneğin talep edilen miktar 80 ise fiyatı kaç bulabiliriz diye sorduğumuzda göz kararı bulunduğu noktaya en yakın iki noktayı inceleyerek buradaki fiyatların ortalamasını alabiliriz.

Fiyatını hesaplamak istediğimiz miktar olan 80'e en yakın iki değerin miktar ve fiyatlarını yukarıdaki scatter plot üzerinden de görebilirsiniz. Bu iki değerin fiyatlarının ortalamasını alalım.

y = (40 + 45) / 2 = 42,5

80 miktarı için belirlenen fiyatın 42,5 olabileceğini öngörmekteyiz. Önce basit doğrusal regresyon ile ardından da polinomsal regresyon ile talep ettiğimiz miktarın fiyatını bulmaya çalışalım. Bakalım hangi algoritma bizim bulduğumuz sonuca daha fazla yakınlaşıyor.

Veri setinde bağımsız değişken miktar (quantity) ve bağımlı değişken ise fiyat (price) olarak tanımlayalım.

# Bağımsız değişken
x = df[["quantity"]] # miktar
# Bağımlı değişken
y = df[["price"]] # fiyat

Önce basit doğrusal regresyon analizi yaparak veriyi eğitelim ve grafik olarak yazdıralım. Ardından eğittiğimiz modelde istediğimiz miktar için fiyatın tahminini bulalım.

# Basit doğrusal regresyon analizi
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(x, y)
# Regresyon doğrusunun gösterimi
def linearRegressionVisual():
plt.scatter(df["quantity"],
df["price"],
s=100,
c="red",
edgecolors='red'
)
plt.plot(x, lin_reg.predict(x), color='blue')
plt.title('Basit Doğrusal Regresyon Sonucu')
plt.xlabel('Miktar')
plt.ylabel('Fiyat')
plt.grid(True)
plt.show()
return
linearRegressionVisual()
# Miktar 80 için fiyat tahmini
print(lin_reg.predict([[80]]))
# ÇIKTI: 34.5537831

Scripte öncelikle Sklearn kütüphanesini kullanarak Regresyon algoritmasının objesini çağırdık ve elimizdeki verileri bu algoritma üzerinden eğittik. Eğitilen modelden çıkan katsayılar ile scatter plot üzerinde regresyon doğrusunu çizdirdik. Yine eğitilen model üzerinden istediğimiz miktar olan 80 tane ürün için fiayat tahmini yaptırdık. Burada çıkan sonucun 34,5 olduğunu görmekteyiz. Yukarıda hesapladığımız tahmini 42,5 fiyatına göre epey bir fark görülmektedir. Şimdi aşağıdaki grafikten regresyon doğrusunun nereden geçtiğine bir bakalım.

Grafikte de görüldüğü üzere regresyon doğrusu istediğimiz miktarın fiyatını tahmin edeceğimiz yere göre farklı bir noktadan geçiyor.

Aynı işlemleri polinomsal regresyon için uygulayıp sonuçlarını gözlemleyelim.

from sklearn.preprocessing import PolynomialFeatures
# Polinom derecesini belirlenir
poly_reg = PolynomialFeatures(degree = 4)
# Belirlenen dereceye göre bağımsız değişken hazırlanır
X_poly = poly_reg.fit_transform(x)
# Model eğitilir
pol_reg = LinearRegression()
pol_reg.fit(X_poly, y)
def polynomialRegressionVisual():
plt.scatter(df["quantity"],
df["price"],
s=100,
c="red",
edgecolors='red'
)
plt.plot(x, pol_reg.predict(poly_reg.fit_transform(x)), color='blue')
plt.title('Polinomsal Regresyon Sonucu')
plt.xlabel('Miktar')
plt.ylabel('Fiyat')
plt.grid(True)
plt.show()
return
polynomialRegressionVisual()
print(pol_reg.predict(poly_reg.fit_transform([[80]])))
# ÇIKTI: 43.10018674

Yukarıdaki kodda görüldüğü üzere Sklearn kütüphanesinin veri hazırlık (preprocessing) sınıfının içerisinden polinomsal özellik objesini çağırdık. Bunun anlamı veri setinde yer alan bağımsız değişkenleri polinomsal olarak hazırladığını göstermektedir. Bir sonraki satır ise belki de bu konunun en önemli parçasını oluşturmaktadır. Burada çağırdığımız obje içerisine tanımladığımız degree (polinom derecesi) eğitilen model verisinin gerçek sonuçlar ile ne kadar eşitlenmesi gerektiğini belirtilen yerdir. Örneğin biz bu dereceyi 4 verdik. Şu an ki bir örnek için doğru gelebilir ancak daha aykırı bir miktar için fiyat istediğimizde muhtemelen absürt bir rakam ortaya çıkaracaktır. Burada derecenin seviyesini artırdıkça aşırı öğrenme (overfitting) yaşanabilir.

Polinomsal regresyon modeli sonrasında 80 miktar ürün için çıkan fiyatın 43,1 olduğunu görüyoruz. Bizim öngörümüze (42,5) baya yaklaşmış durumda. Scatter plot üzerinden polinomsal regresyon eğrisinin nasıl göründüğüne bir bakalım.

Grafikte de görüldüğü üzere regresyon eğrisi noktaların içinden geçerek (fitting) ilerliyor. Overfitting’e doğru bir ilerleyiş bu ancak bizim şimdilik istediğimiz fiyat tahmini doğru bir şekilde verebiliyor.

Bias (Yanlılık) ve Varience (Varyans) Dengelenmesi

Bias, modelin verileri sığdırmadaki basit varsayımlarından kaynaklanan hatayı ifade eder. Yüksek bir bias, modelin verilerdeki desenleri yakalayamadığı anlamına gelir ve bunun adı düşük öğrenmedir (underfitting).

Varyans, verileri sığdırmaya çalışan karmaşık modelden kaynaklanan hatayı ifade eder. Yüksek varyans, modelin veri noktalarının çoğundan geçtiği ve sonucun aşırı öğrenmeye (overfitting) neden olduğu anlamına gelir.

Aşağıdaki grafikler konuyu özetlemektedir.

Polinomsal Regresyonun Avantajları

  • Geniş fonksiyon yelpazesi altına sığabilir.
  • Bu yaklaşım temel olarak geniş bir eğrilik alanına uyabilir.
  • Polinomsal regresyon, bağımlı ve bağımsız değişken arasındaki ilişkiye en iyi yaklaşımı verebilir.

Polinomsal Regresyonun Dezavantajları

  • Aykırı değerlere karşı bir hassasiyet söz konusudur. Bu yüzden veride bir veya iki aykırı değer bulunması, doğrusal olmayan bir analizin sonuçlarını ciddi şekilde etkileyebilir.

Sonuç

Polinomsal regresyon sınırları belli olan bir veri seti için uygun bir algoritmadır. Ancak veri setinin sınırlarının dışından gelen yeni veriler için hatası yüksek tahminlerde bulunabilir. Overfitting ve underfitting gibi konuları daha iyi anlamak için ise güzel bir algoritma deneyimi sağlar.

--

--