1089 lines
87 KiB
Plaintext
1089 lines
87 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<p style=\"text-align:center\">\n",
|
||
" <a href=\"https://skills.network/?utm_medium=Exinfluencer&utm_source=Exinfluencer&utm_content=000026UJ&utm_term=10006555&utm_id=NA-SkillsNetwork-Channel-SkillsNetworkCoursesIBMDeveloperSkillsNetworkML0101ENSkillsNetwork20718538-2022-01-01\" target=\"_blank\">\n",
|
||
" <img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/assets/logos/SN_web_lightmode.png\" width=\"200\" alt=\"Skills Network Logo\">\n",
|
||
" </a>\n",
|
||
"</p>\n",
|
||
"\n",
|
||
"# K-Nearest Neighbors\n",
|
||
"\n",
|
||
"Estimated time needed: **25** minutes\n",
|
||
"\n",
|
||
"## Objectives\n",
|
||
"\n",
|
||
"After completing this lab you will be able to:\n",
|
||
"\n",
|
||
"* Use K Nearest neighbors to classify data\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this Lab you will load a customer dataset, fit the data, and use K-Nearest Neighbors to predict a data point. But what is **K-Nearest Neighbors**?\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**K-Nearest Neighbors** is a supervised learning algorithm. Where the data is 'trained' with data points corresponding to their classification. To predict the class of a given data point, it takes into account the classes of the 'K' nearest data points and chooses the class in which the majority of the 'K' nearest data points belong to as the predicted class.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Here's an visualization of the K-Nearest Neighbors algorithm.\n",
|
||
"\n",
|
||
"<img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/images/KNN_Diagram.png\">\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this case, we have data points of Class A and B. We want to predict what the star (test data point) is. If we consider a k value of 3 (3 nearest data points), we will obtain a prediction of Class B. Yet if we consider a k value of 6, we will obtain a prediction of Class A.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this sense, it is important to consider the value of k. Hopefully from this diagram, you should get a sense of what the K-Nearest Neighbors algorithm is. It considers the 'K' Nearest Neighbors (data points) when it predicts the classification of the test point.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<h1>Table of contents</h1>\n",
|
||
"\n",
|
||
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
|
||
" <ol>\n",
|
||
" <li><a href=\"https://#about_dataset\">About the dataset</a></li>\n",
|
||
" <li><a href=\"https://#visualization_analysis\">Data Visualization and Analysis</a></li>\n",
|
||
" <li><a href=\"https://#classification\">Classification</a></li>\n",
|
||
" </ol>\n",
|
||
"</div>\n",
|
||
"<br>\n",
|
||
"<hr>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Collecting scikit-learn==0.23.1\n",
|
||
" Downloading scikit_learn-0.23.1-cp37-cp37m-manylinux1_x86_64.whl (6.8 MB)\n",
|
||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.8/6.8 MB\u001b[0m \u001b[31m35.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0mm\n",
|
||
"\u001b[?25hRequirement already satisfied: numpy>=1.13.3 in /home/jupyterlab/conda/envs/python/lib/python3.7/site-packages (from scikit-learn==0.23.1) (1.21.6)\n",
|
||
"Requirement already satisfied: scipy>=0.19.1 in /home/jupyterlab/conda/envs/python/lib/python3.7/site-packages (from scikit-learn==0.23.1) (1.7.3)\n",
|
||
"Collecting joblib>=0.11 (from scikit-learn==0.23.1)\n",
|
||
" Downloading joblib-1.3.2-py3-none-any.whl (302 kB)\n",
|
||
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m302.2/302.2 kB\u001b[0m \u001b[31m25.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||
"\u001b[?25hCollecting threadpoolctl>=2.0.0 (from scikit-learn==0.23.1)\n",
|
||
" Downloading threadpoolctl-3.1.0-py3-none-any.whl (14 kB)\n",
|
||
"Installing collected packages: threadpoolctl, joblib, scikit-learn\n",
|
||
" Attempting uninstall: scikit-learn\n",
|
||
" Found existing installation: scikit-learn 0.20.1\n",
|
||
" Uninstalling scikit-learn-0.20.1:\n",
|
||
" Successfully uninstalled scikit-learn-0.20.1\n",
|
||
"Successfully installed joblib-1.3.2 scikit-learn-0.23.1 threadpoolctl-3.1.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"!pip install scikit-learn==0.23.1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's load required libraries\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"from sklearn import preprocessing\n",
|
||
"%matplotlib inline"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<div id=\"about_dataset\">\n",
|
||
" <h2>About the dataset</h2>\n",
|
||
"</div>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Imagine a telecommunications provider has segmented its customer base by service usage patterns, categorizing the customers into four groups. If demographic data can be used to predict group membership, the company can customize offers for individual prospective customers. It is a classification problem. That is, given the dataset, with predefined labels, we need to build a model to be used to predict class of a new or unknown case.\n",
|
||
"\n",
|
||
"The example focuses on using demographic data, such as region, age, and marital, to predict usage patterns.\n",
|
||
"\n",
|
||
"The target field, called **custcat**, has four possible values that correspond to the four customer groups, as follows:\n",
|
||
"1- Basic Service\n",
|
||
"2- E-Service\n",
|
||
"3- Plus Service\n",
|
||
"4- Total Service\n",
|
||
"\n",
|
||
"Our objective is to build a classifier, to predict the class of unknown cases. We will use a specific type of classification called K nearest neighbour.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Load Data \n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's read the data using pandas library and print the first five rows.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>region</th>\n",
|
||
" <th>tenure</th>\n",
|
||
" <th>age</th>\n",
|
||
" <th>marital</th>\n",
|
||
" <th>address</th>\n",
|
||
" <th>income</th>\n",
|
||
" <th>ed</th>\n",
|
||
" <th>employ</th>\n",
|
||
" <th>retire</th>\n",
|
||
" <th>gender</th>\n",
|
||
" <th>reside</th>\n",
|
||
" <th>custcat</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>13</td>\n",
|
||
" <td>44</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>64.0</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>11</td>\n",
|
||
" <td>33</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>136.0</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>68</td>\n",
|
||
" <td>52</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>24</td>\n",
|
||
" <td>116.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>29</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>33</td>\n",
|
||
" <td>33</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>33.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>30</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>41</td>\n",
|
||
" <td>39</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>17</td>\n",
|
||
" <td>78.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>16</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>45</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>38</td>\n",
|
||
" <td>35</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>76.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>45</td>\n",
|
||
" <td>59</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>166.0</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>68</td>\n",
|
||
" <td>41</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>72.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>10</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>33</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>125.0</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>35</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>80.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>15</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>41</td>\n",
|
||
" <td>38</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>37.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" region tenure age marital address income ed employ retire gender \\\n",
|
||
"0 2 13 44 1 9 64.0 4 5 0.0 0 \n",
|
||
"1 3 11 33 1 7 136.0 5 5 0.0 0 \n",
|
||
"2 3 68 52 1 24 116.0 1 29 0.0 1 \n",
|
||
"3 2 33 33 0 12 33.0 2 0 0.0 1 \n",
|
||
"4 2 23 30 1 9 30.0 1 2 0.0 0 \n",
|
||
"5 2 41 39 0 17 78.0 2 16 0.0 1 \n",
|
||
"6 3 45 22 1 2 19.0 2 4 0.0 1 \n",
|
||
"7 2 38 35 0 5 76.0 2 10 0.0 0 \n",
|
||
"8 3 45 59 1 7 166.0 4 31 0.0 0 \n",
|
||
"9 1 68 41 1 21 72.0 1 22 0.0 0 \n",
|
||
"10 2 5 33 0 10 125.0 4 5 0.0 1 \n",
|
||
"11 3 7 35 0 14 80.0 2 15 0.0 1 \n",
|
||
"12 1 41 38 1 8 37.0 2 9 0.0 1 \n",
|
||
"\n",
|
||
" reside custcat \n",
|
||
"0 2 1 \n",
|
||
"1 6 4 \n",
|
||
"2 2 3 \n",
|
||
"3 1 1 \n",
|
||
"4 4 3 \n",
|
||
"5 1 3 \n",
|
||
"6 5 2 \n",
|
||
"7 3 4 \n",
|
||
"8 5 3 \n",
|
||
"9 3 2 \n",
|
||
"10 1 1 \n",
|
||
"11 1 3 \n",
|
||
"12 3 1 "
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df = pd.read_csv('https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/data/teleCust1000t.csv')\n",
|
||
"df.head(13)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<div id=\"visualization_analysis\">\n",
|
||
" <h2>Data Visualization and Analysis</h2> \n",
|
||
"</div>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Let’s see how many of each class is in our data set\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"3 281\n",
|
||
"1 266\n",
|
||
"4 236\n",
|
||
"2 217\n",
|
||
"Name: custcat, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df['custcat'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### 281 Plus Service, 266 Basic-service, 236 Total Service, and 217 E-Service customers\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"You can easily explore your data using visualization techniques:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[<AxesSubplot:title={'center':'income'}>]], dtype=object)"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGxCAYAAACA4KdFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAoVElEQVR4nO3df1DU94H/8ddGlxUIUIHCQkRDUm2vAW2C0WiTSFQwJMZ0bGtyGmvubM6cPy6MOome03HttGjNt8YbbExytWpqPZKbi17utAZslJQSU4LaqLnapCUaGxAPEVBwWeH9/cNjx4/gD3QFefN8zOzovve9nx+vvte+8mGXdRljjAAAACxzS3cfAAAAwI1AyQEAAFai5AAAACtRcgAAgJUoOQAAwEqUHAAAYCVKDgAAsBIlBwAAWImSAwAArETJAXBZGzZskMvl0meffdbdhwIAneLiax0AXM6JEyf05z//WXfffbc8Hk93Hw4AXDVKDgAAsBI/rgJwWRf/uCozM1NpaWkqKyvTAw88oIiICN1xxx1asWKFWltbHc89deqUFixYoDvuuEMej0cJCQl65JFH9Mc//jE45+TJk5o9e7Zuu+02hYWF6Y477tCSJUvk9/sd23K5XJo7d67Wr1+vr371qwoPD9fw4cO1Z88eGWP04osvKjU1VbfeeqvGjh2rTz/9tN257Ny5U+PGjVN0dLQiIiL0zW9+U7/5zW9CHxqAmwIlB0CnVVVVadq0aXrqqaf09ttvKycnR4sXL9amTZuCcxoaGnT//ffr1Vdf1d/93d/pv/7rv/TKK69oyJAhqqyslCSdPXtWDz30kF5//XXNnz9f27Zt01NPPaWVK1dq8uTJ7fb73//93/r5z3+uFStW6N/+7d/U0NCgRx99VAsWLNDvfvc7rVmzRq+99po+/vhjffvb39aFF6o3bdqk7OxsRUdHa+PGjXrzzTcVGxurCRMmUHQAWxkAuIz169cbSaaiosIYY8yYMWOMJPPBBx845n396183EyZMCN7/4Q9/aCSZoqKiS277lVdeMZLMm2++6Rj/yU9+YiSZwsLC4Jgk4/V6zenTp4NjW7duNZLMN77xDdPa2hocX716tZFkPvroI2OMMWfOnDGxsbHmsccec+ynpaXFDBs2zIwYMeIq0wDQk3AlB0Cneb1ejRgxwjE2dOhQHTlyJHj/17/+tYYMGaLx48dfcjvvvvuuIiMj9Z3vfMcx/vTTT0tSuyssDz30kCIjI4P3/+Zv/kaSlJOTI5fL1W687XhKS0t18uRJzZgxQ+fOnQveWltb9fDDD6usrExnzpy52tMH0EP07e4DANDzxMXFtRvzeDxqamoK3j9x4oQGDhx42e3U1NTI6/U6CookJSQkqG/fvqqpqXGMx8bGOu6HhYVddvzs2bOSpOPHj0tSuzJ1oZMnTzoKFICej5ID4Ib48pe/rGPHjl12TlxcnD744AMZYxxFp7q6WufOnVN8fHxIjqVtO/n5+brvvvs6nJOYmBiSfQG4efDjKgA3RE5Ojv70pz/p3XffveSccePG6fTp09q6datj/PXXXw8+Hgrf/OY39aUvfUkff/yxhg8f3uGt7eoPAHtwJQfADZGbm6s33nhDjz/+uBYtWqQRI0aoqalJxcXFmjhxoh566CF973vf089+9jPNmDFDn332mdLT01VSUqK8vDw98sgjl30/T2fceuutys/P14wZM3Ty5El95zvfUUJCgk6cOKE//OEPOnHihNauXRuSfQG4eVByANwQUVFRKikpkc/n02uvvaZly5apf//+uvfee/UP//APkqR+/fpp165dWrJkiV588UWdOHFCt912mxYuXKilS5eG9HieeuopDRw4UCtXrtSsWbPU0NCghIQEfeMb3wi+0RmAXfiNxwAAwEq8JwcAAFiJkgMAAKxEyQEAAFai5AAAACtRcgAAgJUoOQAAwEo98vfktLa26osvvlBUVFS777wBAAA3J2OMGhoalJycrFtuufHXWXpkyfniiy+UkpLS3YcBAACuweeff64BAwbc8P30yJITFRUl6XxI0dHR1729QCCgwsJCZWdny+12X/f2ejrycCIPJ/JwIg8n8nAiD6eTJ08qNTU1+P/jN1qPLDltP6KKjo4OWcmJiIhQdHQ0i1DkcTHycCIPJ/JwIg8n8nAKBAKS1GVvNeGNxwAAwEqUHAAAYCVKDgAAsBIlBwAAWImSAwAArETJAQAAVqLkAAAAK1FyAACAlSg5AADASpQcAABgJUoOAACwEiUHAABYiZIDAACsRMkBAABW6tvdB3Azun3RtivO+WzFo11wJAAA4FpxJQcAAFiJkgMAAKxEyQEAAFai5AAAACtRcgAAgJUoOQAAwEqUHAAAYCVKDgAAsBIlBwAAWImSAwAA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jIzUpEmTdOzYsa48lZDw+XztztXr9QYfN8bI5/MpOTlZ4eHhyszM1KFDhxzbsCULSbr99tvb5eFyuTRnzhxJ9q+N9957T4899piSk5Plcrm0detWx+OhWg+1tbWaPn26YmJiFBMTo+nTp+vUqVM3+Ow673J5BAIBvfDCC0pPT1dkZKSSk5P1ve99T1988YVjG5mZme3WzJNPPumYY0MeUuheH7bk0dG/JS6XSy+++GJwTletj15fct544w3l5uZqyZIl2rdvnx544AHl5OTo6NGj3X1oIVVcXKw5c+Zoz549Kioq0rlz55Sdna0zZ5zfuP7www+rsrIyeNu+fbvj8dzcXG3ZskUFBQUqKSnR6dOnNXHiRLW0tHTl6YTEXXfd5TjXAwcOBB9buXKlVq1apTVr1qisrExer1dZWVlqaGgIzrEpi7KyMkcWbb+N/Lvf/W5wjs1r48yZMxo2bJjWrFnT4eOhWg9Tp07V/v37tWPHDu3YsUP79+/X9OnTb/j5ddbl8mhsbNTevXv1gx/8QHv37tVbb72lP/3pT5o0aVK7uc8884xjzbz66quOx23Io00oXh+25HFhDpWVlfrFL34hl8ulb3/72455XbI+uuRrQG9iI0aMMM8++6xj7Gtf+5pZtGhRNx1R16iurjaSTHFxcXBsxowZ5vHHH7/kc06dOmXcbrcpKCgIjv31r381t9xyi9mxY8eNPNyQW7p0qRk2bFiHj7W2thqv12tWrFgRHDt79qyJiYkxr7zyijHGriw68txzz5k777zTtLa2GmN619qQZLZs2RK8H6r18PHHHxtJZs+ePcE577//vpFk/vjHP97gs7p2F+fRkd///vdGkjly5EhwbMyYMea555675HNsyiMUrw+b8rjY448/bsaOHesY66r10auv5DQ3N6u8vFzZ2dmO8ezsbJWWlnbTUXWNuro6SWr3TbC7d+9WQkKChgwZomeeeUbV1dXBx8rLyxUIBBx5JScnKy0trUfm9cknnyg5OVmpqal68skn9Ze//EWSVFFRoaqqKsd5ejwejRkzJnietmVxoebmZm3atEl///d/L5fLFRzvTWvjQqFaD++//75iYmI0cuTI4Jz77rtPMTExPT6juro6uVyudl+c/Ktf/Urx8fG66667tHDhQseVL9vyuN7Xh215tDl+/Li2bdummTNntnusK9ZHt32tw83gf//3f9XS0tLum88TExPbfUO6TYwxmj9/vu6//36lpaUFx3NycvTd735XgwYNUkVFhX7wgx9o7NixKi8vl8fjUVVVlcLCwtS/f3/H9npiXiNHjtTrr7+uIUOG6Pjx4/rRj36k0aNH69ChQ8Fz6WhdHDlyRJKsyuJiW7du1alTp/T0008Hx3rT2rhYqNZDVVWVEhIS2m0/ISGhR2d09uxZLVq0SFOnTnV8y/a0adOUmpoqr9ergwcPavHixfrDH/4Q/FGoTXmE4vVhUx4X2rhxo6KiojR58mTHeFetj15dctpc+F+r0vkScPGYTebOnauPPvpIJSUljvEnnngi+Pe0tDQNHz5cgwYN0rZt29ot0Av1xLxycnKCf09PT9eoUaN05513auPGjcE3DF7LuuiJWVxs3bp1ysnJUXJycnCsN62NSwnFeuhofk/OKBAI6Mknn1Rra6tefvllx2PPPPNM8O9paWkaPHiwhg8frr179+qee+6RZE8eoXp92JLHhX7xi19o2rRp6tevn2O8q9ZHr/5xVXx8vPr06dOuFVZXV7f7rzZbzJs3T2+//bZ27dqlAQMGXHZuUlKSBg0apE8++USS5PV61dzcrNraWsc8G/KKjIxUenq6Pvnkk+CnrC63LmzN4siRI9q5c6e+//3vX3Zeb1oboVoPXq9Xx48fb7f9EydO9MiMAoGApkyZooqKChUVFTmu4nTknnvukdvtdqwZm/K40LW8PmzM47e//a0OHz58xX9PpBu3Pnp1yQkLC1NGRkbw8liboqIijR49upuO6sYwxmju3Ll666239O677yo1NfWKz6mpqdHnn3+upKQkSVJGRobcbrcjr8rKSh08eLDH5+X3+/U///M/SkpKCl5CvfA8m5ubVVxcHDxPW7NYv369EhIS9Oijj152Xm9aG6FaD6NGjVJdXZ1+//vfB+d88MEHqqur63EZtRWcTz75RDt37lRcXNwVn3Po0CEFAoHgmrEpj4tdy+vDxjzWrVunjIwMDRs27Ipzb9j6uOq3KFuqoKDAuN1us27dOvPxxx+b3NxcExkZaT777LPuPrSQ+sd//EcTExNjdu/ebSorK4O3xsZGY4wxDQ0NZsGCBaa0tNRUVFSYXbt2mVGjRpnbbrvN1NfXB7fz7LPPmgEDBpidO3eavXv3mrFjx5phw4aZc+fOddepXZMFCxaY3bt3m7/85S9mz549ZuLEiSYqKir4v/uKFStMTEyMeeutt8yBAwfM3/7t35qkpCQrs2jT0tJiBg4caF544QXHeG9YGw0NDWbfvn1m3759RpJZtWqV2bdvX/DTQqFaDw8//LAZOnSoef/99837779v0tPTzcSJE7v8fK/kcnkEAgEzadIkM2DAALN//37Hvyd+v98YY8ynn35qli1bZsrKykxFRYXZtm2b+drXvmbuvvtu6/II5evDhjza1NXVmYiICLN27dp2z+/K9dHrS44xxvzsZz8zgwYNMmFhYeaee+5xfKzaFpI6vK1fv94YY0xjY6PJzs42X/7yl43b7TYDBw40M2bMMEePHnVsp6mpycydO9fExsaa8PBwM3HixHZzeoInnnjCJCUlGbfbbZKTk83kyZPNoUOHgo+3traapUuXGq/Xazwej3nwwQfNgQMHHNuwJYs277zzjpFkDh8+7BjvDWtj165dHb4+ZsyYYYwJ3Xqoqakx06ZNM1FRUSYqKspMmzbN1NbWdtFZXr3L5VFRUXHJf0927dpljDHm6NGj5sEHHzSxsbEmLCzM3Hnnneaf/umfTE1NjWM/NuQRyteHDXm0efXVV014eLg5depUu+d35fpwGWPM1V/3AQAA6Bl69XtyAACAvSg5AADASpQcAABgJUoOAACwEiUHAABYiZIDAACsRMkBAABWouQAAAArUXIAAICVKDkAAMBKlBwAAGCl/w81p+JqPaH0LgAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.hist(column='income', bins=50)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Feature set\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's define feature sets, X:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['region', 'tenure', 'age', 'marital', 'address', 'income', 'ed',\n",
|
||
" 'employ', 'retire', 'gender', 'reside', 'custcat'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To use scikit-learn library, we have to convert the Pandas data frame to a Numpy array:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 2., 13., 44., 1., 9., 64., 4., 5., 0., 0., 2.],\n",
|
||
" [ 3., 11., 33., 1., 7., 136., 5., 5., 0., 0., 6.],\n",
|
||
" [ 3., 68., 52., 1., 24., 116., 1., 29., 0., 1., 2.],\n",
|
||
" [ 2., 33., 33., 0., 12., 33., 2., 0., 0., 1., 1.],\n",
|
||
" [ 2., 23., 30., 1., 9., 30., 1., 2., 0., 0., 4.]])"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']] .values #.astype(float)\n",
|
||
"X[0:5]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"What are our labels?\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1, 4, 3, 1, 3])"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y = df['custcat'].values\n",
|
||
"y[0:5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Normalize Data\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Data Standardization gives the data zero mean and unit variance, it is good practice, especially for algorithms such as KNN which is based on the distance of data points:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[-0.02696767, -1.055125 , 0.18450456, 1.0100505 , -0.25303431,\n",
|
||
" -0.12650641, 1.0877526 , -0.5941226 , -0.22207644, -1.03459817,\n",
|
||
" -0.23065004],\n",
|
||
" [ 1.19883553, -1.14880563, -0.69181243, 1.0100505 , -0.4514148 ,\n",
|
||
" 0.54644972, 1.9062271 , -0.5941226 , -0.22207644, -1.03459817,\n",
|
||
" 2.55666158],\n",
|
||
" [ 1.19883553, 1.52109247, 0.82182601, 1.0100505 , 1.23481934,\n",
|
||
" 0.35951747, -1.36767088, 1.78752803, -0.22207644, 0.96655883,\n",
|
||
" -0.23065004],\n",
|
||
" [-0.02696767, -0.11831864, -0.69181243, -0.9900495 , 0.04453642,\n",
|
||
" -0.41625141, -0.54919639, -1.09029981, -0.22207644, 0.96655883,\n",
|
||
" -0.92747794],\n",
|
||
" [-0.02696767, -0.58672182, -0.93080797, 1.0100505 , -0.25303431,\n",
|
||
" -0.44429125, -1.36767088, -0.89182893, -0.22207644, -1.03459817,\n",
|
||
" 1.16300577]])"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X = preprocessing.StandardScaler().fit(X).transform(X.astype(float))\n",
|
||
"X[0:5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Train Test Split\n",
|
||
"\n",
|
||
"Out of Sample Accuracy is the percentage of correct predictions that the model makes on data that the model has NOT been trained on. Doing a train and test on the same dataset will most likely have low out-of-sample accuracy, due to the likelihood of our model overfitting.\n",
|
||
"\n",
|
||
"It is important that our models have a high, out-of-sample accuracy, because the purpose of any model, of course, is to make correct predictions on unknown data. So how can we improve out-of-sample accuracy? One way is to use an evaluation approach called Train/Test Split.\n",
|
||
"Train/Test Split involves splitting the dataset into training and testing sets respectively, which are mutually exclusive. After which, you train with the training set and test with the testing set.\n",
|
||
"\n",
|
||
"This will provide a more accurate evaluation on out-of-sample accuracy because the testing dataset is not part of the dataset that has been used to train the model. It is more realistic for the real world problems.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Train set: (800, 11) (800,)\n",
|
||
"Test set: (200, 11) (200,)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)\n",
|
||
"print ('Train set:', X_train.shape, y_train.shape)\n",
|
||
"print ('Test set:', X_test.shape, y_test.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<div id=\"classification\">\n",
|
||
" <h2>Classification</h2>\n",
|
||
"</div>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<h3>K nearest neighbor (KNN)</h3>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Import library\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Classifier implementing the k-nearest neighbors vote.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.neighbors import KNeighborsClassifier"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Training\n",
|
||
"\n",
|
||
"Let's start the algorithm with k=4 for now:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"KNeighborsClassifier(n_neighbors=4)"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"k = 4\n",
|
||
"#Train Model and Predict \n",
|
||
"neigh = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)\n",
|
||
"neigh"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Predicting\n",
|
||
"\n",
|
||
"We can use the model to make predictions on the test set:\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1, 1, 3, 2, 4])"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"yhat = neigh.predict(X_test)\n",
|
||
"yhat[0:5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Accuracy evaluation\n",
|
||
"\n",
|
||
"In multilabel classification, **accuracy classification score** is a function that computes subset accuracy. This function is equal to the jaccard_score function. Essentially, it calculates how closely the actual labels and predicted labels are matched in the test set.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Train set Accuracy: 0.5475\n",
|
||
"Test set Accuracy: 0.32\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn import metrics\n",
|
||
"print(\"Train set Accuracy: \", metrics.accuracy_score(y_train, neigh.predict(X_train)))\n",
|
||
"print(\"Test set Accuracy: \", metrics.accuracy_score(y_test, yhat))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Practice\n",
|
||
"\n",
|
||
"Can you build the model again, but this time with k=6?\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Train set Accuracy: 0.51625\n",
|
||
"Test set Accuracy: 0.31\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"k = 6\n",
|
||
"neigh6 = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)\n",
|
||
"yhat6 = neigh6.predict(X_test)\n",
|
||
"print(\"Train set Accuracy: \", metrics.accuracy_score(y_train, neigh6.predict(X_train)))\n",
|
||
"print(\"Test set Accuracy: \", metrics.accuracy_score(y_test, yhat6))\n",
|
||
"\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<details><summary>Click here for the solution</summary>\n",
|
||
"\n",
|
||
"```python\n",
|
||
"k = 6\n",
|
||
"neigh6 = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)\n",
|
||
"yhat6 = neigh6.predict(X_test)\n",
|
||
"print(\"Train set Accuracy: \", metrics.accuracy_score(y_train, neigh6.predict(X_train)))\n",
|
||
"print(\"Test set Accuracy: \", metrics.accuracy_score(y_test, yhat6))\n",
|
||
"\n",
|
||
"```\n",
|
||
"\n",
|
||
"</details>\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### What about other K?\n",
|
||
"\n",
|
||
"K in KNN, is the number of nearest neighbors to examine. It is supposed to be specified by the user. So, how can we choose right value for K?\n",
|
||
"The general solution is to reserve a part of your data for testing the accuracy of the model. Then choose k =1, use the training part for modeling, and calculate the accuracy of prediction using all samples in your test set. Repeat this process, increasing the k, and see which k is the best for your model.\n",
|
||
"\n",
|
||
"We can calculate the accuracy of KNN for different values of k.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([0.3 , 0.29 , 0.315, 0.32 , 0.315, 0.31 , 0.335, 0.325, 0.34 ])"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"Ks = 10\n",
|
||
"mean_acc = np.zeros((Ks-1))\n",
|
||
"std_acc = np.zeros((Ks-1))\n",
|
||
"\n",
|
||
"for n in range(1,Ks):\n",
|
||
" \n",
|
||
" #Train Model and Predict \n",
|
||
" neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)\n",
|
||
" yhat=neigh.predict(X_test)\n",
|
||
" mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)\n",
|
||
"\n",
|
||
" \n",
|
||
" std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])\n",
|
||
"\n",
|
||
"mean_acc"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Plot the model accuracy for a different number of neighbors.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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NPEvzOi6jhMnTiAmJgaSJFXKe2RmZqJhw4Y4duwYYmNjK+U9AlW43nu43jcQvvcervcNhO+9h+t9A+F771Vx30IIZGVloV69epDli8+iY49dMWRZRoMGDarkvWJjY8PqG6CgcL33cL1vIHzvPVzvGwjfew/X+wbC994r+74v1VPnwcUTRERERCGCwY6IiIgoRDDYGcRqtWLGjBmwWq1GN6XKheu9h+t9A+F77+F630D43nu43jcQvvceaPfNxRNEREREIYI9dkREREQhgsGOiIiIKEQw2BERERGFCAY7IiIiohDBYFfF1qxZg2HDhqFevXqQJAnLli0zuklVYs6cOejWrRtiYmIQHx+PESNGYP/+/UY3q0q89dZbaN++vbd4Za9evfDtt98a3awqN2fOHEiShEmTJhndlEo3c+ZMSJLk86hTp47RzaoSx48fxx133IGaNWsiMjISHTt2xLZt24xuVqVr3LhxkT9zSZIwfvx4o5tWqVRVxfTp09GkSRNERESgadOmePbZZ6HrutFNq3RZWVmYNGkSEhMTERERgd69e2PLli1GN4s7T1S1nJwcdOjQAffccw9uvPFGo5tTZX755ReMHz8e3bp1g6qqmDZtGoYMGYI9e/YgKirK6OZVqgYNGuDFF19E8+bNAQAffPABhg8fjh07dqBNmzYGt65qbNmyBQsWLED79u2NbkqVadOmDVavXu39WlEUA1tTNc6fP48+ffpg4MCB+PbbbxEfH49Dhw6hWrVqRjet0m3ZsgWapnm//u233zB48GDcfPPNBraq8s2dOxdvv/02PvjgA7Rp0wZbt27FPffcg7i4OEycONHo5lWq++67D7/99hs++ugj1KtXDx9//DEGDRqEPXv2oH79+sY1TJBhAIilS5ca3QxDnD59WgAQv/zyi9FNMUT16tXFu+++a3QzqkRWVpZo0aKFWLVqlbj88svFxIkTjW5SpZsxY4bo0KGD0c2ock899ZTo27ev0c0ICBMnThTNmjUTuq4b3ZRKde2114qxY8f6HLvhhhvEHXfcYVCLqkZubq5QFEV88803Psc7dOggpk2bZlCrXDgUS4bIyMgAANSoUcPgllQtTdPw2WefIScnB7169TK6OVVi/PjxuPbaazFo0CCjm1KlDhw4gHr16qFJkyYYPXo0/vzzT6ObVOmWL1+Orl274uabb0Z8fDw6deqE//u//zO6WVXO4XDg448/xtixYyFJktHNqVR9+/bFDz/8gD/++AMAsHPnTqxbtw7XXHONwS2rXKqqQtM02Gw2n+MRERFYt26dQa1y4VAsVTkhBCZPnoy+ffuibdu2RjenSuzevRu9evVCfn4+oqOjsXTpUlx22WVGN6vSffbZZ9i+fXtAzDupSj169MCHH36Ili1b4tSpU5g9ezZ69+6N33//HTVr1jS6eZXmzz//xFtvvYXJkyfj6aefxubNm/Hoo4/CarXizjvvNLp5VWbZsmVIT0/H3XffbXRTKt1TTz2FjIwMJCUlQVEUaJqG559/HrfeeqvRTatUMTEx6NWrF5577jm0bt0aCQkJWLx4MTZt2oQWLVoY2zhD+wvDHMJ0KPbhhx8WiYmJ4tixY0Y3pcrY7XZx4MABsWXLFjFlyhRRq1Yt8fvvvxvdrEp19OhRER8fL1JSUrzHwmUotrDs7GyRkJAgXn75ZaObUqnMZrPo1auXz7EJEyaInj17GtQiYwwZMkRcd911RjejSixevFg0aNBALF68WOzatUt8+OGHokaNGmLRokVGN63SHTx4UPTv318AEIqiiG7duonbb79dtG7d2tB2sceOqtSECROwfPlyrFmzBg0aNDC6OVXGYrF4F0907doVW7ZswWuvvYZ33nnH4JZVnm3btuH06dPo0qWL95imaVizZg3+85//wG63h8WCAgCIiopCu3btcODAAaObUqnq1q1bpCe6devW+OKLLwxqUdU7cuQIVq9ejS+//NLoplSJJ554AlOmTMHo0aMBAO3atcORI0cwZ84c3HXXXQa3rnI1a9YMv/zyC3JycpCZmYm6deti1KhRaNKkiaHtYrCjKiGEwIQJE7B06VL8/PPPhv/FN5oQAna73ehmVKorr7wSu3fv9jl2zz33ICkpCU899VTYhDoAsNvt2Lt3L/r162d0UypVnz59ipQx+uOPP5CYmGhQi6rewoULER8fj2uvvdboplSJ3NxcyLLvdH1FUcKi3IlHVFQUoqKicP78eXz//feYN2+eoe1hsKti2dnZOHjwoPfrw4cPIyUlBTVq1ECjRo0MbFnlGj9+PD799FN89dVXiImJwcmTJwEAcXFxiIiIMLh1levpp5/G1VdfjYYNGyIrKwufffYZfv75Z3z33XdGN61SxcTEFJlDGRUVhZo1a4b83MrHH38cw4YNQ6NGjXD69GnMnj0bmZmZId+D8Y9//AO9e/fGCy+8gFtuuQWbN2/GggULsGDBAqObViV0XcfChQtx1113wWQKjx+vw4YNw/PPP49GjRqhTZs22LFjB1555RWMHTvW6KZVuu+//x5CCLRq1QoHDx7EE088gVatWuGee+4xtmGGDgSHoZ9++kkAKPK46667jG5apSrungGIhQsXGt20Sjd27FiRmJgoLBaLqF27trjyyivFypUrjW6WIcJljt2oUaNE3bp1hdlsFvXq1RM33HBDyM+p9Pj6669F27ZthdVqFUlJSWLBggVGN6nKfP/99wKA2L9/v9FNqTKZmZli4sSJolGjRsJms4mmTZuKadOmCbvdbnTTKl1ycrJo2rSpsFgsok6dOmL8+PEiPT3d6GYJSQghjImURERERORPrGNHREREFCIY7IiIiIhCBIMdERERUYhgsCMiIiIKEQx2RERERCGCwY6IiIgoRDDYEREREYUIBjsiIiKiEMFgR0QB46+//oIkSUhJSTG6KV779u1Dz549YbPZ0LFjx0p/v8aNG+PVV18t9fml+cwWLVqEatWqVbht/pKWlob4+Hj89ddfpX7N6dOnUbt2bRw/frzyGkYUAhjsiMjr7rvvhiRJePHFF32OL1u2DJIkGdQqY82YMQNRUVHYv38/fvjhh2LP8efntmXLFjzwwAPlbm8wmDNnDoYNG4bGjRsDKD6cZmVlYcCAAUhKSsKxY8cQHx+PMWPGYMaMGcY0mihIMNgRkQ+bzYa5c+fi/PnzRjfFbxwOR7lfe+jQIfTt2xeJiYmoWbNmief563OrXbs2IiMjK3SNquJ0Osv8mry8PLz33nu47777SjznzJkzGDhwILKzs7Fu3To0bNgQAHDPPffgk08+Cam/m0T+xmBHRD4GDRqEOnXqYM6cOSWeM3PmzCLDkq+++qq3BwZw9WKNGDECL7zwAhISElCtWjXMmjULqqriiSeeQI0aNdCgQQO8//77Ra6/b98+9O7dGzabDW3atMHPP//s8/yePXtwzTXXIDo6GgkJCRgzZgzOnj3rfX7AgAF45JFHMHnyZNSqVQuDBw8u9j50Xcezzz6LBg0awGq1omPHjvjuu++8z0uShG3btuHZZ5+FJEmYOXNmhT43ANiwYQP69++PiIgINGzYEI8++ihycnK8zxceit23bx/69u0Lm82Gyy67DKtXr4YkSVi2bJnPdf/8808MHDgQkZGR6NChAzZu3FjkvZctW4aWLVvCZrNh8ODBOHbsmM/zb731Fpo1awaLxYJWrVrho48+8nlekiS8/fbbGD58OKKiojB79mycP38et99+O2rXro2IiAi0aNECCxcuLPH+v/32W5hMJvTq1avY548dO4Z+/fohJiYGP/30E2rVquV9rl27dqhTpw6WLl1a4vWJwh2DHRH5UBQFL7zwAt544w38/fffFbrWjz/+iBMnTmDNmjV45ZVXMHPmTFx33XWoXr06Nm3ahHHjxmHcuHFFAsYTTzyBxx57DDt27EDv3r1x/fXXIy0tDQCQmpqKyy+/HB07dsTWrVvx3Xff4dSpU7jlllt8rvHBBx/AZDJh/fr1eOedd4pt32uvvYaXX34ZL730Enbt2oWhQ4fi+uuvx4EDB7zv1aZNGzz22GNITU3F448/XuK9luZz2717N4YOHYobbrgBu3btQnJyMtatW4dHHnmk2PN1XceIESMQGRmJTZs2YcGCBZg2bVqx506bNg2PP/44UlJS0LJlS9x6661QVdX7fG5uLp5//nl88MEHWL9+PTIzMzF69Gjv80uXLsXEiRPx2GOP4bfffsODDz6Ie+65Bz/99JPP+8yYMQPDhw/H7t27MXbsWDzzzDPYs2cPvv32W+zduxdvvfWWTxgrbM2aNejatWuxz+3fvx99+vRBUlISvvvuO8TExBQ5p3v37li7dm2J1ycKe4KIyO2uu+4Sw4cPF0II0bNnTzF27FghhBBLly4VBf+5mDFjhujQoYPPa//973+LxMREn2slJiYKTdO8x1q1aiX69evn/VpVVREVFSUWL14shBDi8OHDAoB48cUXvec4nU7RoEEDMXfuXCGEEM8884wYMmSIz3sfO3ZMABD79+8XQghx+eWXi44dO17yfuvVqyeef/55n2PdunUTDz/8sPfrDh06iBkzZlz0OqX93MaMGSMeeOABn9euXbtWyLIs8vLyhBBCJCYmin//+99CCCG+/fZbYTKZRGpqqvf8VatWCQBi6dKlQogLn9m7777rPef3338XAMTevXuFEEIsXLhQABC//vqr95y9e/cKAGLTpk1CCCF69+4t7r//fp+23XzzzeKaa67xfg1ATJo0yeecYcOGiXvuueein09Bw4cP934+Hp57sFgsYsCAAUJV1RJf/49//EMMGDCg1O9HFG7YY0dExZo7dy4++OAD7Nmzp9zXaNOmDWT5wj8zCQkJaNeunfdrRVFQs2ZNnD592ud1BYfpTCYTunbtir179wIAtm3bhp9++gnR0dHeR1JSEgDXfDiPknqFPDIzM3HixAn06dPH53ifPn2871UeF/vctm3bhkWLFvm0fejQodB1HYcPHy5y/v79+9GwYUPUqVPHe6x79+7Fvm/79u29v69bty4A+Hyuns/RIykpCdWqVfPe6969e0v1WRT+XB966CF89tln6NixI5588kls2LCh2PZ55OXlwWazFfvc8OHDsW7dOnzxxRclvj4iIgK5ubkXfQ+icGYyugFEFJj69++PoUOH4umnn8bdd9/t85wsyxBC+BwrbiK92Wz2+VqSpGKP6bp+yfZ4Vpfquo5hw4Zh7ty5Rc7xBBoAiIqKuuQ1C17XQwhRoRXAF/vcdF3Hgw8+iEcffbTI6xo1alTkWFnaUvBzLfhZFVTctQoeK81nUfhzvfrqq3HkyBH873//w+rVq3HllVdi/PjxeOmll4ptZ61atUpc/PD000+jffv2uP322yGEwKhRo4qcc+7cOdSuXbvY1xMR59gR0UW8+OKL+Prrr4v0wtSuXRsnT570CXf+rD3366+/en+vqiq2bdvm7ZXr3Lkzfv/9dzRu3BjNmzf3eZQ2zAFAbGws6tWrh3Xr1vkc37BhA1q3bl2h9pf0uXnaXrjdzZs3h8ViKXKdpKQkHD16FKdOnfIe27JlS7napKoqtm7d6v16//79SE9P936urVu3LvdnUbt2bdx99934+OOP8eqrr2LBggUlntupU6eL9gJPnz4dzz33HG6//XYsXry4yPO//fYbOnXqdMk2EYUrBjsiKlG7du1w++2344033vA5PmDAAJw5cwbz5s3DoUOH8Oabb+Lbb7/12/u++eabWLp0Kfbt24fx48fj/PnzGDt2LABg/PjxOHfuHG699VZs3rwZf/75J1auXImxY8dC07Qyvc8TTzyBuXPnIjk5Gfv378eUKVOQkpKCiRMnVqj9JX1uTz31FDZu3Ijx48cjJSUFBw4cwPLlyzFhwoRirzN48GA0a9YMd911F3bt2oX169d7F0+UtVfRbDZjwoQJ2LRpE7Zv34577rkHPXv29A7tPvHEE1i0aBHefvttHDhwAK+88gq+/PLLiy4YAYB//vOf+Oqrr3Dw4EH8/vvv+Oabby4aBocOHYrff//9oiVLpkyZgjlz5mDMmDH45JNPvMdzc3Oxbds2DBkypEz3ThROGOyI6KKee+65IsOurVu3xvz58/Hmm2+iQ4cO2Lx58yUDQFm8+OKLmDt3Ljp06IC1a9fiq6++8q60rFevHtavXw9N0zB06FC0bdsWEydORFxcnM98vtJ49NFH8dhjj+Gxxx5Du3bt8N1332H58uVo0aJFhe+huM+tffv2+OWXX3DgwAH069cPnTp1wjPPPOMzhFyQoihYtmwZsrOz0a1bN9x3332YPn06AJQ4T60kkZGReOqpp3DbbbehV69eiIiIwGeffeZ9fsSIEXjttdfwr3/9C23atME777yDhQsXYsCAARe9rsViwdSpU9G+fXv0798fiqL4XLewdu3aoWvXrliyZMlFr/vEE09g3rx5uOuuu7xlV7766is0atQI/fr1K/2NE4UZSRT+l4eIiALW+vXr0bdvXxw8eBDNmjUzujnlsmLFCjz++OP47bffyhTGu3fvjkmTJuG2226rxNYRBTcuniAiCmBLly5FdHQ0WrRogYMHD2LixIno06dP0IY6ALjmmmtw4MABHD9+3LurxKWcPn0aN910E2699dZKbh1RcGOPHRFRAPvwww/x3HPP4dixY6hVqxYGDRqEl19++aLbmxFR+GKwIyIiIgoRXDxBREREFCIY7IiIiIhCBIMdERERUYhgsCMiIiIKEQx2RERERCGCwY6IiIgoRDDYEREREYUIBjsiIiKiEPH/Xga8iJ1JBRAAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot(range(1,Ks),mean_acc,'g')\n",
|
||
"plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)\n",
|
||
"plt.fill_between(range(1,Ks),mean_acc - 3 * std_acc,mean_acc + 3 * std_acc, alpha=0.10,color=\"turquoise\")\n",
|
||
"plt.legend(('Accuracy ', '+/- 1xstd','+/- 3xstd'))\n",
|
||
"plt.ylabel('Accuracy ')\n",
|
||
"plt.xlabel('Number of Neighbors (K)')\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The best accuracy was with 0.34 with k= 9\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print( \"The best accuracy was with\", mean_acc.max(), \"with k=\", mean_acc.argmax()+1) "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Thank you for completing this lab!\n",
|
||
"\n",
|
||
"## Author\n",
|
||
"\n",
|
||
"Saeed Aghabozorgi\n",
|
||
"\n",
|
||
"### Other Contributors\n",
|
||
"\n",
|
||
"<a href=\"https://www.linkedin.com/in/joseph-s-50398b136/?utm_medium=Exinfluencer&utm_source=Exinfluencer&utm_content=000026UJ&utm_term=10006555&utm_id=NA-SkillsNetwork-Channel-SkillsNetworkCoursesIBMDeveloperSkillsNetworkML0101ENSkillsNetwork20718538-2022-01-01\" target=\"_blank\">Joseph Santarcangelo</a>\n",
|
||
"\n",
|
||
"## <h3 align=\"center\"> © IBM Corporation 2020. All rights reserved. <h3/>\n",
|
||
"\n",
|
||
"<!--\n",
|
||
"## Change Log\n",
|
||
"\n",
|
||
"| Date (YYYY-MM-DD) | Version | Changed By | Change Description |\n",
|
||
"| ----------------- | ------- | ---------- | ---------------------------------- |\n",
|
||
"| 2021-01-21 | 2.4 | Lakshmi | Updated sklearn library |\n",
|
||
"| 2020-11-20 | 2.3 | Lakshmi | Removed unused imports |\n",
|
||
"| 2020-11-17 | 2.2 | Lakshmi | Changed plot function of KNN |\n",
|
||
"| 2020-11-03 | 2.1 | Lakshmi | Changed URL of csv |\n",
|
||
"| 2020-08-27 | 2.0 | Lavanya | Moved lab to course repo in GitLab |\n",
|
||
"| | | | |\n",
|
||
"| | | | |\n",
|
||
"--!>\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python",
|
||
"language": "python",
|
||
"name": "conda-env-python-py"
|
||
},
|
||
"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.7.12"
|
||
},
|
||
"prev_pub_hash": "5363c84665c2ea4c62cd198411b6c0935cac4acc844e6f1b323a6313f712f535"
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|