Skip to main content

Lineer Regrassion

Gerekli Kütüphanelerin Dahil Edilmesi

from sklearn.datasets import load_boston
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

Veri Setini Yükleme ve Veriyi Tanıma İşlemleri

X,y = load_boston(return_X_y=True)

Boston dataseti 13 girdi 506 örnekten oluşmaktadır. Bostonda emlak fiyatlarının regresyon tahminlerinin yapılması için bölgenin çeşitli özelliklerinin istatistiksel vb. verilerini içermektedir.

print("Features label",X.shape)
print("Targets label",y.shape)
Features label (506, 13)
Targets label (506,)
load_boston().keys()
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])

13 adet özellik sütununun isimleri aşağıdadır.

print(load_boston().feature_names)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']

Özellik kolonlarının açıklamalarını ve veri seti hakkındaki bilgileri aşağıdan daha detaylı inceleyebilirsiniz.

print(load_boston().DESCR)
print(load_boston().filename)
boston_house_prices.csv

Boston veri setimizi dataframe olarak tanıtıyoruz

df_boston = pd.DataFrame(X, columns = load_boston().feature_names)
df_boston.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.90
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.90
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.83
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.63
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.90

Veri Ön İşleme İşlemlerine Giriş

Veride Null değerlerin varlığını inceliyoruz.

df_boston.isnull().sum()
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

Tüm özellik kolonlarının birbirlerine göre dağılım grafiklerini ve dağılımları inceliyoruz.

sns.pairplot(df_boston)

Featurlar Arasındaki Korelasyon Katsayılarının İncelenmesi ve Göreselleştirilmesi

Veri setimizin ortalama, standart sapması vs. özelliklerini inceliyoruz.

df_boston.describe()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
count506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000
mean3.61352411.36363611.1367790.0691700.5546956.28463468.5749013.7950439.549407408.23715418.455534356.674032
std8.60154523.3224536.8603530.2539940.1158780.70261728.1488612.1057108.707259168.5371162.16494691.294864
min0.0063200.0000000.4600000.0000000.3850003.5610002.9000001.1296001.000000187.00000012.6000000.320000
25%0.0820450.0000005.1900000.0000000.4490005.88550045.0250002.1001754.000000279.00000017.400000375.377500
50%0.2565100.0000009.6900000.0000000.5380006.20850077.5000003.2074505.000000330.00000019.050000391.440000
75%3.67708312.50000018.1000000.0000000.6240006.62350094.0750005.18842524.000000666.00000020.200000396.225000
max88.976200100.00000027.7400001.0000000.8710008.780000100.00000012.12650024.000000711.00000022.000000396.900000

Özellik sütunlarının birbirleri arasındaki korelasyon katsayıları.

df_boston.corr()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
CRIM1.000000-0.2004690.406583-0.0558920.420972-0.2192470.352734-0.3796700.6255050.5827640.289946-0.385064
ZN-0.2004691.000000-0.533828-0.042697-0.5166040.311991-0.5695370.664408-0.311948-0.314563-0.3916790.175520
INDUS0.406583-0.5338281.0000000.0629380.763651-0.3916760.644779-0.7080270.5951290.7207600.383248-0.356977
CHAS-0.055892-0.0426970.0629381.0000000.0912030.0912510.086518-0.099176-0.007368-0.035587-0.1215150.048788
NOX0.420972-0.5166040.7636510.0912031.000000-0.3021880.731470-0.7692300.6114410.6680230.188933-0.380051
RM-0.2192470.311991-0.3916760.091251-0.3021881.000000-0.2402650.205246-0.209847-0.292048-0.3555010.128069
AGE0.352734-0.5695370.6447790.0865180.731470-0.2402651.000000-0.7478810.4560220.5064560.261515-0.273534
DIS-0.3796700.664408-0.708027-0.099176-0.7692300.205246-0.7478811.000000-0.494588-0.534432-0.2324710.291512
RAD0.625505-0.3119480.595129-0.0073680.611441-0.2098470.456022-0.4945881.0000000.9102280.464741-0.444413
TAX0.582764-0.3145630.720760-0.0355870.668023-0.2920480.506456-0.5344320.9102281.0000000.460853-0.441808
PTRATIO0.289946-0.3916790.383248-0.1215150.188933-0.3555010.261515-0.2324710.4647410.4608531.000000-0.177383
B-0.3850640.175520-0.3569770.048788-0.3800510.128069-0.2735340.291512-0.444413-0.441808-0.1773831.000000
LSTAT0.455621-0.4129950.603800-0.0539290.590879-0.6138080.602339-0.4969960.4886760.5439930.374044-0.366087

