Introduksi

Sains Data (Data Science) merupakan istilah baru yang muncul pada awal abad ke–21, yang definisinya belum bisa disepakati oleh para pakar. Salah satu definisi mengenai sains data yang dominan digunakan adalah definisi dari The Commitee on Data for Science and Technology (CODATA) yang menyebutkan sains data sebagai the methods and technologies used to conduct scientific research through management and utilization of scientific data. Provost & Fawcett menyatakan konsep terpenting pada sains data adalah adanya ekstraksi informasi dari dataset. Dilihat dari sains yang terlibat, sains data dianggap sebagai sebuah pengetahuan yang berbeda dengan – tetapi mengombinasikan – Statistika, Matematika, Teknologi Komputasi, Kecerdasan Buatan, dan berbagai disiplin ilmu terkait. Perspektif ini mengakibatkan sains data tidak hanya ‘diletakkan’ sebagai ilmu baru pada peta ilmu pengetahuan, bahkan beberapa perguruan tinggi terkenal di dalam dan luar negeri membuat ‘wadah’ baru dalam bentuk pusat-pusat penelitian dan/atau program studi yang aktivitasnya berkaitan langsung dan/atau tidak langsung dengan Sains Data.

Sebagai salah satu teknik yang lazim digunakan pada Sains Data, khususnya untuk mengklasifikasikan obyek dan menduga klasifikasi dari sebuah obyek baru berdasarkan atribut-atributnya, SVM tergolong ke dalam teknik supervised learning yang membutuhkan adanya ‘pembelajaran’ dalam melaksanakan tugasnya. Ciri khas dari teknik pada Machine Learning yang tergolong ke dalam kelompok supervised learning adalah adanya ‘pembagian’ (splitting) matriks data menjadi 2 subset yaitu Data Latih dan Data Uji.

Data latih (training set) digunakan untuk ‘mengajari’ SVM dalam menduga parameter-parameter optimal yang akan digunakan untuk mengklasifikasikan obyek. Selanjutnya, menggunakan penduga tersebut dilakukan uji coba klasifikasi pada data uji (testing set). Mempertimbangkan bahwa data uji telah memiliki klasifikasi riil (\(Y_{riil}\)), maka dengan adanya klasifikasi penduga (\(Y_{duga}\)) bisa dihitung nilai ketaktepatan klasifikasi (miss-classification). Semakin rendah nilai ini, semakin baik penduga parameter-parameter yang diperoleh pada data latih.

Membangun Model Klasifikasi

Sebagai sebuah metode dalam kelompok soft modeling, teori Matematika yang diutilisasi SVM secara relatif berat, dan tidak disertakan dalam artikel ringkas ini. Tujuan utama penulisan artikel ini adalah mendemonstrasikan penggunaan R untuk mengklasifikasikan data menurut atribut-atributnya. Sebelumnya, Anda harus mengunduh file Social.csv di Google Drive dan meletakkan di working directory R Anda. File ini terdiri dari 400 observasi dengan 5 attribut, yaitu UserID, Gender, Age, EstimatedSalary, dan Purchased; menggambarkan data potensi penjualan produk \(x\) dengan mengamati 400 pelanggan terdaftar. Nilai atribut Purchased 0 menandakan pelanggan tidak membeli \(x\), sebaliknya bila bernilai 1 maka pelanggan melakukan pembelian. Data ini diperoleh dari situs Kaggle. Simpanlah matriks data ini dalam format data frame R. Perhatikan struktur data Social.csv pada chunks berikut:

datSoc = read.csv("Social.csv")
names(datSoc)
## [1] "UserID"          "Gender"          "Age"             "EstimatedSalary"
## [5] "Purchased"
head(datSoc, 5)
write.table(datSoc, file = "Data SVM.dat")

datSVM = datSoc[-1] # datSVM tanpa UserID, tidak diperlukan dalam klasifikasi
datSVM$Purchased = factor(datSVM$Purchased, c(0,1)) 
str(datSVM)
## 'data.frame':    400 obs. of  4 variables:
##  $ Gender         : chr  "Male" "Male" "Female" "Female" ...
##  $ Age            : int  19 35 26 27 19 27 27 32 25 35 ...
##  $ EstimatedSalary: int  19000 20000 43000 57000 76000 58000 84000 150000 33000 65000 ...
##  $ Purchased      : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
head(datSVM, 10)

Memperhatikan dibutuhkan adanya 2 subset data, maka datSVM akan dipartisi menjadi datLatih dan datUji dengan persentase data pada subset data latih 75% dari total data. Persentase datLatih antara 70–80 persen disarankan oleh pakar di bidang Statistika dan Sains Data. Pada R, pembentukan subset dari matriks data bisa dilakukan menggunakan fungsi sample.split() yang didefinisikan pada library caTools dari . Jadi, Anda harus mengaktifkan caTools sebelum sample.split() bisa digunakan; bila diperlukan, harus diunduh menggunakan install.packages("caTools").

Membentuk Data Uji dan Data Latih

Perhatikan chunks berikut:

library("caTools")
set.seed(1234) # Membangkitkan bilangan acak dengan seed = 1234
Split = sample.split(datSVM$Purchased, SplitRatio = 0.75)
datLatih = subset(datSVM, Split == TRUE)
datUji   = subset(datSVM, Split == FALSE)

# Menampilkan 5 observasi pertama dari masing-masing obyek
head(Split, 10) # Nilai Split untuk 10 observasi pertama
##  [1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
head(datLatih, 5)
head(datUji, 5)

Periksalah bahwa datLatih dan datUji masing-masing memiliki 300 observasi (berasal dari \(400 \times 0.75\)) dan 100 observasi. Sebelum dilakukan pembentukan support vector, observasi-observasi yang memiliki kontribusi tinggi pada pengklasifikasian obyek, sangatlah penting Anda melihat rentang pengukuran dari setiap atribut numerik pada matriks data. Pada datSVM termasuk kedua partisinya, Age dan EstimatedSalary merupakan 2 atribut numerik bertipe integer. Perhatikan ringkasan dari kedua atribut ini.

summary(datSVM[1:4])
##     Gender               Age        EstimatedSalary  Purchased
##  Length:400         Min.   :18.00   Min.   : 15000   0:257    
##  Class :character   1st Qu.:29.75   1st Qu.: 43000   1:143    
##  Mode  :character   Median :37.00   Median : 70000            
##                     Mean   :37.66   Mean   : 69742            
##                     3rd Qu.:46.00   3rd Qu.: 88000            
##                     Max.   :60.00   Max.   :150000
summary(datLatih[1:4])
##     Gender               Age        EstimatedSalary  Purchased
##  Length:300         Min.   :18.00   Min.   : 15000   0:193    
##  Class :character   1st Qu.:29.00   1st Qu.: 42000   1:107    
##  Mode  :character   Median :37.00   Median : 65000            
##                     Mean   :37.75   Mean   : 67610            
##                     3rd Qu.:46.00   3rd Qu.: 86000            
##                     Max.   :60.00   Max.   :150000
summary(datUji[1:4])
##     Gender               Age        EstimatedSalary  Purchased
##  Length:100         Min.   :18.00   Min.   : 16000   0:64     
##  Class :character   1st Qu.:30.75   1st Qu.: 52000   1:36     
##  Mode  :character   Median :37.00   Median : 72500            
##                     Mean   :37.38   Mean   : 76140            
##                     3rd Qu.:42.25   3rd Qu.: 98750            
##                     Max.   :60.00   Max.   :149000

Bila dicermati, kedua atribut memiliki rentang pengukuran yang berbeda. Hal ini berimplikasi pada meningkatnya ketaktepatan klasifikasi SVM. Pada kasus ini, terdapat beberapa teknik yang bisa dipilih untuk ‘menstardarisasi’ rentang pengukuran yang berbeda antaratribut. Anda dipersilakan membaca tulisan Li & Liu untuk melihat teknik-teknik yang lazim digunakan dalam melakukan standarisasi data. Pada makalah ini akan digunakan fungsi standar scale() yang didefinisikan pada package base R.

Menstandarisasi Atribut Data

Pada bagian ini akan dilakukan standarisasi Age dan Estimated Salary sebagai 2 atribut numerik pada datLatih dan datUji. Perhatikan chunks berikut:

datLatih[2:3] = scale(datLatih[2:3])
datUji[2:3]   = scale(datUji[2:3])

