Bu makalede polinomal doğrusal regresyon modeli yardımıyla python ile makine öğenmesi algoritması üzerinde durulacaktır. Basitleştirici varsayım olarak kurulan modelin/verilerin klasik doğrusal regresyon modelinin tüm varsayımlarını sağladığı kabul edilmiştir. Makalede polinomal doğrusal regresyon modelinin bilimsel temelleri kısaca tanıtılacaktır. Sonrasında ise temsili bir model üzerinden python ile makine öğrenmesi uygulaması yapılacaktır.
Not 1: Bu makaledeki uygulamalar Python 3.9 sürümünde, Anaconda Navigator üzerinden Spyder IDE’si kullanılarak yapılmıştır.
Not 2: Bu makalede kullanılan modellerin matematiksel ispatları üzerinde durulmayacaktır. Modellerin daha detaylı matematiksel ispatları için EKONOMETRİ bölümünü ziyaret edebilirsiniz.
1. Giriş ve Örnek Veri Seti
Yıllık deneyime ve ödenen ücretlerden oluşan aşağıdaki gibi bir veri setimiz olsun. Veri setimizde test setine ilişkin süreç ilk makalede belirtilen yöntemlerle aynı olduğu için test setine yer verilmedi.
| Eğitim Seti | |
| Deneyim | Ücret |
| 1 | 39343.00 |
| 2 | 46205.00 |
| 3 | 43525.00 |
| 4 | 39891.00 |
| 5 | 56642.00 |
| 6 | 60150.00 |
| 7 | 54445.00 |
| 8 | 64445.00 |
| 9 | 63218.00 |
| 10 | 55794.00 |
| 11 | 56957.00 |
| 12 | 57081.00 |
| 13 | 61111.00 |
| 14 | 67938.00 |
| 15 | 83088.00 |
| 16 | 81363.00 |
| 17 | 93940.00 |
| 18 | 91738.00 |
| 19 | 98273.00 |
| 20 | 113812.00 |
Modelimizi yukarıdaki eğitim seti ile eğiteceğiz. Takip eden bölümde makine öğrenmesinde yararlanılacak olan polinomal doğrusal regresyonun kuramsal yönü ele alınacaktır. Son bölümde ise kuramsal çerçevede ele alınan konular, yukarıdaki veri seti kullanılarak python ile makine öğrenmesi algoritmasına dönüştürülecektir.
2. Polinomal Doğrusal Regresyon ve Parametrelerin Elde Edilmesi
Polinomal doğrusal regresyon, açıklayıcı değişkenin üstel biçimlerinin modele açıklayıcı değişken olarak dahil edildiği aşağıdaki gibi matematiksel bir fonksiyonu temsil eder.
![]()
Yukarıdaki modelde sadece
açıklayıcı değişken bulunduğuna ve modelin açıklayıcı değişkenin üssel derecelerinden oluştuğuna dikkat ediniz. Modelideki açıklayıcı değişkenlerden en yüksek üsse sahip olan modelin derecesini verir. Bu kapsamda yukarıdaki modelin derecesi k-1’dir. Aşağıda 1. dereceden polinomal bir foksiyon yer almaktadır.
![]()
![]()
![]()
Yukarıda gösterildiği gibi basit doğrusal regresyon aslında 1. dereceden polinomal bir foksiyondur. Aşağıdaki her iki polinomal doğrusal regresyon modelinin derecesi ise 3’tür.
![]()
![]()
Yukarıdaki örneklerde gösterildiği gibi açıklayıcı değişkenler modelde “doğrusal” biçimde yer almasalar bile model “polinomal doğrusal regresyon” şeklinde, halen “doğrusal” olarak ifade edilir. Çünkü regresyon modellerinde doğrusallık koşulu değişkenler için değil parametreler için aranan bir kuraldır. Dolayısıyla yukarıdaki polinomal fonksiyonda parametreler modelde doğrusal şekilde yer aldığı için polinomal modellerin parametreleri de basit doğrusal regresyonlarda kullanılan yöntem ile elde edilir. Bu sebeple polinomal modellerde parametrelerin elde edilme sürecine değinilmeyecektir.
![]()
Örneğin yukarıdaki modelin parametrelerinden biri modelde doğrusal olarak bulunmadığı için model doğrusal değildir.
Aşağıda ise örnek olması amacıyla 1., 2. ve 3. dereceden polinomal foksiyonların koordinat düzleminde grafiği yer almaktadır.
![]()

