Makine Öğrenmesi - Regresyon Algoritmaları -(1)Linear Regression ?

Rafet KANDAR
6 min readFeb 14, 2021

--

Makine öğrenmesi regresyon algoritmaları serimize Linear Regression(basit lineer regresyon) ile başlıyoruz.

Bu başlık altında Linear Regression Nedir ? Basit bir şekilde bunun mantığını anlamaya çalışacağız. Daha sonra normal hayat ve Python üzerinde Linear Regression örnekleri yaparak yazımızı bitireceğiz.

Tecrübe Yılına Göre Maaş Veri Seti

Kullanılacak Veri Seti ?

→ Bu yazım içerisinde yan tarafta görmüş olduğunuz veri setinden yararlanarak konu anlatımı gerçekleştireceğim. Tamamen örnek olması amaçlı rastgele değerlerden oluşturulmuştur.

Linear Regression Nedir ?

Linear regresyon, gözlemlenen verilere doğrusal bir denklem uydurarak iki değişken arasındaki ilişkiyi modellemeye çalışır. Bir başka deyişle en uygun çizgiyi kullanarak, giriş değeri olan x ve sonuç değeri olan y arasında uygun bir ilişki kurarak tahmin yapmamızı sağlar.

En Uygun Çizgi Nedir ? Nasıl buluruz ?

Yan tarafta bulunan maaş ve deneyime ait grafik üzerinden ilerleyelim. Bu grafiğe bakarak, sizlerden 7,5 yıllık deneyime sahip bir çalışanın maaşını tahmin etmenizi istesem bana cevabınız ne olurdu ? Muhtemelen 6300 civarı tahminlerde bulunurdunuz. Evet, biz bu tahminde bulunurken aslında ne yaptık, grafiği inceledik ve nasıl bir ilişki olduğunu gördük ve kafamızdan oraya bir çizgi(line) çizdik ve buna göre bir tahminde bulunduk.

Makine öğrenmesinde de tam olarak böyle yaparız aslında, elimizde ki bu verileri bir modele çevirebilmemiz için bir çizgi(line fit ederiz) çizeriz ve bu çizgiyi kullanarak oluşturduğumuz model üzerinden tahminlerde bulunuruz.

Evet buraya kadar bahsettiğimiz kısmı resim üzerinde inceleyelim. Mantıken nasıl bir çizgi çizebiliriz ?

Mantıken, tüm noktalara en yakın olacak şekilde bir çizgi(line) çizeriz(yeşil çizgi) ve bu çizgi üzerinden tahminlerde bulunuruz.

Buraya kadar olan kısım işin mantık kısmıydı, çizgimizi çizdiğimize göre artık işin matematik kısmına geçebiliriz.

Çizdiğimiz Bu Çizgi(line) Matematiksel Olarak Neyi İfade Ediyor ?

Evet, o zaman formülümüzü incelemeye başlayalım. Buradaki y değişkeni bizim yukarıdaki grafikteki y eksenimizi temsil ediyor, x ise grafik üzerindeki x eksenini temsil ediyor.

b0 → Constant(sabit değer), grafik üzerinde x’in y eksenini kestiği noktadır.

b1 → Coefficient, çizgimizin(line) eğimidir.

Değişkenlerin bizler için ne ifade ettiğini öğrendikten sonra bu formülümüzü bizim grafiğimize göre yeniden düzenleyelim isterseniz.

Maaş = b0 + b1*Deneyim → Evet grafiğimize göre formülümüzü düzenledik.

ÖRNEK → Gelin buradaki b0 ve b1 değerlerini de bularak ufak bir tahminde bulunmayı deneyelim.

Evet, yan tarafta ne yaptık ?

4 yıllık deneyime sahip çalışanın maaşının 4000 bin olduğunu biliyoruz. burada ki b0 değerini yaklaşık olarak 1200 olarak alıyoruz.(tamamen göz kararı mantığı anlamak için). Evet artık bunları kullanarak b1 değerini de buluyoruz.

Bulduğumuz bu değerleri kullanarak 15 yıllık deneyime sahip bir çalışanın ne kadar maaş alacağını tahmin edebiliriz.

Makine öğrenmesi de tam olarak arka tarafta bizim için bunları gerçekleştirerek tahmin de bulunuyor.

Tahmin Hatalarını Nasıl Azaltabiliriz ?

Çizgiyi(line) çizerken amaç tüm noktalara en yakın şekilde geçmesidir. Grafiği incelediğimizde görüyoruz ki çizgimiz bazı notların tam üzerinden geçerken bazılarına uzak kalmış. Peki, bu uzak kaldığı noktaları nasıl tahmin edecek ?

Burada devreye MSE(mean squared error) giriyor. MSE nedir? Oluşturmuş olduğumuz modelin tahminleme performansını ölçer. Peki, bunu nasıl yapar ?

MSE Formülü

Hadi gelin bu karışık gözüken formülü beraber basit bir şekilde inceleyelim.

Bu noktaları tahmin edebilmek için ilk olarak residual’ ı hesaplıyoruz. Residual Nedir ? İlk olarak buna bakalım. Residual gerçek y değeri ve tahmin edilen değer arasındaki farktır. Yani tahmin yaparken yapılan hata olarak da açıklanabilir. Bunu formüle dökecek olursak.

