Praktikum-Machine-Learning/MODUL 3_CLASSIFICATION/SUMIH_202310715145_ML0101EN-Clas-K-Nearest-neighbors-CustCat.ipynb

951 lines
84 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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[31m69.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\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[31m24.2 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",
" </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",
"\n",
" reside custcat \n",
"0 2 1 \n",
"1 6 4 \n",
"2 2 3 \n",
"3 1 1 \n",
"4 4 3 "
]
},
"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()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div id=\"visualization_analysis\">\n",
" <h2>Data Visualization and Analysis</h2> \n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Lets 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": {},
"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": [
"# write your code here\n",
"k = 6\n",
"#Train Model and Predict \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))"
]
},
{
"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": 17,
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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CvDdd99h2LBhAICnn34a1113HWbPnq2/pmvXrgCA33//HZ988glWrVqln9+qVatqt8HlcuH9999Hw4YN9WNXX311uXYmJSVh9+7d6NSpEz766COcOHECW7ZsQUJCAoQQaNmqJTShwaW6cOutt+Kuu+7CSy+9BKvVip07dyItLQ2ff/55tdt3LhjsiIiI6rkIcwQKZhQY9t5VtXfvXmzevFkPOyaTCePGjcM777yjB7W0tDT84x//qPD1aWlpUBQFF1xwwTm1OTU11S/UAcCBAwfw2GOPYePGjcjKyoKmaQCA9PR0dOrUCWlpaejevTvi4uPg0TxQNRWa8J4jQcKYsWMwefJkLFmyBNdddx3eeecdXHjhhWjRosU5tbW6GOyIiIjqOUmSqjUcapS3334bHo8HTZo00Y8JIWA2m5GTk4P4+HjY7fZKX3+m5wBAluVy89kqWhwRGVn+sxo9ejSaNWuG//znP2jcuDE0TUOnTp3gcrkghIDV5p2L5/K4ICAgSRIUSYGAgBACFosF48ePx4IFC3DVVVfho48+wiuvvHKWTyTwuHiCiIiIap3H48F7772HF198EWlpafpj586dSE1NxYcffggA6NKlC7777rsKr9G5c2domoYff/yxwucbNmyI/Px8FBYW6sfS0tLO2rbs7Gzs2bMHjz76KC6++GJ06NABJ0+e9LZb88CpOnF+x/Oxc+dO5OTkQJEVyJIMlJk6d9ttt2H16tWYN28e3G6336KPusJgR0RERLXuyy+/RE5ODm699VZ06tTJ73HNNdfoK1tnzpyJRYsWYebMmdizZw927dqF5557DgDQokUL3HzzzZg4cSKWLl2KgwcP4ocffsAnn3wCAOjbty8iIiLw8MMPY//+/fjoo48qXHVbVnx8PBo0aID58+dj3759WLV6FaZNmwYAUDUVAHD9DdcjOSUZ1159Ldb/tB5//PEHlny+BBs3bNSv06FDB/Tr1w8PPfQQrr/++rP2MNYGBjsiIiKqdW+//TaGDRuG2NjYcs9dffXVSEtLw/bt2zF06FB8+umnWL58Obp164aLLroImzZt0s998803cc011+Duu+9G+/bt8Y9//EPvoUtISMAHH3yAFStWoHPnzli0aBFmzZp11rZJkoQPP/oQW7dtRefOnXH/tPvxzLPPAPAO78qSDIvFgq++/goNkxpizOgx6Nmt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srL054cOHYp77rkH06ZNQ2JiIoYPH17hfWiahieeeAJNmzaF1WpFt27d8M033+jPS5KEbdu24YknnoAkSZg1a9Y5fW4AsH79egwZMgR2ux3NmjXDvffei8LCQv35skOxv/32GwYNGgSbzYbzzz8fq1evhiRJWLp0qd91//jjD1x44YWIiIhA165dsWHDhnLvvXTpUrRr1w42mw3Dhw/H4cOH/Z5/88030bp1a1gsFpx33nl4//33/Z6XJAn//ve/MWbMGERGRuKpp55CTk4O/v73v6Nhw4aw2+1o27YtFixYUOn9f/311zCZTOjfv3+Fzx8+fBiDBw9GdHQ0/ve//yExMVF/rnPnzkhJScGSJUsqvT5RuGOwIyI/iqLgmWeeweuvv46//vrrnK71/fff4+jRo1izZg1eeuklzJo1C5dffjni4+OxadMm3HnnnbjzzjvLBYwHHngA999/P3bs2IEBAwbgiiuuQHZ2NgAgIyMDF1xwAbp164atW7fim2++wbFjx3Dttdf6XePdd9+FyWTCTz/9hLfeeqvC9r366qt48cUX8cILL+Dnn3/GyJEjccUVV2Dfvn36e3Xs2BH3338/MjIy8M9//rPSe63K57Zr1y6MHDkSV111FX7++WcsXrwY69atwz333FPh+ZqmYezYsYiIiMCmTZswf/58PPLIIxWe+8gjj+Cf//wn0tLS0K5dO1x//fXweDz680VFRXj66afx7rvv4qeffkJeXh6uu+46/fklS5ZgypQpuP/++/HLL7/gjjvuwC233IL//e9/fu8zc+ZMjBkzBrt27cLEiRPx2GOPYffu3fj666+xZ88evPnmm35hrKw1a9agV69eFT63d+9eDBw4EO3bt8c333yD6Ojocuf06dMHa9eurfT6RGFPEBGVuPnmm8WYMWOEEEL069dPTJw4UQghxJIlS0Tp/13MnDlTdO3a1e+1L7/8skhNTfW7VmpqqlBVVT923nnnicGDB+vfezweERkZKRYtWiSEEOLgwYMCgHj22Wf1c9xut2jatKmYO3euEEKIxx57TIwYMcLvvQ8fPiwAiL179wohhLjgggtEt27dznq/jRs3Fk8//bTfsd69e4u7775b/75r165i5syZZ7xOVT+38ePHi9tvv93vtWvXrhWyLAuHwyGEECI1NVW8/PLLQgghvv76a2EymURGRoZ+/qpVqwQAsWTJEiHE6c/sv//9r37Or7/+KgCIPXv2CCGEWLBggQAgNm7cqJ+zZ88eAUBs2rRJCCHEgAEDxD/+8Q+/tv3tb38Tl112mf49ADF16lS/c0aPHi1uueWWM34+pY0ZM0b/fHx892CxWMTQoUOFx+Op9PX33XefGDp0aJXfjyjcsMeOiCo0d+5cvPvuu9i9e3eNr9GxY0fI8un/zSQnJ6Nz587694qioEGDBjh+/Ljf60oP05lMJvTq1Qt79uwBAGzbtg3/+9//EBUVpT/at28PwDsfzqeyXiGfvLw8HD16FAMHDvQ7PnDgQP29auJMn9u2bduwcOFCv7aPHDkSmqbh4MGD5c7fu3cvmjVrhpSUFP1Ynz59KnzfLl266F83atQIAPw+V9/n6NO+fXvExcXp97pnz54qfRZlP9e77roLH3/8Mbp164YHH3wQ69evr7B9Pg6HAzabrcLnxowZg3Xr1uGzzz6r9PV2ux1FRUVnfA+icGYyugFEFJyGDBmCkSNH4uGHH8aECRP8npNlGUIIv2MVTaQ3m81+30uSVOExTdPO2h7f6lJN0zB69GjMnTu33Dm+QAMAkZGRZ71m6ev6CCHOaQXwmT43TdNwxx134N577y33uubNm5c7Vp22lP5cS39WpVV0rdLHqvJZlP1cL730Uhw6dAhfffUVVq9ejYsvvhiTJk3CCy+8UGE7ExMTK1388PDDD6NLly74+9//DiEExo0bV+6ckydPomHDhhW+nog4x46IzuDZZ5/FF198Ua4XpmHDhsjMzPQLd4GsPbdx40b9a4/Hg23btum9cj169MCvv/6KFi1aoE2bNn6PqoY5AIiJiUHjxo2xbt06v+Pr169Hhw4dzqn9lX1uvraXbXebNm1gsVjKXad9+/ZIT0/HsWPH9GNbtmypUZs8Hg+2bt2qf793716cOnVK/1w7dOhQ48+iYcOGmDBhAj744AO88sormD9/fqXndu/e/Yy9wI8++iiefPJJ/P3vf8eiRYvKPf/LL7+ge/fuZ20TUbhisCOiSnXu3Bl///vf8frrr/sdHzp0KE6cOIHnnnsOBw4cwBtvvIGvv/46YO/7xhtvYMmSJfjtt98wadIk5OTkYOLEiQCASZMm4eTJk7j++uuxefNm/PHHH1i5ciUmTpwIVVWr9T4PPPAA5s6di8WLF2Pv3r2YPn060tLSMGXKlHNqf2Wf20MPPYQNGzZg0qRJSEtLw759+7B8+XJMnjy5wusMHz4crVu3xs0334yff/4ZP/30k754orq9imazGZMnT8amTZuwfft23HLLLejXr58+tPvAAw9g4cKF+Pe//419+/bhpZdewueff37GBSMA8Pjjj2PZsmXYv38/fv31V3z55ZdnDIMjR47Er7/+esaSJdOnT8ecOXMwfvx4fPjhh/rxoqIibNu2DSNGjKjWvROFEwY7IjqjJ598stywa4cOHTBv3jy88cYb6Nq1KzZv3nzWAFAdzz77LObOnYuuXbti7dq1WLZsmb7SsnHjxvjpp5+gqipGjhyJTp06YcqUKYiNjfWbz1cV9957L+6//37cf//96Ny5M7755hssX74cbdu2Ped7qOhz69KlC3788Ufs27cPgwcPRvfu3fHYY4/5DSGXpigKli5dioKCAvTu3Ru33XYbHn30UQCodJ5aZSIiIvDQQw/hhhtuQP/+/WG32/Hxxx/rz48dOxavvvoqnn/+eXTs2BFvvfUWFixYgKFDh57xuhaLBTNmzECXLl0wZMgQKIrid92yOnfujF69euGTTz4543UfeOABPPfcc7j55pv1sivLli1D8+bNMXjw4KrfOFGYkUTZ//MQEVHQ+umnnzBo0CDs378frVu3Nro5NbJixQr885//xC+//FKtMN6nTx9MnToVN9xwQy22jqh+4+IJIqIgtmTJEkRFRaFt27bYv38/pkyZgoEDB9bbUAcAl112Gfbt24cjR47ou0qczfHjx3HNNdfg+uuvr+XWEdVv7LEjIgpi7733Hp588kkcPnwYiYmJGDZsGF588cUzbm9GROGLwY6IiIgoRHDxBBEREVGIYLAjIiIiChEMdkREREQhgsGOiIiIKEQw2BERERGFCAY7IiIiohDBYEdEREQUIhjsiIiIiELE/wMUQ3NqQ3ZIDgAAAABJRU5ErkJggg==\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=\"green\")\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": 18,
"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
}