Machine Learning: Model Support Vector Machine dengan R untuk Mendeteksi Kanker Payudara

Support Vector Machine dengan R

Halo teman-teman, bertemu lagi dengan jokoding.com. Setelah kita mengulas survival analysis dan penerapannya dengan R, kali ini kita akan melanjutkan bahasan mengenai salah satu model dalam pembelajaran mesin (machine learning), yaitu Support Vector Machine model atau biasa disingkat SVM.

Support Vector Machine (SVM) merupakan salah satu model machine learning yang banyak digunakan untuk memecahkan permasalahan klasifikasi data (data classification) dengan formulasi regresi (regression). Dengan cara ini, SVM biasanya digunakan dalam pemodelan regresi sekaligus pengklasifikasian data.

Lebih lanjut, dalam pemodelan SVM, kita biasanya menggunakan data terlabelisasi (labeled data), yaitu data yang telah terpisah antara variabel dependen dan variabel independennya. Dengan ciri ini, penggunaan SVM dalam dunia sains data (data science) termasuk dalam supervised learning sebagaimana yang kita ulas bersama pada unggahan mengenai perbedaan supervised learning dan unsupervised learning sebelumnya di dalam blog ini.

Beranjak pada teori dari SVM, berdasarkan beberapa literatur baik buku maupun media daring (online), Support Vector Machine (SVM) merupakan algoritma machine learning dengan prinsip pengklasifikasian data dengan menggunakan garis pemisah terbaik (hyperplan) yang mampu mengoptimalkan margin (jarak tegak lurus amatan positif dan negatif terdekat terhadap garis hyperplan) melalui proses minimalisasi menggunakan teknik Lagrange. Amatan positif dalam pengertian ini merupakan amatan yang memiliki selisih positif terhadap garis hyperplan, sedangkan amatan negatif merupakan amatan yang memiliki selisih negatif terhadap garis hyperplan.

Mungkin dari pengertian di atas, mungkin ada yang belum paham. Saya pun juga belum paham kalau sebatas teori. Baik, kita coba membahas dengan sedikit visualisasi sederhana. Misalkan kita dihadapkan pada sekumpulan data yang memiliki pola sebagai berikut untuk diklasifikasikan:

Visualisasi data dasar

Dari data tersebut, kita diminta untuk membuat sebuah pemisah yang jelas antara dua kumpulan amatan dalam data itu. Oleh karena itu, kita coba buat sebuah garis lurus yang mungkin sebagai berikut:

Kemungkinan pemisah berupa garis lurus dua data

Terlihat bahwa akan ada banyak sekali kemungkinan garis lurus yang kita buat supaya menjadi dasar pemisah yang jelas, misalkan kasusnya memisahkan antara gender laki-laki dan perempuan berdasarkan data wajahnya. Kemugkinan garis pemisah sebagai dasar pencirian gender itu kita lakukan sampai kita peroleh sebuah garis pemisah yang paling baik.

Di sinilah awal mula penggunaan support vector machine (SVM). Dengan menggunakan teknik lagrange, kita berusaha untuk menemukan garis pemisah terbaik atau yang kemudian disebut sebagai hyperplan sebagai garis lurus pemisah sebagai dasar klasifikasi data menjadi 2 bagian (2 kelas) yang berbeda (jelas). Bagaimana mendapatkan hyperplan terbaik? Yaitu dengan melakukan penghitungan optimasi sedemikian rupa sehingga diperoleh margin hyperplan optimal.

Fitur utama model SVM

Di dalam memperoleh margin optimal, kita akan memperhitungkan beberapa amatan positif dan negatif terdekat dari hyperplan yang mungkin, Amatan-amatan yang paling dekat dengan hyperplan ini kemudian kita sebut sebagai support vector dan sekaligus menjadi ikhwal penamaan model SVM. Support vector ini merupakan amatan penting penentuan hyperplan karena bila mereka dibuang atau dikeluarkan dari data akan memengaruhi posisi atau letak dari hyperplan terbaik. Sebuah hyperplan dikatakan sebagai hyperplan terbaik bila memiliki margin paling optimal sedemikian rupa sehingga "adil" atau fair terhadap seluruh amatan support vector berdasarkan jaraknya.

Adapun pemanfaatan support vector machine (SVM) dalam data science saat ini semakin luas. Mulai dari analisis sentimen (sentiment analysis) entah berdasarkan kata, emoji, mimik wajah, atau lainnya; kemudian diterapkan pula dalam mendeteksi spam, spam email, spam message; lalu diterapkan juga dalam handwritten digit recognition, image recognition; dan satu lagi biasanya diimplementasikan di bidang kesehatan, misalnya untuk mendeteksi apakah seseorang mengidap penyakit kanker atau tidak.

