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()
x | y | |
---|---|---|
0 | 82.583220 | 134.907414 |
1 | 73.922466 | 134.085180 |
2 | 34.887445 | NaN |
3 | 61.839983 | 114.530638 |
4 | 16.775940 | 31.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()
x | y | |
---|---|---|
count | 100.000000 | 100.000000 |
mean | 52.099330 | 87.915132 |
std | 29.416763 | 45.150390 |
min | 0.016737 | -6.236295 |
25% | 29.012087 | 52.047526 |
50% | 55.255856 | 87.915132 |
75% | 77.442040 | 126.556343 |
max | 99.432294 | 166.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
Regresyon Modelleri¶
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.
$Y\ =\ \beta_0+\ \beta_1\ x_1+\ \beta_2\ x_2+\ \ldots\ +\ \beta_n\ x_n$
Bu denklemde $Y$ değişkeni hedef değişkeni $X$ değişkenleri ise özellik değişkenlerini göstermektedir. $\beta$ katsayıları katsayıları sklearn içerisinde coef_
, $\beta_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($Y$) ile bağımsız bir değişken ($X$) serisinin arasındaki ilişkinin fonksiyonel biçimi.
Lineer regresyon analizi: «veriyi lineer bir çizgiye uydurma çalışması» veya «lineer modelleme»
$Y$: Çıktı, bağımlı, sonuç, etkilenen değişken
$X$: 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()
Görüldüğü gibi veri setinde bazı değerler eksik girilmiş. Şimdi bu değerlerin sayısına bakalım.
veriseti.isnull().sum()
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()
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.
lineer_regresyon.intercept_
lineer_regresyon.coef_
print("Elde edilen regresyon modeli: Y={}+{}X".format(lineer_regresyon.intercept_,lineer_regresyon.coef_[0]))
Şimdi regresyonun performansına bakalım.
y_predicted = lineer_regresyon.predict(X.values.reshape(-1,1))
r2_score(y,y_predicted)
Modelimiz %89 oranında verilere uyum sağladı.
Diğer kullanabileceğimiz ölçüler:
- Mean Absolute Error(MAE): Ortalama Mutlak Hata $MAE = 1/n\times\sum{|y-y_{tahmin}|}$
- Mean squared error(MSE) Ortalama Karesel Hata $MSE = 1/n\times\sum{(y-y_{tahmin})^2}$
- Root Mean Squared Error (RMSE): Ortalama Karesel Hataların Karekökü $RMSE = \sqrt{1/n\times\sum{(y-y_{tahmin})^2}}$
print("Ortalama Mutlak Hata: {} \nOrtalama Karesel Hata: {}".format(
mean_absolute_error(y, y_predicted), mean_squared_error(y, y_predicted)))
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())))
mean_squared_error(y, y_predicted, squared=False)
Varmış aşağıdaki gibi yapılabilir.
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')
Çoklu Regresyon Analizi¶
Eğer bağımsız değişkenler birden fazla olursa bu kez çoklu regresyon modeli kurmamız gerekir. Basit lineer regresyonda olduğu gibi katsayılar ve kesme terimi bulunduktan sonra regresyon modeli kurulabilir. Çoklu regresyonda modele alınacak değişkenlerin seçilmesi en önemli aşamayı oluşturur.
Bu çalışmada Boston veri setini kullanarak bir çoklu regresyon analizi yapalım. Boston veri seti ile ilgili bilgiler şu adresten alınabilir.
from sklearn.datasets import load_boston
boston = load_boston()
boston_X, boston_y = load_boston(return_X_y=True)
# Sütun isimleri
boston.feature_names
# X değerlerini pandas çerçevesine dönüştürelim
boston_X = pd.DataFrame(boston_X,columns=boston.feature_names)
# örnek veri seti
boston_X.head()
# veri setini inceleyelim
boston_X.info()
# Tanımlayıcı istatistikleri
boston_X.describe()
# boş değer var mı
boston_X.isnull().sum()
# korelasyonlara bakalım.
boston_X.corr()
# En yüksek mutlak 5 korelasyonu sıralayalım
for col in boston.feature_names:
en_yuksek_degerler = abs(boston_X.corr()[col]).nlargest(n=5) # en yüksek korelasyona sahip 5 değeri alalım
print(en_yuksek_degerler)
# eğer 0.75'ten büyük değer varsa yazdır.
for index, value in en_yuksek_degerler.items():
if 1> value >=0.75:
print(index, col, "değişkenleri yüksek korelasyona sahip: ", value)
şimdi yüksek korelasyona sahip özellikleri analizden çıkartalım. Neden mi çıkartıyoruz? Şuradan.
- NOX INDUS
- DIS NOX
- RAD TAX
NOX ve RAD değişkenlerini analizden çıkaralım
boston_X = boston_X.drop(['NOX','RAD'], axis=1)
Şimdi çoklu regresyon analizini gerçekleştirelim.
X_train, X_test, y_train, y_test = train_test_split(boston_X, boston_y, test_size=0.33, random_state=42)
coklu_regresyon = LinearRegression()
coklu_regresyon.fit(X_train, y_train)
#katsayılar
print(coklu_regresyon.coef_.round(2))
print(coklu_regresyon.intercept_.round(2))
boston_y_predicted = coklu_regresyon.predict(X_test)
mean_squared_error(y_test,boston_y_predicted,squared=False)
r2_score(y_test,boston_y_predicted)
%matplotlib notebook
plt.plot(y_test,label='gerçek')
plt.plot(boston_y_predicted,label='tahmin')
plt.legend()