Lineer regresyon, makine öğrenmesinin en eski yöntemlerinden olup, bir bağımlı değişken ile bir veya birden çok bağımsız değişken arasında ki ilişkiyi formülize etmek için kullanılan bir yöntemdir. Burada ki amacımız, minimum hataya sahip, bağımsız değişkenlerin bağımlı değişkenler üzerinde ki etkisini bulmaktır. Gerçek verilerden oluşan eğitim verisi kullanılarak, her bir değişkenin sonuç üzerindeki ağırlığı belirlenir ve daha sonra yeni gelen verilerle bir sonraki durum tahmin edilebilir. Örneğin, marketler zincirinizin olduğunu ve birçok şehirde şubelerinizin olduğunu düşünün. Yeni bir şube açacaksınız ama hangi şehirde? Karınızın o şehrin nüfusu ile bağlantılı olduğunu varsayarsak, elinizdeki eğitim verisini (şubelerinizin olduğu şehirlerin nüfusu ve kar oranlarının olduğu bir liste) regresyon metodundan geçirerek nüfusun kar üzerindeki ağırlığını bulabilirsiniz. Daha sonra şube açmak istediğiniz şehrin nüfusuna bağlı olarak o şehirde kar mı, yoksa zarar mı edeceğinizi kestirebilirsiniz.
Şimdi bu eğitim verisini Python da nasıl göstereceğimize bakalım. Bunun için Python da numpy ve matplotlib kütüphanesini kullanacağız. Eğer gerekli kütüphaneleri indirmediyseniz aşağı linklerden indirip kurabilirsiniz. Kurulum ile ilgili kütüphanelerin kendi dökümantasyonu içerisinde anlatımları mevcuttur.
Yukarıdaki kütüphaneleri kurduysanız Python ile veri kümesini aşağıdaki gibi görselleştirebilirsiniz:
1: import numpy as np
2: import matplotlib.pyplot as plt
3: import random
4: def f(x): return 2*x + 4
5: trainX=[]
6: trainY=[]
7: for i in range(0, 50):
8: y = f(i)
9: x = random.choice([i+2, i+1, i, i-0, i-2])
10: trainX.append(x)
11: trainY.append(y)
12: print str(x) + " " + str(y)
13: fig, ax = plt.subplots()
14: ax.plot(trainX, trainY, "r*")
15: plt.show()
Lineer regresyona iki çeşit yaklaşım vardır: Tek Değişkenli Lineer Regresyon ve Çok Değişkenli Lineer Regresyon. Biz burada tek değişkenli lineer regresyondan bahsedeceğiz. Tek değişkenli lineer regresyon aşağıdaki gibi ifade edebiliriz:
Çok değişkenli lineer bir denklemi aşağıdaki gibi ifade edebiliriz:
Burada:
: Bağımlı değişken
: Bağımsız değişken
: Sabit
: Bağımsız değişken
: Sabit
: ’nin üzerindeki ağırlığı
: Değişken sayısı
Olmak şartı ile yukarıdaki denklemi kısaca:
Olmak şartı ile yukarıdaki denklemi kısaca:
Lineer regresyonda ki amacımız, değerlerini hesaplamak. Değerleri öyle bir seçilmeli ki fonksiyonun da hesaplanan tahmin ile gerçek değer olan arasında ki fark(hata) minimum olmalı. Daha teknik bir deyim ile ve rasındaki farkı gösterecek maliyet fonksiyonunu(cost function) minimum olmalıdır. Maliyet fonksiyonu, şu şekilde ifade edilebilir:
Burada:
: ’inci satırdaki özellik listesi. Yani,
: ’inci satırdaki gerçek değer.
: ’inci satırdaki tahmin edilen değer.
Yukarıdaki maliyet fonksiyonunu kodlayacak olursak şu şekilde olacaktır:
Gradient descent metodunu maliyet fonksiyonuna uyarladığımızda aşağıdaki fonksiyonu elde ederiz:
Gradient Descent algoritmasını python ile kodladığımızda aşağıdaki sonucu elde edeceğiz:
Çok küçük belirlendiğinde Gradient Descent algoritması yavaş çalışacaktır.
: ’inci satırdaki özellik listesi. Yani,
: ’inci satırdaki gerçek değer.
: ’inci satırdaki tahmin edilen değer.
Yukarıdaki maliyet fonksiyonunu kodlayacak olursak şu şekilde olacaktır:
1: def compute_cost(X, y, theta):
2: m = y.size
3: hx = (X.dot(theta).flatten() - y)**2
4: J = ( 1.0 / (2*m)) * hx.sum()
5: return J
Maliyet fonksiyonu ile seçtiğimiz değerinin sonuç üzerindeki hatasını bulduk. Ancak amacımız minimum hataya sahip değerlerini belirlemek. Bunun için Gradient Descent metodunu kullanarak fonksiyondaki minimum değeri bulabiliriz. GradientDescent, belirlenen oransal adım büyüklüğü (biz buna öğrenme oranı diyeceğiz.) ile yerel minimum ya da maksimum noktayı hızlı bir şekilde elde etmeye yarayan bir yöntemdir. Genel olarak gradient descent fonksiyonu aşağıdaki gibidir:1: def gradient_descent(X, y, alpha, theta, iter):
2: m = y.size
3: J_history = np.zeros(shape= (iter, 1))
4: for i in range(iter):
5: hx0 = (X.dot(theta).flatten() - y)
6: hx1 = (X.dot(theta).flatten() - y) * X[:, 1]
7: theta[0,0] = theta[0,0] - alpha * (1.0 / m) * hx0.sum()
8: theta[1,0] = theta[1,0] - alpha * (1.0 / m) * hx1.sum()
9: J_history[i, 0] = compute_cost(X, y, theta)
10: return theta, J_history
Çok küçük belirlendiğinde Gradient Descent algoritması yavaş çalışacaktır.
Eğer ki değerini çok büyük belirlersek, algoritma hedeflenen minimum değeri atlayabilir. Bu sebepten minimum noktaya yakınsamak yerine uzaklaşabilir.
Eğitim verisinin okunması ve başlangıç parametreleri verilerek Regresyonun çalışması aşağıda verilmiştir:
1: data_set = np.loadtxt('x01.txt')
2: X = data_set[:, 0]
3: y = data_set[:, 1]
4: m = y.size
5: XX = np.ones(shape=(m,2))
6: XX[:, 1] = X
7: alpha = 0.01
8: theta = np.zeros(shape = (2,1))
9: iter = 2000
10: theta, J = gradient_descent(XX, y, alpha, theta, iter)
11: result = XX.dot(theta).flatten()
12: py.scatter(X, y, marker= 'x', c='r')
13: py.plot(X, result)
14: py.show()
Kodu çalıştırdığımızda minimum hataya sahip denklemimiz aşağıda ki gibi olacak:
Hiç yorum yok:
Yorum Gönder