Jumat, 12 Januari 2018

Classification with Support Vector Machines - Linear Data

[Teori]

SVM adalah algoritma supervisi untuk melakukan klasifikasi baik linear maupun nonlinear tergantung pada margin maksimalisasi diantara titik suporrt, mapping data dapat ditransformasi kedalam dimensi yang lebih tinggi. SVM dibangun oleh Vapnik dan Cortes pada 1992, SVM telah sukses diaplikasikan kebanyak kasus seperti pengenalan tulisan tangan, prediksi runtun waktu, pengenalan suara
Implementasi Support Vector Machine
Pada tulisan ini akan diberikan mengenai
1.    Cara training SVM
2.    Mengukur kinerja nya
3.    Prediksi hasil klasifikasi dengan menggunakan data asing (data yang belum pernah digunakan untuk pelatihan)
Karena tulisan ini agak cukup panjang, siapkan waktu yang cukup!



Jenis Data

Secara umum jenis data yang akan kita temua ada 2 linear dan non linear seperti gambaran berikut



Cukup mudah dimengerti
http://www.softscients.web.id/2016/02/menguji-validitas-cluster.html
Untuk kasus linear sangat mudah untuk menemukan margin/pembatas seperti berikut

Sedangkan untuk kasus nonlinear, kita butuh teknik hyperplane yaitu transformasi ke dimensi lebih tinggi lagi
Kalau masih bingung, coba baca ini http://www.softscients.web.id/2015/05/percepton-pada-kasus-linear-dan-non.html
Inti dari SVM adalah mencoba untuk mencari separating hyperplane alias pembatas secara linear (yang non linear harus dibikin linear dulu)

Tools yang digunakan

Ada banyak tools untuk melakukan mencoba SVM, anda bisa menggunakan matlab dengan function svmclassify ataupun Python dengan pustaka sklearn. Terserah anda karena semua punya kelebihan masing-masing.
Untuk anda yang suka menggunakan python, bisa baca http://www.softscients.web.id/search?q=python
sedangkan untuk Matlab bisa ketikan di command window nya doc svm
Persiapan Pustaka/Library
Library yang digunakan cukup banyak yaitu
  1. Numpy untuk mengolah matrix
  2. Pandas untuk membaca data struktur
  3. Matplotlib untuk visualisasi plot
  4. Sklearn untuk machine learningnya
Juga kita menggunakan Spyder untuk Editornya, sedangkan versi python-nya yaitu 2.7


Persiapan Data Linear

Karena penulis suka menggunakan Python, silahkan bagi anda install terlebih dahulu
Siapkan data dalam bentuk excel disimpan dengan nama data linear.xlsx

Visualisasi data dan Implementasi SVM Linear

Data yang digunakan bersifat linear, sehingga persamaan rumus matematikanya seperti berikut
y = a * x + b
sebagai fungsi linear 2 dimensi.
Bila sudah siap, kita akan langsung saja melakukan ploting


import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import svm

data1 = pd.read_excel('data linear.xlsx')
x1 = data1['p1']
x2 = data1['p2']
x_training = np.array(list(zip(x1,x2)))
y_training = data1['t']

nama_kelas = ['-1','+1']

i_plus = y_training[y_training>0].index
i_min = y_training[y_training<0].index


plt.figure()
plt.scatter(x_training[i_min,0],x_training[i_min,1],c='b',s=100)
plt.scatter(x_training[i_plus,0],x_training[i_plus,1],c='r',s=100)
plt.legend(nama_kelas)
plt.title('Kasus Linear')

 
Sengaja saya berikan warna biru untuk minus dan merah untuk plus, Hasilnya seperti berikut

Tugas dari SVM adalah mencari nilai a dan b dari sebuah function linear tersebut diatas. Kita akan menggunakan library sklearn yaitu SVC yang merupakan C-Support Vector Classification berupa implementasi dari library libsvm. Kita lanjut code-nya dengan berikut


svc = svm.SVC(kernel='linear').fit(x_training,y_training)
weight = svc.coef_
intercept = svc.intercept_
a = -weight[0,0] / weight[0,1]
b = -intercept[0]/weight[0,1]
print('y = '+str(a)+' * x + '+str(b)) #fungsi linear 

menghasilkan


y = -1.56974382329 * x + 9.95470962319

Sesuai dengan jenis kernel=’linear’
Kita tambahkan code lagi, untuk visualisasi separating line nya, kita coba membuat rentang nilai sumbu x dari 2 sampai 3.8 dengan increment 0.1 seperti berikut


x_coba = np.arange(2,3.8,0.1)
y_coba = np.multiply(a,x_coba)+b #penerapan fungsi linear

plt.plot(x_coba,y_coba)
 

Menghasilkan garis biru ditengah sebagai pemisah antara plus dan minus nya.

Melakukan Prediksi Data asing dengan SVM

Bagaimana penggunanan SVM untuk melakukan prediksi data? Misalkan kita mempunyai data berikut

Bila kita plotkan berikut

Terlihat bahwa data asing terletak di area plus, untuk mengujinya cukup gunakan predict()



x_asing = np.array([[3,6]])
print svc.predict(x_asing)
 
Menghasilkan

[1]
 

Sudah tepat SVM melakukan prediksi data asing yaitu kategori kelas plus

Score SVM

Agar tampak lebih meyakinkan, kita melihat score nya dengan score() dengan score 0.0 -  1 seperti berikut

print svc.score(x_training,y_training)
 

menghasilkan

1.0
 

Sehingga dikatakan bahwa SVM melakukan tugasnya 100%
Tulisan akan disambung lagi untuk kasus data non linear yang sering kita jumpai dikehidupan sehari-hari, tapi dengan contoh kasus sederhana terlebih dahulu, ikuti saja serialnya di www.softscients.web.id

Posting Komentar