Derin Öğrenme (Deep Learning) - Sınıflandırma Örnekleri

Kalp Hastalığı Tahmini

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

Konu: Kalp hastalığına yakalanma durumunu Derin Öğrenme modeli ile tahmin etmek.

Veri seti: 319795 x 18 (satır x sütun) elemanı bulunan  "heart_2020_cleaned.csv" veri setidir. 

Keşifsel Veri Analizi (EDA)

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

Çıktı:

df.tail()

Çıktı:

df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 319795 entries, 0 to 319794
Data columns (total 18 columns):
 #   Column            Non-Null Count   Dtype  
---  ------            --------------   -----  
 0   HeartDisease      319795 non-null  object 
 1   BMI               319795 non-null  float64
 2   Smoking           319795 non-null  object 
 3   AlcoholDrinking   319795 non-null  object 
 4   Stroke            319795 non-null  object 
 5   PhysicalHealth    319795 non-null  float64
 6   MentalHealth      319795 non-null  float64
 7   DiffWalking       319795 non-null  object 
 8   Sex               319795 non-null  object 
 9   AgeCategory       319795 non-null  object 
 10  Race              319795 non-null  object 
 11  Diabetic          319795 non-null  object 
 12  PhysicalActivity  319795 non-null  object 
 13  GenHealth         319795 non-null  object 
 14  SleepTime         319795 non-null  float64
 15  Asthma            319795 non-null  object 
 16  KidneyDisease     319795 non-null  object 
 17  SkinCancer        319795 non-null  object 
dtypes: float64(4), object(14)
memory usage: 43.9+ MB
df.shape

Çıktı:

(319795, 18)

Veri seti hakkında gerekli olan sütun düzenlemelerini yaparak veri setini temizleyelim.

#HeartDisease sütununda Yes ve No ifadeleri yerine 1 ve 0 değerleri atandı
df["HeartDisease"]=df["HeartDisease"].map({"Yes":1,"No":0})

Veri setinin istatistik bilgilerini gözlemleyerek veri seti hakkında genel bir bilgi edinilir.

df.describe().T

Çıktı:

Veri setinde sütunların birbirleri ile olan korelasyonu incelendi.

plt.figure(figsize=(15,10))
sns.heatmap(df.corr(),annot=True,linewidths=2)

Çıktı:

Veri setindeki sayısal ve object değişkenler basit bir şekilde görselleştirildi.

plt.figure(figsize=(20,10))
for i,column in enumerate(df.select_dtypes("number").columns):
    if column!="HeartDisease":
        ax=plt.subplot(2,3,i)
        sns.kdeplot(df[column],hue=df["HeartDisease"])
        plt.xticks(rotation=30)

Çıktı:

plt.figure(figsize=(20,25))
for i,column in enumerate(df.select_dtypes("object").columns):
    ax=plt.subplot(5,3,i+1)
    sns.countplot(df[column],hue=df["HeartDisease"])
    plt.xticks(rotation=30)   

Çıktı:

Train ve Test verilerinin ayrılması işlemleri

#Hedef(y) ve bağımsız değişkenler(y) ataması yapılır. 
x,y=df.drop("HeartDisease",axis=1),df[["HeartDisease"]]

#get_dummies ile kategorik değerler uygun hale getirilir
x=pd.get_dummies(x,drop_first=True)

#MinMaxScaler(x değerleri 0-1 aralığında) işlemi
X=MinMaxScaler().fit_transform(x)

#Train ve Test verileri atanır
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=42,test_size=0.2)

print("x_train boyutu:",x_train.shape)
print("x_test boyutu:",x_test.shape)
print("y_train boyutu:",y_train.shape)
print("y_test boyutu:",y_test.shape)

Çıktı:

x_train boyutu: (255836, 37)
x_test boyutu: (63959, 37)
y_train boyutu: (255836, 1)
y_test boyutu: (63959, 1)

Model Oluşturma ve Model Eğitme İşlemleri

#Girdi değişkeni boyutu
n_cols=x_train.shape[1]

#Model oluşturularak katmanlar eklenir
model=Sequential()
model.add(Dense(512,activation='relu',input_shape=(n_cols,)))
model.add(Dropout(rate=.2))
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=.2))
model.add(Dense(128, activation='relu'))
model.add(Dropout(rate=.2))
model.add(Dense(64, activation='relu'))
model.add(Dropout(rate=.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(rate=.2))
model.add(Dense(16, activation='relu'))
model.add(Dropout(rate=.2))
model.add(Dense(8, activation='relu'))
model.add(Dense(1,activation="sigmoid"))
model.summary()

Çıktı:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 512)               19456     
                                                                 
 dropout (Dropout)           (None, 512)               0         
                                                                 
 dense_1 (Dense)             (None, 256)               131328    
                                                                 
 dropout_1 (Dropout)         (None, 256)               0         
                                                                 
 dense_2 (Dense)             (None, 128)               32896     
                                                                 
 dropout_2 (Dropout)         (None, 128)               0         
                                                                 
 dense_3 (Dense)             (None, 64)                8256      
                                                                 
 dropout_3 (Dropout)         (None, 64)                0         
                                                                 
 dense_4 (Dense)             (None, 32)                2080      
                                                                 
 dropout_4 (Dropout)         (None, 32)                0         
                                                                 
 dense_5 (Dense)             (None, 16)                528       
                                                                 
 dropout_5 (Dropout)         (None, 16)                0         
                                                                 
 dense_6 (Dense)             (None, 8)                 136       
                                                                 
 dense_7 (Dense)             (None, 1)                 9         
                                                                 
=================================================================
Total params: 194,689
Trainable params: 194,689
Non-trainable params: 0
#Model derlenir
model.compile(optimizer="adam",loss="binary_crossentropy",metrics=["accuracy"])

#Veri seti öğrenme işlemi yapılır
model.fit(x=x_train,y=y_train,batch_size=64,epochs=10,verbose=1,validation_data=(x_test,y_test))

Çıktı:

...
Epoch 8/10
3998/3998 [==============================] - 23s 6ms/step - loss: 0.2263 - accuracy: 0.9164 - val_loss: 0.2446 - val_accuracy: 0.9137
Epoch 9/10
3998/3998 [==============================] - 24s 6ms/step - loss: 0.2261 - accuracy: 0.9161 - val_loss: 0.2403 - val_accuracy: 0.9146
Epoch 10/10
3998/3998 [==============================] - 22s 6ms/step - loss: 0.2259 - accuracy: 0.9160 - val_loss: 0.2344 - val_accuracy: 0.9137

 

Model başarı değerlendirmesi

Veri setinin model ile eğitilmesi sonucu oluşan "accuracy" ve "loss" değerlerinin train ve test verilerinde göstermiş olduğu değerlerin grafiklemesine bakalım.

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ı:

Yukarıdaki grafik gösteriyorki train ve test verileri yaklaşık olarak birbirlerine benzer sonuçlar oluşturmuştur. İki değer de birbirlerine yakın sonuçlar almıştır.

_,accuracy=model.evaluate(x_test,y_test)
print("Accuracy: %.2f" % (accuracy*100))

Çıktı:

1999/1999 [==============================] - 4s 2ms/step - loss: 0.2344 - accuracy: 0.9137
Accuracy: 91.37

Sonuç olarak; Derin Öğrenme modeli ile veri setine tahmin etme işlemi uygulandı ve %91.37 oranında başarı elde edilmiş oldu. Başarı oranı artırılmak istenebilir, bunun için birkaç adım denenebilir, bu adımlardan bazıları yüksek bilgisayar gücü gerektirebilecektir. Bunlar;

  • Veri seti temizlemesi daha iyi yapılabilir.
  • Model katmanlarına "Dropout" katmanları da eklenebilir.
  • Model gizli katmanları artırılabilir.
  • Gizli katmanlardaki nöron sayısı artırılabilir.
  • Model fit işleminde epoch değeri artırılabilir.

Gibi yukarıda sayılan işlemler yapıldığında model başarısı artırılabilecektir.

Modeli Kaydetme işlemleri

#Model kayıt işlemi
model_json=model.to_json()
with open("modelHeartDiseasePrediction.json", "w") as json_file:
    json_file.write(model_json)

#Model ağırlıkları kayıt işlemi
model.save_weights("modelHeartDiseasePrediction.h5")

print("Model ve ağırlıkları dosya konumuna kaydedildi.")

Çıktı:

Model ve ağırlıkları dosya konumuna kaydedildi.
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.