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

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.

In [36]:
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.

In [2]:
veriseti = pd.read_csv('data/linear_model.csv')
In [3]:
veriseti.head()
Out[3]:
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.

In [7]:
veriseti.isnull().sum()
Out[7]:
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.

In [11]:
veriseti.y.fillna(value=veriseti.y.mean(), inplace=True)

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

In [12]:
veriseti.describe()
Out[12]:
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.

In [14]:
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.

In [15]:
X = veriseti.x
y = veriseti.y

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

In [16]:
plt.scatter(X.values,y.values)
plt.xlabel('x')
plt.ylabel('Y')
plt.title('X y arasındaki ilişki')
Out[16]:
Text(0.5, 1.0, '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.

In [17]:
lineer_regresyon = LinearRegression()
In [19]:
lineer_regresyon.fit(X.values.reshape(-1,1),y.values.reshape(-1,1))
Out[19]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

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

In [20]:
lineer_regresyon.intercept_
Out[20]:
array([0.10692427])
In [22]:
lineer_regresyon.coef_
Out[22]:
array([[0.83833805]])
In [25]:
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.

In [27]:
y_predicted = lineer_regresyon.predict(X.values.reshape(-1,1))
In [28]:
r2_score(y,y_predicted)
Out[28]:
0.8971708595884971

Modelimiz %89 oranında verilere uyum sağladı.

Diğer kullanabileceğimiz ölçüler:

  1. Mean Absolute Error(MAE): Ortalama Mutlak Hata $MAE = 1/n\times\sum{|y-y_{tahmin}|}$
  2. Mean squared error(MSE) Ortalama Karesel Hata $MSE = 1/n\times\sum{(y-y_{tahmin})^2}$
  3. Root Mean Squared Error (RMSE): Ortalama Karesel Hataların Karekökü $RMSE = \sqrt{1/n\times\sum{(y-y_{tahmin})^2}}$
In [38]:
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.

In [39]:
def rmse(targets, predictions):
    return np.sqrt(((predictions - targets) ** 2).mean())
In [46]:
print("RMSE değeri: {}".format(rmse(y.ravel(),y_predicted.ravel())))
RMSE değeri: 0.08355988368688005
In [47]:
mean_squared_error(y, y_predicted, squared=False)
Out[47]:
0.08355988368688005

Varmış aşağıdaki gibi yapılabilir.

Regresyon grafiğini çizmek istersek

In [34]:
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')
Out[34]:
Text(0.5, 1.0, 'X y arasındaki ilişki')

Ç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.

In [56]:
from sklearn.datasets import load_boston
boston = load_boston()
boston_X, boston_y = load_boston(return_X_y=True)
In [62]:
# Sütun isimleri
boston.feature_names
Out[62]:
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
In [63]:
# X değerlerini pandas çerçevesine dönüştürelim
boston_X = pd.DataFrame(boston_X,columns=boston.feature_names)
In [64]:
# örnek veri seti
boston_X.head()
Out[64]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33
In [65]:
# veri setini inceleyelim
boston_X.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 13 columns):
CRIM       506 non-null float64
ZN         506 non-null float64
INDUS      506 non-null float64
CHAS       506 non-null float64
NOX        506 non-null float64
RM         506 non-null float64
AGE        506 non-null float64
DIS        506 non-null float64
RAD        506 non-null float64
TAX        506 non-null float64
PTRATIO    506 non-null float64
B          506 non-null float64
LSTAT      506 non-null float64
dtypes: float64(13)
memory usage: 51.5 KB
In [66]:
# Tanımlayıcı istatistikleri
boston_X.describe()
Out[66]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000
mean 3.613524 11.363636 11.136779 0.069170 0.554695 6.284634 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 12.653063
std 8.601545 23.322453 6.860353 0.253994 0.115878 0.702617 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 7.141062
min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 1.730000
25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 6.950000
50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 11.360000
75% 3.677083 12.500000 18.100000 0.000000 0.624000 6.623500 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 16.955000
max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 37.970000
In [67]:
# boş değer var mı
boston_X.isnull().sum()
Out[67]:
CRIM       0
ZN         0
INDUS      0
CHAS       0
NOX        0
RM         0
AGE        0
DIS        0
RAD        0
TAX        0
PTRATIO    0
B          0
LSTAT      0
dtype: int64
In [68]:
# korelasyonlara bakalım.
boston_X.corr()
Out[68]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
CRIM 1.000000 -0.200469 0.406583 -0.055892 0.420972 -0.219247 0.352734 -0.379670 0.625505 0.582764 0.289946 -0.385064 0.455621
ZN -0.200469 1.000000 -0.533828 -0.042697 -0.516604 0.311991 -0.569537 0.664408 -0.311948 -0.314563 -0.391679 0.175520 -0.412995
INDUS 0.406583 -0.533828 1.000000 0.062938 0.763651 -0.391676 0.644779 -0.708027 0.595129 0.720760 0.383248 -0.356977 0.603800
CHAS -0.055892 -0.042697 0.062938 1.000000 0.091203 0.091251 0.086518 -0.099176 -0.007368 -0.035587 -0.121515 0.048788 -0.053929
NOX 0.420972 -0.516604 0.763651 0.091203 1.000000 -0.302188 0.731470 -0.769230 0.611441 0.668023 0.188933 -0.380051 0.590879
RM -0.219247 0.311991 -0.391676 0.091251 -0.302188 1.000000 -0.240265 0.205246 -0.209847 -0.292048 -0.355501 0.128069 -0.613808
AGE 0.352734 -0.569537 0.644779 0.086518 0.731470 -0.240265 1.000000 -0.747881 0.456022 0.506456 0.261515 -0.273534 0.602339
DIS -0.379670 0.664408 -0.708027 -0.099176 -0.769230 0.205246 -0.747881 1.000000 -0.494588 -0.534432 -0.232471 0.291512 -0.496996
RAD 0.625505 -0.311948 0.595129 -0.007368 0.611441 -0.209847 0.456022 -0.494588 1.000000 0.910228 0.464741 -0.444413 0.488676
TAX 0.582764 -0.314563 0.720760 -0.035587 0.668023 -0.292048 0.506456 -0.534432 0.910228 1.000000 0.460853 -0.441808 0.543993
PTRATIO 0.289946 -0.391679 0.383248 -0.121515 0.188933 -0.355501 0.261515 -0.232471 0.464741 0.460853 1.000000 -0.177383 0.374044
B -0.385064 0.175520 -0.356977 0.048788 -0.380051 0.128069 -0.273534 0.291512 -0.444413 -0.441808 -0.177383 1.000000 -0.366087
LSTAT 0.455621 -0.412995 0.603800 -0.053929 0.590879 -0.613808 0.602339 -0.496996 0.488676 0.543993 0.374044 -0.366087 1.000000
In [94]:
# 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)
CRIM     1.000000
RAD      0.625505
TAX      0.582764
LSTAT    0.455621
NOX      0.420972
Name: CRIM, dtype: float64
ZN       1.000000
DIS      0.664408
AGE      0.569537
INDUS    0.533828
NOX      0.516604
Name: ZN, dtype: float64
INDUS    1.000000
NOX      0.763651
TAX      0.720760
DIS      0.708027
AGE      0.644779
Name: INDUS, dtype: float64
NOX INDUS değişkenleri yüksek korelasyona sahip:  0.7636514469209145
CHAS       1.000000
PTRATIO    0.121515
DIS        0.099176
RM         0.091251
NOX        0.091203
Name: CHAS, dtype: float64
NOX      1.000000
DIS      0.769230
INDUS    0.763651
AGE      0.731470
TAX      0.668023
Name: NOX, dtype: float64
DIS NOX değişkenleri yüksek korelasyona sahip:  0.7692301132258261
INDUS NOX değişkenleri yüksek korelasyona sahip:  0.7636514469209145
RM         1.000000
LSTAT      0.613808
INDUS      0.391676
PTRATIO    0.355501
ZN         0.311991
Name: RM, dtype: float64
AGE      1.000000
DIS      0.747881
NOX      0.731470
INDUS    0.644779
LSTAT    0.602339
Name: AGE, dtype: float64
DIS      1.000000
NOX      0.769230
AGE      0.747881
INDUS    0.708027
ZN       0.664408
Name: DIS, dtype: float64
NOX DIS değişkenleri yüksek korelasyona sahip:  0.7692301132258261
RAD      1.000000
TAX      0.910228
CRIM     0.625505
NOX      0.611441
INDUS    0.595129
Name: RAD, dtype: float64
TAX RAD değişkenleri yüksek korelasyona sahip:  0.9102281885331822
TAX      1.000000
RAD      0.910228
INDUS    0.720760
NOX      0.668023
CRIM     0.582764
Name: TAX, dtype: float64
RAD TAX değişkenleri yüksek korelasyona sahip:  0.9102281885331822
PTRATIO    1.000000
RAD        0.464741
TAX        0.460853
ZN         0.391679
INDUS      0.383248
Name: PTRATIO, dtype: float64
B       1.000000
RAD     0.444413
TAX     0.441808
CRIM    0.385064
NOX     0.380051
Name: B, dtype: float64
LSTAT    1.000000
RM       0.613808
INDUS    0.603800
AGE      0.602339
NOX      0.590879
Name: LSTAT, dtype: float64