Korelasyon katsayılarının görselleştirilmesi.

corr = df_boston.corr()

plt.figure(figsize=(14, 14))
ax = sns.heatmap(
corr,
vmin=-1, vmax=1, center=0,
cmap=sns.diverging_palette(20, 220, n=200),
square=True, annot = True
)
ax.set_xticklabels(
ax.get_xticklabels(),
rotation=45,
horizontalalignment='right'
)
ax.set_ylim(len(corr)+0.5, -0.5);

Veride Aykırı Değerlerin(Outliers) Varlığının İncelenmesi ve Yok Edilmesi Adımları

Öncelikle outlier değerlerini daha iyi anlayabilmek için "CRIM" sütnunun kutu dağılımını inceleyerek outliers değerleri gözlemliyoruz.

df_crım = df_boston["CRIM"].copy()
print(df_crım)
0      0.00632
1 0.02731
2 0.02729
3 0.03237
4 0.06905
...
501 0.06263
502 0.04527
503 0.06076
504 0.10959
505 0.04741
Name: CRIM, Length: 506, dtype: float64
sns.boxplot(x=df_boston["CRIM"])
AxesSubplot:xlabel='CRIM'

Veride Outliers satırlarını çıkartırken "CHAS" sütunundaki değerler hesaba katılmamıştır.Çünkü "CHAS" sütunu 0 ve 1 değerlerinden oluştuğu için tüm 1 değerleri outlier olarak belirlenecek ve veri setinden silinecektir. Bunu önlemek için böyle bir önlem alınmıştır !!!!!

k = 0
for i in range(len(df_boston["CHAS"])):
a = int(df_boston["CHAS"][i])
if a == 1:
k += 1
print("Nehre Kıyısı Olan Ev Sayısı",k)
Nehre Kıyısı Olan Ev Sayısı 35

Outliers değer olan satırları veriden silmek için veri setindeki elemanların z skorlarını alıyoruz. Z skoru bir degerin normal dagilimda gerceklesme olasiligini bulmamizi saglar. Z skoru |3| değerinden büyük ise o veri outlier bir veridir.

#Outlier detection with Z-Score
from scipy import stats
import numpy as np

df_boston1 = df_boston.drop(columns = ["CHAS"])
z_score = np.abs(stats.zscore(df_boston1))
print(z_score)
print(len(z_score))

Outlier verileri veri setimizden siliyoruz.

outliers = list(set(np.where(z_score > 3)[0]))
new_df = df_boston.drop(outliers,axis = 0).reset_index(drop = False)
display(new_df)

y_new = y[list(new_df["index"])]
len(y_new)
indexCRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
000.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.90
110.027310.07.070.00.4696.42178.94.96712.0242.017.8396.90
220.027290.07.070.00.4697.18561.14.96712.0242.017.8392.83
330.032370.02.180.00.4586.99845.86.06223.0222.018.7394.63
440.069050.02.180.00.4587.14754.26.06223.0222.018.7396.90
..........................................
4435010.062630.011.930.00.5736.59369.12.47861.0273.021.0391.99
4445020.045270.011.930.00.5736.12076.72.28751.0273.021.0396.90
4455030.060760.011.930.00.5736.97691.02.16751.0273.021.0396.90
4465040.109590.011.930.00.5736.79489.32.38891.0273.021.0393.45
4475050.047410.011.930.00.5736.03080.82.50501.0273.021.0396.90
448
X_new = new_df.drop('index', axis = 1)

