Sabtu, 13 November 2021

Support Vector Machine (2)

 Support vector machine (SVM) adalah algoritma klasifikasi dari supervised machine learningSVM pertama kali diperkenalkan pada 1960-an dan kemudian disempurnakan pada 1990-an. Namun, baru sekarang menjadi sangat populer, karena kemampuan untuk mencapai hasil yang cemerlang. SVM diimplementasikan dengan cara yang unik jika dibandingkan dengan algoritma pembelajaran mesin lainnya.

Pada artikel ini kita akan melihat apa itu algoritma SVM, teori singkat di balik SVM dan implementasinya di library Scikit-Learn PythonKemudian beralih ke konsep SVM tingkat lanjut, yang dikenal sebagai Kernel SVM, dan juga akan mengimplementasikannya dengan bantuan Scikit-Learn.

SVM sederhana

Dalam kasus data yang dapat dipisahkan secara linier dalam dua dimensi, seperti yang ditunjukkan pada Gambar. 1, algoritma machine learning pada umumnya mencoba menemukan batas yang membagi data sedemikian rupa sehingga kesalahan klasifikasi dapat diminimalkan. Jika Anda melihat lebih dekat pada Gambar 1, ada beberapa batas yang membagi titik data dengan benar. Misalnya, dua garis putus-putus serta satu garis lurus yang dapat mengklasifikasikan data dengan benar.


Gambar 1: Multiple Decision Boundaries

SVM berbeda dari algoritma klasifikasi lainnya dalam cara memilih batas keputusan atau decision boundary yang memaksimalkan jarak dari titik data terdekat dari semua kelas. SVM tidak hanya menemukan decision boundary; tapi menemukan decision boundary yang paling optimal.

Decision boundary yang paling optimal adalah batas yang memiliki margin maksimum dari titik terdekat dari semua kelas. Titik terdekat dari decision boundary yang memaksimalkan jarak antara decision boundaryn dan titik disebut support vector seperti terlihat pada Gambar 2. Decision boundary dalam kasus SVM disebut maximum margin classifier, atau maximum margin hyper plane. .


Gambar 2: Decision boundary dengan Support Vectors

Ada matematika kompleks yang terlibat di balik menemukan support vector, menghitung margin antara batas keputusan dan support vector dan memaksimalkan margin ini. Dalam tutorial ini kita tidak akan membahas detail matematikanya, kita akan melihat bagaimana SVM dan Kernel SVM diimplementasikan melalui library Python Scikit-Learn.

Menerapkan SVM dengan Scikit-Learn


Dengan dataset kali ini, tugas kita adalah memprediksi keaslian uang kertas bank berdasarkan empat atribut uang kertas yaitu skewness dari citra transformasi wavelet, varians citra, entropi citra, dan curtosis citraIni termasuk klasifikasi biner dan kita akan menggunakan algoritma SVM untuk menyelesaikan masalah ini. Bagian selanjutnya terdiri dari langkah-langkah standar machine learning.

Mengimpor Library

Script berikut mengimpor library yang diperlukan:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Mengimpor Data

Data yang dipakai dapat diunduh pada tautan berikut:

https://drive.google.com/file/d/13nw-uRXPY8XIZQxKRNZ3yYlho-CYm_Qt/view

Informasi rinci tentang data tersedia di tautan berikut:

https://archive.ics.uci.edu/ml/datasets/banknote+authentication

Unduh kumpulan data dari tautan Google drive dan simpan secara lokal di mesin Anda. Untuk contoh ini file CSV untuk dataset disimpan di folder "Datasets" dari drive D di komputer Windows. Script membaca file dari path ini. Anda dapat mengubah path file untuk komputer Anda.

Untuk membaca data dari file CSV, cara paling sederhana adalah dengan menggunakan read_csvmetode dengan library pandas. Kode berikut membaca data uang kertas bank ke dalam dataframe panda:

bankdata = pd.read_csv("D:/ANURI/pattern/python/bill_authentication.csv")

Analisis Data Eksplorasi

