Belajar SVM Multi Class
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
- One Vs Rest,
- 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)
- Binary Classification Problem 1: A vs [B,C]
- Binary Classification Problem 2: B vs [A,C]
- Binary Classification Problem 3: C vs [A,B]
One Vs One
Sedangkan untuk one vs one maka menggunakan rumus seperti berikut
- Binary Classification Problem 1: A vs [B]
- Binary Classification Problem 2: A vs [C]
- Binary Classification Problem 3: B vs [C]
Misalkan kita punya 4 class yaitu ‘red,’ ‘blue,’ and ‘green,’ ‘yellow’, maka ada 6 binary classification yaitu
- Binary Classification Problem 1: red vs. blue
- Binary Classification Problem 2: red vs. green
- Binary Classification Problem 3: red vs. yellow
- Binary Classification Problem 4: blue vs. green
- Binary Classification Problem 5: blue vs. yellow
- 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
- Untuk jenis one vs rest menggunakan istilah ‘binarycomplete’
- 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
- jenis kernel gaussian
- 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
- kelas 1 menggunakan kombinasi [1, 1, 1]
- kelas 2 menggunakan kombinasi [-1, 1, 1]
- 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
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