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
Contents
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
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
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