Ada cara yang hampir tak terbatas untuk menganalisis kumpulan data dengan berbagai pustaka Python. Demi kesederhanaan, kita hanya akan memeriksa dimensi data dan melihat beberapa data teratas. Untuk melihat baris dan kolom dan data, jalankan perintah berikut:

bankdata.shape

Dalam output, Anda akan melihat (1372,5). Artinya dataset uang kertas memiliki 1372 baris dan 5 kolom.

Untuk merasakan bagaimana dataset kita sebenarnya terlihat, jalankan perintah berikut:

bankdata.head()

Outputnya akan terlihat seperti ini:

PerbedaanKecondonganKurtosisEntropiKelas
03.621608.6661-2.8073-0.446990
14,545908.1674-2,4586-1.462100
23.86600-2.63831.92420.106450
33.456609.5228-4.0112-3.594400
40.32924-4.45524.5718-0.988800

Anda dapat melihat bahwa semua atribut dalam dataset adalah numerik. Labelnya juga numerik yaitu 0 dan 1.

Prapemrosesan Data

Pra-pemrosesan data melibatkan (1) Membagi data menjadi atribut dan label dan (2) membagi data menjadi set training dan testing.

Untuk membagi data menjadi atribut dan label, jalankan kode berikut:

X = bankdata.drop('Class', axis=1)
y = bankdata['Class']

Pada baris pertama skrip di atas, semua kolom dataframe bankdata disimpan dalam Xvariabel kecuali kolom "Class", yang merupakan kolom label. Metodedrop()metode menghapus kolom ini.

Di baris kedua, hanya kolom Class yang disimpan dalam variabely. Di sini variabel Xberisi atribut sedangkan variabely berisi label yang sesuai.

Setelah data dibagi menjadi atribut dan label, langkah pra-pemrosesan terakhir adalah membagi data menjadi set training dan testing. Kelebihanmodel_selectionmenggunakan library Scikit-Learn berisi train_test_splitmetode yang memungkinkan kita untuk membagi data ke dalam set pelatihan dan pengujian dengan mudah.

Jalankan skrip berikut untuk melakukannya:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

Melatih Algoritma

Kita telah membagi data menjadi set training dan testing. Sekarang saatnya untuk melatih SVM pada data trainin. Scikit-Learn berisi library svm, yang berisi kelas built-in untuk algoritma SVM yang berbeda. Karena kita akan melakukan tugas klasifikasi, kita akan menggunakan kelas pengklasifikasi SVM, yang ditulis seperti SVCdi library Scikit-Learn svm. Kelas ini mengambil satu parameter, yaitu tipe kernel. Ini sangat penting. Dalam kasus SVM sederhana, cukup menetapkan parameter ini sebagai "linier" karena SVM sederhana hanya dapat mengklasifikasikan data yang dapat dipisahkan secara linier. Kita akan melihat kernel non-linear di bagian selanjutnya.

Metode fit kelas SVC dipanggil untuk melatih algoritma pada data training, yang dilewatkan sebagai parameter untuk metodefitJalankan kode berikut untuk melatih algoritma:

from sklearn.svm import SVC
svclassifier = SVC(kernel='linear')
svclassifier.fit(X_train, y_train)

Membuat Prediksi

Untuk membuat prediksi, metodepredict dari kelasSVC dapat digunakan. Perhatikan kode berikut:

y_pred = svclassifier.predict(X_test)

Mengevaluasi Algoritma

Confusion matrix, presisi, recall, dan ukuran F1 adalah metrik yang paling umum digunakan untuk tugas klasifikasi. Pustaka Scikit-Learn metricsberisi metode classification_reportdan confusion_matrix, yang dapat dengan mudah digunakan untuk mengetahui nilai metrik penting ini.

Berikut adalah kode untuk menemukan metrik ini:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

Hasil

Hasil evaluasi adalah sebagai berikut:

[[152    0]
 [  1  122]]
              precision   recall   f1-score   support

           0       0.99     1.00       1.00       152
           1       1.00     0.99       1.00       123

avg / total        1.00     1.00       1.00       275

Dari hasil dapat diamati bahwa SVM sedikit mengungguli algoritma pohon keputusan. Hanya ada satu kesalahan klasifikasi dalam kasus algoritma SVM dibandingkan dengan empat kesalahan klasifikasi dalam kasus algoritma pohon keputusan.

SVM kernel

Pada bagian sebelumnya kita melihat bagaimana algoritma SVM sederhana dapat digunakan untuk menemukan batas keputusan untuk data yang dapat dipisahkan secara linier. Namun, dalam kasus data yang tidak dapat dipisahkan secara linier, seperti yang ditunjukkan pada Gambar 3, garis lurus tidak dapat digunakan sebagai batas keputusan.


Gambar 3: Data yang Tidak Dapat Dipisahkan Secara Linier

Dalam kasus data yang tidak dapat dipisahkan secara linier, algoritma SVM sederhana tidak dapat digunakan. Sebaliknya, versi SVM yang dimodifikasi, yang disebut Kernel SVM, digunakan.

Pada dasarnya, kernel SVM memproyeksikan data yang tidak dapat dipisahkan secara linier berdimensi lebih rendah ke data yang dapat dipisahkan secara linier dalam dimensi yang lebih tinggi sedemikian rupa sehingga titik-titik data milik kelas yang berbeda dialokasikan ke dimensi yang berbeda. Sekali lagi, ada matematika kompleks yang terlibat dalam hal ini, tetapi Anda tidak perlu khawatir tentang hal itu untuk menggunakan SVM. Sebaliknya, kita cukup menggunakan pustaka Scikit-Learn Python untuk mengimplementasikan dan menggunakan kernel SVM.

Menerapkan SVM Kernel dengan Scikit-Learn

Menerapkan SVM Kernel dengan Scikit-Learn mirip dengan SVM sederhana. Di bagian ini, kita akan menggunakan dataset iris yang terkenal untuk memprediksi kategori tanaman berdasarkan empat atribut: lebar sepal, panjang sepal, lebar kelopak dan panjang kelopak.

Dataset dapat diunduh dari tautan berikut:

https://archive.ics.uci.edu/ml/datasets/iris4

Langkah-langkah selanjutnya adalah langkah-langkah umum machine learning sehingga hanya membutuhkan sedikit penjelasan sampai kita mencapai bagian di mana kita akan belajar tentang SVM Kernel.

Mengimpor Perpustakaan

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Mengimpor Data

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# Assign colum names to the dataset
colnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

# Read dataset to pandas dataframe
irisdata = pd.read_csv(url, names=colnames)

Prapemrosesan

X = irisdata.drop('Class', axis=1)
y = irisdata['Class']

Train Test Split

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

Melatih Algoritma

Untuk melatih kernel SVM, gunakan kelas SVCyang sama dari library Scikit-Learn svmPerbedaannya terletak pada nilai untuk parameter kernel daru kelas SVCDalam kasus SVM sederhana, gunakan "linier" sebagai nilai untuk parameter kernel. Namun, untuk kernel SVM, Anda dapat menggunakan kernel Gaussian, polinomial, sigmoid, atau yang dapat dihitung. Kita akan mengimplementasikan kernel polinomial, Gaussian, dan sigmoid untuk melihat mana yang bekerja lebih baik untuk masalah kali ini.

1. Kernel Polinomial

Dalam kasus kernel polinomial , Anda juga harus memberikan nilai untuk parameter degree dari kelasSVCyang pada dasarnya adalah derajat polinomial. Lihatlah bagaimana kita dapat menggunakan kernel polinomial untuk mengimplementasikan kernel SVM:

from sklearn.svm import SVC
svclassifier = SVC(kernel='poly', degree=8)
svclassifier.fit(X_train, y_train)

Membuat Prediksi

Sekarang setelah kita melatih algoritma, langkah selanjutnya adalah membuat prediksi pada data uji.

Jalankan skrip berikut untuk melakukannya:

y_pred = svclassifier.predict(X_test)

Mengevaluasi Algoritma

