Caner Erden

Caner Erden

PhD in Industrial Engineering

Python ile Basit Regresyon Uygulaması

Daha önceki derslerimizde sınıflandırma yöntemlerinden karar ağaçlarını ve destek vektör makinelerini görmüştük. Bu algoritmaların nasıl çalıştığına bakmıştık. Her iki algoritmada da verilerimiz hedef değerleri ile birlikte verilmişti. Biz var olan bilgilerden yola çıkarak bir makine öğrenmesi gerçekleştirdik ardından yine veriseti içerisindeki bir takım veriyi test seti olarak kaydederek oluşturduğumuz modeli test veri seti üzerinde deneyerek ne kadar iyi sonuçlar bulduğumuzu göstermeye çalıştık. Bugün de kimi yerlerde sınıflandırmanın altında kimi yerlerde sınıflandırmadan farklı bir yöntem olarak ele alınan regresyon modellerine bakacağız. Genel regresyon denkleminde hedef değişkenleri sürekli değerler alır ve birer sınıf ifade etmezler. Ancak sürekli değişkenlerin kesikli hale getirilmesi ile regresyon modelleri sınıflandırma için kullanılabilir. Biz öncelikle genel regresyon denkleminden bahsedelim.

? = ?0+ ?1 ?1+ ?2 ?2+ … + ?? ??

Bu denklemde ? değişkeni hedef değişkeni ? değişkenleri ise özellik değişkenlerini göstermektedir. ? katsayıları katsayıları sklearn içerisinde coef_, ?0 ise intercept_ olarak kaydedilir. Lineer regresyon analizinde 2 boyutlu düzlemde çalışıyorsak yani bir çıktı bir de özellik değişkenimiz varsa 2 değişkeni temsil eden en iyi çizgiyi çizmeye çalışırız.

Lineer Regresyon: Bağımlı bir değişken(?) ile bağımsız bir değişken (?) serisinin arasındaki ilişkinin fonksiyonel biçimi.

Lineer regresyon analizi: «veriyi lineer bir çizgiye uydurma çalışması» veya «lineer modelleme»

?: Çıktı, bağımlı, sonuç, etkilenen değişken
?: Girdi, bağımsız, neden(faktör), etkileyen değişken

Regresyon sorusu: Y’nin X’e bağlı koşullarını nasıl tahmin edebiliriz sorusudur.

from sklearn.linear_model import LinearRegression satırıyla lineer regresyon fonksiyonu çağrılır.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error

Basit Lineer Regresyon Analizi

Önce basit bir lineer regresyon modelini ele alalım. Basit lineer regresyon analizinde bir adet bağımsız değişken(x) bir adet de bağımlı değişken vardır. Örnekte kullanılacak olan veri setini şu adresten indirebilirsiniz. Verisetini pandas çerçevesine alıp regresyon modelini kuralım.

veriseti = pd.read_csv('data/linear_model.csv')
veriseti.head()
xy
082.583220134.907414
173.922466134.085180
234.887445NaN
361.839983114.530638
416.77594031.376437

Görüldüğü gibi veri setinde bazı değerler eksik girilmiş. Şimdi bu değerlerin sayısına bakalım.

veriseti.isnull().sum()
x    0
y    8
dtype: int64

y değişkeninde 8 adet boş değer var. X değişkeninde ise boş değer yok. Y değişkenindeki boş değerleri ortalama ile dolduralım.

veriseti.y.fillna(value=veriseti.y.mean(), inplace=True)

Şimdi veri seti hakkında tanımlayıcı istatistik bilgilerine bakalım.

veriseti.describe()
xy
count100.000000100.000000
mean52.09933087.915132
std29.41676345.150390
min0.016737-6.236295
25%29.01208752.047526
50%55.25585687.915132
75%77.442040126.556343
max99.432294166.164544

Göze çarpan bir anormallik ya da aykırı değer olmadığı görülüyor. Şimdi verileri normalize edelim. Örneğin MinMaxScaler kullanarak normalizasyon gerçekleştirelim.

veriseti.x = (veriseti.x - veriseti.x.min() )/ (veriseti.x.max() - veriseti.x.min())
veriseti.y = (veriseti.y - veriseti.y.min() )/ (veriseti.y.max() - veriseti.y.min())

Veri setini x ve Y değişkenlerine ayıralım.

X = veriseti.x
y = veriseti.y

X ve y arasındaki ilişkiye bakalım.

plt.scatter(X.values,y.values)
plt.xlabel('x')
plt.ylabel('Y')
plt.title('X y arasındaki ilişki')

Grafikte x ile y arasında pozitif yönlü doğrusal bir ilişkinin olduğu görülüyor. Şimdi en uygun çizgiyi çizdirmeye çalışalım.

lineer_regresyon = LinearRegression()
lineer_regresyon.fit(X.values.reshape(-1,1),y.values.reshape(-1,1))

Modelimiz kuruldu ve verilerimize uyduruldu. Şimdi lineer modelimizi görüntüleyelim.

print(lineer_regresyon.intercept_)
print(lineer_regresyon.coef_)
array([0.10692427])
array([[0.83833805]])
print("Elde edilen regresyon modeli: Y={}+{}X".format(lineer_regresyon.intercept_,lineer_regresyon.coef_[0]))
Elde edilen regresyon modeli: Y=[0.10692427]+[0.83833805]X

Şimdi regresyonun performansına bakalım.

y_predicted = lineer_regresyon.predict(X.values.reshape(-1,1))
r2_score(y,y_predicted)
0.8971708595884971
Modelimiz %89 oranında verilere uyum sağladı.
print("Ortalama Mutlak Hata: {} \nOrtalama Karesel Hata: {}".format(
    mean_absolute_error(y, y_predicted), mean_squared_error(y, y_predicted)))
Ortalama Mutlak Hata: 0.05159991870239849 
Ortalama Karesel Hata: 0.006982254161764924

RMSE yani Root Mean Squared Error için sklearn içerisinde bir fonksiyon yok ancak bu fonksiyonu şu adreste önerildiği gibi basitçe yazabiliriz.

def rmse(targets, predictions):
    return np.sqrt(((predictions - targets) ** 2).mean())
print("RMSE değeri: {}".format(rmse(y.ravel(),y_predicted.ravel())))
RMSE değeri: 0.08355988368688005
mean_squared_error(y, y_predicted, squared=False)
0.08355988368688005
Varmış:)

Regresyon grafiğini çizmek istersek

random_x = np.array([0, 0.5, 0.99])
plt.scatter(X.values, y.values)
plt.plot(random_x,
         lineer_regresyon.intercept_[0] +
         lineer_regresyon.coef_[0][0] * random_x,
         color='red',
         label='regresyon grafiği')
plt.xlabel('x')
plt.ylabel('Y')
plt.title('X y regresyon analiz')

Ders Videosu

Kodlar

DROP A COMMENT

E-posta hesabınız yayımlanmayacak.