Derin Öğrenme (Deep Learning) - Keras Modeli Derleme İşlemleri

Evaluate Method (Değerlendirme Yöntemleri)

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

Evaluate Method (Değerlendirme Yöntemleri), Keras kullanılarak oluşturulan modellerin veri setini öğrenme işleminden sonra test veririleri ile oluşturulan modelin doğruluk değerini(örn:accuracy) ve kayıp değerini (loss) bulmak için kullanılan yöntemdir.

Söz dizimi: Model.evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, return_dict=False, **kwargs)

  • x, veri seti üzerindeki x_test (bağımsız değişkenler) verilerini temsil eder.
  • y, veri seti üzerindeki y_test (hedef değerlerini) temsil eder.
  • batch_size, yapılacak işin boyutunu temsil eder. Pozitif tam sayı olarak atama yapılabilir. Varsayılan olarak 32 değerini alır.
  • verbose, model eğitimi sırasında ekranda görünecek olan ayrıntıları temsil eder. "auto",0,1 veya 2 değelerini alabilir. Varsayılan olarak "auto"dur. 
    • 0, ayrıntı görünmeden direkt olarak metrics sonuçlarını ve kayıp sonucunu listeler.
    • 1, ilerleme çubuğunu, detayları, metrics sonuçlarını ve kayıp sonucunu listeler.
    • 2, ilerleme çubuğu olmadan detayları, metrics sonuçlarını ve kayıp sonucunu listeler.;
  • callbacks,  değerlendirme sırasında uygulanacak geri aramaların listesini temsil eder.

Örnek-1: Bazı kişilerin diyabet hastalığına yakalanıp yakalanmama bilgilerini içeren "pima-indians-diabetes.csv" veri seti ile kişinin diyabet hastası olup olamayacağını gösterecek olan bir model oluşturaralım, modeli derleyelim ve modele veri setini öğrenme yöntemini uygulayarak sonuçları değerlendirelim. (Fit Method (Öğrenme Yöntemi) örneğinde verilen veri setinin devamını sağlayalım.)

#İlgili kütüphaneler yüklenir
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout 
#Veri seti okundu
df=pd.read_csv("pima-indians-diabetes.csv",header=None)

#Veri setinde sütun isimleri belirli olmadığından dolayı sütun isimleri ataması yapılır.
df.columns=["preg","plass","press","skin","test","mass","pedi","age","class"]
#İlk 5 satır
df.head()

Çıktı:

#x ve y(hedef-tahmin) değerleri belirtilir.
x,y=df.drop("class",axis=1),df[["class"]]

#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=42,test_size=.2)

#Train veri setindeki değişken sayısı
n_cols=x.shape[1]

Veri seti değişken sayısı da göz önüne alınarak bir model oluşturuldu. Model bir giriş katmanı, 3 gizli katman ve 1 tane de çıkış katmanından oluşmaktadır. Gizli katman sayısı duruma göre artırılıp azaltılabilir.

#Model oluşturulur.
model=Sequential()

#Giriş Katmanı ve 1.Gizli Katman oluşturulur.
model.add(Dense(units=12,activation="relu",input_shape=(n_cols,)))

#2.Gizli Katman oluşturulur.
model.add(Dense(units=8,activation="relu"))

#3.Gizli Katman oluşturulur.
model.add(Dense(units=4,activation="relu"))

#Çıkış Katmanı
model.add(Dense(units=1,activation="sigmoid"))
#Model özeti
model.summary()

Çıktı:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 12)                108       
                                                                 
 dense_1 (Dense)             (None, 8)                 104       
                                                                 
 dense_2 (Dense)             (None, 4)                 36        
                                                                 
 dense_3 (Dense)             (None, 1)                 5         
                                                                 
=================================================================
Total params: 253
Trainable params: 253
Non-trainable params: 0
#Model derleme işlemi yapılır
model.compile(loss='binary_crossentropy',optimizer="adam",metrics=["accuracy"])

Model derlendikten sonra derin öğrenme yapabilmek için modeli veri setindeki x_train ve y_train verileri ile eğitip, x_test ve y_test verileri ile başarı seviyesini "accuary" değeri ile değerlendirelim. 

#Model Öğrenme işlemi yapılır.
model.fit(
    x=x_train,
    y=y_train,
    epochs=10,
    batch_size=20,
    verbose=2,
    validation_data=(x_test,y_test)
)

 Çıktı:

