Pada kesempatan kali ini saya akan mendemonstrasikan bagaimana cara menggunakan kNN dengan package caret di R. Caret merupakan package R yang keren banget, karena sampai saat ini sudah ada 150 algoritma machine learning yang langsung bisa kamu pakai. Caret juga sudah menyediakan function sampai contoh-contoh data (training maupun testing), preprocessing, evaluasi model, dan lain-lain.

Load caret package

library(caret)
Loading required package: lattice
Loading required package: ggplot2

Load and check the summary of dataset

summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  

Splitting Dataset to training and testing

set.seed(300)
#Spliting data as training and test set. Using createDataPartition() function from caret. p is the percentage of data that goes to training. 
indxTrain <- createDataPartition(y = iris$Species,p = 0.75,list = FALSE)
training <- iris[indxTrain,]
testing <- iris[-indxTrain,]

#Checking distibution in original data and partitioned data
prop.table(table(training$Species)) * 100
prop.table(table(testing$Species)) * 100

    setosa versicolor  virginica 
  33.33333   33.33333   33.33333 
prop.table(table(iris$Species)) * 100

    setosa versicolor  virginica 
  33.33333   33.33333   33.33333 

Note: creteDataParition function creates sample very effortlessly. We don’t need to write complex function!

PreProcessing

kNN requires variables to be normalized or scaled. caret provides facility to preprocess data. I am going to choose centring and scaling

trainX <- training[,names(training) != "Species"]
preProcValues <- preProcess(x = trainX,method = c("center", "scale"))
preProcValues
Created from 114 samples and 4 variables

Pre-processing:
  - centered (4)
  - ignored (0)
  - scaled (4)

Training and Train Control

set.seed(400)
ctrl <- trainControl(method="repeatedcv",repeats = 3) #,classProbs=TRUE,summaryFunction = twoClassSummary)
knnFit <- train(Species ~ ., data = training, method = "knn", trControl = ctrl, preProcess = c("center","scale"), tuneLength = 20)
#Output of kNN fit
knnFit
k-Nearest Neighbors 

114 samples
  4 predictor
  3 classes: 'setosa', 'versicolor', 'virginica' 

Pre-processing: centered (4), scaled (4) 
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 103, 102, 102, 103, 104, 103, ... 
Resampling results across tuning parameters:

  k   Accuracy   Kappa    
   5  0.9795455  0.9692784
   7  0.9765152  0.9648097
   9  0.9732323  0.9599186
  11  0.9702020  0.9553353
  13  0.9616162  0.9425332
  15  0.9618687  0.9429499
  17  0.9585859  0.9380065
  19  0.9403030  0.9102568
  21  0.9347475  0.9019235
  23  0.9256566  0.8881763
  25  0.9223232  0.8826633
  27  0.9228788  0.8839530
  29  0.9145455  0.8714530
  31  0.9173232  0.8756197
  33  0.9142929  0.8712033
  35  0.8960101  0.8432286
  37  0.8874242  0.8302540
  39  0.8874242  0.8302540
  41  0.8818687  0.8219206
  43  0.8788384  0.8172807

Accuracy was used to select the optimal model using  the largest value.
The final value used for the model was k = 5.
#Plotting yields Number of Neighbours Vs accuracy (based on repeated cross validation)
plot(knnFit)

knnPredict <- predict(knnFit,newdata = testing )
#Get the confusion matrix to see accuracy value and other parameter values
confusionMatrix(knnPredict, testing$Species )
Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         4
  virginica       0          1         8

Overall Statistics
                                         
               Accuracy : 0.8611         
                 95% CI : (0.705, 0.9533)
    No Information Rate : 0.3333         
    P-Value [Acc > NIR] : 8.705e-11      
                                         
                  Kappa : 0.7917         
 Mcnemar's Test P-Value : NA             

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            0.9167           0.6667
Specificity                 1.0000            0.8333           0.9583
Pos Pred Value              1.0000            0.7333           0.8889
Neg Pred Value              1.0000            0.9524           0.8519
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.3333            0.3056           0.2222
Detection Prevalence        0.3333            0.4167           0.2500
Balanced Accuracy           1.0000            0.8750           0.8125
mean(knnPredict == testing$Species)
[1] 0.8611111

