Derin Öğrenme (Deep Learning) - Regresyon Örnekleri

Ev Fiyatları Tahmini

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

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.

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.