# Menampilkan 10 observasi pertama dari kedua obyek setelah distandarisasi
head(datLatih, 10)
summary(datLatih[1:4])
##     Gender               Age           EstimatedSalary    Purchased
##  Length:300         Min.   :-1.87163   Min.   :-1.54730   0:193    
##  Class :character   1st Qu.:-0.82903   1st Qu.:-0.75321   1:107    
##  Mode  :character   Median :-0.07077   Median :-0.07676            
##                     Mean   : 0.00000   Mean   : 0.00000            
##                     3rd Qu.: 0.78227   3rd Qu.: 0.54086            
##                     Max.   : 2.10922   Max.   : 2.42315
head(datUji, 10)
summary(datUji[1:4])
##     Gender               Age          EstimatedSalary   Purchased
##  Length:100         Min.   :-1.8770   Min.   :-1.7820   0:64     
##  Class :character   1st Qu.:-0.6421   1st Qu.:-0.7153   1:36     
##  Mode  :character   Median :-0.0368   Median :-0.1079            
##                     Mean   : 0.0000   Mean   : 0.0000            
##                     3rd Qu.: 0.4717   3rd Qu.: 0.6700            
##                     Max.   : 2.1908   Max.   : 2.1589

Perhatikan ringkasan dari kedua subset data. Nilai tengah (mean) kedua atribut pada setiap subset data \(=0\) dan rentang data yang mirip. Mencermati hal ini, setelah dilakukan pembentukan data latih dan data uji serta standarisasi atribut-atribut numerik, pembentukan support vector bisa dilakukan.

Membentuk Support Vector

Klasifikasi observasi pada R menggunakan SVM membutuhkan library e1071 yang harus Anda unduh sebelumnya. Pada e1071 didefinisikan fungsi-fungsi standar yang dapat digunakan untuk membentuk support vector, memprediksi klas untuk amatan baru, serta melakukan fine tunning untuk parameter-parameter SVM yang dihasilkan. Perhatikan chunks berikut:

library("e1071")  # Aktifkan di memori, instal bila belum ada
attach(datLatih)  # Mengaktifkan datLatih

svm.Lin = svm(Purchased ~ Gender+Age+EstimatedSalary, 
              data = datLatih, type = "C-classification", kernel = "linear")

print(svm.Lin)
## 
## Call:
## svm(formula = Purchased ~ Gender + Age + EstimatedSalary, data = datLatih, 
##     type = "C-classification", kernel = "linear")
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  linear 
##        cost:  1 
## 
## Number of Support Vectors:  119

Kita akan mendiskusikan secara bertahap makna luaran svm.model, diawali dengan jumlah support vector sebesar 119 observasi, dari 300 observasi pada datLatih. Model SVM dibentuk dengan memformulasikan Purchased sebagai fungsi linear dari Gender, Age, EstimatedSalary. Tipe SVM yang digunakan adalah C-classification, salah satu dari 5 tipe yaitu C-classification, nu-classification, one-classification, eps-regression sebagai tipe default, dan nu-regression. Dua tipe pertama digunakan untuk mengklasifikasikan observasi, dua tipe terakhir digunakan untuk melakukan memprediksi model seperti halnya pada analisis regresi, dan tipe ketiga digunakan untuk mendeteksi apakah sebuah observasi merupakan observasi baru dari sebuah matriks data.

Klasifikasi pada Data Latih

Memprediksi Nilai Purchased

Marilah kita lihat pengklasifikasian observasi pada datLatih yang diberikan oleh svm.Lin yang dibangun. Perhatikan kode pada chunks berikut:

# Memprediksi Purchased pada Data Latih
datLatih.Prediksi = predict(svm.Lin, newdata = datLatih)
Hasil = data.frame(datLatih$Purchased, datLatih.Prediksi)
colnames(Hasil) = c("Aktual", "Prediksi")
head(Hasil, n = 10)

Menggunakan model svm.Lin sebagai teknik klasifikasi yang diperoleh menggunakan datLatih, dilakukan prediksi mengenai nilai dari Purchased pada data datSVM.Latih. Selanjutnya, hasil prediksi dan nilai aktual disimpan pada Hasil. Perhatikan 10 observasi pertama pada Hasil.

Memvalidasi Hasil Klasifikasi

Alih-alih memeriksa satu per satu kesesuaian antara nilai aktual dan prediksi dari Purchased, Anda bisa membuat confussion matrix yang layout-nya menyerupai tabel kontingensi. Perhatikan contoh berikut:

Memanfaatkan keempat elemen pada confusion matrix, bisa dihitung beberapa statistik berikut:

Untuk menghitung confusion matrix dengan bentuk seperti Tabel beserta statistik terkait, Anda bisa menggunakan package caret dari , singkatan dari Clasification and Regression Training. Unduhlah dulu package ini bila belum tersedia, selanjutnya aktifkan di memori komputer Anda. Menggunakan fungsi confusionMatrix, bisa dihitung keakuratan klasifikasi dari model SVM yang diperoleh. Perhatikan kode berikut:

library("caret")
cm.Latih = table(datLatih$Purchased, datLatih.Prediksi)
confusionMatrix(cm.Latih)
## Confusion Matrix and Statistics
## 
##    datLatih.Prediksi
##       0   1
##   0 178  15
##   1  27  80
##                                           
##                Accuracy : 0.86            
##                  95% CI : (0.8155, 0.8972)
##     No Information Rate : 0.6833          
##     P-Value [Acc > NIR] : 1.341e-12       
##                                           
##                   Kappa : 0.6871          
##                                           
##  Mcnemar's Test P-Value : 0.08963         
##                                           
##             Sensitivity : 0.8683          
##             Specificity : 0.8421          
##          Pos Pred Value : 0.9223          
##          Neg Pred Value : 0.7477          
##              Prevalence : 0.6833          
##          Detection Rate : 0.5933          
##    Detection Prevalence : 0.6433          
##       Balanced Accuracy : 0.8552          
##                                           
##        'Positive' Class : 0               
## 

Luaran fungsi confusionMatrix dari caret menunjukkan keakurasian klasifikasi sebesar \(\pm 86\%\) dengan rentang kepercayaan (confidence interval) 95% berada pada kisaran 0.8155 – 0.8972. Interpretasi dari statistik lainnya bisa Anda telusuri pada tautan ini.

Klasifikasi pada Data Uji

Menjadi pertanyaan yang menarik, bagaimanakah klasifikasi dari svm.Lin yang dibangun menggunakan data latih datLatih pada data uji datUji? Bagaimanakah keakurasian prediksi dan confusion matrix pada datUji? Perhatikan chunks berikut:

library("caret")
datUji.Prediksi = predict(svm.Lin, newdata = datUji)
Hasil.Uji = data.frame(datUji$Purchased, datUji.Prediksi)
colnames(Hasil.Uji) = c("Aktual", "Prediksi")
head(Hasil.Uji, n = 5)
cm.Uji = table(datUji$Purchased, datUji.Prediksi)
confusionMatrix(cm.Uji)
## Confusion Matrix and Statistics
## 
##    datUji.Prediksi
##      0  1
##   0 59  5
##   1  9 27
##                                           
##                Accuracy : 0.86            
##                  95% CI : (0.7763, 0.9213)
##     No Information Rate : 0.68            
##     P-Value [Acc > NIR] : 3.065e-05       
##                                           
##                   Kappa : 0.6886          
##                                           
##  Mcnemar's Test P-Value : 0.4227          
##                                           
##             Sensitivity : 0.8676          
##             Specificity : 0.8438          
##          Pos Pred Value : 0.9219          
##          Neg Pred Value : 0.7500          
##              Prevalence : 0.6800          
##          Detection Rate : 0.5900          
##    Detection Prevalence : 0.6400          
##       Balanced Accuracy : 0.8557          
##                                           
##        'Positive' Class : 0               
## 

Sebelum kedua hasil klasifikasi tersebut dikomparasikan –klasifikasi pada datLatih dan datUji, terlebih dulu akan dijelaskan besaran yang lazim digunakan pada aplikasi SVM dalam mengklasifikasikan observasi.

Mengevaluasi Model

Dalam machine learning, terdapat beberapa besaran (metrics) yang lazim digunakan untuk mengevaluasi model yang dibentuk. Pada SVM terdapat besaran-besaran yang dihasilkan menggunakan package caret untuk mengevaluasi model. Perhatikan penjelasan ringkas berikut:

Merujuk kepada nilai-nilai statistik pada Tabel dan nilai Cohen \(\kappa\), keakurasian klasifikasi pada datLatih dan datUji menggunakan model SVM yang dibangun melalui observasi pada datLatih dapat diringkas pada Tabel :

Tabel memperlihatkan keempat indikator menunjukkan perbedaan kecil mulai desimal ketiga yang menunjukkan keakurasian model SVM yang diperoleh menggunakan data latih saat dicobakan pada data uji cenderung stabil dan tidak menunjukkan adanya potensi over fitting; model memberikan akurasi yang memuaskan pada data latih tetapi tidak memuaskan pada data uji. Statistik Cohen \(\kappa\) juga memberikan tingkat akurasi klasifikasi yang baik. Meskipun model yang dibentuk dengan kernel linear memberikan hasil klasifikasi yang memuaskan, mungkinkah model di-fine tunning agar akurasi klasifikasi meningkat?

Model Fine Tuning

Salah satu ‘keindahan’ dari SVM sebagai salah satu teknik pada soft modeling adalah adanya ‘kesempatan’ untuk memilih opsi lain pada parameter model. Perhatikan svm.Lin sebelumnya. Kernel – fungsi matematika yang digunakan untuk memisahkan kelas, adalah fungsi linear. Bagaimanakah keakurasian model bila kernel yang dipilih bukan linear, misalnya Radial Basis Function (RBF) sebagai kernel default pada aplikasi bertipe C-clasification? Sekali lagi, artikel ini tidak menjelaskan secara rinci mengenai teori Matematika di ‘balik’ SVM, dan ditujukan hanya sebagai artikel introduksi ke SVM. Anda dianjurkan untuk membaca untuk mengetahui mathematical background SVM.

Pada bagian ini kita akan mencoba meningkatkan kinerja SVM dengan memilih secara manual kernel dan beberapa pengaturan lainnya. Perhatikan chunks berikut:

library("e1071")
attach(datLatih)

svm.RBF1 = svm(Purchased ~ Gender+Age+EstimatedSalary, 
               data = datLatih, type = "C-classification", kernel = "radial",
               cost = 0.5)

svm.RBF2 = svm(Purchased ~ Gender+Age+EstimatedSalary, 
               data = datLatih, type = "C-classification", kernel = "radial", 
               cost = 1.0)

print(svm.RBF1)
print(svm.RBF2)
datLatih.Prediksi1 = predict(svm.RBF1, newdata = datLatih)
datLatih.Prediksi2 = predict(svm.RBF2, newdata = datLatih)

library("caret")
cm.Latih1 = table(datLatih$Purchased, datLatih.Prediksi1)
cm.Latih2 = table(datLatih$Purchased, datLatih.Prediksi2)
confusionMatrix(cm.Latih1)
confusionMatrix(cm.Latih2)

Pada kode di atas, dengan luaran tidak ditampilkan, kita membentuk 2 model SVM pada datLatih yang kita namakan svm.RBF1 dan svm.RBF2. Perbedaan kedua model hanya terletak pada pemilihan fungsi cost, sebuah nilai yang digunakan untuk mengontrol tingkat kesalahan klasifikasi pada data latih. Semakin besar nilai cost, maka semakin kecil kesalahan klasifikasi yang diijinkan. Perhatikan ringkasan dari beberapa besaran pada confusion matrix berikut:

Tabel menunjukkan kinerja kernel radial mengungguli kernel linear pada matriks yang dimodelkan. Bila kernel linear memiliki tingkat akurasi klasifikasi 86%, kedua model SVM dengan kernel radial memiliki tingkat akurasi klasifikasi yang lebih tinggi serta nilai \(\kappa > 0.80\) yang tergolong sangat baik (lihat Tabel di halaman ).

Saat model dengan kernel radial dibandingkan berdasarkan parameter cost, masing-masing sebesar 0.5 dan 1.0, terlihat model svm.RBF2 memiliki empat kriteria pertama dengan nilai lebih besar daripada svm.RBF1. Semakin besar nilai cost (C) pada model, semakin besar akurasi model atau semakin kecil bias dari klasifikasi yang diindikasikan oleh berkurangnya variansi (variance) dari atribut yang diprediksi. Hal ini bisa dilihat dengan memerhatikan selang kepercayaan 95% pada svm.RBF1 yang lebih lebar dibandingkan selang kepercayaan pada svm.RBF2.

Bila Anda ‘malas’ untuk melakukan tuning secara manual, package e1071 memiliki fungsi tune() yang bisa digunakan untuk tuning pada parameter-parameter dari hyperplane. Penjelasan rinci bisa dibaca pada . Chunks berikut digunakan untuk mendemonstrasikan tune() dalam membangun model SVM menggunakan datLatih.

Tuning = tune(svm, as.factor(Purchased) ~ ., 
              data = datLatih, type = "C-classification", kernel = "radial", 
              ranges = list(gamma = c(0.5, 1.0, 1.5), cost = 10^(0.1:1))
              )