Residual → y-y_head(tahmin edilen değer)

Evet, residual değerimizi bulduk fakat grafik üzerinden incelerseniz bazı değerlerin eksi ve bazılarının artı çıktığını görüyoruz. Bizim formüle göre tüm hatalarımızı bulmak için hepsini toplamamız gerekecek fakat bu şekilde bir toplama gerçekleştirirsek eksiler artıları götürecek ve hiç hatamız yok gibi gözükecek. Biz bunu asla istemeyiz çünkü biz bu şekilde tahminde bulunmaya çalışırsak yanlış bir tahminde bulunmuş olacağız.

Bu yüzden eksi ve artıların bir birlerini götürmelerini engellemek için residual ‘ lerin karelerini aldıktan sonra toplama işlemini gerçekleştiriyoruz.

sum(residual^) → formülümüzün yeni hali

Son olarak oluşturduğumuz formülü n’e bölüyoruz. Buradaki n bizim örneklem sayımız yani grafik üzerindeki notların toplamıdır.

sum(residual^) / n→ formülümüzün son hali

Evet, bizim son olarak bulduğumuz bu formül yukarıda verdiğimiz karışık olarak gözüken MSE formülüdür.

Amacımız modeli oluştururken MSE ‘ yi en düşük seviyede tutabilmektir. Çünkü MSE ne kadar düşük olursa modelimizdeki hata oranı o kadar az olacaktır ve doğru bir tahmin gerçekleştirecektir.

Peki Bu Öğrendiklerimizi Python ’da Nasıl Uygulayacağız ?

# Kütüphanelerin eklenmesi
import numpy as np # matematiksel işlemler için
import matplotlib.pyplot as plt # görselleştirme için
import pandas as pd

İlk adım olarak projemiz içerisinde kullanacağımız kütüphanelerimizi import ederek başlıyoruz.

# Veri setinin okunarak bağımlı ve bağımsız değişkenlere ayrılması
data = pd.read_csv('MaasDeneyim.csv', encoding = 'iso-8859-9')
X = data.tecrubeYili.values.reshape(-1,1) # deneyim
y = data.maas.values.reshape(-1,1) # maaş

Kütüphanelerimizi import ettikten sonra verilerimiz olduğu dosyanın okunması işlemini gerçekleştiriyoruz. Daha sonra x ve y değişkenlerimizi ayırıyoruz. Buradaki X olarak oluşturduğumuz aslında verimizdeki deneyim y olarak oluşturduğumuzda maaş verimiz.

# Veri setinin eğitim ve test olarak bölünmesi
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state = 25)

Artık verimiz hazır. Bir sonraki adım olarak verimizi train(eğitim) ve test olmak üzere iki parçaya ayırıyoruz. Sklearn kütüphanesinin train_test_split metodunu kullanarak bu işlemi gerçekleştiriyoruz. Burada kullandığımız;

test_size → verimizin yüzde kaçlık kısmının test olacağını söylüyoruz. Bizim veri setimiz çok küçük olduğu için 0.1 olarak seçtik.

random_state → Eğer biz bu değeri belirtmezsek Python bu ayırma(train ve test olarak) işlemini yaparken her seferinde farklı yerlerinden ayırır, yani x ve y değerlerimiz sürekli değişir. Biz böyle bir değişim olmasını istemediğimizden random_state değerini veriyoruz. Bu değerlere oynayarak tahmin sonucunun değişip değişmediğini gözlemleyebilirsiniz.

# Eğitim verileri ile modelin eğitilmesi
from sklearn.linear_model import LinearRegression
linear_reg = LinearRegression()
linear_reg.fit(X_train, y_train)

Evet, datamızı train ve test olarak ayırdığımıza göre artık modelimizin eğitilme aşamasına geçebiliriz.

Burada yine sklearn kütüphanesi kullanarak Linear Regression ‘u projemize dahil ediyoruz(yani biz bu regresyonu kullanmak istiyoruz diyoruz). Daha sonra linear_reg.fit metodunun içerisine eğitim verilerimizi vererek modelimizin eğitilmesini sağlıyoruz.

# Test verileri kullanılarak tahmin yapılması
y_pred = linear_reg.predict(X_test)

Evet artık modelimiz tahmin yapmak için hazır. Burada başta test için ayırdığımız test verisini linear_reg.predict metodunun içeresine göndererek bir tahminde bulunmasını istiyoruz.

from sklearn.metrics import r2_score
Rkare= r2_score(y_test, y_pred)
print("Score : ",Rkare)
--> Score : 0.9509398593894743

Bir tahminde bulunduk ama ne kadar doğru ? Burada sklearn kütüphanesinin r2_score metodunu içerisine y_test ve y_pred değerlerini göndererek ne kadar başarılı olduğumuza bakıyoruz. Bizim başarı puanımız 0.95, bu değer 1'e ne kadar yakın olursa modelimiz o kadar başarılı olmuş demektir.

→ Evet, yazımın sonuna geldik çok basit bir şekilde linear regresyon algoritmasından bahsetmek istedim, umarım sizleri sıkmamışımdır ve bu konuda bilgi sahibi olmak isteyenlere ufakta olsa faydam dokunmuştur.

Teşekkür ederim.

--

--