(A) Lazy Learners - kNN

## Total number of rows = 538
## Size of testing data = 108. Which is 20% of 538
## Size of training data = 430. Which is 80% of 538

kNN Error. (when k = 1)

## knn.train.error = 0
## knn.test.error = 0.425925925925926

Tuning K. (K ranging from 2:20)

## From the plot, the test error is minimized at various points, the smallest `k` which is minimal is `k = 3'. And KNN.test.error = 0.351851851851852



(B) Lazy Learners - kNN (without duration_ms)

## Total number of rows = 538
## Size of testing data = 108. Which is 20% of 538
## Size of training data = 430. Which is 80% of 538

## From the plot, the test error is minimized at various points, the smallest `k` which is minimal is `k = 6'. And KNN.test.error = 0.351851851851852



(A) Repeated Holdout

## Total number of rows = 538
## Size of testing data = 108. Which is 20% of 538
## Size of training data = 430. Which is 80% of 538
## Using the k = 3.
## The mean value of knn.rh.test.err is 0.418055555555556.



(B) Repeated Holdout (without duration_ms)

## Total number of rows = 538
## Size of testing data = 108. Which is 20% of 538
## Size of training data = 430. Which is 80% of 538
## Using the k = 6.
## The mean value of knn.rh.test.err is 0.422222222222222.



Repeated Cross Validation

## The best mean knn error occurs at k = 11.
## mean.knn.repcv.error = 0.381376659678546.



Support Vector Machines (SVMs)

## svm.test.error =  0.351851851851852



Ensemble Method (Bagging - Random Forests)

## rf.test.error =  0.37962962962963