{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "pb_dDlzNzarJ"
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn import datasets\n",
    "from skimage import exposure"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "nqtQ_NvvzarO"
   },
   "source": [
    "# **Part 2**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "htZjH9OLzarQ",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Temp\\ipykernel_32552\\1184837541.py:3: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
      "  df=train.append(test)\n"
     ]
    }
   ],
   "source": [
    "train = pd.read_csv(\"./fashion-mnist_train.csv\")\n",
    "test = pd.read_csv(\"./fashion-mnist_test.csv\")\n",
    "df=train.append(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tIbO1CdezarR"
   },
   "source": [
    "## Divide Data according to labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "id3DczdnzarR"
   },
   "outputs": [],
   "source": [
    "label=[]\n",
    "for c in range (10):\n",
    "    classes=df.loc[df['label']==c]\n",
    "    label.append(classes)\n",
    "#for example label[1] is for all the samples with label=1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "X_ZB-URkzarR"
   },
   "source": [
    "## Select Different N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "YsGGvFPxzarS",
    "outputId": "59e0e617-c5bf-4249-b1d8-b5647bf2a3bc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 17.9 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "train=[]\n",
    "test=[]\n",
    "for j in range(3000,6001,500):\n",
    "    temp1=[]\n",
    "    temp2=[]\n",
    "    for i in range(10):\n",
    "        data=label[i]\n",
    "        temp1.append(data[:j])\n",
    "        temp2.append(data[j:])\n",
    "    train.append(temp1)\n",
    "    test.append(temp2)\n",
    "#divide each class into two sets for each N we choose\n",
    "#for example: train[0] is the training set for N=3000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "E44DZcqozarU",
    "outputId": "28cb3881-9e40-400d-a2e1-8594f7c5d8f2"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3000, 3500, 4000, 4500, 5000, 5500, 6000])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(3000,6001,500)\n",
    "#there are 7 N we have chosen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "7NZSQ7hgzarV"
   },
   "outputs": [],
   "source": [
    "for i in range(7):\n",
    "    test[i]=pd.concat(test[i])\n",
    "    train[i]=pd.concat(train[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ey-j9Z26zarW"
   },
   "source": [
    "## Use KNN as classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "qbaqMlMqzarW",
    "outputId": "cdc67e7a-2290-434f-fed0-0e3e0123e07c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N= 3000 mean accuracy= 0.83355\n",
      "N= 3500 mean accuracy= 0.8366285714285714\n",
      "N= 4000 mean accuracy= 0.8391\n",
      "N= 4500 mean accuracy= 0.84252\n",
      "N= 5000 mean accuracy= 0.84405\n",
      "N= 5500 mean accuracy= 0.8440666666666666\n",
      "N= 6000 mean accuracy= 0.8473\n",
      "Wall time: 4min 9s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "N=[]\n",
    "accuracy=[]\n",
    "for i in range(7):\n",
    "    y_train = train[i]['label']\n",
    "    X_train = train[i].loc[:, train[i].columns != 'label']\n",
    "    \n",
    "    y_test = test[i]['label']\n",
    "    X_test = test[i].loc[:, test[i].columns != 'label']\n",
    "\n",
    "    knn = KNeighborsClassifier(n_neighbors=20)\n",
    "    knn.fit(X_train,y_train)\n",
    "    A=knn.score(X_test,y_test)\n",
    "    N.append(3000+500*i)\n",
    "    accuracy.append(A)\n",
    "    print('N=',3000+500*i ,'mean accuracy=', A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "IKOsHqdozarY"
   },
   "source": [
    "## Plot the figure"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "utpMPUH2zarY",
    "outputId": "5498bfa1-9e4c-4f54-9e71-16de04506840",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'mean Accuracy')"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA18AAAIjCAYAAAD80aFnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACCg0lEQVR4nOzdeVwV9f7H8ddhEUFZFBFccFfMfSfNrbTIhTTRTE1xz9xKrdRySyu9eXPJ0mwx7V79uaJZmmaU2WKomFvuS2kG4goKiizz+2MuR0lQUOCwvJ+Px3l4ZuY7cz7DeIx335nv12IYhoGIiIiIiIhkKztbFyAiIiIiIlIQKHyJiIiIiIjkAIUvERERERGRHKDwJSIiIiIikgMUvkRERERERHKAwpeIiIiIiEgOUPgSERERERHJAQpfIiIiIiIiOUDhS0REREREJAcofImIiIiIiOQAhS8REck28+fPx2Kx4O/vb+tS5B7++OMPLBYLFouFNWvW3LF9ypQpWCwWLly4YIPqRETyB4UvERHJNkuXLqVChQrs2LGD48eP27ocyaCpU6diGIatyxARyXcUvkREJFucOnWKX375hVmzZuHl5cXSpUttXVK6YmNjbV1CrlGvXj327dvH2rVrbV2KiEi+o/AlIiLZYunSpRQrVowOHTrQtWvXdMPXlStXGDVqFBUqVMDJyYmyZcvSp0+fVLe33bhxgylTplCtWjUKFy5MqVKl6NKlCydOnABg69atWCwWtm7dmurYKbfSLV682Lqub9++FC1alBMnTtC+fXtcXV3p1asXAD/++CPdunWjXLlyODk54evry6hRo7h+/foddR8+fJhnnnkGLy8vnJ2d8fPz4/XXXwfg+++/x2KxpBlgli1bhsViYfv27Wn+PHbt2oXFYmHJkiV3bNu8eTMWi4WvvvoKgKtXr/LSSy9Zf3YlS5bk8ccfZ/fu3WkeOyOeffZZqlWrpt4vEZFsoPAlIiLZYunSpXTp0oVChQrRo0cPjh07xs6dO1O1uXbtGi1atGDevHk88cQTzJ07lyFDhnD48GH++usvAJKSkujYsSNvvPEGDRs25N133+XFF18kOjqaAwcO3FdtiYmJBAQEULJkSf79738TFBQEwKpVq4iLi+OFF15g3rx5BAQEMG/ePPr06ZNq/3379uHv7893333HoEGDmDt3Lp07d+bLL78EoHXr1vj6+qYZOJcuXUrlypVp2rRpmrU1atSISpUqsXLlyju2rVixgmLFihEQEADAkCFDWLBgAUFBQcyfP5+XX34ZZ2dnDh06dF8/FwB7e3smTJjA3r171fslIpLVDBERkSy2a9cuAzC2bNliGIZhJCcnG2XLljVefPHFVO0mTZpkAEZISMgdx0hOTjYMwzAWLVpkAMasWbPSbfP9998bgPH999+n2n7q1CkDMD777DPruuDgYAMwxo0bd8fx4uLi7lg3ffp0w2KxGH/++ad1XcuWLQ1XV9dU626vxzAMY/z48YaTk5Nx5coV67qoqCjDwcHBmDx58h2fc7vx48cbjo6OxqVLl6zr4uPjDQ8PD6N///7Wde7u7sawYcPueqyMSvlZzZw500hMTDSqVq1q1K1b13pOkydPNgDj/PnzWfJ5IiIFkXq+REQkyy1duhRvb28effRRACwWC927d2f58uUkJSVZ261Zs4a6devy9NNP33EMi8VibVOiRAlGjBiRbpv78cILL9yxztnZ2fo+NjaWCxcu0KxZMwzD4LfffgPg/PnzbNu2jf79+1OuXLl06+nTpw/x8fGsXr3aum7FihUkJiby3HPP3bW27t27k5CQQEhIiHXdN998w5UrV+jevbt1nYeHB2FhYfz9998ZPOuMub33a926dVl6bBGRgkzhS0REslRSUhLLly/n0Ucf5dSpUxw/fpzjx4/j7+/PuXPnCA0NtbY9ceIEtWrVuuvxTpw4gZ+fHw4ODllWo4ODA2XLlr1j/enTp+nbty/FixenaNGieHl50apVKwCio6MBOHnyJMA9665evTqNGzdOdevh0qVLefjhh6lSpcpd961bty7Vq1dnxYoV1nUrVqygRIkSPPbYY9Z177zzDgcOHMDX15cmTZowZcoUa30PqlevXlSpUkXPfomIZCGFLxERyVLfffcdERERLF++nKpVq1pfzzzzDEC2jHqYXg/Y7b1st3NycsLOzu6Oto8//jgbNmxg7NixrFu3ji1btlgH60hOTs50XX369OGHH37gr7/+4sSJE/z666/37PVK0b17d77//nsuXLhAfHw869evJygoKFUIfeaZZzh58iTz5s2jdOnSzJw5k5o1a/L1119nutZ/Sun92rNnD1988cUDH09ERBS+REQkiy1dupSSJUuyatWqO149evRg7dq11tEDK1eufM9BMypXrsyRI0dISEhIt02xYsUAc+TE2/35558Zrnv//v0cPXqUd999l7Fjx9KpUyfatm1L6dKlU7WrVKkSQIYG+3j22Wext7fn//7v/1i6dCmOjo6pbhu8m+7du5OYmMiaNWv4+uuviYmJ4dlnn72jXalSpRg6dCjr1q3j1KlTeHp68tZbb2XoM+7lueeeo0qVKrzxxhvq/RIRyQIKXyIikmWuX79OSEgIHTt2pGvXrne8hg8fztWrV1m/fj0AQUFB6Y6ql/LLflBQEBcuXOD9999Pt0358uWxt7dn27ZtqbbPnz8/w7Xb29unOmbK+7lz56Zq5+XlRcuWLVm0aBGnT59Os54UJUqUoF27dvz3v/9l6dKlPPnkk5QoUSJD9Tz00EPUrl2bFStWsGLFCkqVKkXLli2t25OSkqy3QqYoWbIkpUuXJj4+3rruwoULHD58mLi4uAx97u1u7/1KuWYiInL/su4GehERKfDWr1/P1atXeeqpp9Lc/vDDD1snXO7evTuvvPIKq1evplu3bvTv35+GDRty6dIl1q9fz4cffkjdunXp06cPn3/+OaNHj2bHjh20aNGC2NhYvv32W4YOHUqnTp1wd3enW7duzJs3D4vFQuXKlfnqq6+IiorKcO3Vq1encuXKvPzyy5w9exY3NzfWrFnD5cuX72j73nvv0bx5cxo0aMDgwYOpWLEif/zxBxs2bGDPnj2p2vbp04euXbsCMG3atIz/MDF7vyZNmkThwoUZMGBAqlslr169StmyZenatSt169alaNGifPvtt+zcuZN3333X2u7999/njTfe4Pvvv6d169aZ+nwwn/2aNm3aHeclIiL3wXYDLYqISH4TGBhoFC5c2IiNjU23Td++fQ1HR0fjwoULhmEYxsWLF43hw4cbZcqUMQoVKmSULVvWCA4Otm43DHMI+Ndff92oWLGi4ejoaPj4+Bhdu3Y1Tpw4YW1z/vx5IygoyHBxcTGKFStmPP/888aBAwfSHGq+SJEiadZ28OBBo23btkbRokWNEiVKGIMGDTL27t17xzEMwzAOHDhgPP3004aHh4dRuHBhw8/Pz5g4ceIdx4yPjzeKFStmuLu7G9evX8/Ij9Hq2LFjBmAAxk8//XTHcV955RWjbt26hqurq1GkSBGjbt26xvz581O1Sxki/p/D8P/T7UPN/9Nnn31mrUNDzYuI3D+LYegmbhERkeySmJhI6dKlCQwM5NNPP7V1OSIiYkN65ktERCQbrVu3jvPnz9OnTx9blyIiIjamni8REZFsEBYWxr59+5g2bRolSpRg9+7dti5JRERsTD1fIiIi2WDBggW88MILlCxZks8//9zW5YiISC6gni8REREREZEcoJ4vERERERGRHKDwJSIiIiIikgM0yfJ9Sk5O5u+//8bV1RWLxWLrckRERERExEYMw+Dq1auULl0aO7v0+7cUvu7T33//ja+vr63LEBERERGRXOLMmTOULVs23e0KX/fJ1dUVMH/Abm5uNq5GRERERERsJSYmBl9fX2tGSI/C131KudXQzc1N4UtERERERO75OJIG3BAREREREckBCl8iIiIiIiI5QOFLREREREQkByh8iYiIiIiI5ACFLxERERERkRyg8CUiIiIiIpIDFL5ERERERERygMKXiIiIiIhIDlD4EhERERERyQEKXyIiIiIiIjnAwdYFiIiIiIiIZIZhwMWLcO0aFC0Knp5gsdi6qntTz5eIiIiIiOQJV67A3LnwUNUEvLygYkXw8jKX5841t+dmCl8iIiIiIpLrbd4M5csm8vKoROqdDGEl3dhCW1bSjXonQ3h5VCLlyyayebOtK02fbjsUEREREZFcbfNm6NghmQDjGz4x+uPDuVTbuxmricSbgdcX0bHDk3y1wY6AABsVexfq+RIRERERkVzryhV4JiiRAGMT65KfuiN4pfDhHOuSnyLA2MQzQYm58hZEhS8REREREcm1liyBuDj4JLk/DiTdta0DSXycPIC4OPj88xwqMBMUvkREREREJFcyDFgwL4Eg1qTb4/VPpYikCyHMfy8Bw8jmAjNJ4UtERERERHKlixfhyAlHgozVmdovyFjNkROOXLqUTYXdJ4UvERERERHJla5dM/8sxuVM7ZfS/urVrK7owSh8iYiIiIhIrlS0qPnnZYplar+U9q6uWV3Rg1H4EhERERGRXMnTE/wqJ7DG0jVT+62xdMWvcgLFi2dTYfdJ4UtERERERHIliwVeGOHIGoKIxDtD+0TgQwhdGDrSEYslmwvMJIUvERERERHJdW7ehC1bIDgYXFxgoN0iErG/6z6J2DPI7lNcXKBPnxwqNBMUvkREREREJFe5eBECAszXzz/DyjUObLY8SWe79UTgk+Y+EfjQ2W49my1PsirEAQ+P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R48ePXB0dHygokVEJG8ID4f27SEqCjw8YMQIW1ckIiKS+93XQ1pFihRh8ODBWV2LiIjkAZs2QdeuEBsLdetCUJCtKxIREckbMv3M1/Tp01m0aNEd6xctWsS//vWvLClKRERyp8WLITDQDF5t2sC2bVC6tK2rEhERyRsyHb4WLlxI9erV71hfs2ZNPvzwwywpSkREchfDgLfegn79zGHle/WCjRs1h5eIiEhmZDp8RUZGUqpUqTvWe3l5ERERkSVFiYhI7rJ//605vMaOhc8/1xxeIiIimZXpZ758fX35+eefqVixYqr1P//8M6V174mISL5Upw58+CHEx8Pw4bauRkREJG/KdPgaNGgQL730EgkJCTz22GMAhIaG8uqrrzJmzJgsL1BERGzjwgW4dg0qVDCXBw2yaTkiIiJ5XqbD1yuvvMLFixcZOnQoN2/eBKBw4cKMHTuWcePGZXmBIiKS806dgiefNJ/1+uUXKFHC1hWJiIjkfZmeZDnFtWvXOHToEM7OzlStWhUnJyeSkpKwt7fP6hpzJU2yLCL51e7d5hxe585BuXKwZQtUq2brqkRERHKvjGaDTA+4kaJo0aI0btyYWrVq8eeffzJ27FjKli17v4cTEZFc4JtvoFUrM3jVrQvbtyt4iYiIZJX7Dl9xcXF89tlntGjRgho1avDDDz8wevTorKxNRERy0OefQ4cO5nNebdrADz9oDi8REZGslOlnvn799Vc++eQTVq1aRbly5Th06BDff/89LVq0yI76REQkByxZAn37mu979oTPPtNQ8iIiIlktwz1f7777LjVr1qRr164UK1aMbdu2sX//fiwWC56entlZo4iIZLN27aByZXjlFfjPfxS8REREskOGe77Gjh3L2LFjmTp1aoEZVENEJD9LSoKUf85LloTwcHB3t21NIiIi+VmGe76mTZvGqlWrqFixImPHjuXAgQPZWZeIiGSjixehZUvz9sIUCl4iIiLZK8Pha/z48Rw9epT//Oc/REZG4u/vT926dTEMg8uXL2dnjSIikoX++AMeecScv2vsWLh61dYViYiIFAyZHu2wVatWLFmyhMjISIYOHUrDhg1p1aoVzZo1Y9asWfdVxAcffECFChUoXLgw/v7+7Nix467t58yZg5+fH87Ozvj6+jJq1Chu3LiRZtsZM2ZgsVh46aWXUq2/ceMGw4YNw9PT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uROAzz77jIiICOsywPHjx1mzZg0hISHWMBUbG8vo0aPZtWsXoaGh2NnZ8fTTT5OcnHzPmt5991127dqFg4MD/fv3v2v777//nhMnTvD999+zZMkSFi9ezOLFi63b+/Tpw99//83WrVtZs2YNH330UapA/U+JiYl07tyZVq1asW/fPrZv387gwYOtt7P++OOP9OnThxdffJGDBw+ycOFCFi9ezFtvvXXPn9PtIiIiqFmzJmPGjCEiIoKXX36Z2NhYAgICKFasGDt37mTVqlV8++23d4ST0NBQjhw5wpYtW/jqq6/SPP696gSws7Pjvffe4/fff2fJkiV89913vPrqq9bte/bsoU2bNtSoUYPt27fz008/ERgYSFJSkrXNkiVLKFKkCGFhYbzzzjtMnTqVLVu2pPvzXbBgAcOGDWPw4MHs37+f9evXU6VKlXTbu7q6snjxYg4ePMjcuXP5+OOPmT17tnX73b4Hw4YNIz4+nm3btrF//37+9a9/UbRo0XQ/S0QKIENERO4pODjY6NSpk2EYhvHwww8b/fv3NwzDMNauXWvc7Z/Sd99916hWrZpx8+bNDH3Ozp07DcC4evWqYRiG8f333xuA8e2331rbTJ8+3QCMEydOWNc9//zzRkBAgHW5VatWxkMPPWQkJydb140dO9Z46KGHrMvly5c3Zs+ebRiGYfz444+Gm5ubcePGjVT1VK5c2Vi4cKFhGIbh6upqLF68OEPnYRiGARhr1641DMMwTp06ZQDGJ598Yt3++++/G4Bx6NChDB0jxeTJkw1HR0cjKirqrp9//vx5AzD279+fqobffvvNMIy0f7YbNmwwAOP69evWz6pbt651e3BwsFG+fHkjMTHRuq5bt25G9+7dDcMwjEOHDhmAsXPnTuv2Y8eOGYD1Z/1PFy9eNABj69ataW5v06aN8fbbb6da95///McoVaqUdTmtn1Na6tata0yePNm6/NFHHxnFihUzrl27Zl23YcMGw87OzoiMjLSes7e3txEfH3/XY2ekzn9atWqV4enpaV3u0aOH8cgjj6TbvlWrVkbz5s1TrWvcuLExduzYdPcpXbq08frrr6e7/V4/u5kzZxoNGza0Lt/te1C7dm1jypQp6R5LREQ9XyIimfSvf/2LJUuWcOjQoXu27datG9evX6dSpUoMGjSItWvXpurpCQ8PJzAwkHLlyuHq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\n",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,6))\n",
    "plt.plot(N,accuracy,color='blue', linestyle='dashed', marker='o',\n",
    "         markerfacecolor='red', markersize=10)\n",
    "plt.title('Accuracy vs. N')\n",
    "plt.xlabel('N samples in training set for each class')\n",
    "plt.ylabel('mean Accuracy')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Choose N=6000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.76      0.86      0.81      1000\n",
      "           1       0.99      0.95      0.97      1000\n",
      "           2       0.75      0.79      0.77      1000\n",
      "           3       0.91      0.88      0.89      1000\n",
      "           4       0.79      0.80      0.79      1000\n",
      "           5       0.99      0.78      0.87      1000\n",
      "           6       0.64      0.57      0.60      1000\n",
      "           7       0.85      0.94      0.89      1000\n",
      "           8       0.97      0.94      0.95      1000\n",
      "           9       0.87      0.96      0.91      1000\n",
      "\n",
      "    accuracy                           0.85     10000\n",
      "   macro avg       0.85      0.85      0.85     10000\n",
      "weighted avg       0.85      0.85      0.85     10000\n",
      "\n",
      "N=6000, mean accuracy= 0.8473\n",
      "Wall time: 43.1 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "i=6\n",
    "y_train = train[i]['label']\n",
    "X_train = train[i].loc[:, train[i].columns != 'label']\n",
    "\n",
    "y_test = test[i]['label']\n",
    "X_test = test[i].loc[:, test[i].columns != 'label']\n",
    "\n",
    "knn = KNeighborsClassifier(n_neighbors=20)\n",
    "knn.fit(X_train,y_train)\n",
    "pred=knn.predict(X_test)\n",
    "print(classification_report(y_test,pred))\n",
    "print('N=6000, mean accuracy=',knn.score(X_test,y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vaEpNjBRzarZ",
    "tags": []
   },
   "source": [
    "# **Part 3**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "kmYITkXPzarZ"
   },
   "outputs": [],
   "source": [
    "X=df.iloc[:,1:]\n",
    "y=df.iloc[:,0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "pgibO5qezarZ"
   },
   "source": [
    "### Use Kfold to select training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "NdOtU5OwzarZ",
    "outputId": "62d0a18d-d2eb-48d3-ca46-71857c736354"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TRAIN: [10000 10001 10002 ... 69997 69998 69999] TEST: [   0    1    2 ... 9997 9998 9999]\n",
      "mean accuracy= 0.8513\n",
      "TRAIN: [    0     1     2 ... 69997 69998 69999] TEST: [10000 10001 10002 ... 19997 19998 19999]\n",
      "mean accuracy= 0.8457\n",
      "TRAIN: [    0     1     2 ... 69997 69998 69999] TEST: [20000 20001 20002 ... 29997 29998 29999]\n",
      "mean accuracy= 0.8473\n",
      "TRAIN: [    0     1     2 ... 69997 69998 69999] TEST: [30000 30001 30002 ... 39997 39998 39999]\n",
      "mean accuracy= 0.8477\n",
      "TRAIN: [    0     1     2 ... 69997 69998 69999] TEST: [40000 40001 40002 ... 49997 49998 49999]\n",
      "mean accuracy= 0.8429\n",
      "TRAIN: [    0     1     2 ... 69997 69998 69999] TEST: [50000 50001 50002 ... 59997 59998 59999]\n",
      "mean accuracy= 0.8472\n",
      "TRAIN: [    0     1     2 ... 59997 59998 59999] TEST: [60000 60001 60002 ... 69997 69998 69999]\n",
      "mean accuracy= 0.8474\n",
      "Wall time: 2min 32s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "kf = KFold(n_splits=7)\n",
    "kf.get_n_splits(X)\n",
    "\n",
    "for train_index, test_index in kf.split(X):\n",
    "    print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
    "    X_train, X_test = X.iloc[train_index], X.iloc[test_index]\n",
    "    y_train, y_test = y.iloc[train_index], y.iloc[test_index]\n",
    "    knn = KNeighborsClassifier(n_neighbors=20)\n",
    "    knn.fit(X_train,y_train)\n",
    "    print('mean accuracy=', knn.score(X_test,y_test))\n",
    "#From the following output, the first fold got the best accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FcraaJwxzara"
   },
   "source": [
    "### select the index of first fold as training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "IX8EG-0Szara",
    "outputId": "1eccef80-b161-4349-fd2c-9ebc353cf716"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.89      0.83      1009\n",
      "           1       0.99      0.96      0.97       972\n",
      "           2       0.73      0.78      0.76       951\n",
      "           3       0.91      0.86      0.88      1012\n",
      "           4       0.77      0.80      0.79       979\n",
      "           5       1.00      0.80      0.89      1008\n",
      "           6       0.65      0.56      0.60      1022\n",
      "           7       0.86      0.96      0.91      1037\n",
      "           8       0.97      0.94      0.96       974\n",
      "           9       0.89      0.96      0.93      1036\n",
      "\n",
      "    accuracy                           0.85     10000\n",
      "   macro avg       0.85      0.85      0.85     10000\n",
      "weighted avg       0.85      0.85      0.85     10000\n",
      "\n",
      "mean accuracy= 0.8513\n",
      "Wall time: 42.9 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "X_train, X_test = X.iloc[10000:], X.iloc[:10000]\n",
    "y_train, y_test = y.iloc[10000:], y.iloc[:10000]\n",
    "knn = KNeighborsClassifier(n_neighbors=20)\n",
    "knn.fit(X_train,y_train)\n",
    "pred=knn.predict(X_test)\n",
    "print(classification_report(y_test,pred))\n",
    "print('mean accuracy=', knn.score(X_test,y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "name": "Project1.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