![]()

![]()

3. Python ile Makine Öğrenmesi: Polinomal Doğrusal Regresyon
Polinomal doğrusal regresyon modellerine neden ihtiyaç duyulur?
Yıllık deneyimin ücretler üzerindeki etkisini araştırmak istediğimizi, yani modelimizi yukarıdaki eğitim seti ile eğiteceğimizi varsayalım. Python dilini kullanarak modelin paramerelerini, R2 ve düzeltilmiş R2 istatistiklerini, dağılım grafiğini ve tahmin doğrusunu/eğrisini elde etmeyi ve 15 yıllık deneyime sahip bir kişinin ücretini tahmin etmeyi amaçlıyoruz.
Yukarıda verilen örnek veri setinin basit doğrusal regresyon modeli (diğer bir ifadeyle 1. dereceden polinomal bir model) ile tahminine ilişkin python algoritmaları aşağıdadır.
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022
@author: ishakkutlu
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures
# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Veri dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Polynomial_Reg.xlsx"
myLabelx ="YearsExperience"
myLabely ="Salary"
df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)
# linear regression
from sklearn.linear_model import LinearRegression
# linear regression = y = b0 + b1*x^1
lin_reg = LinearRegression(fit_intercept=True)
lin_reg.fit(x,y)
# predict
y_head = lin_reg.predict(x)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head,color="red",label ="linear")
plt.legend()
plt.show()
print("LİNEER DENKLEM: y = b0 + b1*x^1 ")
#parameters
print("Intercept: ", lin_reg.intercept_ )
print("Parameters except intercept", lin_reg.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head))*(len(y)-1)/(len(y)-x.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (LİNEER DENKLEM): ",lin_reg.predict([[15]]), "\n", "__________","\n")
Veri setine göre yukarıdaki algoritmanın sonuçları şu şekilde olmalıdır.

Yukarıda verilen örnek veri setinin basit doğrusal regresyon modeli ile tahmin edilen doğrusu aşağıdadır.
![]()

Yukarıdaki grafikte tahmin edilen doğrunun veri setine fit olmadığını söylemek zor olabilir. Ancak aşağıdaki 3. dereceden polinomal bir model ile tahmin edilen eğrinin veri setine yukarıdakinden daha fit olduğunu söyleyebilecek miyiz?
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022
@author: ishakkutlu
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures
# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Veri dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Polynomial_Reg.xlsx"
myLabelx ="YearsExperience"
myLabely ="Salary"
df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)
# linear regression
from sklearn.linear_model import LinearRegression
# linear regression = y = b0 + b1*x^1
lin_reg = LinearRegression(fit_intercept=True)
lin_reg.fit(x,y)
# predict
y_head = lin_reg.predict(x)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head,color="red",label ="linear")
plt.legend()
plt.show()
print("LİNEER DENKLEM: y = b0 + b1*x^1 ")
#parameters
print("Intercept: ", lin_reg.intercept_ )
print("Parameters except intercept", lin_reg.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head))*(len(y)-1)/(len(y)-x.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (LİNEER DENKLEM): ",lin_reg.predict([[15]]), "\n", "__________","\n")
# %%
# polynomial regression = y = b0 + b1*x^1 + b2*x^2 + b3*x^3 + ... + bn*x^n
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 (3. dereceden polinom)
# y = b0 + b1*x^1 + b2*x^2 (2. dereceden polinom)
# y = b0 + b1*x^1 (1. dereceden polinom, yani lineer denklem)
polynomial_func = PolynomialFeatures(degree = 3, include_bias=True)
x_polynomial = polynomial_func.fit_transform(x)
# fit
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial,y)
# predict
y_head_pol = lin_reg_pol.predict(x_polynomial)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "green",label = "polynomial-1")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-1: y = b0 + b1*x^1 + b2*x^2 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-1): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
Veri setine göre yukarıdaki algoritmanın sonuçları şu şekilde olmalıdır.

Yukarıda verilen örnek veri setinin 3. dereceden polinomal doğrusal regresyon modeli ile tahmin edilen eğrisi ile basit doğrusal modelin tahmin edilen doğrusu aşağıdadır.
![]()

![]()

Kullanılan veri seti için polinomal modelin düzeltilmiş R2 istatistiği basit doğrusal modelin R2 istatistiğinden büyüktür(0,925>0,847). Ancak her iki modelde açıklayıcı değişken sayısı aynı olmadığı için sadece düzeltilmiş R2 istatistiğine bakarak polinomal modelin daha başarılı olduğunu söyleyemeyiz. Ancak tahmin doğruları/eğrileri de incelendiğinde açıkça polinomal modelin verilere daha fit olduğu görülebilmektedir. O halde söz konusu veri seti için basit doğrusal regresyon modeli yerine veri setine daha fit olabilecek polinomal bir model kullanılabilir. Çünkü makine öğrenmesi sürecinde temel problem, modelin gerçek hayatı açıklamada ne kadar başarılı olduğudur.
4. Python ile Makine Öğrenmesi: Polinomal Modelden Değişken Çıkarmak
Aşağıda 3. dereceden polinomal model için X matrisi gösterilmektedir. X değişkenlerimiz 1’den 20’ye kadar ardışık olarak devam eden yıllık deneyimlerdi.
,
,
,
şeklinde polinomal forma dönüştürüldü. Dönüşüm sonrası X değişkenlerine karşılık gelen kolonlar aşağıdaki tabloda işaretlenmiştir.

Şimdi de 3. dereceden polinimal modelimizi aşağıdaki formda kullanmak istediğimizi varsayalım.
![]()
Yapmak istediğimiz
modelinden
değişkenini çıkarmak istiyoruz. İlk olarak polinomal modelimizdeki matrisin
değişkenlerinin tümünü aşağıdaki algortima ile 0 yapabiliriz.
Not: Dikkat edilirse, algoritmaları konu bütünlüğü bakımından bir önceki süreçleri içerecek şekilde kümülatif olarak ekliyorum.
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022
@author: ishakkutlu
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures
# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Veri dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Polynomial_Reg.xlsx"
myLabelx ="YearsExperience"
myLabely ="Salary"
df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)
# linear regression
from sklearn.linear_model import LinearRegression
# linear regression = y = b0 + b1*x^1
lin_reg = LinearRegression(fit_intercept=True)
lin_reg.fit(x,y)
# predict
y_head = lin_reg.predict(x)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head,color="red",label ="linear")
plt.legend()
plt.show()
print("LİNEER DENKLEM: y = b0 + b1*x^1 ")
#parameters
print("Intercept: ", lin_reg.intercept_ )
print("Parameters except intercept", lin_reg.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head))*(len(y)-1)/(len(y)-x.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (LİNEER DENKLEM): ",lin_reg.predict([[15]]), "\n", "__________","\n")
# %%
# polynomial regression = y = b0 + b1*x^1 + b2*x^2 + b3*x^3 + ... + bn*x^n
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 (3. dereceden polinom)
# y = b0 + b1*x^1 + b2*x^2 (2. dereceden polinom)
# y = b0 + b1*x^1 (1. dereceden polinom, yani lineer denklem)
polynomial_func = PolynomialFeatures(degree = 3, include_bias=True)
x_polynomial = polynomial_func.fit_transform(x)
# fit
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial,y)
# predict
y_head_pol = lin_reg_pol.predict(x_polynomial)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "green",label = "polynomial-1")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-1: y = b0 + b1*x^1 + b2*x^2 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-1): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
#%%
# x_polynomial matrisinin soldan üçüncü kolonunun, yani 2. indisteki tüm değerlerini 0 yap.
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 denklemini şu şekilde ifade etmek istiyoruz:
# y = b0 + b1*x^1 + b3*x^3
# x_polynomial matrisinin ilk halini konsola yaz
print("x_polynomial matrisinin ilk hali:", "\n", x_polynomial, "\n")
x_polynomial_new=x_polynomial
i=0
for a in x_polynomial:
#print(x_polynomial[i,2])
x_polynomial_new[i,2]=0
i=i+1
print("i= ", i, "\n")
print("x_polynomial matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış hali:", "\n", x_polynomial_new, "\n")
# fit
# x_polynomial_new matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış halini yeniden tahmin et
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial_new,y)
y_head_pol = lin_reg_pol.predict(x_polynomial_new)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "blue",label = "polynomial-2")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-2: y = b0 + b1*x^1 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial_new.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-2): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
Konsolda görüntülenen sonuçlar şu şekilde olmalıdır.



Yeni modeli ile tahmin edilen eğrisi aşağıdadır.
![]()

modelinden
değişkenini çıkarmak için yukarıdaki yöntemden farklı olarak, aşağıdaki algortima ile polinomal modelimizdeki matrisin
kolonunu tümüyle çıkarabiliriz.
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022
@author: ishakkutlu
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures
# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Veri dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Polynomial_Reg.xlsx"
myLabelx ="YearsExperience"
myLabely ="Salary"
df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)
# linear regression
from sklearn.linear_model import LinearRegression
# linear regression = y = b0 + b1*x^1
lin_reg = LinearRegression(fit_intercept=True)
lin_reg.fit(x,y)
# predict
y_head = lin_reg.predict(x)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head,color="red",label ="linear")
plt.legend()
plt.show()
print("LİNEER DENKLEM: y = b0 + b1*x^1 ")
#parameters
print("Intercept: ", lin_reg.intercept_ )
print("Parameters except intercept", lin_reg.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head))*(len(y)-1)/(len(y)-x.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (LİNEER DENKLEM): ",lin_reg.predict([[15]]), "\n", "__________","\n")
# %%
# polynomial regression = y = b0 + b1*x^1 + b2*x^2 + b3*x^3 + ... + bn*x^n
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 (3. dereceden polinom)
# y = b0 + b1*x^1 + b2*x^2 (2. dereceden polinom)
# y = b0 + b1*x^1 (1. dereceden polinom, yani lineer denklem)
polynomial_func = PolynomialFeatures(degree = 3, include_bias=True)
x_polynomial = polynomial_func.fit_transform(x)
# fit
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial,y)
# predict
y_head_pol = lin_reg_pol.predict(x_polynomial)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "green",label = "polynomial-1")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-1: y = b0 + b1*x^1 + b2*x^2 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-1): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
#%%
# x_polynomial matrisinin soldan üçüncü kolonunun, yani 2. indisteki tüm değerlerini 0 yap.
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 denklemini şu şekilde ifade etmek istiyoruz:
# y = b0 + b1*x^1 + b3*x^3
# x_polynomial matrisinin ilk halini konsola yaz
print("x_polynomial matrisinin ilk hali:", "\n", x_polynomial, "\n")
x_polynomial_new=x_polynomial
i=0
for a in x_polynomial:
#print(x_polynomial[i,2])
x_polynomial_new[i,2]=0
i=i+1
print("i= ", i, "\n")
print("x_polynomial matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış hali:", "\n", x_polynomial_new, "\n")
# fit
# x_polynomial_new matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış halini yeniden tahmin et
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial_new,y)
y_head_pol = lin_reg_pol.predict(x_polynomial_new)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "blue",label = "polynomial-2")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-2: y = b0 + b1*x^1 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial_new.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-2): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
#%%
# x_polynomial matrisinin soldan üçüncü kolonunu, yani 2. indisi kaldır.
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 denklemini şu şekilde ifade etmek istiyoruz:
# y = b0 + b1*x^1 + b3*x^3
# Yukarıdaki yöntemde 2. indisteki değerleri 0'a eşitlemek suretiyle y = b0 + b1*x^1 + b3*x^3 denklemini elde ettik.
# Burada ise matrsin üçüncü kolonunu, yani 2. indisini tamamen kaldırmak suretiyle y = b0 + b1*x^1 + b3*x^3 denklemini elde etmiş olacağız.
x_polynomial_new=np.delete(x_polynomial_new, 2, 1)
print("x_polynomial matrisinin üçüncü kolonunun tamamen kaldırılmış hali:", "\n", x_polynomial_new, "\n")
# fit
# x_polynomial_new matrisinin üçüncü kolonunun tamamen kaldırılmış halini yeniden tahmin et
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial_new,y)
y_head_pol = lin_reg_pol.predict(x_polynomial_new)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "gray",label = "polynomial-3")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-3: y = b0 + b1*x^1 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial_new.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-3): ",lin_reg_pol.predict([[1,15,15**3]]), "\n", "__________","\n")
Sonuçlar şu şekilde olmalıdır.

İkinci yönteme göre elde edilen yeni modelin tahmin edilen eğrisi aşağıdadır.
![]()

Son kullanılan her iki yöntemin sonuçları, hem grafikler hem de parametre ve R2 istatistileri açısından neredeyse aynıdır. Matematiksel açıdan her iki model arasından herhangi bir fark olmamasına rağmen, istatistiki olarak ikinci yöntemi kullanmak daha güvenilir olabilir.
Kullanılan veri seti için
modelinin grafiği 2. dereceden polinomal bir modelin grafiğine oldukça benzerdir. Aşağıdaki algoritmada 2. dereceden polinomal modelin uygulamasını bulabilirsiniz.
![]()
# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022
@author: ishakkutlu
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures
# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Veri dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Polynomial_Reg.xlsx"
myLabelx ="YearsExperience"
myLabely ="Salary"
df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)
# linear regression
from sklearn.linear_model import LinearRegression
# linear regression = y = b0 + b1*x^1
lin_reg = LinearRegression(fit_intercept=True)
lin_reg.fit(x,y)
# predict
y_head = lin_reg.predict(x)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head,color="red",label ="linear")
plt.legend()
plt.show()
print("LİNEER DENKLEM: y = b0 + b1*x^1 ")
#parameters
print("Intercept: ", lin_reg.intercept_ )
print("Parameters except intercept", lin_reg.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head))*(len(y)-1)/(len(y)-x.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (LİNEER DENKLEM): ",lin_reg.predict([[15]]), "\n", "__________","\n")
# %%
# polynomial regression = y = b0 + b1*x^1 + b2*x^2 + b3*x^3 + ... + bn*x^n
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 (3. dereceden polinom)
# y = b0 + b1*x^1 + b2*x^2 (2. dereceden polinom)
# y = b0 + b1*x^1 (1. dereceden polinom, yani lineer denklem)
polynomial_func = PolynomialFeatures(degree = 3, include_bias=True)
x_polynomial = polynomial_func.fit_transform(x)
# fit
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial,y)
# predict
y_head_pol = lin_reg_pol.predict(x_polynomial)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "green",label = "polynomial-1")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-1: y = b0 + b1*x^1 + b2*x^2 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-1): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
#%%
# x_polynomial matrisinin soldan üçüncü kolonunun, yani 2. indisteki tüm değerlerini 0 yap.
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 denklemini şu şekilde ifade etmek istiyoruz:
# y = b0 + b1*x^1 + b3*x^3
# x_polynomial matrisinin ilk halini konsola yaz
print("x_polynomial matrisinin ilk hali:", "\n", x_polynomial, "\n")
x_polynomial_new=x_polynomial
i=0
for a in x_polynomial:
#print(x_polynomial[i,2])
x_polynomial_new[i,2]=0
i=i+1
print("i= ", i, "\n")
print("x_polynomial matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış hali:", "\n", x_polynomial_new, "\n")
# fit
# x_polynomial_new matrisinin üçüncü kolonunun tüm değerlerinin 0 yapılmış halini yeniden tahmin et
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial_new,y)
y_head_pol = lin_reg_pol.predict(x_polynomial_new)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "blue",label = "polynomial-2")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-2: y = b0 + b1*x^1 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial_new.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-2): ",lin_reg_pol.predict([[1,15,15**2,15**3]]), "\n", "__________","\n")
#%%
# x_polynomial matrisinin soldan üçüncü kolonunu, yani 2. indisi kaldır.
# y = b0 + b1*x^1 + b2*x^2 + b3*x^3 denklemini şu şekilde ifade etmek istiyoruz:
# y = b0 + b1*x^1 + b3*x^3
# Yukarıdaki yöntemde 2. indisteki değerleri 0'a eşitlemek suretiyle y = b0 + b1*x^1 + b3*x^3 denklemini elde ettik.
# Burada ise matrsin üçüncü kolonunu, yani 2. indisini tamamen kaldırmak suretiyle y = b0 + b1*x^1 + b3*x^3 denklemini elde etmiş olacağız.
x_polynomial_new=np.delete(x_polynomial_new, 2, 1)
print("x_polynomial matrisinin üçüncü kolonunun tamamen kaldırılmış hali:", "\n", x_polynomial_new, "\n")
# fit
# x_polynomial_new matrisinin üçüncü kolonunun tamamen kaldırılmış halini yeniden tahmin et
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial_new,y)
y_head_pol = lin_reg_pol.predict(x_polynomial_new)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "gray",label = "polynomial-3")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-3: y = b0 + b1*x^1 + b3*x^3")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial_new.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-3): ",lin_reg_pol.predict([[1,15,15**3]]), "\n", "__________","\n")
# %%
# Doğrudan 2. dereceden bir polinom denklemi için yeni bir tahmin oluştur.
# y = b0 + b1*x^1 + b2*x^2 (2. dereceden polinom)
polynomial_func = PolynomialFeatures(degree = 2, include_bias=True)
x_polynomial = polynomial_func.fit_transform(x)
# fit
lin_reg_pol = LinearRegression(fit_intercept=True)
lin_reg_pol.fit(x_polynomial,y)
# predict
y_head_pol = lin_reg_pol.predict(x_polynomial)
plt.scatter(x,y)
plt.ylabel(myLabely)
plt.xlabel(myLabelx)
plt.plot(x,y_head_pol,color= "orange",label = "polynomial-4")
plt.legend()
plt.show()
print("POLİNOMAL DENKLEM-4: y = b0 + b1*x^1 + b2*x^2")
#parameters
print("Intercept: ", lin_reg_pol.intercept_ )
print("Parameters except intercept", lin_reg_pol.coef_, "\n")
# R^2
print("R^2 score: ", r2_score(y,y_head_pol))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_head_pol))*(len(y)-1)/(len(y)-x_polynomial.shape[1]+1) # sabit terimin dahil edildiği yöntem.
print("Adjusted R^2 score: ", adj_r2, "\n")
print("15 yıllık deneyime sahip kişinin ücret tahmini (POLİNOMAL DENKLEM-4): ",lin_reg_pol.predict([[1,15,15**2]]), "\n", "__________","\n")
Veri setine uygulanan 2. dereceden polinomal modelin sonuçları şu şekildedir.

