{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "6e4f6396-cf67-ebcc-8238-24b5ae987a65"
      },
      "outputs": [],
      "source": [
        "#kNN\n",
        "#Load required libraries\n",
        "library(ggplot2)\n",
        "library(lattice)\n",
        "library(caret)\n",
        "library(nnet)\n",
        "library(class)\n",
        "training<-read.csv(\"train.csv\")\n",
        "inTrain<-sample(1:42000,35000)     #Using 35000 examples in training set.\n",
        "trainSub<-training[inTrain,]\n",
        "\n",
        "scaling<-function(f){\n",
        "  (f-sum(f)/(dim(f)[1]*dim(f)[2]))/(max(f)-min(f))\n",
        "}\n",
        "\n",
        "trainSub[2:785]<-scaling(trainSub[2:785])   #Mean normalization and feature scaling applied to training and test sets\n",
        "\n",
        "nzv<-nearZeroVar(trainSub[2:785],saveMetrics = TRUE)   #remove variables with near zero variance\n",
        "trainSub_nzv<- trainSub[c(rownames(nzv[nzv$percentUnique>0.1,]))]\n",
        "trainSub_nzv<-cbind(label=trainSub$label,trainSub_nzv)\n",
        "\n",
        "#preparing the test set\n",
        "testing<-read.csv(\"test.csv\")\n",
        "testing<-scaling(testing)\n",
        "testing_nzv<- testing[c(rownames(nzv[nzv$percentUnique>0.1,]))]\n",
        "\n",
        "#preparing the crossvalidation set\n",
        "incv<-sample(setdiff(1:42000,inTrain),5000)\n",
        "cvset<-training[incv,]\n",
        "cvset[2:785]<-scaling(cvset[2:785])\n",
        "cvset_nzv<-cvset[c(rownames(nzv[nzv$percentUnique>0.1,]))]\n",
        "cvset_nzv<-cbind(label=cvset$label,cvset_nzv)\n",
        "\n",
        "numiter=10\n",
        "accuracycv<-rep(0,numiter)\n",
        "iter=1:numiter\n",
        "#Run kNN for different values of k and choose the optimal one to be used for test set.\n",
        "for(i in 1:numiter){\n",
        "  mdl_cv<- knn(trainSub_nzv[2:dim(trainSub_nzv)[2]],cvset_nzv[2:dim(cvtest_nzv)[2]],trainSub_nzv$label,k=i)\n",
        "  accuracycv[i]<-sum(mdl_cv==cvset_nzv$label)/dim(cvset_nzv)[1]\n",
        "}\n",
        "#max accuracycv is 97.04 for k=5.\n",
        "p<-ggplot(data.frame(iter,accuracycv),aes(iter,accuracycv))+geom_point()\n",
        "p\n",
        "\n",
        "#Running kNN on test set with k=5.\n",
        "mdl_test<- knn(trainSub_nzv[2:dim(trainSub_nzv)[2]],testing_nzv,trainSub_nzv$label,k=which.max(accuracycv))  #Takes more than 20 minutes to execute.\n",
        "write.csv(mdl_test,file=\"submission_knn.csv\",row.names=FALSE) #need to add column name and serial number to this file\n",
        "#96.58 on the test set."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "60a489b4-a7a3-dfe7-a752-49d5de3d4048"
      },
      "outputs": [],
      "source": [
        ""
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "kernelspec": {
      "display_name": "R",
      "language": "R",
      "name": "ir"
    },
    "language_info": {
      "codemirror_mode": "r",
      "file_extension": ".r",
      "mimetype": "text/x-r-source",
      "name": "R",
      "pygments_lexer": "r",
      "version": "3.3.2"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}