print(Tuning)
## 
## Parameter tuning of 'svm':
## 
## - sampling method: 10-fold cross validation 
## 
## - best parameters:
##  gamma     cost
##    0.5 1.258925
## 
## - best performance: 0.07333333

Perhatikan sintaks penggunaan fungsi tune(). Penjelasan R (ketik ?tune() pada console) menunjukkan penentuan parameter ‘terbaik’ dilakukan menggunakan algoritma Grid Search yang tidak dijelaskan pada artikel ini. Argumen pertama dari tune() adalah metode svm yang akan di-tuning, diikuti dengan formula as.factor(Purchased) ~ .. Perhatikanlah bahwa Purchased pada datLatih bertipe integer yang harus diubah menjadi bertipe factor pada aplikasi SVM untuk mengklasifikasikan observasi.

Tipe dan fungsi kernel yang kita pilih sama dengan yang diperoleh pada svm.RBF1 dan svm.RBF2 yang terbukti memiliki kinerja lebih baik dibandingkan svm.Lin. Terdapat 2 parameter yang akan di-tuning, gamma (\(\gamma\)) dan cost dengan nilai \(\gamma\) yang diperiksa 0.5, 1.0, dan 1.5; serta cost berada pada rentang [\(10^{0.1}, \cdots, 10^{1}\)]. Hasil tuning menunjukkan \(\gamma = 0.5\) dan \(cost = 1.258925\) merupakan parameter-parameter penduga terbaik dari fungsi hyperplane. Kedua nilai ini selanjutnya digunakan untuk memodelkan ulang (re-modeling) support vector seperti diperlihatkan pada kode berikut:

svm.Tuning = svm(Purchased ~ Gender+Age+EstimatedSalary, 
                 data = datLatih, type = "C-classification",
                 kernel = "radial", gamma = 0.5, cost = 1.258925)
datLatih.Tuning = predict(svm.Tuning, newdata = datLatih)

library("caret")
cm.Tuning = table(datLatih$Purchased, datLatih.Tuning)

confusionMatrix(cm.Tuning)
## Confusion Matrix and Statistics
## 
##    datLatih.Tuning
##       0   1
##   0 178  15
##   1   7 100
##                                           
##                Accuracy : 0.9267          
##                  95% CI : (0.8911, 0.9535)
##     No Information Rate : 0.6167          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8428          
##                                           
##  Mcnemar's Test P-Value : 0.1356          
##                                           
##             Sensitivity : 0.9622          
##             Specificity : 0.8696          
##          Pos Pred Value : 0.9223          
##          Neg Pred Value : 0.9346          
##              Prevalence : 0.6167          
##          Detection Rate : 0.5933          
##    Detection Prevalence : 0.6433          
##       Balanced Accuracy : 0.9159          
##                                           
##        'Positive' Class : 0               
## 

Perhatikanlah besaran-besaran dari kelayakan model pada confusion matrix. Terlihat accuracy klasifikasi sebesar 0.9267 lebih tinggi dibandingkan yang diperoleh pada svm.RBF2 dan Cohen \(\kappa\) sebesar 0.8428 melebihi Cohen \(\kappa\) pada svm.RBF2. Cobalah untuk memeriksa apakah kedua parameter ini memberikan hasil klasifikasi yang lebih baik bila digunakan pada data uji.

Mengklasifikasikan Data Baru

Rangkaian aplikasi SVM pada data frame Data SVM.dat menghasilkan fungsi terbaik untuk mengklasifikasikan observasi berdasarkan atribut Purchased adalah hyperplane yang dibentuk dengan kernel radial, dengan nilai \(\gamma\) dan cost masing-masing sebesar 0.5 dan 1.259 seperti diperlihatkan pada obyek Tuning. Menjadi pertanyaan yang menarik tentang penggunaan parameter-parameter SVM ini untuk mengklasifikasikan observasi-observasi baru yang tidak ada pada Data Latih atau Data Uji. Sebagai contoh, seandainya Anda memiliki \(n\) pelanggan baru dengan atribut-atribut Gender, Age, dan EstimatedSalary, maka berapakah persentase pelanggan yang tergolong ke dalam kelompok Purchased = 1? Hal inilah yang sesungguhnya menjadi tujuan utama dari SVM pada pengklasifikasian observasi.