Epoch 1/10
31/31 - 1s - loss: 1.7484 - accuracy: 0.5798 - val_loss: 1.2313 - val_accuracy: 0.5000 - 674ms/epoch - 22ms/step
Epoch 2/10
31/31 - 0s - loss: 0.9181 - accuracy: 0.5228 - val_loss: 0.8313 - val_accuracy: 0.4545 - 56ms/epoch - 2ms/step
Epoch 3/10
31/31 - 0s - loss: 0.7283 - accuracy: 0.4707 - val_loss: 0.7109 - val_accuracy: 0.4221 - 49ms/epoch - 2ms/step
Epoch 4/10
31/31 - 0s - loss: 0.6831 - accuracy: 0.4886 - val_loss: 0.6795 - val_accuracy: 0.6429 - 56ms/epoch - 2ms/step
Epoch 5/10
31/31 - 0s - loss: 0.6673 - accuracy: 0.6564 - val_loss: 0.6710 - val_accuracy: 0.6429 - 55ms/epoch - 2ms/step
Epoch 6/10
31/31 - 0s - loss: 0.6534 - accuracy: 0.6531 - val_loss: 0.6597 - val_accuracy: 0.6429 - 52ms/epoch - 2ms/step
Epoch 7/10
31/31 - 0s - loss: 0.6411 - accuracy: 0.6531 - val_loss: 0.6539 - val_accuracy: 0.6429 - 53ms/epoch - 2ms/step
Epoch 8/10
31/31 - 0s - loss: 0.6376 - accuracy: 0.6531 - val_loss: 0.6508 - val_accuracy: 0.6429 - 58ms/epoch - 2ms/step
Epoch 9/10
31/31 - 0s - loss: 0.6360 - accuracy: 0.6531 - val_loss: 0.6502 - val_accuracy: 0.6429 - 50ms/epoch - 2ms/step
Epoch 10/10
31/31 - 0s - loss: 0.6321 - accuracy: 0.6531 - val_loss: 0.6498 - val_accuracy: 0.6429 - 59ms/epoch - 2ms/step

Sonuçları grafiksel olarak görüntüleyelim.

fig=plt.figure(figsize=(20,6))

#Accuracy Grafiklemesi
x1=fig.add_subplot(121)
x1.plot(model.history.history['accuracy'])
x1.plot(model.history.history['val_accuracy'])
x1.set_title('Model accuracy')
x1.set_ylabel('Accuracy')
x1.set_xlabel('Epoch')
x1.legend(['Train', 'Test'], loc='upper left')

#Loss Grafiklemesi
x2=fig.add_subplot(122)
x2.plot(model.history.history['loss'])
x2.plot(model.history.history['val_loss'])
x2.set_title('Model loss')
x2.set_ylabel('Loss')
x2.set_xlabel('Epoch')
x2.legend(['Train', 'Test'], loc='upper left')

plt.show()

Çıktı:


Modele öğretme işlemi (fit) yaparken paramatre olarak girilen "validation_data=(x_test,y_test)" değeri belirtildiğinden dolayı Epoch 10/10 (en son oluşan epoch) satırında en son ulaşılabilecek sonuçlar listelenmişti. Ancak "validation_data" değerleri her zaman model öğrenme aşamasında verilmeyebilir, bu durumda "val_loss" ve "val_accuracy" değerleri görüntülenmeyecektir. Bu değerler "Evaluate Method" kullanılarak görüntülenebilir.

model.evaluate(x_test,y_test)

Çıktı:

5/5 [==============================] - 0s 2ms/step - loss: 0.6498 - accuracy: 0.6429
[0.6498218178749084, 0.6428571343421936]

Yukarıdaki çıktıda da görüldüğü gibi ilk değer "loss" değeri, ikinci değer de "accuracy" değerini temsi etmektedir. Veri setimize derin öğrenme işlemi uyguladıktan sonra başarı yüzdesi %64,28 olarak çıkmış oldu.

Başarı oranını artırmak için modele yeni katmanlar eklenebilir veya çıkartılabilir, katmanlara yeni nöronlar eklenebilir, epochs(döngü sayısı) artırılabilir, batch_size değeri değiştirilebilir gibi bazı değişiklikler yaparak başarı yüzdesi artırılabilir. Derin öğrenme işlemlerinde büyük veri setleri daha yüksek başarılı sonuçlar vermektedir. Örneğimizdeki veri setinin boyutunun küçük olması da sonucu etkileyecektir. Şimdi de model oluşturma işleminde bu saydığımız bazı maddeleri uygulayarak başarı yüzdesine tekrar bakalım.