Mengingat SVM ini merupakan supervised learning, maka dalam praktiknya kita akan melatih mesin terhadap pola data terlebih dahulu dengan menggunakan data terpisah (data split). Data untuk melatih mesin kita sebut sebagai train dataset, sedangkan data untuk melakukan uji model (dalam hal ini SVM) kita sebut sebagai test dataset. Dimensi dari train dataset dan test dataset ini masih debatable sehingga dalam praktik kali ini, kita pilih aman saja, yaitu rentang 75 persen - 80 persen.

Setiap pemodelan tentu biasa memiliki keunggulan dan kelemahan, tak terlepas pula pada model SVM. Kelebihan dari model SVM ini ada beberapa, yaitu berkinerja baik untuk set data yang berukuran kecil dan telah melalui tahapan pembersihan data (data preprocessing dan data wrangling); hasilnya akurat; baik untuk klasifikasi data baik secara linier maupun non-linier (non-linier biasanya menggunakan fungsi Kernel); Efektif digunakan untuk data yang berdimensi ruang banyak (multivariat). Sedangkan kelemahan model ini meliputi tidak sesuai bila digunakan untuk data besar (big data) dengan ukuran train dataset yang lebih besar dari train dataset sebab tidak efisien dari sisi waktu dan bisa menimbulkan overfitting; tidak begitu efektif bila data kita memiliki beberapa kelas yang overlap (misalkan variabel X1 laki: 1, perempuan: 0 dan variabel X2 kondisi keparahan penyakit, ya: 1, tidak: 0); kesalahan pemilihan fungsi Kernel karena ketidakpaham.

Baik, itu sekilas mengenai teori singkat sekaligus kelebihan serta kelemahan dari model SVM. Terakhir, kita akan mencoba mempraktikkan SVM ini menggunakan R. Kasus data yang kita angkat dalam praktik kali ini adalah bagaimana penerapan SVM dalam mendeteksi kanker payudara seseorang dari berbagai indikator (lebih jelas bisa dicek datanya langsung). Data pengukuran dan diagnosa kanker payudara ini merupakan data sekunder dari UCI Wicoxsin University yang dapat teman-teman unduh pada tautan berikut. Setelah diunduh, kita akan mempraktikkan pemodelan SVM dengan menggunakan beberapa code berikut:

Code:

#Install dan aktivasi package
install.packages("e1071")
install.packages("caret")
library(e1071)
library(caret)

#Mengimport Data
library(readxl)
kankerpd <- read_excel("C:/Users/Joko Ade/Downloads/kankerpd.xlsx")

#Melihat Sekilas Data dan Strukturnya
head(kankerpd, 20)
str(kankerpd)

Hasil:

        id diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean
      <dbl> <chr>           <dbl>        <dbl>          <dbl>     <dbl>           <dbl>            <dbl>
 1   842302 M                18.0         10.4          123.      1001           0.118            0.278
 2   842517 M                20.6         17.8          133.      1326           0.0847           0.0786
 3 84300903 M                19.7         21.2          130       1203           0.110            0.160
 4 84348301 M                11.4         20.4           77.6      386.          0.142            0.284
 5 84358402 M                20.3         14.3          135.      1297           0.100            0.133
 6   843786 M                12.4         15.7           82.6      477.          0.128            0.17  
 7   844359 M                18.2         20.0          120.      1040           0.0946           0.109
 8 84458202 M                13.7         20.8           90.2      578.          0.119            0.164
 9   844981 M                13           21.8           87.5      520.          0.127            0.193
10 84501001 M                12.5         24.0           84.0      476.          0.119            0.240
11   845636 M                16.0         23.2          103.       798.          0.0821           0.0667
12 84610002 M                15.8         17.9          104.       781           0.0971           0.129
13   846226 M                19.2         24.8          132.      1123           0.0974           0.246
14   846381 M                15.8         24.0          104.       783.          0.0840           0.100
15 84667401 M                13.7         22.6           93.6      578.          0.113            0.229
16 84799002 M                14.5         27.5           96.7      659.          0.114            0.160
17   848406 M                14.7         20.1           94.7      684.          0.0987           0.072
18 84862001 M                16.1         20.7          108.       799.          0.117            0.202
19   849014 M                19.8         22.2          130       1260           0.0983           0.103
20  8510426 B                13.5         14.4           87.5      566.          0.0978           0.0813
# ... with 24 more variables: concavity_mean <dbl>, concave points_mean <dbl>, symmetry_mean <dbl>,
#   fractal_dimension_mean <dbl>, radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
#   smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>, concave points_se <dbl>,
#   symmetry_se <dbl>, fractal_dimension_se <dbl>, radius_worst <dbl>, texture_worst <dbl>,
#   perimeter_worst <dbl>, area_worst <dbl>, smoothness_worst <dbl>, compactness_worst <dbl>,
#   concavity_worst <dbl>, concave points_worst <dbl>, symmetry_worst <dbl>,
#   fractal_dimension_worst <dbl>


tibble [569 x 32] (S3: tbl_df/tbl/data.frame)
 $ id                     : num [1:569] 842302 842517 84300903 84348301 84358402 ...
 $ diagnosis              : chr [1:569] "M" "M" "M" "M" ...
 $ radius_mean            : num [1:569] 18 20.6 19.7 11.4 20.3 ...
 $ texture_mean           : num [1:569] 10.4 17.8 21.2 20.4 14.3 ...
 $ perimeter_mean         : num [1:569] 122.8 132.9 130 77.6 135.1 ...
 $ area_mean              : num [1:569] 1001 1326 1203 386 1297 ...
 $ smoothness_mean        : num [1:569] 0.1184 0.0847 0.1096 0.1425 0.1003 ...
 $ compactness_mean       : num [1:569] 0.2776 0.0786 0.1599 0.2839 0.1328 ...
 $ concavity_mean         : num [1:569] 0.3001 0.0869 0.1974 0.2414 0.198 ...
 $ concave points_mean    : num [1:569] 0.1471 0.0702 0.1279 0.1052 0.1043 ...
 $ symmetry_mean          : num [1:569] 0.242 0.181 0.207 0.26 0.181 ...
 $ fractal_dimension_mean : num [1:569] 0.0787 0.0567 0.06 0.0974 0.0588 ...
 $ radius_se              : num [1:569] 1095 0.543 0.746 0.496 0.757 ...
 $ texture_se             : num [1:569] 0.905 0.734 0.787 1156 0.781 ...
 $ perimeter_se           : num [1:569] 8589 3398 4585 3445 5438 ...
 $ area_se                : num [1:569] 153.4 74.1 94 27.2 94.4 ...
 $ smoothness_se          : num [1:569] 0.0064 0.00522 0.00615 0.00911 0.01149 ...
 $ compactness_se         : num [1:569] 0.049 0.0131 0.0401 0.0746 0.0246 ...
 $ concavity_se           : num [1:569] 0.0537 0.0186 0.0383 0.0566 0.0569 ...
 $ concave points_se      : num [1:569] 0.0159 0.0134 0.0206 0.0187 0.0188 ...
 $ symmetry_se            : num [1:569] 0.03 0.0139 0.0225 0.0596 0.0176 ...
 $ fractal_dimension_se   : num [1:569] 0.00619 0.00353 0.00457 0.00921 0.00511 ...
 $ radius_worst           : num [1:569] 25.4 25 23.6 14.9 22.5 ...
 $ texture_worst          : num [1:569] 17.3 23.4 25.5 26.5 16.7 ...
 $ perimeter_worst        : num [1:569] 184.6 158.8 152.5 98.9 152.2 ...
 $ area_worst             : num [1:569] 2019 1956 1709 568 1575 ...
 $ smoothness_worst       : num [1:569] 0.162 0.124 0.144 0.21 0.137 ...
 $ compactness_worst      : num [1:569] 0.666 0.187 0.424 0.866 0.205 ...
 $ concavity_worst        : num [1:569] 0.712 0.242 0.45 0.687 0.4 ...
 $ concave points_worst   : num [1:569] 0.265 0.186 0.243 0.258 0.163 ...
 $ symmetry_worst         : num [1:569] 0.46 0.275 0.361 0.664 0.236 ...
 $ fractal_dimension_worst: num [1:569] 0.1189 0.089 0.0876 0.173 0.0768 ...

Code:

#Membuat matriks korelasi
kan <- kankerpd[,-c(1:2)]
corr_mat <- cor(kan)

#Mengurangi dimensi dari matriks korelasi
library(reshape2)
melt_corr <- melt(corr_mat)

#Membuat Visualisasi Matriks Korelasi Multi Variabel
#ggplot() untuk memformat template visualisasi
#geom_text() untuk menampilkan nilai dalam hal ini korelasi
library(ggplot2)
ggplot(data = melt_corr, aes(x=Var1, y = Var2, fill = value)) + geom_tile() +
  geom_text(aes(Var2, Var1, label = round(value,2)), color = "white", size = 1.5)

Hasil:

Matriks korelasi antar variabel independen

Code:

#Partisi Data
inTrain <- createDataPartition(y = kankerpd$diagnosis, p = 0.75, list = F)
train <- kankerpd[inTrain,]
test <- kankerpd[-inTrain,]