Bagian ini akan mendemonstrasikan penggunaan svm.Tuning yang diperoleh sebelumnya untuk menduga klasifikasi pada beberapa observasi baru. Sebelumnya, Anda harus mengunduh file Data Diprediksi.csv di dan meletakkan di working directory R Anda. Bila distribusi data baru mengikuti distribusi peluang dari datSVM yang diasumsikan menyebar normal, maka terlebih dulu harus dihitung mean dan simpangan baku dari atribut datSVM yang bertipe numerik, sebagai berikut:

# Menghitung parameter mean dan simp. baku dari data awal datSVM
MeanAge = mean(datSVM$Age)
SDevAge = sd(datSVM$Age)

MeanSal = mean(datSVM$EstimatedSalary)
SDevSal = sd(datSVM$EstimatedSalary)

Jika atribut bertipe numerik pada obyek data yang baru – misalkan bernama NewObs – mengikuti distribusi peluang datSVM, maka distribusi peluang NewObs dapat dinyatakan sebagai:

Mari kita persiapkan dat frame NewObs yang akan diklasifikasikan menggunakan hyperplane terbaik yang diperoleh dengan svm.Tuning.

# Mempersiapkan data frame baru
NewObs = read.csv("Data Diprediksi.csv")
str(NewObs) # struktur data dari obyek NewObs
## 'data.frame':    20 obs. of  4 variables:
##  $ Gender         : chr  "Male" "Male" "Male" "Female" ...
##  $ Age            : int  35 35 49 39 41 58 47 55 52 40 ...
##  $ EstimatedSalary: int  22000 39000 74000 134000 71000 101000 47000 130000 114000 142000 ...
##  $ Purchased      : logi  NA NA NA NA NA NA ...
NewObs[4] = factor(NewObs[4], levels = c(0,1)) # Mengubah menjadi factor
head(NewObs, n=5)

Mengingat svm.Tuning diperoleh dari obyek datUji yang distandarisasi, maka observasi-observasi yang akan diprediksi klasifikasinya juga harus diberi perlakuan sama, tetapi bukan menggunakan fungsi scale() melainkan menggunakan formulasi normalisasi berikut (Kenapa?):

Normalisasi Age dan EstimatedSalary serta 5 observasi yang pertama ditunjukkan pada chunks berikut:

# Menstandarisasi Age dan EstimatedSalary dengan parameter data awal
NewObs$Age = (NewObs$Age - MeanAge)/SDevAge
NewObs$EstimatedSalary = (NewObs$EstimatedSalary - MeanSal)/SDevSal
head(NewObs, n=10)

Melalui serangkaian proses sebelumnya, kita telah siap mengklasifikasikan potensi Purchased dari 20 observasi pada NewObs. Lihat chunks berikut:

# Menggunakan klasifikasi svm.Tuning untuk memprediksi Purchaed
Prediksi = predict(svm.Tuning, newdata = NewObs[-4])
NewObs$Purchased = Prediksi
NewObs

Ringkasan Artikel

Sebagai sebuah metode Sains Data, SVM dapat digunakan untuk mengklasifikasikan atau memisahkan kelompok observasi dengan karakteristik penciri yang mirip antarobservasi (misalkan himpunan \({\tt A}\)) dengan kelompok observasi lain yang memiliki karakteristik penciri yang berbeda (\({\tt\overline{A}}\)). ‘Pemisahan’ ini dilakukan dengan membangun hyper plane yang memiliki kemampuan pemisah optimal. Meskipun SVM dikategorikan sebagai binary classifier technique, SVM juga dapat digunakan untuk mengklasifikasikan observasi multi-class yang tidak dibahas pada artikel ini. Selain bertujuan mengklasifikasikan, SVM juga dapat digunakan untuk memprediksi dengan memanfaatkan nilai-nilai atribut prediktor.

Seperti halnya berbagai teknik kuantitatif lain, SVM juga memiliki kelebihan dan kelemahan. Beberapa riset menunjukkan SVM secara umum memberikan hasil klasifikasi yang lebih baik dibandingkan dengan kinerja dari Naive-Bayes Classifier meski klasifikasi yang diperoleh sensitif dengan tipe kernel yang digunakan. Selain itu, saat observasi tidak bisa diklasifikasikan dengan tegas, keakurasian SVM menurun secara drastis. Secara ringkas, SVM diaplikasikan melalui tahapan berikut: