Python ile Makine Öğrenmesi: Matris Yöntemiyle Çok Değişkenli Doğrusal Regresyon

P

Bu makalede çok değişkenli (multiple) 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 çok değişkenli doğrusal regresyon modelinin bilimsel temelleri matris cebiri kullanılarak kısaca tanıtılacaktır. Sonrasında çok değişkenli 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 yaşa göre ödenen ücretlerden oluşan aşağıdaki gibi bir veri setimiz olsun. Veri setimizde test setine ilişkin süreç bir önceki makalede belirtilen yöntemlerle aynı olduğu için test setine yer verilmedi.

Eğitim Seti
DeneyimÜcretYaş
1.139343.0025
1.346205.0027
2.043525.0023
2.239891.0025
2.956642.0032
3.060150.0038
3.254445.0027
3.264445.0041
3.963218.0037
4.055794.0035
4.056957.0038
4.157081.0045
4.561111.0028
4.967938.0036
5.383088.0039
5.981363.0045
6.093940.0043
6.891738.0046
7.198273.0050
8.2113812.0043
8.7109431.0038
9.0105582.0047
9.5116969.0043
9.6112635.0052
10.5121872.0049

Modelimizi yukarıdaki eğitim seti ile eğiteceğiz. Takip eden bölümlerde makine öğrenmesinde yararlanılacak olan çoklu doğrusal regresyonun matris cebiri ile 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.  Matris Yöntemiyle Parametrelerin Elde Edilmesi

Yıllık deneyimin ve yaşın ücretler üzerindeki etkisini araştırmak istediğimizi, yani modelimizi yukarıdaki eğitim seti ile eğiteceğimizi varsayalım. Eğitimde kullanacağımız modelimiz şu şekilde olacaktır.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\beta _2}{X_{2i}} + {\varepsilon _i}

\displaystyle {h_0}\left( {{X_{1i}},{X_{2i}}} \right) = {\beta _0} + {\beta _1}{X_{1i}} + {\beta _2}{X_{2i}} + {\varepsilon _i}

Yukarıdaki modelde \displaystyle {Y_i} açıklanan/bağımlı değişken, \displaystyle {X_{1i}} ve \displaystyle {X_{2i}} açıklayıcı/bağımsız değişkenlri ve \displaystyle {\varepsilon _i} ifadesi ise hata terimleridir. Y, X ve \displaystyle \varepsilon  ifadelerinde yer alan “i” harfleri bir önceki makalede de belirtildiği üzere gözlem sırasını temsil etmektedir. Ancak ikiden daha fazla k-1 adet açıklayıcı değişkenin olduğu bir modelde toplam sembolü gibi metotlarla işlem yapmak mümkün olmaz. Bu durumda da matris cebiri kullanılır. Aşağıdaki gibi k-1 adet açıklayıcı değişkenden (sabit terim ile birlikte k adet parametreden oluşan) bir genel doğrusal model olsun.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\beta _2}{X_{2i}} + {\beta _3}{X_{3i}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)i}} + {\varepsilon _i}

Yukarıdaki modelde “i” gözlem sırasını, k modelde bulunan parametre sayısını ve “n” gözlem sayısını temsil etmektedir. Modelde bir sabit olduğu ve sabit de \displaystyle {\beta _0} ile ifade edildiği ve modelde k adet parametre olduğu varsayıldığı için son parametre \displaystyle {\beta _k} yerine \displaystyle {\beta _{k - 1}} ile ifade edilmiştir. Modelde bulunan sabit \displaystyle {\beta _0} yerine \displaystyle {\beta _1} ile ifade edilseydi, modelde k adet parametre olduğu varsayıldığı için son parametre \displaystyle {\beta _{k - 1}} yerine \displaystyle {\beta _k} ile ifade edilirdi. Yukarıdaki modelin matris formunda ifade edilebilmesi için model 1’den “n” gözlem sayısına kadar genişletilir.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\beta _2}{X_{2i}} + {\beta _3}{X_{3i}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)i}} + {\varepsilon _i}

\displaystyle {Y_1} = {\beta _0} + {\beta _1}{X_{11}} + {\beta _2}{X_{21}} + {\beta _3}{X_{31}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)1}} + {\varepsilon _1}

\displaystyle {Y_2} = {\beta _0} + {\beta _1}{X_{12}} + {\beta _2}{X_{22}} + {\beta _3}{X_{32}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)2}} + {\varepsilon _2}

\displaystyle {Y_3} = {\beta _0} + {\beta _1}{X_{13}} + {\beta _2}{X_{23}} + {\beta _3}{X_{33}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)3}} + {\varepsilon _3}