X_new.describe()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
count448.000000448.000000448.000000448.000000448.000000448.000000448.000000448.000000448.000000448.000000448.000000448.000000
mean2.4086859.29687510.9825450.0736610.5507276.27794268.2350453.7881608.716518393.08928618.398661374.135089
std4.76406019.2618266.7408750.2615100.1137070.62408327.7387691.9303328.171676160.9019352.13817951.762313
min0.0063200.0000000.4600000.0000000.3850004.3680002.9000001.1296001.000000188.00000012.60000083.450000
25%0.0825980.0000005.1900000.0000000.4530005.88775045.6750002.1813754.000000277.00000017.300000377.677500
50%0.2246350.0000008.5600000.0000000.5280006.19400075.5000003.3666505.000000311.00000018.700000392.215000
75%2.17687812.50000018.1000000.0000000.6140006.59075093.8000005.1167008.000000437.00000020.200000396.900000
max28.65580080.00000027.7400001.0000000.8710008.375000100.0000009.22290024.000000711.00000021.200000396.900000

Yeni veri setimizin matrissel boyutu (448,13) olmuştur. İlk veri seti (506,13) olduğu göz önüne alınarak 58 veri satırı outliers olarak tespit edilip veriden silinmiştir.

print(len(y_new))
print(X_new.shape)
448
(448, 13)
X_new.info()

Linear Regresion Modellerinin Oluşturulması

1) Normalize Edilmiş ve Outliers uygulanmış girdiler ile oluşturulmuş model:

X_scl = StandardScaler().fit_transform(X_new)
X_train, X_test, y_train, y_test = train_test_split(X_scl,y_new, test_size=0.3, random_state=42)
model = LinearRegression()
model.fit(X_train,y_train)
LinearRegression()
print("Train set doğruluk skoru",model.score(X_train,y_train))
print("Test set doğruluk skoru",model.score(X_test,y_test))
Train set doğruluk skoru 0.7300275738890303
Test set doğruluk skoru 0.7262644595320192
print("Model Linear Regression Denklemi Girdilerin Ağırlık Değerleri:")
print("*****************************"*2)
for i in range(X_new.shape[1]):
print("Feature:",X_new.columns[i]," Coefficent:",model.coef_[i])
print("*****************************"*2)
print("Model Bias Değeri",model.intercept_)

MODEL Denklemi

f(x) = x1.(-0.6232915117704749) + x2.(0.20681549725170598) + x3.(0.4866594709201995) + x4.(0.6094681951041256) + x5.(-1.8854778838035968) + x6.(2.972984539726412) + x7.(-0.24617193422155162) + x8.(-2.483054981411919) + x9.(2.0866963867596273) + x10.(-1.3352511053788594) + x11.(-2.07362742795935) + x12.(0.5507950528783419) + x13.(3.382569850079229) + (23.00316433536967)

y_pred = model.predict(X_test)
for i in range(len(y_pred)):
print("MODEL GERÇEK DEĞERİ:",y_test[i],
"***"*2,
"MODEL PREDİCTİON DEĞERİ:",y_pred[i])

Test veri setindeki ilk satır değeri modelde belirlenen ağırlık ve bias değerleri ile çarpılarak tahmin işlemi yapılmıştır. predict() metodu ile tüm test verimizin tahmin değerleri oluşturulabilir. Aşağıda sadece predict() metodunun işleyişi anlaşılması için matamatiksel işlemi yapılmıştır. Diğer modellerde de aynı şekilde bu işlem tekrar edilmiştir. Bu açıklama satırı tüm modeller için tek tek yazılmayacaktır.

ağırlık1 = 0
ağırlıklar = 0
for i in range(13):
ağırlıklar = X_test[0][i] * model.coef_[i]
ağırlık1 += ağırlıklar
predict1 = ağırlık1 + model.intercept_
print("Tahmin edilen değer",predict1)
print("Gerçek değer",y_test[0])
Tahmin edilen değer 28.571848105506398
Gerçek değer 26.4
a = np.arange(-6,6,0.089)
b = np.arange(0,135)
plt.figure(figsize=(18,9))
plt.suptitle("MODEL TAHMİN GRAFİĞİ DENKLEMİNİN ÇİZDİRİLMESİ")

plt.subplot(1,3,1)
plt.plot(a,y_pred,"r")
plt.plot(X_test,y_pred,'o')
plt.plot(a,y_pred)
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Tahminleme değerleri Grafiği")

plt.subplot(1,3,2)
plt.plot(a,y_pred,"r")
plt.plot(X_test,y_test,'o')
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Gerçek değerler Grafiği")

plt.subplot(1,3,3)
plt.plot(b,y_pred,"b")
plt.title("Model Denklem Grafiği")

plt.show()

png

png

png

png

