×

Belajar SVM Multi Class

Belajar SVM Multi Class

4,143 Views

Bisakah SVM yang didesain sejak awal hanya untuk memecahkan masalah pada binary class digunakan untuk multi class? Model Binary classification seperti logistic regression and SVM tidak support terhadap multi class sehingga diperlukan algoritma seperti melakukan split berikut

  1. One Vs Rest,
  2. One Vs One

Pada artikel ini, kita akan belajar mengenai cara kerja SVM Multiclass di Matlab secara lebih mudah melalui teknik coding design / decode schema 

Bagi kalian yang belum tahu cara kerja SVM, bisa baca https://softscients.com/2020/03/26/buku-belajar-machine-learning-dengan-matlab-support-vector-machine/

One vs Rest

Sesuai dengan namanya rest artinya istirahat. Perhatikan gambar berikut yang terdiri dari 3 class

Pada sesi pelatihan, jika A adalah kelas positif, maka yang lainnya dianggap negatif, kemudian dilanjutkan sesi pelatihan yang lain ketika B adalah kelas positif, maka yang lainnya dianggap negatif. Jadi seperti berikut tahapannya (menjadi tree binary clasification)

  1. Binary Classification Problem 1: A vs [B,C]
  2. Binary Classification Problem 2: B vs [A,C]
  3. Binary Classification Problem 3: C vs [A,B]

One Vs One

Sedangkan untuk one vs one maka menggunakan rumus seperti berikut

    \[\frac{k*(k-1)}{2}\]

  1. Binary Classification Problem 1: A vs [B]
  2. Binary Classification Problem 2: A vs [C]
  3. Binary Classification Problem 3: B vs [C]

Misalkan kita punya 4 class yaitu ‘red,’ ‘blue,’ and ‘green,’ ‘yellow’, maka ada 6 binary classification yaitu

  1. Binary Classification Problem 1: red vs. blue
  2. Binary Classification Problem 2: red vs. green
  3. Binary Classification Problem 3: red vs. yellow
  4. Binary Classification Problem 4: blue vs. green
  5. Binary Classification Problem 5: blue vs. yellow
  6. Binary Classification Problem 6: green vs. yellow

Implementasi

Untuk package Scikit, metode One vs Rest disebut dengan (OvR) https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html  Contoh kode yang digunakan yaitu

# logistic regression for multi-class classification using built-in one-vs-rest
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, n_classes=3, random_state=1)
# define model
model = LogisticRegression(multi_class='ovr')
# fit model
model.fit(X, y)
# make predictions
yhat = model.predict(X)

Atau dengan metode lainya yang secara eksplisit yaitu

import numpy as np
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
X = np.array([
     [10, 10],
     [8, 10],
     [-5, 5.5],
     [-5.4, 5.5],
     [-20, -20],
     [-15, -20]
 ])
y = np.array([0, 0, 1, 1, 2, 2])
clf = OneVsRestClassifier(SVC()).fit(X, y)
clf.predict([[-19, -20], [9, 9], [-5, 5]])

Pelatihan SVM menggunakan metode one vs one disebut dengan (ovo)

# SVM for multi-class classification using built-in one-vs-one
from sklearn.datasets import make_classification
from sklearn.svm import SVC
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, n_classes=3, random_state=1)
# define model
model = SVC(decision_function_shape='ovo')
# fit model
model.fit(X, y)
# make predictions
yhat = model.predict(X)

Atau secara eksplisit yaitu

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import LinearSVC
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, shuffle=True, random_state=0)
clf = OneVsOneClassifier(LinearSVC(random_state=0)).fit(X_train, y_train)
clf.predict(X_test[:10])

https://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsOneClassifier.html

Kalian bisa pelajari lebih lanjut di https://www.amazon.com/Pattern-Recognition-Learning-Information-Statistics/dp/0387310738/ref=as_li_ss_tl?keywords=Pattern+Recognition+and+Machine+Learning&qid=1579729404&sr=8-1&linkCode=sl1&tag=inspiredalgor-20&linkId=35644770788d3f7d6402ac21dac68952&language=en_US

Bagaimana SVM mutliclass di matlab

Matlab sedikit berbeda cara untuk SVM Multiclass yaitu  dengan function fitcecoc() menggunakan algoritma yang dikenal dengan Error Correcting Output Codes Model (ECOCM). Algoritma tersebut bisa dipelajari lebih lengkap di https://www.mathworks.com/help/stats/fitcecoc.html#bufm0tv Pengaturan metode yang digunakan yaitu

  1. Untuk jenis one vs rest menggunakan istilah ‘binarycomplete’
  2. Sedangkan untuk one vs one menggunakan istilah ‘allpairs’ atau ‘onevsone’

Misalkan kita akan menggunakan one vs one yaitu