\displaystyle  \vdots

\displaystyle {Y_n} = {\beta _0} + {\beta _1}{X_{1n}} + {\beta _2}{X_{2n}} + {\beta _3}{X_{3n}}. + ... + {\beta _{k - 1}}{X_{\left( {k - 1} \right)n}} + {\varepsilon _n}

Yukarıdaki denklem sistemi aşağıdaki şekilde matris formunda ifade edilir.

\displaystyle {\left[ {\begin{array}{*{20}{c}}  {{Y_1}} \\  {{Y_2}} \\  {{Y_3}} \\  {{Y_4}} \\  \vdots  \\  {{Y_n}}  \end{array}} \right]_{nx1}} = {\left[ \begin{gathered}  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{11}}}  \end{array}}&{{X_{21}}}  \end{array}}&{{X_{31}}}  \end{array}}& \ldots  \end{array}}&{{X_{\left( {k - 1} \right)1}}}  \end{array} \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{12}}}  \end{array}}&{{X_{22}}}&{{X_{32}}}& \ldots &{{X_{\left( {k - 1} \right)2}}}  \end{array} \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{13}}}  \end{array}}&{{X_{23}}}&{{X_{33}}}  \end{array}}& \ldots &{{X_{\left( {k - 1} \right)3}}}  \end{array} \hfill \\  \vdots  \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{1n}}}  \end{array}}&{{X_{2n}}}&{{X_{3n}}}  \end{array}}& \ldots &{{X_{\left( {k - 1} \right)n}}}  \end{array} \hfill \\  \end{gathered}  \right]_{nxk}}{\left[ {\begin{array}{*{20}{c}}  {{\beta _0}} \\  {{\beta _1}} \\  {{\beta _2}} \\  {{\beta _3}} \\  \vdots  \\  {{\beta _{k - 1}}}  \end{array}} \right]_{kx1}} + {\left[ {\begin{array}{*{20}{c}}  {{\varepsilon _1}} \\  {{\varepsilon _2}} \\  {{\varepsilon _3}} \\  {{\varepsilon _4}} \\  \vdots  \\  {{\varepsilon _n}}  \end{array}} \right]_{nx1}}

\displaystyle Y, \displaystyle X, \displaystyle \beta  ve \displaystyle \varepsilon  ifadeleri birer matrisi temsil etmek üzere, yukarıdaki denklem sistemi aşağıdaki şekilde ifade edilir.

\displaystyle Y = X\beta  + \varepsilon

Yukarıdaki modelde hata terimlerini temsil eden \displaystyle \varepsilon  matrisi yalnız bırakılır.

\displaystyle \varepsilon  = Y - X\beta

Matris cebirinde eşitliğin her iki tarafının da karesinin alınması için (\displaystyle \varepsilon  matrisinin nx1 boyutlarında bir sütun vektörü olduğu varsayımı altında), her iki taraf da soldan kendi transpozu (devriği, trasnpose) ile çarpılır.

\displaystyle \varepsilon '\varepsilon  = {\left( {Y - X\beta } \right)^\prime }\left( {Y - X\beta } \right)

Yukarıdaki denklem sistemi, transpozunun alınması sonrası aşağıdaki şekilde düzenlenir.

\displaystyle \varepsilon '\varepsilon  = \left( {Y' - \beta 'X'} \right)\left( {Y - X\beta } \right)

Eşitliğin sağında yer alan ifade açılır.

\displaystyle \varepsilon '\varepsilon  = Y'Y - Y'X\beta  - \beta 'X'Y + \beta 'X'X\beta

Yukarıdaki denklem sisteminde \displaystyle Y'X\beta  ifadesi ile \displaystyle \beta 'X'Y ifadesi birbirine eşittir. Bu iki ifadenin toplamı \displaystyle 2Y'X\beta  olarak ifade edilebileceği gibi \displaystyle 2\beta 'X'Y olarak da ifade edilebilir.

\displaystyle \varepsilon '\varepsilon  = Y'Y - \underbrace {\left( {Y'X\beta  + \beta 'X'Y} \right)}_{2\beta 'X'Y} + \beta 'X'X\beta

\displaystyle \varepsilon '\varepsilon  = Y'Y - 2\beta 'X'Y + \beta 'X'X\beta

Yukarıdaki denklem sisteminde yer alan \displaystyle \beta 'X'X\beta  ifadesi içindeki \displaystyle X'X ifadesinin sonucu, kxk boyutlarında bir kare matris olduğu için bir determinanta sahiptir.  Ayrıca X değişkenlerinin gözlemlenebilen sayısal değerleri olduğundan \displaystyle X'X ifadesi p gibi bir sabite eşit olacaktır.

\displaystyle X'X = {\left[ {\begin{array}{*{20}{c}}  1&1&1&1& \ldots &1 \\  {{X_{11}}}&{{X_{12}}}&{{X_{13}}}&{{X_{14}}}& \ldots &{{X_{1n}}} \\  {{X_{21}}}&{{X_{22}}}&{{X_{23}}}&{{X_{24}}}& \ldots &{{X_{2n}}} \\  \vdots &{}&{}&{}&{}&{} \\  {{X_{\left( {k - 1} \right)1}}}&{{X_{\left( {k - 1} \right)2}}}&{{X_{\left( {k - 1} \right)3}}}&{{X_{\left( {k - 1} \right)4}}}& \ldots &{{X_{\left( {k - 1} \right)n}}}  \end{array}} \right]_{kxn}}{\left[ \begin{gathered}  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{11}}}  \end{array}}&{{X_{21}}}  \end{array}}&{{X_{31}}}  \end{array}}& \ldots  \end{array}}&{{X_{\left( {k - 1} \right)1}}}  \end{array} \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{12}}}  \end{array}}&{{X_{22}}}&{{X_{32}}}& \ldots &{{X_{\left( {k - 1} \right)2}}}  \end{array} \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{13}}}  \end{array}}&{{X_{23}}}&{{X_{33}}}  \end{array}}& \ldots &{{X_{\left( {k - 1} \right)3}}}  \end{array} \hfill \\  \vdots  \hfill \\  \begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  {\begin{array}{*{20}{c}}  1&{{X_{1n}}}  \end{array}}&{{X_{2n}}}&{{X_{3n}}}  \end{array}}& \ldots &{{X_{\left( {k - 1} \right)n}}}  \end{array} \hfill \\  \end{gathered}  \right]_{nxk}}

\displaystyle X'X = {\left[ {\begin{array}{*{20}{c}}  {}&{} \\  {}&{}  \end{array}} \right]_{kxk}} = p

\displaystyle \varepsilon '\varepsilon  = Y'Y - 2\beta 'X'Y + \beta 'p\beta

Yukarıdaki denklem sistemi aşağıdaki gibi tekrar düzenlenir.

\displaystyle \varepsilon '\varepsilon  = Y'Y - 2\beta 'X'Y + p\beta '\beta

Yukarıdaki denklem sisteminde hata terimlerinin karelerinin toplamı elde edilmişti. Hata terimlerinin karelerinin toplamını minimize etmek için \displaystyle \beta  parametrelerine göre ayrı ayrı kısmi türev alınarak 0’a (sıfıra) eşitlenir.

\displaystyle \frac{{\partial \varepsilon '\varepsilon }}{{\partial \beta }} =  - 2X'Y + 2p\beta  = 0

Yukarıdaki denklem sistemi aşağıdaki şekilde düzenlenir.

\displaystyle 2p\beta  = 2X'Y

\displaystyle \cancel{2}p\beta  = \cancel{2}X'Y

\displaystyle p\beta  = X'Y

\displaystyle p = X'X olduğundan yukarıdaki denklem sistemde yerine yazılır.

\displaystyle X'X\beta  = X'Y

\displaystyle \beta  parametrelerinin tahmin edicisi \displaystyle \beta  sütun vektörünü elde etmek amacıyla, \displaystyle \beta  matrisinin yalnız bırakılması gerekir. Bu amaçla yukarıdaki denklem sisteminin her iki tarafı da soldan, \displaystyle X'X ifadesinin tersini temsil eden \displaystyle {\left( {X'X} \right)^{ - 1}} ifadesi ile çarpılır.

\displaystyle {\left( {X'X} \right)^{ - 1}}X'X\beta  = {\left( {X'X} \right)^{ - 1}}X'Y

Bir matrisi, kendi tersi ile çarpmak birim matrisi verdiğinden ve birim matrisin determinantı da 1 olduğundan, \displaystyle {\left( {X'X} \right)^{ - 1}}X'X = I = 1 yoluyla \displaystyle \beta  sütun vektörü yalnız bırakılmış olur.

\displaystyle \underbrace {{{\left( {X'X} \right)}^{ - 1}}X'X}_I\beta  = {\left( {X'X} \right)^{ - 1}}X'Y

\displaystyle \underbrace I_1\beta  = {\left( {X'X} \right)^{ - 1}}X'Y

\displaystyle \hat \beta  = {\left( {X'X} \right)^{ - 1}}X'Y

Yukarıdaki parametre tahmin edicisini temsil eden \displaystyle \hat \beta  sütun vektörü satır vektörü olarak aşağıdaki şekilde de elde edilebilir.

\displaystyle \hat \beta  = Y'X{\left( {X'X} \right)^{ - 1}}

3.  Python ile Makine Öğrenmesi: Çoklu Doğrusal Regresyon

Aşağıdaki kodlarda bir satırın solunda yer “#” işareti o satırın derleyici tarafından okunmadığını ifade eder. Benzer şekilde ‘’’ ile ‘’’ işaretleri arasında yer alan satır veya satırlar da derleyici tarafından okunmaz. Bu işaretler yardımıyla kodların için açıklama/yorum eklenebilmektedir veya bir kod satırı veya bloğunun kolaylıkla kapatılıp açılması mümkün olmaktadır.

Aşağıdaki python algoritmasında verilerin xlsx uzantılı bir Excel dosyadan okunması, verilerin dönüştürülmesi, verilere ols/ekk uygulanması (verilerin regresyon tahminin yapılması), R2 ve düzeltilmiş (adjusted) R2 istatistiğinin hesaplanması ve parametrelerin elde edilmesi yer almaktadır. İlave olarak sayısal değerlerin arraylerin içinden çıkarılması ve eğitim seti dışında rassal 2 farklı veri ile modele basit bir tahmin yaptırılmıştır.

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022

@author: ishakkutlu
"""

#%%
import pandas as pd
from sklearn.linear_model import LinearRegression

#"C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Csv dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Multiple_Reg.xlsx"
myLabelx1 ="YearsExperience"
myLabelx2 ="Age"
myLabely ="Salary"
# Sadece yukarıdaki değişkenleri uyarlamanız yeterli olacaktır.
# Veri setinizi eğitmek için kodlarda başka herhangi bir değişiklik yapmanıza gerek yoktur.
# Modelin Y=b0+b1X1+b2X2+e olduğu varsayılmıştır.

df = pd.read_excel(myTrainingFile) # Excel'den pythona veri aktarımı
#df = pd.read_csv(myTrainingFile, sep = ",") # Eğer csv dosyasından veri aktarılacaksa, bu satır kullanılır.

X = df[[myLabelx1, myLabelx2]]
y = df[myLabely]

# %% 
#Predict
multiple_reg = LinearRegression(fit_intercept=True) # Modelde sabit terim olacak. Y=b0+b1X1+b2X2+e
#multiple_reg = LinearRegression(fit_intercept=False) # Modelde sabit terim olmayacak. Y=b1X1+b2X2+e
multiple_reg.fit(X.values, y)
#multiple_reg.fit(X, y) # Bu satırla fit edildiğinde aşağıdaki TahminTest sürecinde verilerin başlığının olmasını bekliyor ve uyarı (hata değil) veriyor.

b0 = multiple_reg.intercept_
print("b0: ", b0 )
print("b1,b2: ", "\n", multiple_reg.coef_) # parametrelerin arrayin içinde
print("b1,b2: ", "\n", multiple_reg.coef_[0], "\n", multiple_reg.coef_[1]) # parametrelerin arrayin içinden çıkarıldı ve alt satıra yazdırıldı.

# predict 
TahminTest = multiple_reg.predict([[10,35],[5,35]])
print("Array şeklindeki sonuç: ", TahminTest)
print ("10 yıllık deneyime sahip 35 yaşındaki kişinin ücreti: ", TahminTest[0]) #ilk sıradaki değer arrayin içinden çıkarıldı
print ("5 yıllık deneyime sahip 35 yaşındaki kişinin ücreti: ", TahminTest[1]) #İkinci sıradaki değer arrayin içinden çıkarıldı


# %% 
# R^2 
r2 = multiple_reg.score(X.values, y) #Eğer isimlendirme ilgili bir uyarı verirse değişkenin sağına, yandaki gibi ".values" ifadesini ekleyiniz.
print('R^2 score: ',r2)
# Adjusted R-squared
adj_r2 = 1 - (1-r2)*(len(y)-1)/(len(y)-(X.shape[1]+1)) # adjR2 hesaplanmasında sabit terimin dahil edildiği yöntem kullanıldı. Yani toplam 3 parametre olmalı.
print('Adjusted R^2 score: ',adj_r2)

Makalenin girişinde sunulan veri setine göre yukarıdaki algoritmanın sonuçları şu şekilde olmalıdır.

Yorum Yap

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube