Machine Learning Support Vector Regression

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

Kali ini kita akan belajar tentang model regresi lain yang disebut dengan SVR (Support Vector Regression). Model regresi ini merupakan penggunaan dari metodemachine learningyang lain yaitu klasifikasi menggunakan SVM (Support vector machines). Model ini walaupun memiliki namaregressiondi 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:

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 istilahsupport 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 istilahhyperplaneatauseparating 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 sebuahhyperplane.

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:

Gambar di atas menunjukkan sebuahhyperplane(garis diagonal di tengah) yang diapit oleh dua garis batas + dan garis batas – (dijelaskan di atas). Kita juga melihat ada ε sebagai jarak antarahyperplanedengan 2 garis batas tadi. Bisa dilihat ada beberapa datapoin yang dilingkari yang menjadipotential 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, garishyperplanenya 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
2. Memilih kernel dan parameternya serta regularisasinya (regularization)
3. Membuat korelasi matriks
4. Melatih modelnya untuk mendapatkan koefisien
5. Gunakan koefisien di atas, kemudian buat estimatornya

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 kernellinear, polinomial, radial basis functionataugaussian, 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 untukfeature scaling.Mengapa kita melakukanfeature 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 itufeature 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 mempersiapkanfeature scalinguntuk variabel X
* Line 14 adalah mempersiapkanfeature scalinguntuk 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 gaussianalias RBF (radial basis function). Mengapa memilih kernel ini? Pertama, kernel ini adalah kernel defaultdan 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

Sekilas grafik di atas tampak seperti grafik regresi polinomial, namun sebenarnya itu merupakan hasil dari model SVR. Garis biru yang tampak merupakanhyperplanedari model kita, yang sbeisa mungkin memasukkan semuadatapointske dalam zonaeuclideannya.

Perlu dicermati bahwa sumbu x dan y-nya bukanlah nilai awal, karena sudah melalui hasilfeature 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 denganhyperplane.Hal ini disebabkan karenahyperplanedari SVR menganggap titik tersebut sebagaioutlierkarena 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 melakukantransformsaja 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 fitdengan penulisan transform_fit seperti pada line 15.
* Line 34 adalah merubah 6.5 menjadi sebuaharray dengan perintah np.array[[6.5]]. Mengapa perlu menjadiarray? Karena jika di inspeksi (CTRL+i) perintah transform ia memerlukan sebuah nilaiarraydi dalamnya. Dan agar merubah angka 6.5 ke dalam sebuah array melaluilibrarynumpy maka perlu menuliskannya dengan ditutup dengan 2brackets (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 melakukanslicing (kita hanya butuh gaji sebagai sumbu y, dan level pekerjaan sebagai sumbu x)
* Line 6 menginstallpackagee1071. Jika sudah punyapackageini di Rstudio, maka tidak perlu menginstallnya
* Line 7 menyalakanpackagee1071 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:

* Line 10 menjelaskan bahwa kita memilih tipe ‘eps-regression’ karena kita ingin melakukan regresi dengansupport 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/menjalankanlibraryggplot2 untuk visualisasi modelnya
* Line 19 sampai 26 adalah perintah visualisasi modelnya. Jika dieksekusi maka akan tampak grafik sebagai berikut:

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 sisicoding 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 dalamhardware 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.