clc;clear all;close all;
load fisheriris
X = meas;
Y = species;
t = templateSVM('Standardize',true,'KernelFunction','gaussian');
model = fitcecoc(X,Y,'Learners',t,'Coding','onevsone','Verbose',1);
prediksi = predict(model,X);
hasil = table(Y,prediksi)

Bila ditelisik lagi, variabel model akan memberikan informasi sebagai berikut

>> model

model = 

  ClassificationECOC
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
           BinaryLearners: {3×1 cell}
               CodingName: 'onevsone'


  Properties, Methods

>> model.BinaryLearners

ans =

  3×1 cell array

    {1×1 classreg.learning.classif.CompactClassificationSVM}
    {1×1 classreg.learning.classif.CompactClassificationSVM}
    {1×1 classreg.learning.classif.CompactClassificationSVM}

Terdapat 3 learner, kita bisa cek koq satu-persatu, misalkan untuk learner 1

P = model.BinaryLearners{1}

Menghasilkan

ans = 

  classreg.learning.classif.CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [-1 1]
           ScoreTransform: 'none'
                    Alpha: [30×1 double]
                     Bias: -0.0830
         KernelParameters: [1×1 struct]
                       Mu: [5.4710 3.0990 2.8610 0.7860]
                    Sigma: [0.6417 0.4787 1.4495 0.5652]
           SupportVectors: [30×4 double]
      SupportVectorLabels: [30×1 double]


  Properties, Methods

kita juga bisa melihat kernel yang digunakan

>> P.KernelParameters

ans = 

  struct with fields:

    Function: 'gaussian'
       Scale: 1

dari informasi diatas dapat disimpulkan bahwa learner ke 1 mempunyai

  1. jenis kernel gaussian
  2. target class [-1, 1]

Ada yang belum paham?

Mari kita gunakan 2 ciri fitur saja yaitu untuk mempermudah ilustrasi bahwa multiclass SVM di matlab menggunakan beberapa learner (tergantung metode yang digunakan one vs rest atau one vs one). Dataset yang kita gunakan yaitu https://softscients.com/2020/07/11/aplikasi-kmeans-clustering-dengan-matlab/

clc;clear all;close all;
X = [ 7,8;
    4,13;
    8,7;
    8 ,9;
    3 ,12;
    3 ,1;
    5 ,3;
    3 ,13;
    9 ,8;
    3 ,5;
    8 ,8;
    2 ,13;
    1 ,3;
    3 ,14]

%kita gunakan clustering untuk otomatisasi class Y
[Y,center]=kmeans(X,3);
figure
gscatter(X(:,1),X(:,2),Y)
legend('class 1','class 2','class 3')

Kalian bisa melihat ada 3 class

Tentu sangat mudah bagi kita untuk membuat visualisasi 2 dimensi daripada multidimensi, selanjutnya dilakukan SVM multiclass dengan kode sebagai berikut

t = templateSVM('Standardize',false,'KernelFunction','gaussian');

arti dari  Standardize',false memastikan bahwa nilai tersebut tidak dilakukan normalisasi, selanjutnya perintah untuk melakukan training SVM multiclass di matlab yaitu

model = fitcecoc(X,Y,'Learners',t,'Coding','onevsone','Verbose',1);

terlihat model menghasilkan berikut

model = 

  ClassificationECOC
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [1 2 3]
           ScoreTransform: 'none'
           BinaryLearners: {3×1 cell}
               CodingName: 'onevsone'


  Properties, Methods

BinaryLearners berjumlah 3, kita bisa cek satu-persatu menggunakan struct berikut

%ada 3 learner yaitu
P = model.BinaryLearners{1}
P2 = model.BinaryLearners{2}
P3 = model.BinaryLearners{3}

Kita bisa cek hasilnya setiap Binary Learners nya bahwa setiap target class akan tetap menggunakan 2 class yaitu [-1,+1]

P = 

  classreg.learning.classif.CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [-1 1]
           ScoreTransform: 'none'
                    Alpha: [8×1 double]
                     Bias: 0.1259
         KernelParameters: [1×1 struct]
           SupportVectors: [8×2 double]
      SupportVectorLabels: [8×1 double]


  Properties, Methods


P2 = 

  classreg.learning.classif.CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [-1 1]
           ScoreTransform: 'none'
                    Alpha: [8×1 double]
                     Bias: 0.1259
         KernelParameters: [1×1 struct]
           SupportVectors: [8×2 double]
      SupportVectorLabels: [8×1 double]


  Properties, Methods


P3 = 

  classreg.learning.classif.CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [-1 1]
           ScoreTransform: 'none'
                    Alpha: [8×1 double]
                     Bias: 8.6736e-19
         KernelParameters: [1×1 struct]
           SupportVectors: [8×2 double]
      SupportVectorLabels: [8×1 double]


  Properties, Methods

Oiya, kalian juga bisa cek jenis kernel yang digunakan, apakah benar menggunakan jenis kernel gaussian? sesuai dengan masukan yang telah kita definisikan diatas! Misalkan kita cek P

P.KernelParameters

hasilnya

ans = 

  struct with fields:

    Function: 'gaussian'
       Scale: 1

berarti sudah sama! kalian bisa cek untuk P2 dan P3

Ingat bahwa P, P2, dan P3 merupakan model / classifier/ binary learner SVM, maka kita bisa menggunakan untuk melakukan predict(). Agar kita bisa bandingkan hasil P, P2, P3, cukup merge menggunakan tabel dengan input berupa variabel X

table(predict(P,X),predict(P2,X),predict(P3,X))

hasil akan terlihat sebagai berikut

ans =

  14×3 table

    Var1    Var2    Var3
    ____    ____    ____

     -1       1       1 
      1      -1      -1 
     -1       1       1 
     -1       1       1 
      1      -1      -1 
      1       1       1 
      1       1       1 
      1      -1      -1 
     -1       1       1 
      1       1       1 
     -1       1       1 
      1      -1      -1 
      1       1       1 
      1      -1      -1

Masih belum paham? yuk kita bandingkan dengan target class Y agar lebih jelas

table(predict(P,X),predict(P2,X),predict(P3,X),Y)

hasilnya

ans =

  14×4 table

    Var1    Var2    Var3    Y
    ____    ____    ____    _

     -1       1       1     2
      1      -1      -1     3
     -1       1       1     2
     -1       1       1     2
      1      -1      -1     3
      1       1       1     1
      1       1       1     1
      1      -1      -1     3
     -1       1       1     2
      1       1       1     1
     -1       1       1     2
      1      -1      -1     3
      1       1       1     1
      1      -1      -1     3

kalian bisa lihat, artinya bahwa untuk

  1. kelas 1  menggunakan kombinasi [1, 1, 1]
  2. kelas 2 menggunakan kombinasi [-1, 1, 1]
  3. kelas 3 menggunakan kombinasi [1, -1, -1]

itulah yang dinamakan dengan coding design di matlab atau juga disebut decoding scheme, which determines how the results (predictions) of the binary classifiers are aggregated.

Hasil setiap Binary Classifer akan di agregasi untuk menentukan hasil prediksi akhir! Kalian bisa coba untuk menggunakan  4 kelas maka kalau menggunakan one vs one akan terdapat 6 binary classifier mengikuti rumus

    \[\frac{k*(k-1)}{2}\]

Kalian bisa menggunakan coding design yaitu ada

Coding Design Description Number of Learners Minimal Pairwise Row Distance
one-versus-all (OVA) For each binary learner, one class is positive and the rest are negative. This design exhausts all combinations of positive class assignments. K 2
one-versus-one (OVO) For each binary learner, one class is positive, another is negative, and the rest are ignored. This design exhausts all combinations of class pair assignments. K(K – 1)/2 1
binary complete This design partitions the classes into all binary combinations, and does not ignore any classes. That is, all class assignments are –1 and 1 with at least one positive class and one negative class in the assignment for each binary learner. 2K – 1 – 1 2K – 2
ternary complete This design partitions the classes into all ternary combinations. That is, all class assignments are 0, –1, and 1 with at least one positive class and one negative class in the assignment for each binary learner. (3K – 2K + 1 + 1)/2 3K – 2
ordinal For the first binary learner, the first class is negative and the rest are positive. For the second binary learner, the first two classes are negative and the rest are positive, and so on. K – 1 1
dense random For each binary learner, the software randomly assigns classes into positive or negative classes, with at least one of each type. For more details, see Random Coding Design Matrices. Random, but approximately 10 log2K Variable
sparse random For each binary learner, the software randomly assigns classes as positive or negative with probability 0.25 for each, and ignores classes with probability 0.5. For more details, see Random Coding Design Matrices. Random, but approximately 15 log2K Variable

 

Kita teruskan hasil diatas, kalau kita visualisaskan dalam bentuk 2 dimensi dengan melibatkan nilai Support Vector nya akan terlihat lebih jelas

sv = P.SupportVectors;
sv2 = P2.SupportVectors;
sv3 = P3.SupportVectors;

figure
gscatter(X(:,1),X(:,2),Y)
hold on
plot(sv(:,1),sv(:,2),'ko','MarkerSize',10)
plot(sv2(:,1),sv2(:,2),'ko','MarkerSize',10)
plot(sv3(:,1),sv3(:,2),'ko','MarkerSize',10)
legend('class 1','class 2','class 3','Support Vector')
hold off

 

 

Maka Apakah SVM bisa digunakan untuk Classification MultiClass? jawabannya adalah bisa! melalui coding design / decode schema layaknya training di perceptron dan backpropagation. Semoga kalian semua merasa tercerahkan melalui tulisan kami, silahkan tinggalkan comment

You May Have Missed