png

png

2) Normalize Edilmemiş ama Outliers uygulanmış girdiler ile oluşturulmuş model1:

X_train1, X_test1, y_train1, y_test1 = train_test_split(X_new,y_new, test_size=0.3, random_state=42)
model1 = LinearRegression().fit(X_train1,y_train1)
print("Train set doğruluk skoru",model1.score(X_train1,y_train1))
print("Test set doğruluk skoru",model1.score(X_test1,y_test1))
Train set doğruluk skoru 0.7300275738890302
Test set doğruluk skoru 0.7262644595320187
print("Model1 Linear Regression Denklemi Girdilerin Ağırlık Değerleri:")
print("*****************************"*2)
for i in range(X_new.shape[1]):
print("Feature:",X_new.columns[i]," Coefficent:",model1.coef_[i])
print("*****************************"*2)
print("Model1 Bias Değeri",model1.intercept_)

MODEL1 Denklemi:

f(x) = x1.(-0.13097826393430267) + x2.(0.0107490695698219) + x3.(0.07227600629470217) + x4.(2.3331789133362024) + x5.(-16.60050148737175) + x6.(4.769089026642503) + x7.(-0.008884573675461185) + x8.(-1.2877736450188066) + x9.(0.2556426991343798) + x10.(-0.008307817052884045) + x11.(-0.9708941270421753) + x12.(0.010652746683792933) + x13.(-0.5224434130685673) + (28.244934503472876)

y_pred = model1.predict(X_test1)
for i in range(len(y_pred)):
print("MODEL1 GERÇEK DEĞERİ:",y_test1[i],
"***"*2,
"MODEL1 PREDİCTİON DEĞERİ:",y_pred[i])
ağırlık1 = 0
ağırlıklar = 0
for i in range(13):
ağırlıklar = X[0][i] * model1.coef_[i]
ağırlık1 += ağırlıklar

predict1 = ağırlık1 + model1.intercept_
print("Tahmin edilen değer",predict1)
print("Gerçek değer",y[0])
Tahmin edilen değer 29.752125355295206
Gerçek değer 24.0
a = np.arange(0,700,5.186)
b = np.arange(0,135)
plt.figure(figsize=(18,9))
plt.suptitle("MODEL1 TAHMİN GRAFİĞİ DENKLEMİNİN ÇİZDİRİLMESİ")

plt.subplot(1,3,1)
plt.plot(a,y_pred,"r")
plt.plot(X_test1,y_pred,'o')
plt.plot(a,y_pred)
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Tahminleme değerleri Grafiği")

plt.subplot(1,3,2)
plt.plot(a,y_pred,"r")
plt.plot(X_test1,y_test1,'o')
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Gerçek değerler Grafiği")

plt.subplot(1,3,3)
plt.plot(b,y_pred,"b")
plt.title("Model1 Denklem Grafiği")

plt.show()

png

3) Normalize Edilmemiş ve Outliers uygulanmamış girdiler ile oluşturulmuş model2:

X_train2, X_test2, y_train2, y_test2 = train_test_split(X,y, test_size=0.3, random_state=42)
model2 = LinearRegression().fit(X_train2,y_train2)
print("Train set doğruluk skoru",model2.score(X_train2,y_train2))
print("Test set doğruluk skoru",model2.score(X_test2,y_test2))
Train set doğruluk skoru 0.7434997532004697
Test set doğruluk skoru 0.711226005748496
print("Model2 Linear Regression Denklemi Girdilerin Ağırlık Değerleri:")
print("*****************************"*2)
for i in range(df_boston.shape[1]):
print("Feature:",df_boston.columns[i]," Coefficent:",model2.coef_[i])
print("*****************************"*2)
print("Model2 Bias Değeri",model2.intercept_)

MODEL2 Denklemi:

f(x) = x1.(-0.13347010285294425) + x2.(0.03580891359323082) + x3.(0.049522645220057185) + x4.(3.1198351162854077) + x5.(-15.41706089530688) + x6.(4.057199231645392) + x7.(-0.010820835184930837) + x8.(-1.3859982431608768) + x9.(0.24272733982224357) + x10.(-0.00870223436566267) + x11.(-0.9106852081102922) + x12.(0.011794115892570081) + x13.(-0.5471133128239593) + (31.631084035694585)

y_pred = model2.predict(X_test2)
for i in range(len(y_pred)):
print("MODEL2 GERÇEK DEĞERİ:",y_test2[i],
"***"*2,
"MODEL2 PREDİCTİON DEĞERİ:",y_pred[i])
## Test verisindeki ilk değerinin regresyon tahmini ve gerçek değerinin karşılaştırılması
ağırlık1 = 0
ağırlıklar = 0
for i in range(13):
ağırlıklar = X_test2[0][i] * model2.coef_[i]
ağırlık1 += ağırlıklar
predict1 = ağırlık1 + model2.intercept_
print("Tahmin edilen değer",predict1)
print("Gerçek değer",y_test2[0])
Tahmin edilen değer 28.648960046324085
Gerçek değer 23.6
a = np.arange(0,700,4.61)
b = np.arange(0,152)
plt.figure(figsize=(18,9))
plt.suptitle("MODEL2 TAHMİN GRAFİĞİ DENKLEMİNİN ÇİZDİRİLMESİ")

plt.subplot(1,3,1)
plt.plot(a,y_pred,"r")
plt.plot(X_test2,y_pred,'o')
plt.plot(a,y_pred)
plt.legend("Denklem")
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Tahminleme değerleri Grafiği")

plt.subplot(1,3,2)
plt.plot(a,y_pred,"r")
plt.plot(X_test2,y_test2,'o')
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Gerçek değerler Grafiği")

plt.subplot(1,3,3)
plt.plot(b,y_pred,"b")
plt.title("Model2 Denklem Grafiği")

plt.show()

png

4) Outliers uygulanmış ve MinMax Scaller uygulanmış model3:

X_minmax= MinMaxScaler().fit_transform(X_new)
X_train3, X_test3, y_train3, y_test3 = train_test_split(X_minmax,y_new, test_size=0.3, random_state=42)
model3 = LinearRegression().fit(X_train3,y_train3)
print("Train set doğruluk skoru",model3.score(X_train3,y_train3))
print("Test set doğruluk skoru",model3.score(X_test3,y_test3))
Train set doğruluk skoru 0.7300275738890303
Test set doğruluk skoru 0.7262644595320192
print("Model3 Linear Regression Denklemi Girdilerin Ağırlık Değerleri:")
print("*****************************"*2)
for i in range(X_new.shape[1]):
print("Feature:",X_new.columns[i]," Coefficent:",model3.coef_[i])
print("*****************************"*2)
print("Model3 Bias Değeri",model3.intercept_)

MODEL3 Denklemi:

f(x) = x1.(-3.752459153020569) + x2.(0.8599255655852653) + x3.(1.971689451719393) + x4.(2.333178913336127) + x5.(-8.067843722862678) + x6.(19.109739729756456) + x7.(-0.8626921038876417) + x8.(-10.42233844123072) + x9.(5.879782080090829) + x10.(-4.344988318658385) + x11.(-8.349689492562684) + x12.(3.339103448034986) + x13.(-15.809137679454942) + (27.68275880501959)

y_pred = model3.predict(X_test3)
for i in range(len(y_pred)):
print("MODEL3 GERÇEK DEĞERİ:",y_test3[i],
"***"*2,
"MODEL3 PREDİCTİON DEĞERİ:",y_pred[i])
## Test verisindeki ilk değerinin regresyon tahmini ve gerçek değerinin karşılaştırılması
ağırlık1 = 0
ağırlıklar = 0
for i in range(13):
ağırlıklar = X_test3[0][i] * model3.coef_[i]
ağırlık1 += ağırlıklar
predict1 = ağırlık1 + model3.intercept_
print("Tahmin edilen değer",predict1)
print("Gerçek değer",y_test3[0])
Tahmin edilen değer 28.57184810550641
Gerçek değer 26.4
a = np.arange(0,1,0.00745)
b = np.arange(0,135)
plt.figure(figsize=(18,9))
plt.suptitle("MODEL3 TAHMİN GRAFİĞİ DENKLEMİNİN ÇİZDİRİLMESİ")

plt.subplot(1,3,1)
plt.plot(a,y_pred,"r")
plt.plot(X_test3,y_pred,'o')
plt.plot(a,y_pred)
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Tahminleme değerleri Grafiği")

plt.subplot(1,3,2)
plt.plot(a,y_pred,"r")
plt.plot(X_test3,y_test3,'o')
plt.legend(df_boston.columns)
plt.tight_layout()
plt.title("Gerçek değerler Grafiği")

plt.subplot(1,3,3)
plt.plot(b,y_pred,"b")
plt.title("Model3 Denklem Grafiği")

plt.show()

png

Oluşturulan tüm modellerin train ve test doğruluk skorları aşağıda yazdırılmıştır. En yüksek train doğruluğunu model2 yakalasa da test doğruluğu olarak diğer modellerden geride kalmıştır. Model, model1 ve model3 train ve test doğrulukları birbirlerine eşittir.

print("MODEL Train set doğruluk skoru",model.score(X_train,y_train))
print("MODEL Test set doğruluk skoru",model.score(X_test,y_test))
print("***"*17)
print("MODEL1 Train set doğruluk skoru",model1.score(X_train1,y_train1))
print("MODEL1 Test set doğruluk skoru",model1.score(X_test1,y_test1))
print("***"*17)
print("MODEL2 Train set doğruluk skoru",model2.score(X_train2,y_train2))
print("MODEL2 Test set doğruluk skoru",model2.score(X_test2,y_test2))
print("***"*17)
print("MODEL3 Train set doğruluk skoru",model3.score(X_train3,y_train3))
print("MODEL3 Test set doğruluk skoru",model3.score(X_test3,y_test3))

Poly Lineer Regression

from sklearn.datasets import load_boston
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X,y = load_boston(return_X_y=True)
print("Features label",X.shape)
print("Targets label",y.shape)
Features label (506, 13)
Targets label (506,)
load_boston().keys()
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])
print(load_boston().feature_names)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
print(load_boston().DESCR)
df_boston = pd.DataFrame(X, columns = load_boston().feature_names)
df_boston.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.90
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.90
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.83
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.63
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.90
df_boston.isnull().sum()
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
df_boston.describe()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
count506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000
mean3.61352411.36363611.1367790.0691700.5546956.28463468.5749013.7950439.549407408.23715418.455534356.674032
std8.60154523.3224536.8603530.2539940.1158780.70261728.1488612.1057108.707259168.5371162.16494691.294864
min0.0063200.0000000.4600000.0000000.3850003.5610002.9000001.1296001.000000187.00000012.6000000.320000
25%0.0820450.0000005.1900000.0000000.4490005.88550045.0250002.1001754.000000279.00000017.400000375.377500
50%0.2565100.0000009.6900000.0000000.5380006.20850077.5000003.2074505.000000330.00000019.050000391.440000
75%3.67708312.50000018.1000000.0000000.6240006.62350094.0750005.18842524.000000666.00000020.200000396.225000
max88.976200100.00000027.7400001.0000000.8710008.780000100.00000012.12650024.000000711.00000022.000000396.900000
#Outlier detection with Z-Score
from scipy import stats
import numpy as np

df_boston1 = df_boston.drop(columns = ["CHAS"])
z_score = np.abs(stats.zscore(df_boston1))
print(z_score)
print(len(z_score))
         CRIM        ZN     INDUS       NOX        RM       AGE       DIS  \
0 0.419782 0.284830 1.287909 0.144217 0.413672 0.120013 0.140214
1 0.417339 0.487722 0.593381 0.740262 0.194274 0.367166 0.557160
2 0.417342 0.487722 0.593381 0.740262 1.282714 0.265812 0.557160
3 0.416750 0.487722 1.306878 0.835284 1.016303 0.809889 1.077737
4 0.412482 0.487722 1.306878 0.835284 1.228577 0.511180 1.077737
.. ... ... ... ... ... ... ...
501 0.413229 0.487722 0.115738 0.158124 0.439316 0.018673 0.625796
502 0.415249 0.487722 0.115738 0.158124 0.234548 0.288933 0.716639
503 0.413447 0.487722 0.115738 0.158124 0.984960 0.797449 0.773684
504 0.407764 0.487722 0.115738 0.158124 0.725672 0.736996 0.668437
505 0.415000 0.487722 0.115738 0.158124 0.362767 0.434732 0.613246

RAD TAX PTRATIO B LSTAT
0 0.982843 0.666608 1.459000 0.441052 1.075562
1 0.867883 0.987329 0.303094 0.441052 0.492439
2 0.867883 0.987329 0.303094 0.396427 1.208727
3 0.752922 1.106115 0.113032 0.416163 1.361517
4 0.752922 1.106115 0.113032 0.441052 1.026501
.. ... ... ... ... ...
501 0.982843 0.803212 1.176466 0.387217 0.418147
502 0.982843 0.803212 1.176466 0.441052 0.500850
503 0.982843 0.803212 1.176466 0.441052 0.983048
504 0.982843 0.803212 1.176466 0.403225 0.865302
505 0.982843 0.803212 1.176466 0.441052 0.669058

[506 rows x 12 columns]
506
y = np.array(y)
y.shape
(506,)
outliers = list(set(np.where(z_score > 3)[0]))
X_new = df_boston.drop(outliers,axis = 0).reset_index(drop = True)
display(new_df)
y_new = np.delete(y,outliers)
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.90
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.90
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.83
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.63
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.90
.......................................
4430.062630.011.930.00.5736.59369.12.47861.0273.021.0391.99
4440.045270.011.930.00.5736.12076.72.28751.0273.021.0396.90
4450.060760.011.930.00.5736.97691.02.16751.0273.021.0396.90
4460.109590.011.930.00.5736.79489.32.38891.0273.021.0393.45
4470.047410.011.930.00.5736.03080.82.50501.0273.021.0396.90
X_new.shape
(448, 13)
y_new.shape
(448,)
X_new.info()
class 'pandas.core.frame.DataFrame'
RangeIndex: 448 entries, 0 to 447
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CRIM 448 non-null float64
1 ZN 448 non-null float64
2 INDUS 448 non-null float64
3 CHAS 448 non-null float64
4 NOX 448 non-null float64
5 RM 448 non-null float64
6 AGE 448 non-null float64
7 DIS 448 non-null float64
8 RAD 448 non-null float64
9 TAX 448 non-null float64
10 PTRATIO 448 non-null float64
11 B 448 non-null float64
12 LSTAT 448 non-null float64
dtypes: float64(13)
memory usage: 45.6 KB
# Veri ön işleme
from sklearn.preprocessing import StandardScaler
X_scl = StandardScaler().fit_transform(X_new) # Veriyi standartlaştırma

Bu kod bloğunda, X_new değişkeninde bulunan veriler StandardScaler kullanılarak standartlaştırılıyor. Standartlaştırma işlemi, veri setindeki özniteliklerin ortalamasını 0 ve standart sapmasını 1 olacak şekilde ayarlar.

# Polinom özellikleri ekleyerek veri setini genişletme
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=1) # Polinom derecesi belirleniyor
X_poly = poly_features.fit_transform(X_scl) # Polinom özellikleri ekleniyor

Bu kod bloğunda, PolynomialFeatures kullanılarak, veri setine polinom özellikleri eklenir. Bu, modelin karmaşıklığını ve kapasitesini artırarak daha karmaşık veri yapılarını öğrenmesini sağlar.

# Dönüştürülmüş veri setinin boyutlarını kontrol etme
X_poly.shape

(448, 14)

Bu ifade, polinom özellikleri eklenmiş veri setinin boyutlarını gösterir. Burada 448 satır ve 14 sütun vardır.

# Lineer Regresyon modeli oluşturma ve eğitme
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_poly, y_new) # Modeli polinom özelliklerle eğitme

LinearRegression()

Bu kod bloğunda, LinearRegression modeli oluşturulmuş ve polinom özellikleri içeren veri seti ile eğitilmiştir.

# Başka bir Lineer Regresyon modeli daha oluşturma ve eğitme
model1 = LinearRegression()
model1.fit(X_new, y_new) # Orijinal veri ile modeli eğitme

LinearRegression()

Bu kod, başka bir lineer regresyon modelini orijinal veri setiyle eğitir. İki modelin karşılaştırılması için bu adım önemlidir.

# Test veri setini belirleme
X_test = X_new # Test verisi olarak orijinal veriyi kullanma

Test için kullanılacak veri seti, orijinal veri seti X_new olarak belirlenmiştir.

# Test veri setinin boyutunu kontrol etme
X_test.shape

(448, 13)

Bu kod, test veri setinin boyutlarını gösterir. Burada 448 satır ve 13 sütun vardır.

