Doğrusal Regresyon (Linear Regression)

Elimizde çeşitli canlıların beyin-vücut ağırlıkları olsun. Öncelikle veriye kısaca göz atalım:

Brain Body
3.385 44.500
0.480 15.500
1.350 8.100
465.000 423.000
36.330 119.500

İlk sütun beyin ağırlığını, ikinci sütun ise vücut ağırlığını içeriyor. Beyin ve vücut ağırlığı arasında doğrusal bir model kurmak istiyoruz. Vücut ağırlının, beyin ağırlığına bağlı olduğunu varsayalım. O halde,  bu modeli, A ve B reel sayı olmak üzere,

(vücut ağırlığı) = A * (beyin ağırlığı) + B

şeklinde kurabiliriz. Başka bir deyişle, beyin ağırlığı bağımsız değişkenimiz, vücut ağırlığı da bağımlı değişkenimizdir.

A ve B sayılarını belirlediğimizi varsayarak, verilen bir beyin ağırlığı için vücut ağırlığını tahmin edebiliriz ve bunun için python fonksiyonu:

def tahmin(A, B, x):
    return A * x + B

Peki A ve B sayılarını nasıl belirleyeceğiz?

A ve B sayılarını herhangi bir şekilde seçtiğimizde, predict fonksiyonu, x’e karşılık bir tahmini y değeri verecektir. Tablodaki x değerlerine karşılık gelen gerçek y değerlerinden tahmin ettiğimiz değerin farklarına bakarak tahmin hatamızı hesaplayabiliriz. Bunun için python fonksiyonu:

def hata(A, B, x, y):
    return y - tahmin(A, B, x)

Verisetimiz üzerindeki toplam kestirim hatasını bilmek istiyoruz. Ancak hataları sadece toplayamayız- bir x_1 değeri için tahmin çok büyük, bir x_2 değeri için tahmin çok küçük ise hatalar birbirini dengeleyebilir.

O yüzden hataların karelerini topluyoruz:

def hataların_kareler_toplamı(A, B, x, y):
    return sum(hata(A, B, x, y) ** 2 for x,y in zip(x,y))

En küçük kareler (Least Squares) metodu, A ve B sayılarını, hataların kareler toplamını en küçük yapacak şekilde seçer. Matematiksel analiz kullanılarak A ve B sayıları aşağıdaki gibi seçilir:

def en_kucuk_kareler(x, y):
    B = korelasyon(x, y) * standart_sapma(y) / standart_sapma(x)
    A = ortalama(y) - B * ortalama(x)

İleride temel istatistik bilgileri veren bir yazı yazacağım. Korelasyon, standart sapma gibi terimleri orada açıklarım. Şimdilik yukarıdaki kodu pseudo-code olarak düşünelim.

Doğrumuzun verimize ne kadar uyduğunu ölçmemiz gerekiyor. En yaygın kullanılan ölçme yöntemlerinden biri determinasyon katsayısıdır (coefficent of determination).

Scikit-learn  kullanarak doğrusal regresyonu hesaplayalım:


# coding: utf-8

# In[1]:

# Import libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# In[2]:

# Import data
dataframe = pd.read_csv('brain_body.txt', sep=',')
X = dataframe[['Brain']]
y = dataframe[['Body']]

# In[3]:

# Create regressor and fit data
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X, y)

# In[4]:

# Visualising the results
plt.scatter(X, y, color = 'red')
plt.plot(X, regressor.predict(X), color = 'blue')
plt.title('Linear Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

# In[5]:

print('Coefficients: \n', regressor.coef_)
# The mean squared error
print("Mean squared error: %.2f" % np.mean((regressor.predict(X) - y) ** 2))

Adım adım ne yaptığımızı açıklayayım:

  1.  İlk olarak gerekli kütüphaneleri içeri aktardık. Ben kütüphanelerin bir çoğunu ayrı ayrı kurmakla uğraşmamak için Anaconda python dağıtımını kullanıyorum.
  2.  Pandas kütüphanesi ile txt dosyamızı bir veri-çerçevesine (dataframe) aktarıyoruz.
  3.  Scikit-learn kütüphanesinden LinearRegression fonksiyonu ile elimizdeki X ve y verilerine lineer regresyon uyguluyoruz.
  4. Matplotlib kütüphanesi ile önce elimizdeki veriyi saçılım grafiği (scatter plot) olarak ardından tahmin ettiğimiz doğrumuzu çiziyoruz.
  5. Önce A katsayısını, sonrada hataların kareler toplamının ortalamasını ekrana yazdırıyoruz. Örneğimizde Mean squared error: 108423.21 sonucunu elde ediyoruz ki, bu da verilerimizin doğru etrafında çok fazla saçılmış olduğunu göstermektedir.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s