mirror of
https://github.com/deepseek-ai/DeepSeek-Coder.git
synced 2025-02-23 06:09:07 -05:00
1156 lines
86 KiB
Plaintext
1156 lines
86 KiB
Plaintext
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"provenance": [],
|
|
"include_colab_link": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "python3",
|
|
"display_name": "Python 3"
|
|
},
|
|
"language_info": {
|
|
"name": "python"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "view-in-github",
|
|
"colab_type": "text"
|
|
},
|
|
"source": [
|
|
"<a href=\"https://colab.research.google.com/github/Orrm23/DeepSeek-Coder/blob/main/SalaryEstimation_K_NN.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "6pk_INoSKj1N"
|
|
},
|
|
"source": [
|
|
"# Day-4 | Salary Estimation | K-NEAREST NEIGHBOUR model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "7OGtDD8zKwUz"
|
|
},
|
|
"source": [
|
|
"### *Importing Libraries*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "7YBAsJmVKc_B"
|
|
},
|
|
"source": [
|
|
"import pandas as pd #useful for loading the dataset\n",
|
|
"import numpy as np #to perform array"
|
|
],
|
|
"execution_count": 1,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "rVLDLs-lK3xo"
|
|
},
|
|
"source": [
|
|
"### *Choose Dataset from Local Directory*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "XA2ITub0K9k2",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 73
|
|
},
|
|
"outputId": "02acd90f-0908-4b97-85b4-bf701901c3f6"
|
|
},
|
|
"source": [
|
|
"from google.colab import files\n",
|
|
"uploaded = files.upload()"
|
|
],
|
|
"execution_count": 2,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
],
|
|
"text/html": [
|
|
"\n",
|
|
" <input type=\"file\" id=\"files-10af51ff-93ce-47d8-89ae-45b5a3fa1cf9\" name=\"files[]\" multiple disabled\n",
|
|
" style=\"border:none\" />\n",
|
|
" <output id=\"result-10af51ff-93ce-47d8-89ae-45b5a3fa1cf9\">\n",
|
|
" Upload widget is only available when the cell has been executed in the\n",
|
|
" current browser session. Please rerun this cell to enable.\n",
|
|
" </output>\n",
|
|
" <script>// Copyright 2017 Google LLC\n",
|
|
"//\n",
|
|
"// Licensed under the Apache License, Version 2.0 (the \"License\");\n",
|
|
"// you may not use this file except in compliance with the License.\n",
|
|
"// You may obtain a copy of the License at\n",
|
|
"//\n",
|
|
"// http://www.apache.org/licenses/LICENSE-2.0\n",
|
|
"//\n",
|
|
"// Unless required by applicable law or agreed to in writing, software\n",
|
|
"// distributed under the License is distributed on an \"AS IS\" BASIS,\n",
|
|
"// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
|
|
"// See the License for the specific language governing permissions and\n",
|
|
"// limitations under the License.\n",
|
|
"\n",
|
|
"/**\n",
|
|
" * @fileoverview Helpers for google.colab Python module.\n",
|
|
" */\n",
|
|
"(function(scope) {\n",
|
|
"function span(text, styleAttributes = {}) {\n",
|
|
" const element = document.createElement('span');\n",
|
|
" element.textContent = text;\n",
|
|
" for (const key of Object.keys(styleAttributes)) {\n",
|
|
" element.style[key] = styleAttributes[key];\n",
|
|
" }\n",
|
|
" return element;\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Max number of bytes which will be uploaded at a time.\n",
|
|
"const MAX_PAYLOAD_SIZE = 100 * 1024;\n",
|
|
"\n",
|
|
"function _uploadFiles(inputId, outputId) {\n",
|
|
" const steps = uploadFilesStep(inputId, outputId);\n",
|
|
" const outputElement = document.getElementById(outputId);\n",
|
|
" // Cache steps on the outputElement to make it available for the next call\n",
|
|
" // to uploadFilesContinue from Python.\n",
|
|
" outputElement.steps = steps;\n",
|
|
"\n",
|
|
" return _uploadFilesContinue(outputId);\n",
|
|
"}\n",
|
|
"\n",
|
|
"// This is roughly an async generator (not supported in the browser yet),\n",
|
|
"// where there are multiple asynchronous steps and the Python side is going\n",
|
|
"// to poll for completion of each step.\n",
|
|
"// This uses a Promise to block the python side on completion of each step,\n",
|
|
"// then passes the result of the previous step as the input to the next step.\n",
|
|
"function _uploadFilesContinue(outputId) {\n",
|
|
" const outputElement = document.getElementById(outputId);\n",
|
|
" const steps = outputElement.steps;\n",
|
|
"\n",
|
|
" const next = steps.next(outputElement.lastPromiseValue);\n",
|
|
" return Promise.resolve(next.value.promise).then((value) => {\n",
|
|
" // Cache the last promise value to make it available to the next\n",
|
|
" // step of the generator.\n",
|
|
" outputElement.lastPromiseValue = value;\n",
|
|
" return next.value.response;\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"/**\n",
|
|
" * Generator function which is called between each async step of the upload\n",
|
|
" * process.\n",
|
|
" * @param {string} inputId Element ID of the input file picker element.\n",
|
|
" * @param {string} outputId Element ID of the output display.\n",
|
|
" * @return {!Iterable<!Object>} Iterable of next steps.\n",
|
|
" */\n",
|
|
"function* uploadFilesStep(inputId, outputId) {\n",
|
|
" const inputElement = document.getElementById(inputId);\n",
|
|
" inputElement.disabled = false;\n",
|
|
"\n",
|
|
" const outputElement = document.getElementById(outputId);\n",
|
|
" outputElement.innerHTML = '';\n",
|
|
"\n",
|
|
" const pickedPromise = new Promise((resolve) => {\n",
|
|
" inputElement.addEventListener('change', (e) => {\n",
|
|
" resolve(e.target.files);\n",
|
|
" });\n",
|
|
" });\n",
|
|
"\n",
|
|
" const cancel = document.createElement('button');\n",
|
|
" inputElement.parentElement.appendChild(cancel);\n",
|
|
" cancel.textContent = 'Cancel upload';\n",
|
|
" const cancelPromise = new Promise((resolve) => {\n",
|
|
" cancel.onclick = () => {\n",
|
|
" resolve(null);\n",
|
|
" };\n",
|
|
" });\n",
|
|
"\n",
|
|
" // Wait for the user to pick the files.\n",
|
|
" const files = yield {\n",
|
|
" promise: Promise.race([pickedPromise, cancelPromise]),\n",
|
|
" response: {\n",
|
|
" action: 'starting',\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" cancel.remove();\n",
|
|
"\n",
|
|
" // Disable the input element since further picks are not allowed.\n",
|
|
" inputElement.disabled = true;\n",
|
|
"\n",
|
|
" if (!files) {\n",
|
|
" return {\n",
|
|
" response: {\n",
|
|
" action: 'complete',\n",
|
|
" }\n",
|
|
" };\n",
|
|
" }\n",
|
|
"\n",
|
|
" for (const file of files) {\n",
|
|
" const li = document.createElement('li');\n",
|
|
" li.append(span(file.name, {fontWeight: 'bold'}));\n",
|
|
" li.append(span(\n",
|
|
" `(${file.type || 'n/a'}) - ${file.size} bytes, ` +\n",
|
|
" `last modified: ${\n",
|
|
" file.lastModifiedDate ? file.lastModifiedDate.toLocaleDateString() :\n",
|
|
" 'n/a'} - `));\n",
|
|
" const percent = span('0% done');\n",
|
|
" li.appendChild(percent);\n",
|
|
"\n",
|
|
" outputElement.appendChild(li);\n",
|
|
"\n",
|
|
" const fileDataPromise = new Promise((resolve) => {\n",
|
|
" const reader = new FileReader();\n",
|
|
" reader.onload = (e) => {\n",
|
|
" resolve(e.target.result);\n",
|
|
" };\n",
|
|
" reader.readAsArrayBuffer(file);\n",
|
|
" });\n",
|
|
" // Wait for the data to be ready.\n",
|
|
" let fileData = yield {\n",
|
|
" promise: fileDataPromise,\n",
|
|
" response: {\n",
|
|
" action: 'continue',\n",
|
|
" }\n",
|
|
" };\n",
|
|
"\n",
|
|
" // Use a chunked sending to avoid message size limits. See b/62115660.\n",
|
|
" let position = 0;\n",
|
|
" do {\n",
|
|
" const length = Math.min(fileData.byteLength - position, MAX_PAYLOAD_SIZE);\n",
|
|
" const chunk = new Uint8Array(fileData, position, length);\n",
|
|
" position += length;\n",
|
|
"\n",
|
|
" const base64 = btoa(String.fromCharCode.apply(null, chunk));\n",
|
|
" yield {\n",
|
|
" response: {\n",
|
|
" action: 'append',\n",
|
|
" file: file.name,\n",
|
|
" data: base64,\n",
|
|
" },\n",
|
|
" };\n",
|
|
"\n",
|
|
" let percentDone = fileData.byteLength === 0 ?\n",
|
|
" 100 :\n",
|
|
" Math.round((position / fileData.byteLength) * 100);\n",
|
|
" percent.textContent = `${percentDone}% done`;\n",
|
|
"\n",
|
|
" } while (position < fileData.byteLength);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // All done.\n",
|
|
" yield {\n",
|
|
" response: {\n",
|
|
" action: 'complete',\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"scope.google = scope.google || {};\n",
|
|
"scope.google.colab = scope.google.colab || {};\n",
|
|
"scope.google.colab._files = {\n",
|
|
" _uploadFiles,\n",
|
|
" _uploadFilesContinue,\n",
|
|
"};\n",
|
|
"})(self);\n",
|
|
"</script> "
|
|
]
|
|
},
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"Saving salary.csv to salary.csv\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "2VV6yeOfK_vp"
|
|
},
|
|
"source": [
|
|
"### *Load Dataset*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Ij-0EywfLN3t"
|
|
},
|
|
"source": [
|
|
"dataset = pd.read_csv('salary.csv')"
|
|
],
|
|
"execution_count": 3,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "7QZKjhQiLd0_"
|
|
},
|
|
"source": [
|
|
"### *Summarize Dataset*\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Bn4Vn37VLsZX",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "3c5f2ba0-35fd-4859-9c20-777593dc00df"
|
|
},
|
|
"source": [
|
|
"print(dataset.shape)\n",
|
|
"print(dataset.head(5))"
|
|
],
|
|
"execution_count": 4,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"(32561, 5)\n",
|
|
" age education.num capital.gain hours.per.week income\n",
|
|
"0 90 9 0 40 <=50K\n",
|
|
"1 82 9 0 18 <=50K\n",
|
|
"2 66 10 0 40 <=50K\n",
|
|
"3 54 4 0 40 <=50K\n",
|
|
"4 41 10 0 40 <=50K\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "PSCVm2nuMmEa"
|
|
},
|
|
"source": [
|
|
"### *Mapping Salary Data to Binary Value*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "NHJs-2U0M3CV",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "ba91dd2d-2c05-4d58-d180-86635bc29685"
|
|
},
|
|
"source": [
|
|
"income_set = set(dataset['income'])\n",
|
|
"dataset['income'] = dataset['income'].map({'<=50K': 0, '>50K': 1}).astype(int)\n",
|
|
"print(dataset.head)"
|
|
],
|
|
"execution_count": 5,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"<bound method NDFrame.head of age education.num capital.gain hours.per.week income\n",
|
|
"0 90 9 0 40 0\n",
|
|
"1 82 9 0 18 0\n",
|
|
"2 66 10 0 40 0\n",
|
|
"3 54 4 0 40 0\n",
|
|
"4 41 10 0 40 0\n",
|
|
"... ... ... ... ... ...\n",
|
|
"32556 22 10 0 40 0\n",
|
|
"32557 27 12 0 38 0\n",
|
|
"32558 40 9 0 40 1\n",
|
|
"32559 58 9 0 40 0\n",
|
|
"32560 22 9 0 20 0\n",
|
|
"\n",
|
|
"[32561 rows x 5 columns]>\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "cPyEdPblNyrw"
|
|
},
|
|
"source": [
|
|
"### *Segregate Dataset into X(Input/IndependentVariable) & Y(Output/DependentVariable)*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "LKL0-37RNz0v",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "a714a09a-8f1b-4de0-de9a-f7f5c8461207"
|
|
},
|
|
"source": [
|
|
"X = dataset.iloc[:, :-1].values\n",
|
|
"X"
|
|
],
|
|
"execution_count": 6,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[90, 9, 0, 40],\n",
|
|
" [82, 9, 0, 18],\n",
|
|
" [66, 10, 0, 40],\n",
|
|
" ...,\n",
|
|
" [40, 9, 0, 40],\n",
|
|
" [58, 9, 0, 40],\n",
|
|
" [22, 9, 0, 20]])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 6
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "gYqJfw9CN379",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "85ddb52c-990f-4fc3-d1e2-6d3d75f77dda"
|
|
},
|
|
"source": [
|
|
"Y = dataset.iloc[:, -1].values\n",
|
|
"Y"
|
|
],
|
|
"execution_count": 7,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"array([0, 0, 0, ..., 1, 0, 0])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 7
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "c9aiUBLqOCIP"
|
|
},
|
|
"source": [
|
|
"### *Splitting Dataset into Train & Test*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "F-Xes7CFODNU"
|
|
},
|
|
"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.25, random_state = 0)"
|
|
],
|
|
"execution_count": 8,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "BI1S2PKoOLpf"
|
|
},
|
|
"source": [
|
|
"### *Feature Scaling*\n",
|
|
"### we scale our data to make all the features contribute equally to the result\n",
|
|
"###Fit_Transform - fit method is calculating the mean and variance of each of the features present in our data\n",
|
|
"###Transform - Transform method is transforming all the features using the respective mean and variance,\n",
|
|
"###We want our test data to be a completely new and a surprise set for our model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "bHSNDh8zOMZl"
|
|
},
|
|
"source": [
|
|
"from sklearn.preprocessing import StandardScaler\n",
|
|
"sc = StandardScaler()\n",
|
|
"X_train = sc.fit_transform(X_train)\n",
|
|
"X_test = sc.transform(X_test)"
|
|
],
|
|
"execution_count": 9,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "tWUH3bnwYEfr"
|
|
},
|
|
"source": [
|
|
"### *Finding the Best K-Value*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "WKES0Vn1YINO",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 581
|
|
},
|
|
"outputId": "207033dc-a2ff-4659-b63c-2ad3d1b0f7e9"
|
|
},
|
|
"source": [
|
|
"error = []\n",
|
|
"from sklearn.neighbors import KNeighborsClassifier\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# Calculating error for K values between 1 and 40\n",
|
|
"for i in range(1, 40):\n",
|
|
" model = KNeighborsClassifier(n_neighbors=i)\n",
|
|
" model.fit(X_train, y_train)\n",
|
|
" pred_i = model.predict(X_test)\n",
|
|
" error.append(np.mean(pred_i != y_test))\n",
|
|
"\n",
|
|
"plt.figure(figsize=(12, 6))\n",
|
|
"plt.plot(range(1, 40), error, color='red', linestyle='dashed', marker='o',\n",
|
|
" markerfacecolor='blue', markersize=10)\n",
|
|
"plt.title('Error Rate K Value')\n",
|
|
"plt.xlabel('K Value')\n",
|
|
"plt.ylabel('Mean Error')"
|
|
],
|
|
"execution_count": 10,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0, 0.5, 'Mean Error')"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 10
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 1200x600 with 1 Axes>"
|
|
],
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/IAAAIjCAYAAACgdyAGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAe3BJREFUeJzt3Xl4VOXZx/HfZE/IQgiYsIdNXMEWhKLimhIQREpYq5IK7hZFxO1tFVutgLUWEMSKgmBFwBCVghIQAcXiBlLrhsheZJElCRBIJpnn/eOYhEASZpKZzJzJ93Ndc83kLM+5ZzmTuc+zOYwxRgAAAAAAwBZC/B0AAAAAAABwH4k8AAAAAAA2QiIPAAAAAICNkMgDAAAAAGAjJPIAAAAAANgIiTwAAAAAADZCIg8AAAAAgI2QyAMAAAAAYCMk8gAAAAAA2AiJPAAAQDVSU1P1u9/9zt9hAABQhkQeAAA3vfLKK3I4HFXePv74Y3+HWKnf/e53FeKMjIzU2Wefrccee0wnTpyoUZnffPONHn/8cW3fvt2rsa5evVoOh0NZWVkVlhcVFalfv34KCQnRrFmzKt332WeflcPh0HvvvVdl+TNnzpTD4dDixYu9GjcAAHUpzN8BAABgN3/+85/Vpk2b05a3b9/eD9G4JzIyUi+99JIkKS8vT2+//baeeOIJbdmyRa+99prH5X3zzTf605/+pCuvvFKpqalejrYip9OpQYMG6Z133tHMmTM1cuTISrcbNmyYHnjgAc2bN09paWmVbjNv3jwlJSWpT58+vgwZAACfIpEHAMBDffr0UdeuXT3ap7i4WC6XSxEREaetO3bsmBo0aFDjeIwxOnHihKKjo6vcJiwsTDfeeGPZ33fddZcuueQSvf7663r22WeVnJxc4+P7ktPp1JAhQ7RkyRL94x//0KhRo6rctlmzZrrqqquUnZ2tGTNmKDIyssL63bt364MPPtBtt92m8PBwX4cOAIDP0LQeAAAv2759uxwOh5555hlNnjxZ7dq1U2RkZFlzdIfDoW+++Ua//e1vlZiYqMsuu0ySlew/8cQTZdunpqbq//7v/1RYWFih/NTUVPXr1085OTnq2rWroqOj9Y9//MOjGB0Ohy677DIZY7R169ay5Tt27NBdd92ljh07Kjo6WklJSRo8eHCFJvSvvPKKBg8eLEm66qqryprsr169umybd999Vz179lSDBg0UFxenvn376uuvv/YoxuLiYg0bNkxvv/22ZsyYoVtvvfWM+9x4443Ky8vT0qVLT1s3f/58uVwu3XDDDZKkZ555RpdccomSkpIUHR2tLl26nNakvzKl7+GpSrtenNrdwBuvBQAAJ6NGHgAAD+Xl5enAgQMVljkcDiUlJVVYNnv2bJ04cUK33XabIiMj1ahRo7J1gwcPVocOHfTUU0/JGCNJuuWWWzRnzhwNGjRI999/vz755BNNmDBB3377rd58880KZW/atEnDhw/X7bffrltvvVUdO3b0+HmUJpyJiYllyz777DP9+9//1rBhw9SiRQtt375dM2bM0JVXXqlvvvlGMTExuvzyy3XPPfdo6tSp+r//+z+de+65klR2/+qrryozM1Pp6emaNGmSCgoKNGPGDF122WX64osv3GqKX1xcrOHDh+vNN9/U9OnTdfvtt7v1nAYOHKg777xT8+bN08CBAyusmzdvnlq3bq1LL71UkjRlyhT1799fN9xwg4qKijR//nwNHjxYS5YsUd++fd063pl447UAAOA0BgAAuGX27NlGUqW3yMjIsu22bdtmJJn4+Hizf//+CmWMHz/eSDLDhw+vsHzjxo1GkrnlllsqLB83bpyRZN5///2yZa1btzaSzLJly9yKOzMz0zRo0MD89NNP5qeffjI//PCDeeaZZ4zD4TAXXHCBcblcZdsWFBSctv+6deuMJDN37tyyZW+88YaRZFatWlVh2yNHjpiGDRuaW2+9tcLyvXv3moSEhNOWn2rVqlVGUtlznD59ulvP8WSDBw82UVFRJi8vr2zZd999ZySZRx55pGzZqc+1qKjIXHDBBebqq6+usLx169YmMzOz7O/S9/BUpZ+Pbdu2GWNq/1oAAFAVauQBAPDQ9OnTdfbZZ1dYFhoaetp2GRkZatKkSaVl3HHHHRX+fueddyRJY8eOrbD8/vvv1zPPPKOlS5fqqquuKlvepk0bpaenux3zsWPHTovlsssu05w5cyo0Ez+5n73T6VR+fr7at2+vhg0basOGDbrpppuqPc6KFSuUm5ur4cOHV2i1EBoaqu7du2vVqlVuxbtv3z6FhYVVOqjgmdx444164403lJ2dXTZt3Lx58ySprFm9VPG5Hj58WCUlJerZs6def/11j49ZGW+9FgAAnIpEHgAAD3Xr1s2twe6qS0JPXbdjxw6FhIScNvJ9SkqKGjZsqB07drhddmWioqL0r3/9S5L0v//9T08//bT2799/2gB5x48f14QJEzR79mzt3r27rNm/ZHUpOJPNmzdLkq6++upK18fHx7sV79NPP63Jkydr0KBBWr58eVlzeHf06dNHjRo10rx588oS+ddff12dO3fW+eefX7bdkiVL9OSTT2rjxo0VxiGorP97TXjrtQAA4FQk8gAA+Eh1o8hXtc7dJLK6sisTGhpaYUq29PR0nXPOObr99tsrzKk+evRozZ49W2PGjFGPHj2UkJAgh8OhYcOGyeVynfE4pdu8+uqrSklJOW19WJh7Pz2aNm2qFStW6LLLLlPfvn21Zs0ade7c2a19w8PDNWTIEM2cOVP79u3Tzp07tXnzZj399NNl23z44Yfq37+/Lr/8cj3//PNq2rSpwsPDNXv27LLa+6pU9R6VlJRU+NtbrwUAAKfiPwgAAAGgdevWcrlc2rx5c9mgcZLVxDw3N1etW7f26vGaNm2q++67T3/605/08ccf61e/+pUkKSsrS5mZmfrb3/5Wtu2JEyeUm5tbYf+qktl27dpJks4666wq53J3V9u2bZWTk6MrrrhC6enp+vDDD9WhQwe39r3hhhv0wgsvaMGCBdq2bZscDoeGDx9etn7RokWKiopSTk5OhWnqZs+efcaySwcHzM3NVcOGDcuWn9pqwpuvBQAAJ2P6OQAAAsC1114rSZo8eXKF5c8++6wkeW0U9ZONHj1aMTExmjhxYtmy0NDQCs3pJem55547rba5dN77UxP89PR0xcfH66mnnpLT6TztmD/99JNHMV544YVaunSpjh49ql//+tfavXu3W/tdeumlSk1N1T//+U8tWLBAV1xxhVq0aFG2PjQ0VA6Ho8Lz2r59u956660zll2aoH/wwQdly44dO6Y5c+ZU2M7brwUAAKWokQcAwEPvvvuuvvvuu9OWX3LJJWrbtm2NyuzcubMyMzP14osvKjc3V1dccYU+/fRTzZkzRwMGDKgw0J23JCUl6eabb9bzzz+vb7/9Vueee6769eunV199VQkJCTrvvPO0bt06vffee6dNrXfRRRcpNDRUkyZNUl5eniIjI3X11VfrrLPO0owZM3TTTTfpl7/8pYYNG6YmTZpo586dWrp0qS699FJNmzbNozh79Oih7OxsXXfddfr1r3+tDz/8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tEaeRB4AAAAAglpAJPLTp09XamqqoqKi1L17d3366adVbjtz5kz17NlTiYmJSkxMVFpa2mnbP/744zrnnHPUoEGDsm0++eQTXz8N/7rlFunvf5e6dvV3JAAAAAAAH/J7Ir9gwQKNHTtW48eP14YNG9S5c2elp6dr//79lW6/evVqDR8+XKtWrdK6devUsmVL9erVS7t37y7b5uyzz9a0adP03//+V2vXrlVqaqp69eqln376qa6eVt0bPFgaM0Y67zx/RwIAAAAA8CGHMcb4M4Du3bvr4osv1rRp0yRJLpdLLVu21OjRo/Xwww+fcf+SkhIlJiZq2rRpGjFiRKXb5OfnKyEhQe+9956uueaaM5ZZun1eXp7iS0eDBwAAAADARzzJQ/1aI19UVKT169crLS2tbFlISIjS0tK0bt06t8ooKCiQ0+lUo9LB3io5xosvvqiEhAR17ty50m0KCwuVn59f4WY7hw5J69ZJGzb4OxIAAAAAgA/5NZE/cOCASkpKlJycXGF5cnKy9u7d61YZDz30kJo1a1bhYoAkLVmyRLGxsYqKitLf//53rVixQo0bN660jAkTJighIaHs1rJly5o9IX965x3pkkukBx/0dyQAAAAAAB/yex/52pg4caLmz5+vN998U1FRURXWXXXVVdq4caP+/e9/q3fv3hoyZEiV/e4feeQR5eXlld127dpVF+F7F/PIAwAAAEC94NdEvnHjxgoNDdW+ffsqLN+3b59SUlKq3feZZ57RxIkTtXz5cnXq1Om09Q0aNFD79u31q1/9Si+//LLCwsL08ssvV1pWZGSk4uPjK9xsh+nnAAAAAKBe8GsiHxERoS5dumjlypVly1wul1auXKkePXpUud/TTz+tJ554QsuWLVNXN6dbc7lcKiwsrHXMAat0jAASeQAAAAAIamH+DmDs2LHKzMxU165d1a1bN02ePFnHjh3TzTffLEkaMWKEmjdvrgkTJkiSJk2apMcee0zz5s1TampqWV/62NhYxcbG6tixY/rLX/6i/v37q2nTpjpw4ICmT5+u3bt3a/DgwX57nj5XWiN/7JhUWChFRvo3HgAAAACAT/g9kR86dKh++uknPfbYY9q7d68uuugiLVu2rGwAvJ07dyokpLzhwIwZM1RUVKRBgwZVKGf8+PF6/PHHFRoaqu+++05z5szRgQMHlJSUpIsvvlgf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UPitRl6Sxo4dq8zMTHXt2lXdunXT5MmTdezYMd18882SpBEjRqh58+aaMGGCJGuAvG+++abs8e7du7Vx40bFxsaqffv2kqTrrrtOf/nLX9SqVSudf/75+uKLL/Tss89q5MiRbsdVOpA/g94BAAAAAOpCaf7p1sRyxs+ee+4506pVKxMREWG6detmPv7447J1V1xxhcnMzCz7e9u2bUbSabcrrriibJv8/Hxz7733mlatWpmoqCjTtm1b84c//MEUFha6HdOuXbsqPQ43bty4cePGjRs3bty4cePmy9uuXbvOmLP6dR75QOVyufTjjz8qLi5ODoej1uXl5+erZcuW2rVrF/PS2wzvnb3x/tkX75198d7ZF++dvfH+2RfvnX15+70zxujIkSNq1qzZad3FT+XXpvWBKiQkRC1atPB6ufHx8ZycNsV7Z2+8f/bFe2dfvHf2xXtnb7x/9sV7Z1/efO8SEhLc2i7opp8DAAAAACCYkcgDAAAAAGAjJPJ1IDIyUuPHj2euehvivbM33j/74r2zL947++K9szfeP/vivbMvf753DHYHAAAAAICNUCMPAAAAAICNkMgDAAAAAGAjJPIAAAAAANgIiTwAAAAAADZCIl8Hpk+frtTUVEVFRal79+769NNP/R0SzuDxxx+Xw+GocDvnnHP8HRYq8cEHH+i6665Ts2bN5HA49NZbb1VYb4zRY489pqZNmyo6OlppaWnavHmzf4LFac70/v3ud7877Vzs3bu3f4JFmQkTJujiiy9WXFyczjrrLA0YMECbNm2qsM2JEyd09913KykpSbGxscrIyNC+ffv8FDFO5s77d+WVV5527t1xxx1+ihilZsyYoU6dOik+Pl7x8fHq0aOH3n333bL1nHeB60zvHeecfUycOFEOh0NjxowpW+aPc49E3scWLFigsWPHavz48dqwYYM6d+6s9PR07d+/39+h4QzOP/987dmzp+y2du1af4eEShw7dkydO3fW9OnTK13/9NNPa+rUqXrhhRf0ySefqEGDBkpPT9eJEyfqOFJU5kzvnyT17t27wrn4+uuv12GEqMyaNWt099136+OPP9aKFSvkdDrVq1cvHTt2rGyb++67T//617/0xhtvaM2aNfrxxx81cOBAP0aNUu68f5J06623Vjj3nn76aT9FjFItWrTQxIkTtX79en3++ee6+uqrdf31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AAAQFEjkAQCoR373u99pwIABFZZlZWUpKipKf/vb307bftGiRQoNDdXu3bsrLa9Dhw4aO3asL0IFAABVIJEHAKAee+mll3TDDTdoxowZuv/++09b379/fyUlJWnOnDmnrfvggw/0ww8/aNSoUXURKgAA+BmJPAAA9dTTTz+t0aNHa/78+br55psr3SY8PFw33XSTXnnlldPWzZo1S927d9f555+vZ599VhdeeKEaNGigli1b6q677tLRo0erPHZlLQPGjBmjK6+8suxvl8ulCRMmqE2bNoqOjlbnzp2VlZVVk6cKAEBQIZEHAKAeeuihh/TEE09oyZIl+s1vflPttqNGjdLmzZv1wQcflC07evSosrKyymrjQ0JCNHXqVH399deaM2eO3n//fT344IO1inHChAmaO3euXnjhBX399de67777dOONN2rNmjW1KhcAALsL83cAAACgbr377rt6++23tXLlSl199dVn3P68887Tr371K82aNUuXX365JGnhwoUyxmjYsGGSrNr0UqmpqXryySd1xx136Pnnn69RjIWFhXrqqaf03nvvqUePHpKktm3bau3atfrHP/6hK664okblAgAQDKiRBwCgnunUqZNSU1M1fvz4apu/n2zkyJHKysrSkSNHJFnN6gcPHqy4uDhJ0nvvvadrrrlGzZs3V1xcnG666SYdPHhQBQUFNYrxhx9+UEFBgX79618rNja27DZ37lxt2bKlRmUCABAsSOQBAKhnmjdvrtWrV2v37t3q3bt3WXJendKa94ULF2rz5s366KOPyprVb9++Xf369VOnTp20aNEirV+/XtOnT5ckFRUVVVpeSEiIjDEVljmdzrLHpRcYli5dqo0bN5bdvvnmG/rJAwDqPZrWAwBQD7Vu3Vpr1qzRVVddpd69e2vZsmVlteuViYuL0+DBgzVr1ixt2bJFZ599tnr27ClJWr9+vVwul/72t78pJMSqI1i4cGG1x2/SpIm++uqrCss2btyo8PBwSVZz/sjISO3cuZNm9AAAnIIaeQAA6qmWLVtq9erV2r9/v9LT05Wfn1/t9qNGjdK///1vvfDCCxo5cmTZ8vbt28vpdOq5557T1q1b9eqrr+qFF16otqyrr75an3/+uebOnavNmzdr/PjxFRL7uLg4jRs3Tvfdd5/mzJmjLVu2aMOGDXruuecqnQoPAID6hEQeAIB6rEWLFlq9erUOHDhwxmT+sssuU8eOHZWfn68RI0aULe/cubOeffZZTZo0SRdccIFee+01TZgwodrjpqen69FHH9WDDz6oiy++WEeOHKlQpiQ98cQTevTRRzVhwgSde+656t27t5YuXao2bdrU7kkDAGBzDnNqBzUAAAAAABCwqJEHAAAAAMBGSOQBAAAAALAREnkAAAAAAGyERB4AAAAAABshkQcAAAAAwEZI5AEAAAAAsBESeQAAAAAAbIREHgAAAAAAGyGRBwAAAADARkjkAQAAAACwERJ5AAAAAABs5P8BCSYlFS+kPD4AAAAASUVORK5CYII=\n"
|
|
},
|
|
"metadata": {}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "j3i7m8V3OoXP"
|
|
},
|
|
"source": [
|
|
"### *Training*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "GmrBKoYLOnIx",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 80
|
|
},
|
|
"outputId": "3512171c-3593-42d9-8cc8-d9ea70dd9927"
|
|
},
|
|
"source": [
|
|
"from sklearn.neighbors import KNeighborsClassifier\n",
|
|
"model = KNeighborsClassifier(n_neighbors = 2, metric = 'minkowski', p = 2)\n",
|
|
"model.fit(X_train, y_train)"
|
|
],
|
|
"execution_count": 11,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"KNeighborsClassifier(n_neighbors=2)"
|
|
],
|
|
"text/html": [
|
|
"<style>#sk-container-id-1 {\n",
|
|
" /* Definition of color scheme common for light and dark mode */\n",
|
|
" --sklearn-color-text: #000;\n",
|
|
" --sklearn-color-text-muted: #666;\n",
|
|
" --sklearn-color-line: gray;\n",
|
|
" /* Definition of color scheme for unfitted estimators */\n",
|
|
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
|
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
|
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
|
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
|
" /* Definition of color scheme for fitted estimators */\n",
|
|
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
|
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
|
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
|
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
|
"\n",
|
|
" /* Specific color for light theme */\n",
|
|
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
|
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
|
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
|
" --sklearn-color-icon: #696969;\n",
|
|
"\n",
|
|
" @media (prefers-color-scheme: dark) {\n",
|
|
" /* Redefinition of color scheme for dark theme */\n",
|
|
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
|
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
|
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
|
" --sklearn-color-icon: #878787;\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 pre {\n",
|
|
" padding: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-hidden--visually {\n",
|
|
" border: 0;\n",
|
|
" clip: rect(1px 1px 1px 1px);\n",
|
|
" clip: rect(1px, 1px, 1px, 1px);\n",
|
|
" height: 1px;\n",
|
|
" margin: -1px;\n",
|
|
" overflow: hidden;\n",
|
|
" padding: 0;\n",
|
|
" position: absolute;\n",
|
|
" width: 1px;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
|
|
" border: 1px dashed var(--sklearn-color-line);\n",
|
|
" margin: 0 0.4em 0.5em 0.4em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" padding-bottom: 0.4em;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-container {\n",
|
|
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
|
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
|
" so we also need the `!important` here to be able to override the\n",
|
|
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
|
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
|
" display: inline-block !important;\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"div.sk-parallel-item,\n",
|
|
"div.sk-serial,\n",
|
|
"div.sk-item {\n",
|
|
" /* draw centered vertical line to link estimators */\n",
|
|
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
|
" background-size: 2px 100%;\n",
|
|
" background-repeat: no-repeat;\n",
|
|
" background-position: center center;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Parallel-specific style estimator block */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item::after {\n",
|
|
" content: \"\";\n",
|
|
" width: 100%;\n",
|
|
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
|
" flex-grow: 1;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel {\n",
|
|
" display: flex;\n",
|
|
" align-items: stretch;\n",
|
|
" justify-content: center;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item {\n",
|
|
" display: flex;\n",
|
|
" flex-direction: column;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
|
|
" align-self: flex-end;\n",
|
|
" width: 50%;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
|
|
" align-self: flex-start;\n",
|
|
" width: 50%;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
|
|
" width: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Serial-specific style estimator block */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-serial {\n",
|
|
" display: flex;\n",
|
|
" flex-direction: column;\n",
|
|
" align-items: center;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" padding-right: 1em;\n",
|
|
" padding-left: 1em;\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
|
"clickable and can be expanded/collapsed.\n",
|
|
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
|
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
|
"*/\n",
|
|
"\n",
|
|
"/* Pipeline and ColumnTransformer style (default) */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable {\n",
|
|
" /* Default theme specific background. It is overwritten whether we have a\n",
|
|
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Toggleable label */\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label {\n",
|
|
" cursor: pointer;\n",
|
|
" display: flex;\n",
|
|
" width: 100%;\n",
|
|
" margin-bottom: 0;\n",
|
|
" padding: 0.5em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" text-align: center;\n",
|
|
" align-items: start;\n",
|
|
" justify-content: space-between;\n",
|
|
" gap: 0.5em;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label .caption {\n",
|
|
" font-size: 0.6rem;\n",
|
|
" font-weight: lighter;\n",
|
|
" color: var(--sklearn-color-text-muted);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
|
|
" /* Arrow on the left of the label */\n",
|
|
" content: \"▸\";\n",
|
|
" float: left;\n",
|
|
" margin-right: 0.25em;\n",
|
|
" color: var(--sklearn-color-icon);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Toggleable content - dropdown */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content {\n",
|
|
" max-height: 0;\n",
|
|
" max-width: 0;\n",
|
|
" overflow: hidden;\n",
|
|
" text-align: left;\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content pre {\n",
|
|
" margin: 0.2em;\n",
|
|
" border-radius: 0.25em;\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
|
" /* Expand drop-down */\n",
|
|
" max-height: 200px;\n",
|
|
" max-width: 100%;\n",
|
|
" overflow: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
|
" content: \"▾\";\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Pipeline/ColumnTransformer-specific style */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator-specific style */\n",
|
|
"\n",
|
|
"/* Colorize estimator box */\n",
|
|
"#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
|
|
"#sk-container-id-1 div.sk-label label {\n",
|
|
" /* The background is the default theme color */\n",
|
|
" color: var(--sklearn-color-text-on-default-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover, darken the color of the background */\n",
|
|
"#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Label box, darken color on hover, fitted */\n",
|
|
"#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator label */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label label {\n",
|
|
" font-family: monospace;\n",
|
|
" font-weight: bold;\n",
|
|
" display: inline-block;\n",
|
|
" line-height: 1.2em;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label-container {\n",
|
|
" text-align: center;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator-specific */\n",
|
|
"#sk-container-id-1 div.sk-estimator {\n",
|
|
" font-family: monospace;\n",
|
|
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
|
" border-radius: 0.25em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" margin-bottom: 0.5em;\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* on hover */\n",
|
|
"#sk-container-id-1 div.sk-estimator:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
|
"\n",
|
|
"/* Common style for \"i\" and \"?\" */\n",
|
|
"\n",
|
|
".sk-estimator-doc-link,\n",
|
|
"a:link.sk-estimator-doc-link,\n",
|
|
"a:visited.sk-estimator-doc-link {\n",
|
|
" float: right;\n",
|
|
" font-size: smaller;\n",
|
|
" line-height: 1em;\n",
|
|
" font-family: monospace;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" border-radius: 1em;\n",
|
|
" height: 1em;\n",
|
|
" width: 1em;\n",
|
|
" text-decoration: none !important;\n",
|
|
" margin-left: 0.5em;\n",
|
|
" text-align: center;\n",
|
|
" /* unfitted */\n",
|
|
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-unfitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link.fitted,\n",
|
|
"a:link.sk-estimator-doc-link.fitted,\n",
|
|
"a:visited.sk-estimator-doc-link.fitted {\n",
|
|
" /* fitted */\n",
|
|
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-fitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover */\n",
|
|
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
|
".sk-estimator-doc-link:hover,\n",
|
|
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
|
".sk-estimator-doc-link:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
|
".sk-estimator-doc-link.fitted:hover,\n",
|
|
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
|
".sk-estimator-doc-link.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Span, style for the box shown on hovering the info icon */\n",
|
|
".sk-estimator-doc-link span {\n",
|
|
" display: none;\n",
|
|
" z-index: 9999;\n",
|
|
" position: relative;\n",
|
|
" font-weight: normal;\n",
|
|
" right: .2ex;\n",
|
|
" padding: .5ex;\n",
|
|
" margin: .5ex;\n",
|
|
" width: min-content;\n",
|
|
" min-width: 20ex;\n",
|
|
" max-width: 50ex;\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" box-shadow: 2pt 2pt 4pt #999;\n",
|
|
" /* unfitted */\n",
|
|
" background: var(--sklearn-color-unfitted-level-0);\n",
|
|
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link.fitted span {\n",
|
|
" /* fitted */\n",
|
|
" background: var(--sklearn-color-fitted-level-0);\n",
|
|
" border: var(--sklearn-color-fitted-level-3);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link:hover span {\n",
|
|
" display: block;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link {\n",
|
|
" float: right;\n",
|
|
" font-size: 1rem;\n",
|
|
" line-height: 1em;\n",
|
|
" font-family: monospace;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" border-radius: 1rem;\n",
|
|
" height: 1rem;\n",
|
|
" width: 1rem;\n",
|
|
" text-decoration: none;\n",
|
|
" /* unfitted */\n",
|
|
" color: var(--sklearn-color-unfitted-level-1);\n",
|
|
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
|
|
" /* fitted */\n",
|
|
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-fitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover */\n",
|
|
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
|
"}\n",
|
|
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=2)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KNeighborsClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=2)</pre></div> </div></div></div></div>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 11
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "0oabYXRVOxO4"
|
|
},
|
|
"source": [
|
|
"### *Predicting, wheather new customer with Age & Salary will Buy or Not*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "ovhU7dWzOx_a",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "0ffcdae0-a0cc-438a-f3dc-83f253ae793d"
|
|
},
|
|
"source": [
|
|
"age = int(input(\"Enter New Employee's Age: \"))\n",
|
|
"edu = int(input(\"Enter New Employee's Education: \"))\n",
|
|
"cg = int(input(\"Enter New Employee's Captital Gain: \"))\n",
|
|
"wh = int(input(\"Enter New Employee's Hour's Per week: \"))\n",
|
|
"newEmp = [[age,edu,cg,wh]]\n",
|
|
"result = model.predict(sc.transform(newEmp))\n",
|
|
"print(result)\n",
|
|
"\n",
|
|
"if result == 1:\n",
|
|
" print(\"Employee might got Salary above 50K\")\n",
|
|
"else:\n",
|
|
" print(\"Customer might not got Salary above 50K\")"
|
|
],
|
|
"execution_count": 14,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"Enter New Employee's Age: 60\n",
|
|
"Enter New Employee's Education: 11\n",
|
|
"Enter New Employee's Captital Gain: 0\n",
|
|
"Enter New Employee's Hour's Per week: 12\n",
|
|
"[0]\n",
|
|
"Customer might not got Salary above 50K\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "mjBCAtVFTE89"
|
|
},
|
|
"source": [
|
|
"### *Prediction for all Test Data*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "SLSFpnwqTFk7",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "48095b0e-6a7c-4ec5-d5cd-19c074b42955"
|
|
},
|
|
"source": [
|
|
"y_pred = model.predict(X_test)\n",
|
|
"print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))"
|
|
],
|
|
"execution_count": 15,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"[[0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" ...\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]]\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "dgsr46pcTosv"
|
|
},
|
|
"source": [
|
|
"### *Evaluating Model - CONFUSION MATRIX*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "agWRkVL3Tqn_",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "3e9bdec0-081b-4d19-c9f4-71061cca654d"
|
|
},
|
|
"source": [
|
|
"from sklearn.metrics import confusion_matrix, accuracy_score\n",
|
|
"cm = confusion_matrix(y_test, y_pred)\n",
|
|
"\n",
|
|
"print(\"Confusion Matrix: \")\n",
|
|
"print(cm)\n",
|
|
"\n",
|
|
"print(\"Accuracy of the Model: {0}%\".format(accuracy_score(y_test, y_pred)*100))"
|
|
],
|
|
"execution_count": 16,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"Confusion Matrix: \n",
|
|
"[[5918 275]\n",
|
|
" [1326 622]]\n",
|
|
"Accuracy of the Model: 80.33411128853949%\n"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |