Machine Learning: Support Vector Regression

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.

Subscribe
Notify of
guest

24 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
nur
nur
5 years ago

terimakasih pak materinya sangat mudah dipahami oleh orang awam yang baru belajar seperti saya

Syawal
Syawal
5 years ago

untuk penentuan jujur atau tidaknya bgmna yah kak?krn outputnya cuma grafik

della
della
4 years ago

permisi pak. Saya mau bertanya, bapak ada referensi buku atau link untuk menjabarkan rumus matematis dari SVR nya secara detail tidak pak ? kalau ada boleh saya minta ?.
terimakasih sebelumnya pak

Hardimanto
Hardimanto
4 years ago

Permisi pak, apa svr ini bisa dihitung menggunakan perhitungan manual atau perhitungan matematisnya ? jika bapak punya boleh saya lihat pak ? atau bapak punya referensi atau buku untuk membantu saya memahami perhitungan manualnya pak ? mohon bantuannya pak, terimakasih sebelumnya pak

Rocky Gultom
Rocky Gultom
4 years ago

Halo Pak, saya mencoba dengan MinMaxScaler dan hasilnya point prediction sejajar diatas point real nya, berbeda apabila saya menggunakan standar scaler, tetapi hasil score terhadap kedua normalisasi tsb sama. mohon bantuan penjelasan nnya pak. Terima Kasih

Rocky Gultom
Rocky Gultom
Reply to  MB Herlambang
4 years ago

Baik Pak, source ada dibawah ini.. import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler, MinMaxScaler from sklearn.svm import SVR df = pd.read_csv(‘Posisi_gaji.csv’) x = df.iloc[:,1:-1].values y = df.iloc[:,-1:].values #Normalisasi Dengan StandarScaler sc_x = StandardScaler(with_mean =True) sc_y = StandardScaler(with_mean =True) scx = sc_x.fit_transform(x) scy = sc_y.fit_transform(y) #Normalisasi Dengan MinMaxScaler mm_x = MinMaxScaler(feature_range=(0, 1)) mm_y = MinMaxScaler(feature_range=(0, 1)) mmx = mm_x.fit_transform(x) mmy = mm_x.fit_transform(y) scsor = SVR(kernel=’rbf’) mmsor = SVR(kernel=’rbf’) scsor.fit(scx,scy) mmsor.fit(mmx, mmy) scy_pred = scsor.predict(scx) mmy_Pred = mmsor.predict(mmx) #Graph With Standar Scaler plt.scatter(scx, scy, color=’red’ ) plt.plot(scx, scy_pred, color = ‘blue’) plt.title(‘Jujur atau… Read more »

utami
utami
4 years ago

kak kalaudalam versi matlab gimana ya kak

oktavia
oktavia
4 years ago

Selamat Malam Pak,
Saya melakukan penelitian terkait prediksi menggunakan SVR dengan membandingkan beberapa kernel, namun nilai bias yang saya dapatkan pada salah satu kernel saya menghasilkan bilangan negatif (-). Apakah hal tersebut mungkin pak ?
Mohon penjelasannya Pak,
Terimakasih

Last edited 4 years ago by oktavia
bambang
bambang
4 years ago

Kalau kita ingin menentukkan nilai lain diluar rentang data apakah bisa, terima kasih

bambang
bambang
Reply to  MB Herlambang
3 years ago

Mohon info bagaimana perintah atau script nya utk menentukan data diluar rentang, tks

utami
utami
4 years ago

ketika saya masukkan data saya mengapa error ya pak mohon penjelasannya, untuk error nya dibagian ini pak

= sc_y.fit_transform(y)

Screenshot (290).png
utami
utami
4 years ago

pak untuk mengetahui nilai bias, beta, epsilon dari svr nya bagaimana ya pak

Agustina
Agustina
1 year ago

apakah itu harus memprediksi ke level 6,5 ya kak? Apakah bisa memprediksi di level yg lain?