Derin Öğrenme (Deep Learning) - Regresyon Örnekleri
Lisansüstü Eğitime Kabul Tahmini
Konu: Hindistanda bulunan üniversitelerin Lisansüstü programına kabul şansı yüzdesini Derin Öğrenme modeli ile tahmin etmek.
Veri seti: 500x 9 (satır x sütun) elemanı bulunan "Admission_Predict_Ver1.1.csv" veri setidir. Veri setinde bulunan değişkenler;
- GRE Puanları ( 340 üzerinden )
- TOEFL Puanları (120 üzerinden)
- Üniversite Puanı ( 5 üzerinden )
- Amaç Beyanı ve Tavsiye Mektubu Mukavemet (5 üzerinden)
- Lisans not ortalaması (10 üzerinden)
- Araştırma Deneyimi ( 0 veya 1 )
- Kabul Şansı (0'dan 1'e kadar)
Keşifsel Veri Analizi (EDA)
df=pd.read_csv("Admission_Predict_Ver1.1.csv")
df.head()
Çıktı:
df.tail()
Çıktı:
df.info()
Çıktı:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 500 entries, 0 to 499 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Serial No. 500 non-null int64 1 GRE Score 500 non-null int64 2 TOEFL Score 500 non-null int64 3 University Rating 500 non-null int64 4 SOP 500 non-null float64 5 LOR 500 non-null float64 6 CGPA 500 non-null float64 7 Research 500 non-null int64 8 Chance of Admit 500 non-null float64 dtypes: float64(4), int64(5) memory usage: 35.3 KB
df.shape
Çıktı:
(500, 9)
df.isnull().sum()
Çıktı:
Serial No. 0 GRE Score 0 TOEFL Score 0 University Rating 0 SOP 0 LOR 0 CGPA 0 Research 0 Chance of Admit 0 dtype: int64
Veri seti hakkında gerekli olan sütun düzenlemelerini yaparak veri setini temizleyelim.
#Serial No. değeri sayısal olarak bir üstünlük belirtmediğinden kaldıralım
df.drop(["Serial No."],axis=1,inplace=True)
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 değişkenler basit bir şekilde görselleştirildi.
df.hist(figsize=(15,10));
Çıktı:
Derin Öğrenme model oluşturma aşamaları ve işlemleri
#x(bağımsız) y(hedef) değişkeni tanımlanır
x,y=df.drop("Chance of Admit ",axis=1),df[["Chance of Admit "]]
#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)
#Son durumda X değerleri görünümü
pd.DataFrame(X,columns=x.columns).head()
Çıktı:
#Model giriş katmanı değeri(veri seti değişken sayısı)
n_cols=X.shape[1]
#Model oluşturularak katmanlar eklenir
model=Sequential()
model.add(Dense(512,activation='relu',input_shape=(n_cols,)))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1,activation="linear"))
#Model derlenir
model.compile(optimizer="adam",loss="mse",metrics=["mse"])
#train ve test verileri tanımlanır
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=42,test_size=.2)
#Veri seti öğrenme işlemi yapılır
model.fit(x=x_train,y=y_train,batch_size=128,epochs=50,verbose=1,validation_data=(x_test,y_test))
Çıktı:
... Epoch 48/50 4/4 [==============================] - 0s 12ms/step - loss: 0.0037 - mse: 0.0037 - val_loss: 0.0036 - val_mse: 0.0036 Epoch 49/50 4/4 [==============================] - 0s 13ms/step - loss: 0.0036 - mse: 0.0036 - val_loss: 0.0038 - val_mse: 0.0038 Epoch 50/50 4/4 [==============================] - 0s 12ms/step - loss: 0.0033 - mse: 0.0033 - val_loss: 0.0038 - val_mse: 0.0038
model.summary()
Çıktı:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 512) 4096 dense_1 (Dense) (None, 256) 131328 dense_2 (Dense) (None, 128) 32896 dense_3 (Dense) (None, 64) 8256 dense_4 (Dense) (None, 32) 2080 dense_5 (Dense) (None, 16) 528 dense_6 (Dense) (None, 8) 136 dense_7 (Dense) (None, 1) 9 ================================================================= Total params: 179,329 Trainable params: 179,329 Non-trainable params: 0
Model başarı değerlendirmesi
Veri setinin model ile eğitilmesi sonucu oluşan "mse" değerlerinin train ve test verilerinde göstermiş olduğu değerlerin grafiklemesine bakalım.
fig=plt.figure(figsize=(10,6))
#mse Grafiklemesi
plt.plot(model.history.history['mse'])
plt.plot(model.history.history['val_mse'])
plt.title('Mean Squared Error')
plt.ylabel('mse')
plt.xlabel('Epoch')
plt.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.
Model başarı yüzdesini görebilmek için "r2_score" kullanılabilir.
#x_test verileri tahminleme işlemi
pred=model.predict(x_test)
#r2_score değerinin yüzdelik gösterimi
r2_score(y_test,pred)*100
Çıktı:
81.58915120376551
Sonuç olarak; Derin Öğrenme modeli ile veri setine tahmin etme işlemi uygulandı ve %81,58 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.