# Test veri setine polinom özellikler eklenmesi
X_test_pred = poly_features.fit_transform(X_test) # Test verisini dönüştürme

Bu kod bloğu, test veri setine polinom özellikler ekler.

# Dönüştürülmüş test veri setinin boyutlarını kontrol etme
X_test_pred.shape

(448, 14)

Bu ifade, polinom özellikleri eklenmiş test veri setinin boyutlarını gösterir.

# Model kullanarak tahmin yapma
y_pred = model.predict(X_test_pred) # Polinom modeliyle tahmin yapma

Bu kod bloğu, polinom regresyon modelini kullanarak tahminler yapar.

# Başka bir model kullanarak tahmin yapma
y_pred1 = model1.predict(X_test) # Lineer modeliyle tahmin yapma

Bu kod, lineer regresyon modeli kullanarak tahminler yapar.

# İlk tahmin değerlerini gösterme
y_pred1[0] # Lineer modelin ilk tahmini

29.483163224969477

Bu ifade, lineer regresyon modelinin ilk tahmin değerini

gösterir.

y_pred[0]  # Polinom modelin ilk tahmini

-359.57673325992755

Bu ifade, polinom regresyon modelinin ilk tahmin değerini gösterir.

y_new[0]  # Gerçek ilk değer

24.0

Bu kod, veri setindeki ilk gerçek değeri gösterir.

# 'CRIM' özniteliğinin değerlerini gösterme
X_new["CRIM"] # Orijinal veri setinde 'CRIM' sütunu

0 0.00632
1 0.02731
...
446 0.10959
447 0.04741
Name: CRIM, Length: 448, dtype: float64

Bu kod, CRIM özniteliğinin tüm değerlerini listeler.

X_test["CRIM"]  # Test veri setinde 'CRIM' sütunu

0 0.00632
1 0.02731
...
446 0.10959
447 0.04741
Name: CRIM, Length: 448, dtype: float64

Bu kod, test veri setinde CRIM özniteliğinin tüm değerlerini listeler.

Sonuçların görselleştirilmesi, modelin performansının anlaşılmasında kritik öneme sahiptir. İki farklı görselleştirme yapılarak, polinom ve lineer regresyon modellerinin gerçek verilere ne kadar yakın sonuçlar ürettiği karşılaştırılır.

# Polinom Regresyon sonuçlarını görselleştirme
import matplotlib.pyplot as plt
plt.scatter(np.arange(0, X_new.shape[0]), y_new, color='red', label='Gerçek Veri')
plt.plot(np.arange(0, X_new.shape[0]), y_pred, color='blue', label='Polinom Regresyon')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

Bu kod bloğu, polinom regresyon modelinin sonuçlarını gerçek veriyle birlikte görselleştirir.

# Lineer Regresyon sonuçlarını görselleştirme
plt.scatter(np.arange(0, X_new.shape[0]), y_new, color='red', label='Gerçek Veri')
plt.plot(np.arange(0, X_new.shape[0]), y_pred1, color='blue', label='Lineer Regresyon')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

Bu kod bloğu, lineer regresyon modelinin sonuçlarını gerçek veriyle birlikte görselleştirir.

Son olarak, bir örnek polinom regresyon uygulaması gösterilir. Bu, polinom regresyonun nasıl çalıştığını göstermek için basit bir örnektir.

# Basit bir polinom regresyon örneği
# Kütüphaneleri yükleme
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Örnek veri oluşturma
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1) # Giriş verisi
y = np.array([2, 4, 8, 16, 32]) # Çıkış verisi

# Polinom özelliklerini oluşturma
poly_features = PolynomialFeatures(degree=3)
X_poly = poly_features.fit_transform(X)

# Model oluşturma ve eğitme
model = LinearRegression()
model.fit(X_poly, y)

# Tahmin yapma
X_pred = np.linspace(1, 5, 100).reshape(-1, 1)
X_pred_poly = poly_features.transform(X_pred)
y_pred = model.predict(X_pred_poly)

# Sonuçları görselleştirme
plt.scatter(X, y, color='red', label='Gerçek Veri')
plt.plot(X_pred, y_pred, color='blue', label='Polinom Regresyon')
plt.xlabel('X')


plt.ylabel('y')
plt.legend()
plt.show()