Derin Öğrenme (Deep Learning) - Regresyon Örnekleri
Ev Fiyatları Tahmini
Konu: Bir bölgede bulunan ev fiyatlarını Derin Öğrenme modeli ile tahmin etmek.
Veri seti: 21613 x 21 (satır x sütun) elemanı bulunan "kc_house_data.csv" veri setidir.
Keşifsel Veri Analizi (EDA)
df=pd.read_csv("kc_house_data.csv")
df.head()
Çıktı:
df.tail()
Çıktı:
df.info()
Çıktı:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 21613 entries, 0 to 21612 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 21613 non-null int64 1 date 21613 non-null object 2 price 21613 non-null float64 3 bedrooms 21613 non-null int64 4 bathrooms 21613 non-null float64 5 sqft_living 21613 non-null int64 6 sqft_lot 21613 non-null int64 7 floors 21613 non-null float64 8 waterfront 21613 non-null int64 9 view 21613 non-null int64 10 condition 21613 non-null int64 11 grade 21613 non-null int64 12 sqft_above 21613 non-null int64 13 sqft_basement 21613 non-null int64 14 yr_built 21613 non-null int64 15 yr_renovated 21613 non-null int64 16 zipcode 21613 non-null int64 17 lat 21613 non-null float64 18 long 21613 non-null float64 19 sqft_living15 21613 non-null int64 20 sqft_lot15 21613 non-null int64 dtypes: float64(5), int64(15), object(1) memory usage: 3.5+ MB
df.shape
Çıktı:
(21613, 21)
df.isnull().sum()
Çıktı:
id 0 date 0 price 0 bedrooms 0 bathrooms 0 sqft_living 0 sqft_lot 0 floors 0 waterfront 0 view 0 condition 0 grade 0 sqft_above 0 sqft_basement 0 yr_built 0 yr_renovated 0 zipcode 0 lat 0 long 0 sqft_living15 0 sqft_lot15 0 dtype: int64
Veri seti hakkında gerekli olan sütun düzenlemelerini yaparak veri setini temizleyelim.
#id,lat,long değerleri sayısal olarak bir üstünlük belirtmediğinden kaldıralım
df.drop(["id","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)
#zipcode değeri sayısal olarak bir üstünlük belirtmediğinden category değişkenine dönüştürülebilir.
df["zipcode"]=df["zipcode"].astype("category")
#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)
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("price",axis=1),df[["price"]]
#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ı:
... 136/136 [==============================] - 1s 5ms/step - loss: 11493208064.0000 - mse: 11493208064.0000 - val_loss: 20833437696.0000 - val_mse: 20833437696.0000 Epoch 49/50 136/136 [==============================] - 1s 5ms/step - loss: 11614675968.0000 - mse: 11614675968.0000 - val_loss: 20446461952.0000 - val_mse: 20446461952.0000 Epoch 50/50 136/136 [==============================] - 1s 5ms/step - loss: 11602239488.0000 - mse: 11602239488.0000 - val_loss: 20343592960.0000 - val_mse: 20343592960.0000
model.summary()
Çıktı:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 512) 45056 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: 220,289 Trainable params: 220,289 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ı:
86.54317032538086
Sonuç olarak; Derin Öğrenme modeli ile veri setine tahmin etme işlemi uygulandı ve %86,54 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.