Support Vector Machine SVM Implementation Using Python

Hai semuanya, kali ini kita akan belajar tentang salah satu algoritma yang populer di dunia machine learning, yaitu Support Vector Machine. Tanpa berlama-lama yuk kita belajar lebih dalam tentang algoritma tersebut. Check this out …

Sejarah Singkat SVM
Vladimir N Vapnik, seorang Professor dari Columbia, Amerika Serikat pada tahun 1992 memperkenalkan sebuah algoritma training yang bertujuan untuk memaksimalkan margin antara pola pelatihan dan batas keputusan (decision boundary). Algoritma ini kemudian dikenal luas sebagai Support Vector Machine (SVM).

Support Vector Machine adalah model machine learning multifungsi yang dapat digunakan untuk menyelesaikan permasalahan regresi, klasifikasi, dan pendeteksian outlier. Termasuk ke dalam kategori supervised learning, SVM adalah salah satu metode yang paling populer dalam machine learning. Siapa pun yang tertarik untuk masuk ke dalam dunia machine learning, perlu mengetahui SVM.

Tujuan dari algoritma SVM adalah untuk menemukan hyperplane terbaik dalam ruang berdimensi-N (ruang dengan N-jumlah fitur) yang berfungsi sebagai pemisah yang jelas bagi titik-titik data input. Untuk lebih jelasnya, perhatikan gambar berikut.

SVM hyperplane ilustrationPada gambar diatas, bagian sebelah kiri menunjukkan beberapa kemungkinan bidang (hyperplane) untuk memisahkan data lingkaran dan data segitiga. Algoritma SVM kemudian mencari hyperplane terbaik yang dapat memisahkan kedua kelas secara optimal. Seperti tampak pada gambar di sebelah kanan, sebuah hyperplane optimal berhasil dibuat dan mampu memisahkan kedua kelas sehingga memiliki margin yang paling maksimal.

Beberapa keunggulan SVM antara lain :

1. SVM efektif pada data berdimensi tinggi (data dengan jumlah fitur atau atribut yang sangat banyak).
2. SVM efektif pada kasus di mana jumlah fitur pada data lebih besar dari jumlah sampel.
3. SVM menggunakan subset poin pelatihan dalam fungsi keputusan (disebut support vector) sehingga membuat penggunaan memori menjadi lebih efisien.

Support Vector Machine Classifier
Kali ini kita akan belajar tentang SMV pada kasus klasifikasi. Untuk memahami bagaimana algoritma SVM bekerja pada kasus klasifikasi, bayangkan kita memiliki sebuah kebun binatang mini. Di kebun binatang tersebut terdapat dua jenis binatang, yaitu ayam dan ular. Sebagai seorang ML engineer, kita ingin mengembangkan sebuah model yang mampu membedakan antara ayam dan ular agar bisa menempatkan kedua hewan tersebut di kandang yang berbeda. Kita tentunya tak ingin menyatukan ayam dan ular dalam satu kandang yang sama kan?

Lantas bagaimana SVM membuat sebuah decision boundary tersebut?

Pertama SVM mencari support vector pada setiap kelas. Support vector adalah sampel dari masing-masing kelas yang memiliki jarak paling dekat dengan sampel kelas lainnya. Pada contoh dataset bola basket dan bola kaki di bawah, support vector adalah bola basket dan bola kaki yang memiliki warna biru.

Hyperplane High and Low MarginSetelah support vector ditemukan, SVM menghitung margin. Margin bisa kita anggap sebagai jalan yang memisahkan dua kelas. Margin dibuat berdasarkan support vector di mana support vector bekerja sebagai batas tepi jalan, atau sering kita kenal sebagai bahu jalan. SVM mencari margin terbesar atau jalan terlebar yang mampu memisahkan kedua kelas.

Pada dataset bola basket dan bola kaki di atas SVM akan memilih margin di sebelah kanan karena ‘jalan’ atau margin pada gambar sebelah kanan lebih lebar dari ‘jalan’ di sebelah kiri. Oleh karena itu, gambar sebelah kanan disebut sebagai high margin classification dan gambar di sebelah kiri disebut low margin classification.

Kembali lagi ke kasus klasifikasi ayam dan ular, sampel ayam dan ular yang berada dalam lingkaran merah adalah support vector. Kemudian kita mencari jalan terlebar dari 2 support vector. Setelah menemukan jalan terlebar, decision boundary lalu digambar berdasarkan jalan tersebut.

SVM hyperplane ilustrationDecision boundary adalah garis yang membagi jalan atau margin menjadi 2 bagian yang sama besar. Hyperplane adalah bidang yang memisahkan kedua kelas, sedangkan margin adalah lebar ‘jalan’ yang membagi kedua kelas. Horeee! Sekarang Anda sudah paham bagaimana support vector machine bekerja dalam masalah klasifikasi.

SVM Klasifikasi non Linier
Sebelumnya kita sudah belajar tentang support vector classifier untuk kasus linear. Support vector classifier bekerja dengan mencari margin terbesar, atau “jalan” terlebar yang mampu untuk memisahkan 2 buah kelas. Permasalahannya, data di lapangan jauh lebih kompleks dibanding data ayam dan ular seperti di atas. Bagaimana jika data yang kita miliki terlihat seperti ini?

Non Linier ClassificationData di atas merupakan data yang tidak bisa dipisahkan secara linier sehingga kita menyebutnya sebagai data non-linear. Pada data non-linear, decision boundary yang dihitung algoritma SVM bukan berbentuk garis lurus. Meski cukup rumit dalam menentukan decision boundary pada kasus ini, tapi kita juga mendapatkan keuntungan, yaitu, bisa menangkap lebih banyak relasi kompleks dari setiap data poin yang tersebar.

Untuk data seperti di atas, Support Vector Classifier menggunakan sebuah metode yaitu “kernel trick” sehingga data dapat dipisahkan secara linier. Apa itu trik kernel? Ia adalah sebuah metode untuk mengubah data pada dimensi tertentu (misal 2D) ke dalam dimensi yang lebih tinggi (3D) sehingga dapat menghasilkan hyperplane yang optimal. Perhatikan gambar berikut!

SVM KernelBagaimana trik kernel bekerja?

Pertama, kita perlu menghitung skor jarak dari dua titik data, misal x_i dan x_j. Skor akan bernilai lebih tinggi untuk titik data yang lebih dekat, dan sebaliknya. Lalu kita gunakan skor ini untuk memetakan data pada dimensi yang lebih tinggi (3D). Teknik ini berguna untuk mengurangi waktu dan sumber daya komputasi, terutama untuk data berjumlah besar. Hal ini juga mencegah kebutuhan akan proses transformasi yang lebih kompleks. Itulah mengapa teknik ini sering disebut sebagai trik kernel.

Seperti yang ditunjukkan gambar di atas, pemetaan titik data dari ruang 2D menjadi 3D menggunakan fungsi kernel. Titik-titik merah yang sebelumnya berada di tengah sekarang berada di dalam bidang vertikal dengan posisi lebih rendah setelah diubah menjadi ruang 3D. Titik data yang sebelumnya sulit dipisahkan, sekarang dapat dengan mudah dipisahkan dengan teknik kernel.

Animasi yang dibuat oleh Udiprod berikut dapat membantu kita untuk melihat bagaimana data 2 dimensi seperti pada gambar sebelumnya diubah ke dalam ruang 3 dimensi, sehingga data dapat dipisahkan secara linier.

Kernel IlustrationBagaimana, sampai sini sudah paham, kan? Saya akan memberikan satu contoh lagi. Mari perhatikan ilustrasi berikut tentang bagaimana trik kernel bekerja pada data yang lebih sederhana.

Data di atas adalah data 1 dimensi dengan 2 buah kelas yaitu dokter dan polisi. Data di atas bukan data linier karena kita tak dapat menggambar satu garis lurus untuk memisahkan 2 kelas yang ada. Bagaimana cara kita bisa menggambar garis lurus yang bisa memisahkan 2 kelas tersebut? Betul, kita akan menggunakan trik kernel untuk mengubah data tersebut ke dalam dimensi yang lebih tinggi seperti ke dalam bidang 2 dimensi.

one dimention kernel illustrationKetika data sudah diubah ke dalam bidang 2 dimensi, sebuah garis lurus bisa digambar untuk memisahkan 2 kelas. Trik kernel menggunakan fungsi matematis yang bisa mengubah data dari dimensi tertentu ke dimensi yang lebih tinggi sehingga kelas-kelas pada data dapat dipisah secara linier.

SVM Klasifikasi Multi-Kelas
SVM sejatinya merupakan binary classifier atau model untuk klasifikasi 2 kelas. Namun, SVM juga dapat dipakai untuk klasifikasi multi-kelas menggunakan suatu teknik yaitu “one-vs-rest”.

Pada masalah klasifikasi multi-kelas, SVM melakukan klasifikasi biner untuk masing-masing kelas. Model kemudian memisahkan kelas tersebut dari semua kelas lainnya, menghasilkan model biner sebanyak jumlah kelasnya. Untuk membuat prediksi, semua proses klasifikasi biner dijalankan pada tahap uji.

Sebagai contoh, jika ada 3 buah kelas: donat, ayam, dan burger, SVM akan melakukan 3 kali klasifikasi. Pertama, membangun pemisah antara kelas donat dan kelas bukan donat.

One vs RestKemudian membangun pemisah antara kelas ayam dan kelas bukan ayam, lalu pemisah antara kelas burger dan bukan kelas burger. Teknik inilah yang disebut dengan “One-vs-Rest”.

One vs RestSetelah mengenal sekilas tentang apa itu support vector machine dan cara kerjanya, sekarang kita akan mencoba mengimplementaskan SVM dengan Python. Library yang akan kita gunakan yaitu Scikit Learn.

Pada latihan kali ini kita akan menggunakan dataset Prima Indian Dataset. Dataset ini dikumpulkan oleh National Institute of Diabetes and Digestive and Kidney Diseases. Dataset berisi 8 kolom atribut dan 1 kolom label yang berisi 2 kelas yaitu 1 dan 0. Angka 1 menandakan bahwa orang tersebut positif diabetes dan 0 menandakan negatif. Terdapat 768 sampel yang merupakan 768 pasien perempuan keturunan suku Indian Pima.

Model machine learning yang akan kita buat bertujuan untuk mengklasifikasikan apakah seorang pasien positif diabetes atau tidak.

Tahapan latihan kali ini adalah:

1. Baca dan ubah data ke dalam bentuk dataframe.
2. Bagi dataset.
3. Lakukan standarisasi.
4. Buat dan latih model.
5. Evaluasi model.

Tahap pertama yang perlu kita lakukan adalah mengunduh dataset Pima Indian Diabetes dari tautan berikut. Kemudian, impor library pandas dan ubah file csv yang sudah kita unduh menjadi dataframae, lalu tampilkan lima data teratas menggunakan function head().

import pandas as pd# Load dataset
df = pd.read_csv(‘diabetes.csv’)# Print top 5 rows
df.head()

Top 5 rowsSelanjutnya hal yang paling penting adalah kita perlu mengecek apakah terdapat nilai-nilai yang hilang pada dataset serta apakah ada atribut yang tipe datanya tidak sesuai. Kita bisa melakukan ini dengan memanggil fungsi .info() pada dataframe.

# Display dataset information
df.info()

Dataset informationPada gambar diatas menunjukkan bahwa semua atribut nilainya lengkap, dan juga nilai-nilai dari tiap kolom memiliki tipe data numerik yaitu int64 dan float64.

Pada tahap ini data sudah siap dan bisa digunakan untuk pelatihan model.

Kita lalu memisahkan antara atribut dan label pada dataframe. Untuk memisahkan kolom-kolom pada dataframe secara sekaligus kamu bisa menggunakan slicing atau untuk melihat caranya bisa melihat dokumentasinya pada tautan berikut.

# Separating attributes
X = df[df.columns[:8]]# Separating label
y = df[‘Outcome’]

Jika kita lihat, nilai-nilai pada dataset memiliki skala yang berbeda. Contohnya pada kolom Glucose dan kolom Diabetes Pedigree Function. Kita perlu mengubah nilai-nilai dari setiap atribut berada pada skala yang sama. Kita dapat mencoba menggunakan standarisasi dengan fungsi StandardScaler() dari Scikit Learn.

from sklearn.preprocessing import StandardScaler# Call StandardScaler
scaler = StandardScaler()# Standardization of dataset values
scaler.fit(X)
X = scaler.transform(X)
print(X)

Scaling resultSetelah kita melakukan standarisasi, kita bisa memisahkan data training dan testing menggunakan fungsi .train_test_split().

# Import train_test_split
from sklearn.model_selection import train_test_split# Separate training data and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Kita kemudian membuat objek Support Vector Classifier dan menampungnya pada variabel clf.

# Import SVM classifier
from sklearn.svm import SVC# Create SVC object and call fit function to train model
clf = SVC()
clf.fit(X_train, y_train)

Terakhir, kita bisa melihat bagaimana akurasi prediksi dari model yang kita latih terhadap data testing.

# Show accuracy score
clf.score(X_test, y_test)

SVM AccuracyPada gambar diatas ternyata model kita menghasilkan akurasi yang cukup baik, yaitu sekitar 0.75 atau 75%.

Selamat, Anda telah berhasil mengembangkan sebuah model Support Vector Classifier untuk mendeteksi diabetes.

Pada pembahasan diatas kita sudah belajar tentang Support Vector Machine dan implemetasinya menggunakan Python. Oke mungkin cukup sekian pembahasan kita kali ini, nantikan artikel selanjutnya yang akan saya bagikan. Untuk melihat project lengkap pada latihan diatas, kalian bisa lihat pada tautan berikut.