KFold Validation dan Ratio nya

By | July 28, 2024
Print Friendly, PDF & Email
2,306 Views

KFold Validation merupakan cara baik untuk menghilangkan bias yang terjadi ketika bekerja untuk menguji sebuah model algoritma. Sudah banyak yang menerangkan apa itu kfold validation, tapi disini kita sedikit membahas kfold validation secara lebih mudah tentu menggunakana bahasa R.

Split Dataset

Split dataset merupakan cara termudah untuk membagi dataset menjadi 2 block yaitu training dan testing menggunakan ratio, biasanya 70% yang artinya 70% dataset akan dimasukan ke training dan sisanya adalah testing. Seperti biasa kita akan menggunakan dataset bawaan R yaitu iris, kita loading saja package dplyr dan caret.

library(caret)
library(dplyr)


df = iris

Untuk mengetahui komposisi kelas/target/Species dataset yang terdiri dari 150 records, gunakan dplyr berikut

informasi = df %>% group_by(Species) %>% summarise(jumlah=n())
informasi

Hasilnya terdapat masing-masing 50 records

  Species    jumlah
* <fct>       <int>
1 setosa         50
2 versicolor     50
3 virginica      50

Kita gunakan ratio 0.7 untuk split dataset menggunakan caret

set.seed(1)
trainIndex = caret::createDataPartition(dat$Species, p = 0.7,
                                        list = FALSE,
                                        times = 1)

Agar tidak berubah-ubah setiap kali run, kita set saja set.seed(1) , kalian bebas menggunakan nilai berapa, itu hanya general random, yuk kita split menjadi dataset train dan test sebagai berikut

dfTrain <- df[ trainIndex,]
dfTest  <- df[-trainIndex,]

Kita akan cari tahu komposisi masing-masing, apakah sudah betul

informasi_train = dfTrain %>% group_by(Species) %>% summarise(jumlah=n())
informasi_train

Hasilnya menggunakan function diatas sudah OK,

  Species    jumlah
* <fct>       <int>
1 setosa         35
2 versicolor     35
3 virginica      35

Berarti dari record sejumlah 150 terbagi menjadi

  • train terdiri dari 105 record
  • sisanya yaitu 45 record adalah test

Biar lebih yakin, kita cek apakah 45 record

informasi_test = dfTest %>% group_by(Species) %>% summarise(jumlah=n())
informasi_test

Hasilnya

  Species    jumlah
* <fct>       <int>
1 setosa         15
2 versicolor     15
3 virginica      15

Menguji dataset dengan Kfold Validation

Secara umum kfold validation bisa diilustrasikan sebagai berikut

See also  Uji Kesamaan Rata-Rata Dari Dua Populasi Data Berpasangan dan Saling Berhubungan

Kfold 10

Kita akan menggunakan KFold 10 saja untuk mengetahui komposisinya, misalkan untuk KFold ke 1 sebagai data train dan sisanya sebagai data test.

set.seed(123)
fold <- createFolds(df$Species, k=10)
dfTrain <- df[fold$Fold01,]
dfTest  <- df[-fold$Fold01,]

informasi_train = dfTrain %>% group_by(Species) %>% summarise(jumlah=n())
informasi_train


informasi_test = dfTest %>% group_by(Species) %>% summarise(jumlah=n())
informasi_test

hasilnya

  Species    jumlah
* <fct>       <int>
1 setosa          5
2 versicolor      5
3 virginica       5

  Species    jumlah
* <fct>       <int>
1 setosa         45
2 versicolor     45
3 virginica      45

Kita bisa menyimpulkan

  • data train terdiri dari 15 record atau 10%
  • data test terdiri dari 135 atau 90%

Kita cek lagi untuk KFold ke 2 sebagai data train dan sisanya test menggunakan kode berikut

dfTrain <- df[fold$Fold02,]
dfTest  <- df[-fold$Fold02,]

informasi_train = dfTrain %>% group_by(Species) %>% summarise(jumlah=n())
informasi_train


informasi_test = dfTest %>% group_by(Species) %>% summarise(jumlah=n())
informasi_test