#Yeni Model oluşturulur.
model=Sequential()

#Giriş Katmanı ve 1.Gizli Katman oluşturulur.
model.add(Dense(units=12,activation="relu",input_shape=(n_cols,)))

#1.Gizli katmandan 2.Gizli katmana girerken verinin %20'si rasgele atıldı
model.add(Dropout(rate=.2))

#2.Gizli Katman oluşturulur.
model.add(Dense(units=64,activation="relu"))

#2.Gizli katmandan 3.Gizli katmana girerken verinin %20'si rasgele atıldı
model.add(Dropout(rate=.2))

#3.Gizli Katman oluşturulur.
model.add(Dense(units=32,activation="relu"))

#3.Gizli katmandan 4.Gizli katmana girerken verinin %20'si rasgele atıldı
model.add(Dropout(rate=.2))

#4.Gizli Katman oluşturulur.
model.add(Dense(units=16,activation="relu"))

#4.Gizli katmandan 5.Gizli katmana girerken verinin %20'si rasgele atıldı
model.add(Dropout(rate=.2))

#5.Gizli Katman oluşturulur.
model.add(Dense(units=8,activation="relu"))

#Çıkış Katmanı
model.add(Dense(units=1,activation="sigmoid"))
#Model özeti
model.summary()

Çıktı:

Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_4 (Dense)             (None, 12)                108       
                                                                 
 dropout (Dropout)           (None, 12)                0         
                                                                 
 dense_5 (Dense)             (None, 64)                832       
                                                                 
 dropout_1 (Dropout)         (None, 64)                0         
                                                                 
 dense_6 (Dense)             (None, 32)                2080      
                                                                 
 dropout_2 (Dropout)         (None, 32)                0         
                                                                 
 dense_7 (Dense)             (None, 16)                528       
                                                                 
 dropout_3 (Dropout)         (None, 16)                0         
                                                                 
 dense_8 (Dense)             (None, 8)                 136       
                                                                 
 dense_9 (Dense)             (None, 1)                 9         
                                                                 
=================================================================
Total params: 3,693
Trainable params: 3,693
Non-trainable params: 0

Model özetinde de görüldüğü gibi yeni gizli katmanlar eklendi, katmanlardaki nöron sayıları artırıldı ve veri seti içerisinde aykırı değerleri kaldırmak için "Dropout" katmanı eklenerek verilerin %20'si rasgele atıldı.

#Model derleme işlemi yapılır
model.compile(loss='binary_crossentropy',optimizer="adam",metrics=["accuracy"])
#Model Öğrenme işlemi yapılır.
model.fit(
    x=x_train,
    y=y_train,
    epochs=500,
    batch_size=10,
    verbose=2,
    validation_data=(x_test,y_test)
)

Model öğrenme işleminde "epochs" sayısı artırıldı, "batch_size" değeri azaltıldı.

fig=plt.figure(figsize=(20,6))

#Accuracy Grafiklemesi
x1=fig.add_subplot(121)
x1.plot(model.history.history['accuracy'])
x1.plot(model.history.history['val_accuracy'])
x1.set_title('Model accuracy')
x1.set_ylabel('Accuracy')
x1.set_xlabel('Epoch')
x1.legend(['Train', 'Test'], loc='upper left')

#Loss Grafiklemesi
x2=fig.add_subplot(122)
x2.plot(model.history.history['loss'])
x2.plot(model.history.history['val_loss'])
x2.set_title('Model loss')
x2.set_ylabel('Loss')
x2.set_xlabel('Epoch')
x2.legend(['Train', 'Test'], loc='upper left')

plt.show()

Çıktı:

Modele tekrar değerlendirme işlemi yapalım.

model.evaluate(x_test,y_test)

Çıktı:

5/5 [==============================] - 0s 1ms/step - loss: 0.6362 - accuracy: 0.7143
[0.6362026929855347, 0.7142857313156128]

Yukarıdaki çıktıda da görüldüğü gibi yeni model ve farklı eğitme işlemleri sonrasında başarı yüzdesi %64,28 den %71.43 değerine yükselmiş oldu. Aynı zamandan da kayıp değerleri de %64.98 değerinden %63.62 değerine inmiş oldu. 

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.