Veri setine uygulanan 2. dereceden polinomal modelin tahmin edilen eğrisi ile bir önceki aşamada kullanılan 3. dereceden polinomal modelin tahmin edilen eğrisi aşağıdadır.
![]()

![]()

Grafikler incelendiğinde her iki modelin de oldukça benzer eğrileri tahmin ettiği görülüyor. Ancak her iki modelin de açıklayıcı değişken sayıları aynı olduğu için düzeltilmiş R2 istatistiği ile modeller kolaylıkla karşılaştırılabilir. Bir önceki aşamada incelenen 3. dereceden polinomal modelin düzeltilmiş R2 istatistiği, 2. dereceden polinomal modelin düzeltilmiş R2 istatistiğinden biraz daha büyüktür (0,910>0,897). Diğer bir ifadeyle bir öceki aşamada tahmin edilen model, 2. dereceden polinomal modelden daha güçlüdür.
Son olarak birkaç kritik noktadan bahsedeceğim.
“polynomial_func = PolynomialFeatures(degree = 3, include_bias=True)” satırında yer alan “degree” ifadesi polinomum derecesini, “include_bias=True” ifadesi ise polinomun matrisinde sabit terime karşılık gelen kolonun (True iken) olmasını/(False iken) olmamasını temsil eder. Örneğin yukarıda verilen konsol sonuçlarında “Parameters except intercept” ifadelerinde yer alan “0.” değerleri yerine, örnek modellerde sabit terim kullanılmamış olsaydı, sabit terimin değerlerinin bulunacağını ifade eder. Diğer bir ifadeyle polinomal modellerde sabit terim, polinomal dönüştürme sırasında “PolynomialFeatures” özelliği içinde veya doğrusal regresyon modelinin oluşturulma aşamasında “LinearRegression” özelliği içinde (fit_intercept=True) iki farklı şekilde modele ilave edilebilir.
Bir diğer konu da 15 yıllık deneyim tahmin edilirken algoritmanın lineer bölümünde lin_reg_pol.predict([[15]] şeklinde, polinomal bölümlerde ise lin_reg_pol.predict([[1,15,15**2,15**3]] şeklimde tahmin eidlmiştir. Bunun sebebi lineer bölümde tek bir X değişkeni varken, polinomal bölümde X değişkenin üssel değerleri de birer değişken/parametre olduğu için birden fazla değer vardır. Yani model tahmin edilirken array’in içinde, X matrisinin kolon sayısı kadar değer olmalıdır. Polinomal modellerde, yukarıda bahsedildiği gibi “include_bias=True” iken sabit terimi de bir değişken gibi dikkate almak gerektiğine de dikkat edilmelidir.