Pekerjaan ini terinspirasi dari link ini: http://rstudio-pubs-static.s3.amazonaws.com/16444_caf85a306d564eb490eebdbaf0072df2.html

LS0tDQp0aXRsZTogIkFsZ29yaXRtYSBrTk4gbWVuZ2d1bmFrYW4gcGFja2FnZSBjYXJldCBkaSBSIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJCZXJuYXJkdXMgQXJpIEt1bmNvcm8iDQpkYXRlOiBNYXkgMywgMjAxNw0KLS0tDQoNCjwhLS0gVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gIC0tPg0KDQo8IS0tIFRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gIC0tPg0KDQpQYWRhIGtlc2VtcGF0YW4ga2FsaSBpbmkgc2F5YSBha2FuIG1lbmRlbW9uc3RyYXNpa2FuIGJhZ2FpbWFuYSBjYXJhIG1lbmdndW5ha2FuIGtOTiBkZW5nYW4gcGFja2FnZSBjYXJldCBkaSBSLiBDYXJldCBtZXJ1cGFrYW4gcGFja2FnZSBSIHlhbmcga2VyZW4gYmFuZ2V0LCBrYXJlbmEgc2FtcGFpIHNhYXQgaW5pIHN1ZGFoIGFkYSAxNTAgYWxnb3JpdG1hIG1hY2hpbmUgbGVhcm5pbmcgeWFuZyBsYW5nc3VuZyBiaXNhIGthbXUgcGFrYWkuIENhcmV0IGp1Z2Egc3VkYWggbWVueWVkaWFrYW4gZnVuY3Rpb24gc2FtcGFpIGNvbnRvaC1jb250b2ggZGF0YSAodHJhaW5pbmcgbWF1cHVuIHRlc3RpbmcpLCBwcmVwcm9jZXNzaW5nLCBldmFsdWFzaSBtb2RlbCwgZGFuIGxhaW4tbGFpbi4gDQoNCiNMb2FkIGNhcmV0IHBhY2thZ2UgDQpgYGB7cn0NCmxpYnJhcnkoY2FyZXQpDQpgYGANCiNMb2FkIGFuZCBjaGVjayB0aGUgc3VtbWFyeSBvZiBkYXRhc2V0DQpgYGB7cn0NCmlyaXMgPC0gZGF0YS5mcmFtZShpcmlzKQ0KIyBTdW1tYXJ5IG9mIGRhdGENCnN1bW1hcnkoaXJpcykNCmBgYA0KDQojU3BsaXR0aW5nIERhdGFzZXQgdG8gdHJhaW5pbmcgYW5kIHRlc3RpbmcNCmBgYHtyfQ0Kc2V0LnNlZWQoMzAwKQ0KI1NwbGl0aW5nIGRhdGEgYXMgdHJhaW5pbmcgYW5kIHRlc3Qgc2V0LiBVc2luZyBjcmVhdGVEYXRhUGFydGl0aW9uKCkgZnVuY3Rpb24gZnJvbSBjYXJldC4gcCBpcyB0aGUgcGVyY2VudGFnZSBvZiBkYXRhIHRoYXQgZ29lcyB0byB0cmFpbmluZy4gDQppbmR4VHJhaW4gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbih5ID0gaXJpcyRTcGVjaWVzLHAgPSAwLjc1LGxpc3QgPSBGQUxTRSkNCnRyYWluaW5nIDwtIGlyaXNbaW5keFRyYWluLF0NCnRlc3RpbmcgPC0gaXJpc1staW5keFRyYWluLF0NCg0KI0NoZWNraW5nIGRpc3RpYnV0aW9uIGluIG9yaWdpbmFsIGRhdGEgYW5kIHBhcnRpdGlvbmVkIGRhdGENCnByb3AudGFibGUodGFibGUodHJhaW5pbmckU3BlY2llcykpICogMTAwDQpgYGANCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKHRlc3RpbmckU3BlY2llcykpICogMTAwDQpgYGANCmBgYHtyfQ0KcHJvcC50YWJsZSh0YWJsZShpcmlzJFNwZWNpZXMpKSAqIDEwMA0KYGBgDQoNCk5vdGU6IGNyZXRlRGF0YVBhcml0aW9uIGZ1bmN0aW9uIGNyZWF0ZXMgc2FtcGxlIHZlcnkgZWZmb3J0bGVzc2x5LiBXZSBkb24ndCBuZWVkIHRvIHdyaXRlIGNvbXBsZXggZnVuY3Rpb24hDQoNCiNQcmVQcm9jZXNzaW5nDQprTk4gcmVxdWlyZXMgdmFyaWFibGVzIHRvIGJlIG5vcm1hbGl6ZWQgb3Igc2NhbGVkLiBjYXJldCBwcm92aWRlcyBmYWNpbGl0eSB0byBwcmVwcm9jZXNzIGRhdGEuIEkgYW0gZ29pbmcgdG8gY2hvb3NlIGNlbnRyaW5nIGFuZCBzY2FsaW5nDQpgYGB7cn0NCnRyYWluWCA8LSB0cmFpbmluZ1ssbmFtZXModHJhaW5pbmcpICE9ICJTcGVjaWVzIl0NCnByZVByb2NWYWx1ZXMgPC0gcHJlUHJvY2Vzcyh4ID0gdHJhaW5YLG1ldGhvZCA9IGMoImNlbnRlciIsICJzY2FsZSIpKQ0KcHJlUHJvY1ZhbHVlcw0KYGBgDQoNCiNUcmFpbmluZyBhbmQgVHJhaW4gQ29udHJvbA0KYGBge3J9DQpzZXQuc2VlZCg0MDApDQpjdHJsIDwtIHRyYWluQ29udHJvbChtZXRob2Q9InJlcGVhdGVkY3YiLHJlcGVhdHMgPSAzKSAjLGNsYXNzUHJvYnM9VFJVRSxzdW1tYXJ5RnVuY3Rpb24gPSB0d29DbGFzc1N1bW1hcnkpDQprbm5GaXQgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGEgPSB0cmFpbmluZywgbWV0aG9kID0gImtubiIsIHRyQ29udHJvbCA9IGN0cmwsIHByZVByb2Nlc3MgPSBjKCJjZW50ZXIiLCJzY2FsZSIpLCB0dW5lTGVuZ3RoID0gMjApDQojT3V0cHV0IG9mIGtOTiBmaXQNCmtubkZpdA0KYGBgDQoNCmBgYHtyfQ0KI1Bsb3R0aW5nIHlpZWxkcyBOdW1iZXIgb2YgTmVpZ2hib3VycyBWcyBhY2N1cmFjeSAoYmFzZWQgb24gcmVwZWF0ZWQgY3Jvc3MgdmFsaWRhdGlvbikNCnBsb3Qoa25uRml0KQ0KYGBgDQoNCmBgYHtyfQ0Ka25uUHJlZGljdCA8LSBwcmVkaWN0KGtubkZpdCxuZXdkYXRhID0gdGVzdGluZyApDQojR2V0IHRoZSBjb25mdXNpb24gbWF0cml4IHRvIHNlZSBhY2N1cmFjeSB2YWx1ZSBhbmQgb3RoZXIgcGFyYW1ldGVyIHZhbHVlcw0KY29uZnVzaW9uTWF0cml4KGtublByZWRpY3QsIHRlc3RpbmckU3BlY2llcyApDQpgYGANCg0KYGBge3J9DQptZWFuKGtublByZWRpY3QgPT0gdGVzdGluZyRTcGVjaWVzKQ0KYGBgDQoNClBla2VyamFhbiBpbmkgdGVyaW5zcGlyYXNpIGRhcmkgbGluayBpbmk6IA0KaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xNjQ0NF9jYWY4NWEzMDZkNTY0ZWI0OTBlZWJkYmFmMDA3MmRmMi5odG1sIA==