hasilnya

  Species    jumlah
* <fct>       <int>
1 setosa          5
2 versicolor      5
3 virginica       5

  Species    jumlah
* <fct>       <int>
1 setosa         45
2 versicolor     45
3 virginica      45

artinya sama hasilnya yaitu perbandingan 10% dan 90%

KFold 5

Kita akan coba untuk mengubah jumlah Kfold  5 saja

fold <- createFolds(df$Species, k=5)

dfTrain <- df[fold$Fold1,]
dfTest  <- df[-fold$Fold1,]

informasi_train = dfTrain %>% group_by(Species) %>% summarise(jumlah=n())
informasi_train


informasi_test = dfTest %>% group_by(Species) %>% summarise(jumlah=n())
informasi_test

hasilnya

  Species    jumlah
* <fct>       <int>
1 setosa         10
2 versicolor     10
3 virginica      10

  Species    jumlah
* <fct>       <int>
1 setosa         40
2 versicolor     40
3 virginica      40

Yuk kita hitung lagi, Kita bisa menyimpulkan

  • data train terdiri dari 30 record atau 20%
  • data test terdiri dari 120 atau 80%

KFold 10 dengan rasio 20% : 80%

Ada hal menarik yang harus kita perhatikan bahwa agar tetap mendapatkan rasio 20% : 80% dengan KFold 10, maka bisa menggunakan teknik seperti berikut

Dengan menggabungkan 2 blok dan melakukan slicing, misalkan Block 1 terdiri dari gabungan 1 dan 2

set.seed(123)
fold <- createFolds(df$Species, k=10)

block = c(fold$Fold01,fold$Fold02) #block 1

dfTrain = df[block,]
dfTest =  df[-block,]

informasi_train = dfTrain %>% group_by(Species) %>% summarise(jumlah=n())
informasi_train


informasi_test = dfTest %>% group_by(Species) %>% summarise(jumlah=n())
informasi_test

kita lihat hasilnya

  Species    jumlah
* <fct>       <int>
1 setosa         10
2 versicolor     10
3 virginica      10

  Species    jumlah
* <fct>       <int>
1 setosa         40
2 versicolor     40
3 virginica      40

bila ribet sebenarnya tetap menggunakan KFold 5 saja

See also  Cara Hitung Manual Uji Normalitas Shapiro Wilk

Confussion Matrix

Selesai urusan dataset, kita  lanjut ke confussion matrix, misalkan untuk prediksi dataset diatas, kita akan menggunakan SVM saja

# Support Vector Machines (SVM) with a radial kernel
model_svm = caret::train(Species~., data=dfTrain, method='svmRadial')

function diatas sudah tidak perlu memisahkan antara X dan Y, tapi untuk prediksi kita butuh hal tersebut, maka cara cepat gunakans aja dplry berikut

X = dfTrain %>% select(-Species)
Y = dfTrain$Species

Mari kita hitung akurasi dengan confusion matrix (sebenarnya ini kurang cocok sih karena bukan binary class, namun saya akan biarkan saja)

prediksi = caret:predict(model_svm,X)
caret::confusionMatrix(as.factor(Y),as.factor(prediksi))

hasil

Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         10          0         0
  versicolor      0         10         0
  virginica       0          0        10

Overall Statistics
                                     
               Accuracy : 1          
                 95% CI : (0.8843, 1)
    No Information Rate : 0.3333     
    P-Value [Acc > NIR] : 4.857e-15  
                                     
                  Kappa : 1          
                                     
 Mcnemar's Test P-Value : NA         

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            1.0000           1.0000
Specificity                 1.0000            1.0000           1.0000
Pos Pred Value              1.0000            1.0000           1.0000
Neg Pred Value              1.0000            1.0000           1.0000
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.3333            0.3333           0.3333
Detection Prevalence        0.3333            0.3333           0.3333
Balanced Accuracy           1.0000            1.0000           1.0000

Bila ada pertanyaan, silahkan kirim pertanyaan saja

ref:

https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial

https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial