Friday, May 31, 2019

Keras untuk permasalahan regresi

Pada posting sebelumnya telah didemokan penggunaan Keras sebagai solusi permasalahan klasifikasi. Pada banyak kasus nyata, permasalahan yang dihadapi adalah regresi bukan klasifikasi. Misal, pada prediksi cuaca, prediksi jumlah pengunjung, prediksi temperature, dll, dimana output dari model adalah nilai numerik, bukan kategori diskrit. Deep learning didesain untuk dapat menangani baik permasalahan klasifikasi maupun regresi (juga clustering). Pada posting ini akan didemokan bagaimana Deep Learning bisa menyelesaikan permasalah regresi sederhana.


Problem

Permasalahan yang kita angkat sebagai contoh adalah fungsi matematik sederhana berikut,

$$ f(x) = 2x + 3 $$

Dimana $x$ merupakan input dan $f(x)$ merupakan nilai output. Misal, kita ingin membuat model yang bisa memberikan prediksi nilai $f(x)$ diberikan nilai input $x$ dimana sebelumnya model kita latih dengan range nilai $x$ yang diberikan. Model deep learning ini akan kita implementasikan dengan Keras.

Implementasi
Implementasi deep learning ini akan mengikuti pola yang saya tulis disini: https://bagustris.blogspot.com/2019/04/implementasi-deep-learning-dengan-keras.html

Input-Output data

Input-output data, sesuai persamaan di atas, didefinisikan dalam python numpy sebagai berikut.
import numpy as np
x_train = np.arange(0, 10.01, 0.01)
y_train = 2*x_train + 3             #**2 + 3


Model

Untuk membuat model, kita buat fungsi `build_model`. Model yang kita bangun terdiri dari tiga layer: 2 dense (fully connected) layer dan satu output layer. Input layer akan masuk pada dense layer pertama. Model tersebut bisa kita gambarkan sebagai berikut.

Berikut fungsi `build_model` untuk membangun model seperti gambar di atas.

def build_model():
    # create model
    model = Sequential()
    model.add(Dense(128, input_dim=1, activation='relu'))
    model.add(Dense(128, activation='relu'))
    #model.add(Dropout(0.5))
    model.add(Dense(1)) #kernel_initializer='normal'
    # compile model
    model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae'])
    return model


Model summary

Untuk memanggil dan meresume hasil buil_model tersebut, dua perintah berikut dapat digunakan.

model = build_model()
model.summary()

Training model

Untuk melatih model, digunakan instance .fit. Kita gunakan batch size sebanyak 16 dan epoch sebanyak 20 kali. Sebanyak 30% dari traininig data kita gunakan untuk validation/development. Untuk mengukur performance, kita gunakan mean absolte error (mae), dan kita tampilkan nilai minimumnya.
hist = model.fit(x_train, y_train, epochs=20, batch_size=16, validation_split=0.3)
print(min(hist.history['val_mean_absolute_error']))

Evaluasi

Untuk mengaluasi model, model.evaluate bisa kita gunakan, atau langsung kita gunakan model untuk memprediksi nilai yang kita inginkan. Misal kira ingin memprediksi nilai f(x) dari x=4 sehingga hasilnya adalah 2*4+3 = 11, dan untuk x=9 maka f(x) = 2*9+3=21.
# evaluate model
loss, score = model.evaluate([4, 11], [8, 22])

# Or directly predict value of test data
pred_4_11 = model.predict([4, 11])

print(pred_4_11)

Output error dan prediksi dari kode di atas adalah sebagai berikut,
MAE = 0.14173693306422314
Prediksi = [[11.000016]
            [25.405918]]

Error yang didapat (mean absolute error, MAE) cukup kecil, dan hasil prediksinya cukup mendekati nilai sebenarnya. Untuk input x=4 maka f(x) seharusnya 2*4+3=11, sedang untuk x=11, f(x) = 2*11+3 = 25. Sedangkan hasil prediksinya adalah 11.00 dan 25.40.

Perbedaan dengan permasalahan klasifikasi
Perbeedaan implementasi regresi dan klasifikasi terletak pada layer terakhir: baik jumlahnya maupun fungsi aktivasinya. Jika output hanya satu, maka banyaknya node/unit pada layer terahir juga satu. Khusus untuk regresi, kita tidak perlu mendefinisikan fungsi aktivasi yang digunakan, alias fungsi yang dipakai adalah linear (default dense layer pada keras). Pada permasalahan klasifikasi, umumnya fungsi yang dipakai di layer terakhir adalah softmax.

Sesedarhana itu. Kode lengkapnya ada di bawah ini.

# Simple keras for regression task

import numpy as np
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout

x_train = np.arange(0, 10.01, 0.01)
y_train = 2*x_train + 3             #**2 + 3

def build_model():
    # create model
    model = Sequential()
    model.add(Dense(128, input_dim=1, activation='relu'))
    model.add(Dense(128, activation='relu'))
    #model.add(Dropout(0.5))
    model.add(Dense(1)) #kernel_initializer='normal'
    # compile model
    model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae'])
    return model

model = build_model()
model.summary()

# train model, use 30% of train data for validation/development
hist = model.fit(x_train, y_train, epochs=20, batch_size=16, validation_split=0.3)
print(min(hist.history['val_mean_absolute_error']))

# Evaluate model
loss, score = model.evaluate([4, 11], [8, 22])

# Or directly predict value of test data
pred_4_11 = model.predict([4, 11])
print(pred_4_11)

Bonus Track:

Untuk menggambar diagram alir dari layer ke layer, gunakan perintah berikut:
from keras.utils import plot_model 
plot_model(model,show_shapes=True, show_layer_names=False, to_file='model_regresi.png')  

Hasilnya adalah sebagai berikut. Sangat intuitif untuk memahami model yang digunakan.

No comments:

Post a Comment

Your comments here/Silahkan komentar disini...

Related Posts Plugin for WordPress, Blogger...