Makine Öğrenmesi - II. Doğrusal Olmayan İlişkiler (Non-Linear Relationships)

I. YSA - MLPRegressor

Yayın tarihi :05-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Çok Katmanlı Algılayıcı (Multilayer Perceptron - MLP), ileri beslemeli yapay sinir ağı sınıfıdır. En az üç katmandan oluşur; bir girdi katmanı, bir veya daha fazla gizli katmandan ve son olarak da çıktı katmanından oluşur.

Kullanımı için MLPRegressor kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.neural_network import MLPRegressor

Söz dizimi: MLPRegressor(hidden_layer_sizes=(100,), activation='relu', *, solver='adam', alpha=0.0001, batch_size='auto', learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=200, shuffle=True, random_state=None, tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False, validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)

  • hidden_layer_sizes, gizli katmanın boyutunu temsil etmektedir.Örn (50,100,100) 3 tane gizli katmanın oluştuğunu gösterecektir. İstenilen sayı kadar katman oluşturulabilir. Default olarak 100'dür.
  • activation, gizli katmanın aktivasyon fonksiyonunu temsil eder. 4 farklı değer alabilir; identity, logistic, tanh, relu, default olarak relu bulunmaktadır.
  • solver, ağırlık optimizasyonunu temsil etmektedir. 3 farklı değer alabilir; lbfgs, sgd, adam default olara adam bulunmaktadır. Burada dikkat edilecek husus adam büyük veri setlerinde iyi sonuç verebileceği gibi lbfgs de küçük veri setlerinde iyi sonuçlar verebilir.

Örnek-1: Ev fiyatlarının bulunduğu "kc_house_data" adlı veri setine MLPRegressor işlemi uygulayalım.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error

from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler

Keşifsel Veri Analizi EDA 

df=pd.read_csv("kc_house_data.csv")
df.head()

Çıktı:

df.shape

Çıktı:

(21613, 21)
#id,zipcode,lat,long değerleri sayısal olarak bir üstünlük belirtmediğinden kaldıralım
df.drop(["id","zipcode","lat","long"],axis=1,inplace=True)

#date alanını düzenleyerek yıl,ay ve gün olarak yeni sütunda oluşturalım 
df["date"]=pd.to_datetime(df["date"])
df["year"]=(df["date"]).dt.year
df["month"]=(df["date"]).dt.month
df["day"]=(df["date"]).dt.day
#date alanını yıl,ay,gün olarak ayırdığımız için bu sütunu kaldırabiliriz.
df.drop("date",axis=1,inplace=True)

#yr_built ve yr_renovated sütununu büyük sayılardan kurtararak küçük sayılara çevirerek yaşlarını bulalım
df["yr_built"]=2022-df["yr_built"]
df["yr_renovated"]=2022-df["yr_renovated"]
df["yr_renovated"]=df["yr_renovated"].map(lambda x: 0 if x==2022 else x)

Regresyon İşlemi 

#x ve ye değerlerini atayalım
x,y=df.drop("price",axis=1),df[["price"]]
#Train ve test işlemlerinde kullanılacak değerleri ayıralım
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=13,test_size=.2)
#son durumda train ve test verilerinin boyutlarına bakalım
x_train.shape,x_test.shape,y_train.shape,y_test.shape

Çıktı:

((17290, 18), (4323, 18), (17290, 1), (4323, 1))
#verileri büyük boyutlarda değilde belirli bir aralıkta değerlerine göre standart hale getirelim
#standart hale getirmemizin en önemli nedenlerinden biri performanstır.
sc=StandardScaler()
scale=sc.fit(x_train)
scaled_xTrain=scale.transform(x_train)
scaled_xTest=scale.transform(x_test)
#örnek olarak görüntüleyelim
scaled_xTrain[0:1]

Çıktı:

array([[ 0.67304714, -0.80077147, -0.08588714, -0.20073274, -0.91438604,
        -0.08602115, -0.30106929,  0.91510812, -0.55653171, -0.74407221,
         1.22528542,  0.30800523, -0.17846518, -0.06540858, -0.1918528 ,
         1.44101091, -1.14123021,  0.84029233]])
#hidden_layer_sizes boyutu bilgisayar gücüne göre artırılabilir.
mlp=MLPRegressor(
    hidden_layer_sizes=(100,100,25),
    activation="relu",
    solver="adam"
)
#Modeli eğitelim
mlp.fit(scaled_xTrain,y_train)
#scaled_xTest için tahmin işlemi yapalım
predict_mlp=mlp.predict(scaled_xTest)
(mean_squared_error(y_test,predict_mlp))**.5

Çıktı:

182426.7032895719
r2_score(y_test,predict_mlp)*100

Çıktı:

74.2524197518493

Model Tuning (Model Ayarlama) işlemi

Regresyon sonucunda bazı parametreleri kullanarak %74.25 doğruluk oranı elde edildi. Yazılmış olunan hidden_layer_sizes=(100,100,25) mi daha iyi başka bir değer mi, actication=relu mu daha iyi başkası mı ya da solver=adam mı daha iyi başka bir özelliği mi daha başarılı sonucu almamızı sağlar? Bunun için de GridSearchCV kütüphanesinden faydalanacağız.

#model tuning
from sklearn.model_selection import GridSearchCV
parameters={
    "hidden_layer_sizes":[(100,100,25),(150,150,100)],
    "max_iter":[40,80],
    "activation":["relu","tanh"],
    "solver":["adam","sgd"],
    "alpha":[0.001,0.05],
    "learning_rate":["adaptive","constant"]
}
gsc=GridSearchCV(mlp,param_grid=parameters,cv=6)
#Modeli eğitelim
gsc.fit(scaled_xTrain,y_train)

Çıktı:

GridSearchCV(cv=6, estimator=MLPRegressor(hidden_layer_sizes=(100, 100, 25)),
             param_grid={'activation': ['relu', 'tanh'], 'alpha': [0.001, 0.05],
                         'hidden_layer_sizes': [(100, 100, 25),
                                                (150, 150, 100)],
                         'learning_rate': ['adaptive', 'constant'],
                         'max_iter': [40, 80], 'solver': ['adam', 'sgd']})
#En iyi parametre değerleri
gsc.best_params_

Çıktı:

{'activation': 'relu',
 'alpha': 0.001,
 'hidden_layer_sizes': (150, 150, 100),
 'learning_rate': 'adaptive',
 'max_iter': 80,
 'solver': 'adam'}
#En iyi parametre değerlerini girerek doğruluk oranını tekrar hesaplayalım
mlp_best=MLPRegressor(
    hidden_layer_sizes=(150,150,100),
    max_iter=80,
    activation="relu",
    solver="adam",
    alpha=0.001,
    learning_rate="adaptive")
mlp_best.fit(scaled_xTrain,y_train)
#scaled_xTest için tahmin işlemi yapalım
predict_mlp_best=mlp_best.predict(scaled_xTest)
(mean_squared_error(y_test,predict_mlp_best))**.5

Çıktı:

185046.4417040236
r2_score(y_test,predict_mlp_best)*100

Çıktı:

73.50761380548985
Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.