#Mengattach data
attach(train)
attach(test)

#Pemodelan SVM
svmku <- svm(as.factor(diagnosis) ~., data = train)
svmku

Hasil:

Call:
svm(formula = as.factor(diagnosis) ~ ., data = train)

Parameters:
   SVM-Type:  C-classification
 SVM-Kernel:  radial
       cost:  1

Number of Support Vectors:  116

Code:

#Prediksi dengan data train
prediksi_train <- predict(svmku, train)

#Melihat Akurasi SVM terhadap data train
confusionMatrix(prediksi_train, as.factor(train$diagnosis), mode = "everything")

Hasil:

Confusion Matrix and Statistics

          Reference
Prediction   B   M
         B 267   3
         M   1 156
                                          
               Accuracy : 0.9906          
                 95% CI : (0.9762, 0.9974)
    No Information Rate : 0.6276          
    P-Value [Acc > NIR] : <2e-16          
                                          
                  Kappa : 0.9799          
                                          
 Mcnemar's Test P-Value : 0.6171          
                                          
            Sensitivity : 0.9963          
            Specificity : 0.9811          
         Pos Pred Value : 0.9889          
         Neg Pred Value : 0.9936          
              Precision : 0.9889          
                 Recall : 0.9963          
                     F1 : 0.9926          
             Prevalence : 0.6276          
         Detection Rate : 0.6253          
   Detection Prevalence : 0.6323          
      Balanced Accuracy : 0.9887          
                                          
       'Positive' Class : B 

Code:

#Prediksi dengan data Test
prediksi_test <- predict(svmku, test)

#Melihat Akurasi SVM terhadap data test
confusionMatrix(prediksi_test, as.factor(test$diagnosis), mode = "everything")

Hasil:

Confusion Matrix and Statistics

          Reference
Prediction  B  M
         B 87  6
         M  2 47
                                         
               Accuracy : 0.9437         
                 95% CI : (0.892, 0.9754)
    No Information Rate : 0.6268         
    P-Value [Acc > NIR] : <2e-16         
                                         
                  Kappa : 0.8777         
                                         
 Mcnemar's Test P-Value : 0.2888         
                                         
            Sensitivity : 0.9775         
            Specificity : 0.8868         
         Pos Pred Value : 0.9355         
         Neg Pred Value : 0.9592         
              Precision : 0.9355         
                 Recall : 0.9775         
                     F1 : 0.9560         
             Prevalence : 0.6268         
         Detection Rate : 0.6127         
   Detection Prevalence : 0.6549         
      Balanced Accuracy : 0.9322         
                                         
       'Positive' Class : B

Berdasarkan hasil pemodelan SVM dengan menggunakan data kanker payudara UCI Wicoxsin di atas, terlihat bahwa prediksi menggunakan train dataset diperoleh tingkat akurasi sebesar 99,60 persen sedangkan dengan test dataset diperoleh tingkat akurasi sebesar 94,37 persen. Akurasi model SVM yang kita peroleh ini sangat baik karena akurasinya di atas 80 persen. Signifikansi tingkat akurasinya juga baik karena nilai p-value[Acc > NIR] kurang dari alpha 0,05 (misal kita gunakan alpha 5 persen). Terlihat pula proporsi jumlah observasi positif yang tepat diprediksi SVM (Sensitivity) juga baik, pada train datasset diperoleh sebesar 99,63 persen dan test dataset sebesar 97,75 persen. Ukuran Precision menunjukkan banyaknya class yang berhasil dideteksi, dalam kasus kita untuk train dataset 98,89 persen dan test dataset sebesar 93,55 persen. Ukuran Recall menunjukkan banyaknya class ke-i yang berhasil ditemukan dibandingkan dengan class lainnya, untuk test dataset kita peroleh sebesar 97,75 persen. Sedangkan nilai F1 menunjukkan harmonisasi hasil prediksi terhadap Recall atau biasa disebut sebagai tingkat akurasi total. Dalam kasus kita ini, nilai F1 sangat baik, pada test dataset sebesar 95,60 persen. Bila data kita seimbang ukurannya (balanced data), kita cukup menggunakan nilai dari F1 saja sebagai dasar penentuan perbandingan hasil, sedangkan bila data kita tidak seimbang (imbalanced data), kita perlu mempertimbangkan hasil Precision dan Recall.

Demikian sedikit ulasan mengenai bagaimana SVM diterapkan dengan menggunakan R. Ikuti terus unggahan menarik berikutnya. Selamat memahami dan mempraktikkan!

Add Comments


EmoticonEmoticon