ş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

In [95]:
boston_X = boston_X.drop(['NOX','RAD'], axis=1)

Şimdi çoklu regresyon analizini gerçekleştirelim.

In [96]:
X_train, X_test, y_train, y_test = train_test_split(boston_X, boston_y, test_size=0.33, random_state=42)
In [97]:
coklu_regresyon = LinearRegression()
In [98]:
coklu_regresyon.fit(X_train, y_train)
Out[98]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
In [106]:
#katsayılar
print(coklu_regresyon.coef_.round(2))
print(coklu_regresyon.intercept_.round(2))
[-0.08  0.03 -0.05  3.45  4.16 -0.03 -1.18 -0.   -0.69  0.01 -0.57]
19.11
In [113]:
boston_y_predicted = coklu_regresyon.predict(X_test)
In [115]:
mean_squared_error(y_test,boston_y_predicted,squared=False)
Out[115]:
4.827980073358347
In [116]:
r2_score(y_test,boston_y_predicted)
Out[116]:
0.6919945689994251
In [119]:
%matplotlib notebook
plt.plot(y_test,label='gerçek')
plt.plot(boston_y_predicted,label='tahmin')
plt.legend()
"); if (!fig.cell_info) { console.error("Failed to find cell for figure", id, fig); return; } var output_index = fig.cell_info[2] var cell = fig.cell_info[0]; }; mpl.figure.prototype.handle_close = function(fig, msg) { var width = fig.canvas.width/mpl.ratio fig.root.unbind('remove') // Update the output cell to use the data from the current canvas. fig.push_to_output(); var dataURL = fig.canvas.toDataURL(); // Re-enable the keyboard manager in IPython - without this line, in FF, // the notebook keyboard shortcuts fail. IPython.keyboard_manager.enable() $(fig.parent_element).html(''); fig.close_ws(fig, msg); } mpl.figure.prototype.close_ws = function(fig, msg){ fig.send_message('closing', msg); // fig.ws.close() } mpl.figure.prototype.push_to_output = function(remove_interactive) { // Turn the data on the canvas into data in the output cell. var width = this.canvas.width/mpl.ratio var dataURL = this.canvas.toDataURL(); this.cell_info[1]['text/html'] = ''; } mpl.figure.prototype.updated_canvas_event = function() { // Tell IPython that the notebook contents must change. IPython.notebook.set_dirty(true); this.send_message("ack", {}); var fig = this; // Wait a second, then push the new image to the DOM so // that it is saved nicely (might be nice to debounce this). setTimeout(function () { fig.push_to_output() }, 1000); } mpl.figure.prototype._init_toolbar = function() { var fig = this; var nav_element = $('
'); nav_element.attr('style', 'width: 100%'); this.root.append(nav_element); // Define a callback function for later on. function toolbar_event(event) { return fig.toolbar_button_onclick(event['data']); } function toolbar_mouse_event(event) { return fig.toolbar_button_onmouseover(event['data']); } for(var toolbar_ind in mpl.toolbar_items){ var name = mpl.toolbar_items[toolbar_ind][0]; var tooltip = mpl.toolbar_items[toolbar_ind][1]; var image = mpl.toolbar_items[toolbar_ind][2]; var method_name = mpl.toolbar_items[toolbar_ind][3]; if (!name) { continue; }; var button = $(''); button.click(method_name, toolbar_event); button.mouseover(tooltip, toolbar_mouse_event); nav_element.append(button); } // Add the status bar. var status_bar = $(''); nav_element.append(status_bar); this.message = status_bar[0]; // Add the close button to the window. var buttongrp = $('
'); var button = $(''); button.click(function (evt) { fig.handle_close(fig, {}); } ); button.mouseover('Stop Interaction', toolbar_mouse_event); buttongrp.append(button); var titlebar = this.root.find($('.ui-dialog-titlebar')); titlebar.prepend(buttongrp); } mpl.figure.prototype._root_extra_style = function(el){ var fig = this el.on("remove", function(){ fig.close_ws(fig, {}); }); } mpl.figure.prototype._canvas_extra_style = function(el){ // this is important to make the div 'focusable el.attr('tabindex', 0) // reach out to IPython and tell the keyboard manager to turn it's self // off when our div gets focus // location in version 3 if (IPython.notebook.keyboard_manager) { IPython.notebook.keyboard_manager.register_events(el); } else { // location in version 2 IPython.keyboard_manager.register_events(el); } } mpl.figure.prototype._key_event_extra = function(event, name) { var manager = IPython.notebook.keyboard_manager; if (!manager) manager = IPython.keyboard_manager; // Check for shift+enter if (event.shiftKey && event.which == 13) { this.canvas_div.blur(); // select the cell after this one var index = IPython.notebook.find_cell_index(this.cell_info[0]); IPython.notebook.select(index + 1); } } mpl.figure.prototype.handle_save = function(fig, msg) { fig.ondownload(fig, null); } mpl.find_output_cell = function(html_output) { // Return the cell and output element which can be found *uniquely* in the notebook. // Note - this is a bit hacky, but it is done because the "notebook_saving.Notebook" // IPython event is triggered only after the cells have been serialised, which for // our purposes (turning an active figure into a static one), is too late. var cells = IPython.notebook.get_cells(); var ncells = cells.length; for (var i=0; i= 3 moved mimebundle to data attribute of output data = data.data; } if (data['text/html'] == html_output) { return [cell, data, j]; } } } } } // Register the function which deals with the matplotlib target/channel. // The kernel may be null if the page has been refreshed. if (IPython.notebook.kernel != null) { IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm); }
Out[119]:
<matplotlib.legend.Legend at 0x12e0fbc3208>

DROP A COMMENT

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir