Machine Learning: Support Vector Regression

Catatan penting : Jika Anda benar-benar awam tentang apa itu Python, silakan klik artikel saya ini. Jika Anda awam tentang R, silakan klik artikel ini.

Kali ini kita akan belajar tentang model regresi lain yang disebut dengan SVR (Support Vector Regression). Model regresi ini merupakan penggunaan dari metode machine learning yang lain yaitu klasifikasi menggunakan SVM (Support vector machines). Model ini walaupun memiliki nama regression di belakangnya, namun kita tidak melakukan regresi yang umum (di bahas di materi-materi sebelumnya).

Informasi lengkap tentang pembahasan ini bisa melalui tautan ini,  namun tentunya pembahasan di link tersebut sangatlah akademis. Maka akan saya buat cara yang sangat sederhana sehingga para pembaca bisa memahaminya dengan mudah.

Untuk lebih mudahnya mari kita melihat gambar di bawah ini:

Ilustrasi SVM

Melalui gambar di atas kita dapat melihat ada 3 garis sejajar diagonal dari kiri bawah menuju kanan atas. Saya akan membaginya menjadi 3 garis:

  • Garis paling atas (garis putus-putus) adalah garis batas +, artinya garis ini merupakan garis yang melewati/melalui poin (satu data poin) yang menjadi bagian dari kluster +. Titik-titik (data points) ini sering disebut juga dengan istilah support vectors. Titik yang dilewati garis ini adalah titik terluar dari kluster + sekaligus menjadi batas bagi kluster +. Jarak antara garis ini dengan garis tengah haruslah tegak lurus (perpendicular).
  • Garis tengah adalah garis pembatas antara kedua zona (+ dan -), yang dalam SVM disebut dengan istilah hyperplane atau separating plane/line. Garis ini memisahkan dua kluster, yaitu klaster + dan -. Atau bisa saja kita sebut dengan kluster A dan B, 1 dan 2, dan seterusnya (penamaan bebas, namun konvensi umum menggunakan + dan -).
  • Garis paling bawah (garis putus-putus) adalah garis batas -, artinya garis ini merupakan garis yang memiliki melewati satu data poin yang menjadi bagian dari kluster -. Penjelasannya sama dengan garis batas +.

Perlu diingat bahwa jarak antara garis paling atas dengan garis tengah, adalah sama dengan jarak antara garis paling bawah dengan garis tengah. Jarak ini kita sebut dengan epsilon dengan simbol ε.

Inti dari gambar di atas (kita bahas konsep SVM dulu secara umum agar mudah memahami SVR nantinya), adalah bagaimana agar bisa membagi dua zona (dua kluster) dengan sebisa mungkin memaksimalkan jarak epsilon (ε) nya, sehingga didapat sebuah pembagian yang paling optimal. Pembagian optimal itu seperti apa? Adalah didapat dua zona yang semua data poin masuk ke dalam salah satu dari dua zona ini, dengan tingkat kepastian yang presisi (jarak epsilon paling besar).

Jadi bisa dipahami ya apa itu SVM.

Sebagai ringkasan, SVM adalah sebuah cara membagi sebuah dataset ke dalam 2 jenis dataset dengan menggunakan sebuah hyperplane.

Lalu apa bedanya dengan SVR? Jika SVM itu tujuannya membagi dataset (klasifikasi) ke dalam 2 zona, maka SVR sebaliknya, yaitu bagaimana caranya agar semua dataset masuk ke dalam satu zona, dengan tetap meminimasi nilai epsilon (ε).

SVM membagi menjadi dua, SVR memasukkan semuanya menjadi satu. Mudah dimengerti ya sampai di sini.

Sebagai ilustrasi SVR, dapat dilihat melalui gambar di bawah ini:

Ilustrasi SVR

