Derin Öğrenme (Deep Learning) - Sınıflandırma Örnekleri
Kalp Hastalığı Tahmini
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.