SUPERVISED LEARNING : CARA KERJA SVM (SUPPORT VECTOR MACHINE)

 

A. Pengertian 

    SVM memecahkan masalah klasifikasi biner dengan merumuskannya sebagai masalah optimasi cembung (Vapnik 1998). Masalah optimasi memerlukan pencarian margin maksimum yang memisahkan hyperplane, sambil mengklasifikasikan sebanyak mungkin titik pelatihan dengan benar. SVM mewakili hyperplane optimal ini dengan vektor dukungan. Solusi yang jarang dan generalisasi yang baik dari SVM memungkinkan adaptasi terhadap masalah regresi. SVM generalisasi ke SVR dicapai dengan memperkenalkan ε wilayah -insensitive sekitar fungsi, yang disebut ε-tabung. Tabung ini merumuskan ulang masalah optimasi untuk menemukan tabung yang paling mendekati fungsi bernilai kontinu, sambil menyeimbangkan kompleksitas model dan kesalahan prediksi. Lebih khusus, SVR dirumuskan sebagai masalah optimasi dengan terlebih dahulu mendefinisikan cembung ε-fungsi kerugian tidak sensitif untuk diminimalkan dan menemukan tabung paling datar yang berisi sebagian besar contoh pelatihan. 

    Oleh karena itu, fungsi multiobjektif dibangun dari fungsi kerugian dan sifat geometris tabung. Kemudian, optimasi cembung, yang memiliki solusi unik, diselesaikan, menggunakan algoritma optimasi numerik yang sesuai. Hyperplane direpresentasikan dalam bentuk vektor pendukung, yang merupakan sampel pelatihan yang terletak di luar batas tabung. Seperti dalam SVM, vektor pendukung dalam SVR adalah contoh paling berpengaruh yang mempengaruhi bentuk tabung, dan data pelatihan dan pengujian diasumsikan independen dan terdistribusi secara identik (iid), diambil dari fungsi distribusi probabilitas yang tetap tetapi tidak diketahui yang sama. dalam konteks pembelajaran terawasi.

B. Cara Kerja SVR


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. M

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.


C. Contoh 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.

Bahasa Python

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Mengimpor library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
 
# Mengimpor dataset
dataset = pd.read_csv('Posisi_gaji.csv')
= dataset.iloc[:, 1:2].values
= dataset.iloc[:, 2:3].values
 
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_y = StandardScaler()
= sc_X.fit_transform(X)
= 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

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.
Referensi :
pertemuan 8 machine learning Institut Teknologi PLN
https://www.megabagus.id/machine-learning-support-vector-regression/
https://link.springer.com/chapter/10.1007/978-1-4302-5990-9_4
https://link.springer.com/content/pdf/10.1007%2F978-1-4302-5990-9.pdf