Gambar di atas menunjukkan sebuah hyperplane (garis diagonal di tengah) yang diapit oleh dua garis batas + dan garis batas – (dijelaskan di atas). Kita juga melihat ada ε sebagai jarak antara hyperplane dengan 2 garis batas tadi. Bisa dilihat ada beberapa datapoin yang dilingkari yang menjadi potential support vectors. Artinya titik-titik (data points) ini merupakan data poin yang bisa menjadi calon pembatas, sehingga semua data poin bisa masuk ke dalam satu kluster, dengan tetap sebisa mungkin meminimasi nilai ε nya. Sehingga jika divisualisasikan, garis hyperplane nya sebisa mungkin melewati semua titik-titik data (data points) tadi. Gambarnya akan tampak seperti grafik regresi pada umunya.

 

Sekarang mari kita bahas langkah-langkah menggunakan SVR:

  1. Menyiapkan training set \tau=\left \{ \underset{X}\rightarrow+\underset{Y}\rightarrow \right \}
  2. Memilih kernel dan parameternya serta regularisasinya (regularization)
  3. Membuat korelasi matriks \underset{K}\rightarrow
  4. Melatih modelnya untuk mendapatkan koefisien \underset{\alpha}\rightarrow =\left \{ \alpha_{i} \right \}
  5. Gunakan koefisien di atas, kemudian buat estimatornya f (\underset{X}\rightarrow, \underset{\alpha}\rightarrow, x^{*} ) = y^{*}

Barangkali ada sebagian yang melihat langkah-langkah di atas terlalu rumit, karena ada proses kalkulasi yang melibatkan vektor. Selain itu ada juga istilah kernel, yang merupakan sebuah istilah yang menjelaskan tentang  cara merubah data dari dua dimensi menjadi multi dimensi. Ada beberapa kernel yang populer dipakai di ML yaitu kernel linear, polinomial, radial basis function atau gaussian, dan sigmoid. Tenang saja, tidak perlu mengerti semuanya saat ini. Semua ini akan menjadi sangat mudah ketika mencobanya memecahkan sebuah contoh nyata.

 

 

STUDI KASUS

Kali ini kita akan melakukan sebuah prediksi regresi menggunakan SVR. Kasusnya sama persis dengan kasus gaji di pembahasan regresi polinomial. Secara ringkas, perusahaan ingin mencari tahu apakah calon pegawai jujur atau tidak tentang gaji yang ia sampaikan di perusahaan sebelumnya tempat ia bekerja.

Untuk memulai silakan download datasetnya di link ini.

Perlu dicatat melalui pembahasan sebelumnya di regresi polinomial bahwa data kita bukanlah linear!

 

Bahasa Python

# Mengimpor library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Mengimpor dataset
dataset = pd.read_csv('Posisi_gaji.csv')
X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2:3].values

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_y = StandardScaler()
X = sc_X.fit_transform(X)
y = sc_y.fit_transform(y)

# Fitting SVR ke dataset
from sklearn.svm import SVR
regressor = SVR(kernel = 'rbf')
regressor.fit(X, y)

# Visualisasi hasil SVR
plt.scatter(X, y, color = 'red')
plt.plot(X, regressor.predict(X), color = 'blue')
plt.title('Jujur atau tidak (SVR)')
plt.xlabel('Tingkat posisi')
plt.ylabel('Gaji')
plt.show()

# Memprediksi hasil 
# y_pred = regressor.predict(6.5)
# y_pred = regressor.predict(sc_X.transform(6.5))
# y_pred = regressor.predict(sc_X.transform(np.array([[6.5]])))
y_pred = sc_y.inverse_transform(regressor.predict(sc_X.transform(np.array([[6.5]]))))

# Visualisasi hasi SVR (resolusi tinggi dan kurva yang lebih halus)
X_grid = np.arange(min(X), max(X), 0.01) # Pilih 0.01 dan bukan 0.1, karena datanya sudah melalui feature scaling
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X, y, color = 'red')
plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
plt.title('Jujur atau tidak (SVR)')
plt.xlabel('Tingkat posisi')
plt.ylabel('Gaji')
plt.show()

Penjelasan:

  • Line 2 sampai 4 mengimpor library apa saja yang diperlukan
  • Line 7 sampai 9 mengimpor datasetnya
  • Line 12 mengimpor library untuk feature scaling. Mengapa kita melakukan feature scaling? Karena perbedaan antara gaji (satuannya jutaan) dengan level bekerja sangatlah jauh, sehingga jika dibuat grafiknya nantinya hanya akan terlihat garis lurus saja. Oleh karena itu feature scaling (FS) menyamakan satuannya sehingga mudah untuk divisualisasikan dan diinterpretasikan.

Perlu juga diingat alasan mengapa kita membutuhkan FS. Library ML lainya seperti regresi linear dan regresi polinomial sudah memiliki fitur FS di dalamnya, sehingga tidka perlu melakukan FS lagi. Namun library SVM tidak memiliki fitur FS, sehingga kali ini kita perlu melakukan FS.

  • Line 13 adalah mempersiapkan feature scaling untuk variabel X
  • Line 14 adalah mempersiapkan feature scaling untuk variabel y
  • Line 15 adalah proses melakukan FS kepada variabel X
  • Line 16 adalah proses melakukan FS kepada variabel y
  • Line 19 mengimpor sub library SVR dari library SVM
  • Line 20 mempersiapkan model SVR  dengan menggunakan kernel gaussian alias RBF (radial basis function). Mengapa memilih kernel ini? Pertama, kernel ini adalah kernel default dan paling umum dipakai. Kedua, kernel ini juga cocok untuk data non linear.
  • Line 21 membuat model SVR kita dari dataset kita (training set)
  • Line 24 sampai 29 adalah untuk melihat visualisasi dari model SVR kita.

Grafiknya tampak sebagai berikut

Model SVR

Sekilas grafik di atas tampak seperti grafik regresi polinomial, namun sebenarnya itu merupakan hasil dari model SVR. Garis biru yang tampak merupakan hyperplane dari model kita, yang sbeisa mungkin memasukkan semua datapoints ke dalam zona euclideannya.

Perlu dicermati bahwa sumbu x dan y-nya bukanlah nilai awal, karena sudah melalui hasil feature scaling sebelumnya. Oleh karena itu, bisa dilihat bahwa FS sangat membantu visualisasi hasil pemodelan SVR. Karena jika tidak maka sumbu y dan sumbu x tidak akan tampak hubungan yang jelas yang disebabkan satuan x dan y terpaut jauh.

Selain itu, di gambar tersebut dapat dilihat titik merah paling kanan (posisi CEO) tidak terhubung dengan hyperplane. Hal ini disebabkan karena hyperplane dari SVR menganggap titik tersebut sebagai outlier karena jaraknya terhadap titik-titik (datapoints) yang lain terlalu jauh. Sehingga tidak menjadi bagian dari kluster SVR.

  • Line 32 sampai 34 adalah alur berpikir menentukan prediksi y nya
  • Line 32 adalah perintah umum untuk melakukan prediksi regresi. Namun karena nilai 6.5 (level ke 6.5) yang ingin kita prediksi perlu dilakukan FS (feature scaling), maka perintah FS dilakukan di line 33.
  • Line 33 adalah perintah melakukan FS untuk nilai 6.5 dengan cara menuliskan sc_X.transform. Artinya kita menggunakan sc_X yang merupakan variabel yang sudah disiapkan untuk melakukan FS terhadap nilai variabel X. Kemudian kita cukup melakukan transform saja dan tidak perlu fit, karena kita hanya ingin melakukan FS saja untuk kemudian memprediksi nilai y-nya, dan bukan membuat model SVR (lagi). Kalau ingin membuat model SVR lagi, maka diperlukan transform dan fit dengan penulisan transform_fit seperti pada line 15.
  • Line 34 adalah merubah 6.5 menjadi sebuah array dengan perintah np.array[[6.5]]. Mengapa perlu menjadi array? Karena jika di inspeksi (CTRL+i) perintah transform ia memerlukan sebuah nilai array di dalamnya. Dan agar merubah angka 6.5 ke dalam sebuah array melalui library numpy maka perlu menuliskannya dengan ditutup dengan 2 brackets (kurung kotak).
  • Line 35 adalah perintah yang kita pakai. Perlu diingat, jika kita mengeksekusi line 34, maka yang didapat adalah nilai prediksi y dengan satuan yang sudah melalui proses FS. Bukan itu yang kita inginkan. Kita menginginkan nilai prediksi y dalam satuan juta dolar. Oleh karena itu prosesnya perlu dibalik, dengan cara melakukan inverse. Jika dieksekusi maka akan menghasilkan nilai prediksi y adalah 170K dolar per tahun. Nilai yang tidak jauh dari regresi polinomial. Walau demikian modelnya masih cukup baik dan berhasil memprediksi nilai gaji berdasarkan level pekerjanya.

 

Bahasa R

# Mengimpor dataset
dataset = read.csv('Posisi_gaji.csv')
dataset = dataset[2:3]

# Membuat model SVR
install.packages('e1071')
library(e1071)
regressor = svm(formula = Gaji ~ .,
                data = dataset,
                type = 'eps-regression',
                kernel = 'radial')

# Memprediksi level ke 6.5
y_pred = predict(regressor, data.frame(Level = 6.5))

# Visualisasi SVR
# install.packages('ggplot2')
library(ggplot2)
ggplot() +
geom_point(aes(x = dataset$Level, y = dataset$Gaji),
            colour = 'red') +
geom_line(aes(x = dataset$Level, y = predict(regressor, newdata = dataset)),
           colour = 'blue') +
           ggtitle('Jujur atau tidak (SVR)') +
           xlab('Tingkat') +
           ylab('Gaji')
  • Line 2 mengimpor datasetnya
  • Line 3 melakukan slicing (kita hanya butuh gaji sebagai sumbu y, dan level pekerjaan sebagai sumbu x)
  • Line 6 menginstall package e1071. Jika sudah punya package ini di Rstudio, maka tidak perlu menginstallnya
  • Line 7 menyalakan package e1071 yang sudah diinstall melalui perintah sebelumnya
  • Line 8 membuat model SVR nya dengan membuat nama modelnya adalah regressor. Kemudian diikuti dengan perintah svm. Untuk mengetahui parameter apa saja yang diperlukan, cukup arahkan kursor ke svm lalu klik kiri. Setelah itu tekan F1 maka akan tampak sebagai berikut:

Parameter SVR di Rstudio

  • Line 10 menjelaskan bahwa kita memilih tipe ‘eps-regression’ karena kita ingin melakukan regresi dengan support vectors. Jika ingin melakukan SVM pada umumnya pilihlah TIPE ‘C-classification’
  • Line 11 menjelaskan bahwa kita memilih kernel ‘radial’, karena datanya tidak linear. Radial sama saja dengan gaussian. Bisa saja kita memilih polynomial, tapi kali ini kita memilih yang sering dipakai secara umum yaitu ‘radial’.
  • Line 14 memprediksi nilai y untuk level 6.5. Jika dieksekusi maka hasilnya 177K dolar per tahun.
  • Line 18 menyalakan/menjalankan library ggplot2 untuk visualisasi modelnya
  • Line 19 sampai 26 adalah perintah visualisasi modelnya. Jika dieksekusi maka akan tampak grafik sebagai berikut:

Model SVR di Rstudio

Tampak bahwa modelnya cukup baik memprediksi nilai gaji pegawai berdasarkan tingkatan pekerjaannya.

Sampai sini tampak bahwa menggunakan R untuk beberapa kasus ML lebih mudah daripada python, baik dari sisi coding dan logika berpikirnya. Namun kedua bahasa ini memiliki plus dan minusnya. R memang spesifik untuk statistik dan ML, namun python lebih umum (general) dan banyak diintegrasikan ke dalam hardware iseperti robot misalnya.

 

Baik sampai sini saya harap pembaca bisa mendapatkan gambaran tentang apa itu SVR dan bagaimana cara memodelkannya melalui studi kasus di dunia nyata.

Jika ingin belajar topik AI yang lain silakan klik link ini.

 

Semoga bermanfaat.

 

Leave a Reply

avatar
  Subscribe  
Notify of