Seperti biasa, langkah terakhir dari setiap algoritma machine learning adalah membuat evaluasi untuk kernel polinomial. Jalankan skrip berikut:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Output untuk kernel SVM menggunakan kernel polinomial terlihat seperti ini:

[[11  0  0]
 [ 0 12  1]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       1.00     1.00       1.00        11
Iris-versicolor       1.00     0.92       0.96        13
 Iris-virginica       0.86     1.00       0.92         6

    avg / total       0.97     0.97       0.97        30

Sekarang mari kita ulangi langkah yang sama untuk kernel Gaussian dan sigmoid.

2. Kernel Gaussian

Kita dapat menggunakan kernel polinomial untuk mengimplementasikan kernel SVM:

from sklearn.svm import SVC
svclassifier = SVC(kernel='rbf')
svclassifier.fit(X_train, y_train)

Untuk menggunakan kernel Gaussian, Anda harus menentukan 'rbf' sebagai nilai untuk parameter Kernel dari kelas SVC.

Prediksi dan Evaluasi

y_pred = svclassifier.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Output dari Kernel SVM dengan kernel Gaussian terlihat seperti ini:

[[11  0  0]
 [ 0 13  0]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       1.00     1.00       1.00        11
Iris-versicolor       1.00     1.00       1.00        13
 Iris-virginica       1.00     1.00       1.00         6

    avg / total       1.00     1.00       1.00        30

3. Kernel Sigmoid

Terakhir, mari gunakan kernel sigmoid untuk mengimplementasikan Kernel SVM. Perhatikan skrip berikut:

from sklearn.svm import SVC
svclassifier = SVC(kernel='sigmoid')
svclassifier.fit(X_train, y_train)

Untuk menggunakan kernel sigmoid, Anda harus menentukan 'sigmoid' sebagai nilai untuk kernelparameter SVCkelas.

Prediksi dan Evaluasi

y_pred = svclassifier.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Output dari Kernel SVM dengan kernel Sigmoid terlihat seperti ini:

[[ 0  0 11]
 [ 0  0 13]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       0.00     0.00       0.00        11
Iris-versicolor       0.00     0.00       0.00        13
 Iris-virginica       0.20     1.00       0.33         6

    avg / total       0.04     0.20       0.07        30

Perbandingan Kinerja Kernel

Jika kita membandingkan kinerja dari berbagai jenis kernel, kita dapat dengan jelas melihat bahwa kernel sigmoid berkinerja paling buruk. Hal ini dikarenakan fungsi sigmoid mengembalikan dua nilai yaitu 0 dan 1, sehingga lebih cocok untuk masalah klasifikasi biner. Namun, dalam kasus ini, kita memiliki tiga kelas keluaran.

Di antara kernel Gaussian dan kernel polinomial, kita dapat melihat bahwa kernel Gaussian mencapai tingkat prediksi 100% sempurna sementara kernel polinomial salah mengklasifikasikan satu instance. Oleh karena itu kernel Gaussian berkinerja sedikit lebih baik. Namun, tidak ada aturan baku

 mengenai kernel mana yang berkinerja terbaik di setiap skenario. Ini semua tentang menguji semua kernel dan memilih satu dengan hasil terbaik pada dataset pengujian Anda.

Kesimpulan

Pada artikel ini kita mempelajari SVM sederhana dan kernel. Kita mempelajari intuisi di balik algoritma SVM dan bagaimana penerapannya dengan library Scikit-Learn Python. Kita juga mempelajari berbagai jenis kernel yang dapat digunakan untuk mengimplementasikan kernel SVM. Saya sarankan Anda mencoba menerapkan algoritma ini pada kumpulan data dunia nyata yang tersedia di tempat-tempat seperti kaggle.com.

Tidak ada komentar:

Posting Komentar

Implementasi Praktis dari Algoritma Faster R-CNN untuk Deteksi Objek (Bagian 2 – dengan kode Python)

  Pengantar Tujuan di balik seri tulisan ini adalah untuk menunjukkan betapa bermanfaatnya berbagai jenis algoritma R-CNN.  Dalam artikel in...