mirror of
https://github.com/deepseek-ai/DeepSeek-Coder.git
synced 2025-02-23 06:09:07 -05:00
1083 lines
78 KiB
Plaintext
1083 lines
78 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/accuracy_enhanced_BreastCancerDetection_VariousMLAlgorithm.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "AhpeX5Dm_eLW"
|
|
},
|
|
"source": [
|
|
"# **Day-10_BreastCancerDetection_VariousMLAlgorithm**"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "8rvHswu2td0Z"
|
|
},
|
|
"source": [
|
|
"### *Importing Libraries*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "P-YXxKhu_Uk4"
|
|
},
|
|
"source": [
|
|
"import pandas as pd #useful for loading the dataset\n",
|
|
"import numpy as np #to perform array\n",
|
|
"from matplotlib import pyplot"
|
|
],
|
|
"execution_count": 1,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "mOt3nocbwvZk"
|
|
},
|
|
"source": [
|
|
"### *Choose Dataset from Local Directory*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "xB2NMwXtw2dG",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 73
|
|
},
|
|
"outputId": "ec354929-3ba9-42a1-b9bb-ccf832a4bb1b"
|
|
},
|
|
"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-fecec7e8-bcb2-40b8-af0a-82ebe3c06ca1\" name=\"files[]\" multiple disabled\n",
|
|
" style=\"border:none\" />\n",
|
|
" <output id=\"result-fecec7e8-bcb2-40b8-af0a-82ebe3c06ca1\">\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 data.csv to data.csv\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "69Kx6TycwzHo"
|
|
},
|
|
"source": [
|
|
"### *Load Dataset*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "7aXWQK9Cw7Dz"
|
|
},
|
|
"source": [
|
|
"dataset = pd.read_csv('data.csv')"
|
|
],
|
|
"execution_count": 3,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "huZ5AaCtxD0p"
|
|
},
|
|
"source": [
|
|
"### *Summarize Dataset*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "SmD4EDrkxFzq",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "c8de07bb-c31d-45b6-d7f1-f37549d27d5f"
|
|
},
|
|
"source": [
|
|
"print(dataset.shape)\n",
|
|
"print(dataset.head(5))"
|
|
],
|
|
"execution_count": 4,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"(569, 33)\n",
|
|
" id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n",
|
|
"0 842302 M 17.99 10.38 122.80 1001.0 \n",
|
|
"1 842517 M 20.57 17.77 132.90 1326.0 \n",
|
|
"2 84300903 M 19.69 21.25 130.00 1203.0 \n",
|
|
"3 84348301 M 11.42 20.38 77.58 386.1 \n",
|
|
"4 84358402 M 20.29 14.34 135.10 1297.0 \n",
|
|
"\n",
|
|
" smoothness_mean compactness_mean concavity_mean concave points_mean \\\n",
|
|
"0 0.11840 0.27760 0.3001 0.14710 \n",
|
|
"1 0.08474 0.07864 0.0869 0.07017 \n",
|
|
"2 0.10960 0.15990 0.1974 0.12790 \n",
|
|
"3 0.14250 0.28390 0.2414 0.10520 \n",
|
|
"4 0.10030 0.13280 0.1980 0.10430 \n",
|
|
"\n",
|
|
" ... texture_worst perimeter_worst area_worst smoothness_worst \\\n",
|
|
"0 ... 17.33 184.60 2019.0 0.1622 \n",
|
|
"1 ... 23.41 158.80 1956.0 0.1238 \n",
|
|
"2 ... 25.53 152.50 1709.0 0.1444 \n",
|
|
"3 ... 26.50 98.87 567.7 0.2098 \n",
|
|
"4 ... 16.67 152.20 1575.0 0.1374 \n",
|
|
"\n",
|
|
" compactness_worst concavity_worst concave points_worst symmetry_worst \\\n",
|
|
"0 0.6656 0.7119 0.2654 0.4601 \n",
|
|
"1 0.1866 0.2416 0.1860 0.2750 \n",
|
|
"2 0.4245 0.4504 0.2430 0.3613 \n",
|
|
"3 0.8663 0.6869 0.2575 0.6638 \n",
|
|
"4 0.2050 0.4000 0.1625 0.2364 \n",
|
|
"\n",
|
|
" fractal_dimension_worst Unnamed: 32 \n",
|
|
"0 0.11890 NaN \n",
|
|
"1 0.08902 NaN \n",
|
|
"2 0.08758 NaN \n",
|
|
"3 0.17300 NaN \n",
|
|
"4 0.07678 NaN \n",
|
|
"\n",
|
|
"[5 rows x 33 columns]\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "-MFwV-9k3Tu1"
|
|
},
|
|
"source": [
|
|
"### *Mapping Class String Values to Numbers*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "yJvwzEfF3ZMe",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "7138e1d5-0f52-4a8d-80e1-63f3280ea23f"
|
|
},
|
|
"source": [
|
|
"dataset['diagnosis'] = dataset['diagnosis'].map({'B': 0, 'M': 1}).astype(int)\n",
|
|
"print(dataset.head)"
|
|
],
|
|
"execution_count": 5,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"<bound method NDFrame.head of id diagnosis radius_mean texture_mean perimeter_mean \\\n",
|
|
"0 842302 1 17.99 10.38 122.80 \n",
|
|
"1 842517 1 20.57 17.77 132.90 \n",
|
|
"2 84300903 1 19.69 21.25 130.00 \n",
|
|
"3 84348301 1 11.42 20.38 77.58 \n",
|
|
"4 84358402 1 20.29 14.34 135.10 \n",
|
|
".. ... ... ... ... ... \n",
|
|
"564 926424 1 21.56 22.39 142.00 \n",
|
|
"565 926682 1 20.13 28.25 131.20 \n",
|
|
"566 926954 1 16.60 28.08 108.30 \n",
|
|
"567 927241 1 20.60 29.33 140.10 \n",
|
|
"568 92751 0 7.76 24.54 47.92 \n",
|
|
"\n",
|
|
" area_mean smoothness_mean compactness_mean concavity_mean \\\n",
|
|
"0 1001.0 0.11840 0.27760 0.30010 \n",
|
|
"1 1326.0 0.08474 0.07864 0.08690 \n",
|
|
"2 1203.0 0.10960 0.15990 0.19740 \n",
|
|
"3 386.1 0.14250 0.28390 0.24140 \n",
|
|
"4 1297.0 0.10030 0.13280 0.19800 \n",
|
|
".. ... ... ... ... \n",
|
|
"564 1479.0 0.11100 0.11590 0.24390 \n",
|
|
"565 1261.0 0.09780 0.10340 0.14400 \n",
|
|
"566 858.1 0.08455 0.10230 0.09251 \n",
|
|
"567 1265.0 0.11780 0.27700 0.35140 \n",
|
|
"568 181.0 0.05263 0.04362 0.00000 \n",
|
|
"\n",
|
|
" concave points_mean ... texture_worst perimeter_worst area_worst \\\n",
|
|
"0 0.14710 ... 17.33 184.60 2019.0 \n",
|
|
"1 0.07017 ... 23.41 158.80 1956.0 \n",
|
|
"2 0.12790 ... 25.53 152.50 1709.0 \n",
|
|
"3 0.10520 ... 26.50 98.87 567.7 \n",
|
|
"4 0.10430 ... 16.67 152.20 1575.0 \n",
|
|
".. ... ... ... ... ... \n",
|
|
"564 0.13890 ... 26.40 166.10 2027.0 \n",
|
|
"565 0.09791 ... 38.25 155.00 1731.0 \n",
|
|
"566 0.05302 ... 34.12 126.70 1124.0 \n",
|
|
"567 0.15200 ... 39.42 184.60 1821.0 \n",
|
|
"568 0.00000 ... 30.37 59.16 268.6 \n",
|
|
"\n",
|
|
" smoothness_worst compactness_worst concavity_worst \\\n",
|
|
"0 0.16220 0.66560 0.7119 \n",
|
|
"1 0.12380 0.18660 0.2416 \n",
|
|
"2 0.14440 0.42450 0.4504 \n",
|
|
"3 0.20980 0.86630 0.6869 \n",
|
|
"4 0.13740 0.20500 0.4000 \n",
|
|
".. ... ... ... \n",
|
|
"564 0.14100 0.21130 0.4107 \n",
|
|
"565 0.11660 0.19220 0.3215 \n",
|
|
"566 0.11390 0.30940 0.3403 \n",
|
|
"567 0.16500 0.86810 0.9387 \n",
|
|
"568 0.08996 0.06444 0.0000 \n",
|
|
"\n",
|
|
" concave points_worst symmetry_worst fractal_dimension_worst \\\n",
|
|
"0 0.2654 0.4601 0.11890 \n",
|
|
"1 0.1860 0.2750 0.08902 \n",
|
|
"2 0.2430 0.3613 0.08758 \n",
|
|
"3 0.2575 0.6638 0.17300 \n",
|
|
"4 0.1625 0.2364 0.07678 \n",
|
|
".. ... ... ... \n",
|
|
"564 0.2216 0.2060 0.07115 \n",
|
|
"565 0.1628 0.2572 0.06637 \n",
|
|
"566 0.1418 0.2218 0.07820 \n",
|
|
"567 0.2650 0.4087 0.12400 \n",
|
|
"568 0.0000 0.2871 0.07039 \n",
|
|
"\n",
|
|
" Unnamed: 32 \n",
|
|
"0 NaN \n",
|
|
"1 NaN \n",
|
|
"2 NaN \n",
|
|
"3 NaN \n",
|
|
"4 NaN \n",
|
|
".. ... \n",
|
|
"564 NaN \n",
|
|
"565 NaN \n",
|
|
"566 NaN \n",
|
|
"567 NaN \n",
|
|
"568 NaN \n",
|
|
"\n",
|
|
"[569 rows x 33 columns]>\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "0qgR6rGRxH5y"
|
|
},
|
|
"source": [
|
|
"### *Segregate Dataset into X(Input/IndependentVariable) & Y(Output/DependentVariable)*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "8qOVIILpxefB",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "a50556fe-21af-46eb-ff7e-056be4e2d174"
|
|
},
|
|
"source": [
|
|
"X = dataset.iloc[:, 2:32].values\n",
|
|
"X"
|
|
],
|
|
"execution_count": 6,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[1.799e+01, 1.038e+01, 1.228e+02, ..., 2.654e-01, 4.601e-01,\n",
|
|
" 1.189e-01],\n",
|
|
" [2.057e+01, 1.777e+01, 1.329e+02, ..., 1.860e-01, 2.750e-01,\n",
|
|
" 8.902e-02],\n",
|
|
" [1.969e+01, 2.125e+01, 1.300e+02, ..., 2.430e-01, 3.613e-01,\n",
|
|
" 8.758e-02],\n",
|
|
" ...,\n",
|
|
" [1.660e+01, 2.808e+01, 1.083e+02, ..., 1.418e-01, 2.218e-01,\n",
|
|
" 7.820e-02],\n",
|
|
" [2.060e+01, 2.933e+01, 1.401e+02, ..., 2.650e-01, 4.087e-01,\n",
|
|
" 1.240e-01],\n",
|
|
" [7.760e+00, 2.454e+01, 4.792e+01, ..., 0.000e+00, 2.871e-01,\n",
|
|
" 7.039e-02]])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 6
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "TE6LNAwmxkBn",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "93adc199-d960-4cdd-9d42-3ad978584020"
|
|
},
|
|
"source": [
|
|
"Y = dataset.iloc[:,1].values\n",
|
|
"Y"
|
|
],
|
|
"execution_count": 7,
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,\n",
|
|
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,\n",
|
|
" 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1,\n",
|
|
" 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1,\n",
|
|
" 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,\n",
|
|
" 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1,\n",
|
|
" 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,\n",
|
|
" 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0,\n",
|
|
" 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1,\n",
|
|
" 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1,\n",
|
|
" 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0,\n",
|
|
" 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
|
|
" 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0,\n",
|
|
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,\n",
|
|
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1,\n",
|
|
" 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,\n",
|
|
" 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1,\n",
|
|
" 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0,\n",
|
|
" 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1,\n",
|
|
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0,\n",
|
|
" 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,\n",
|
|
" 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,\n",
|
|
" 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0,\n",
|
|
" 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,\n",
|
|
" 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
|
|
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 7
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "oOzExtMjxmup"
|
|
},
|
|
"source": [
|
|
"### *Splitting Dataset into Train & Test*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "uJXcK2PHxqJ9"
|
|
},
|
|
"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": "89y8rh-3yv15"
|
|
},
|
|
"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": "ehsC_5BSy-Pa"
|
|
},
|
|
"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": "X1gsZ3YZ51gz"
|
|
},
|
|
"source": [
|
|
"### *Validating some ML algorithm by its accuracy - Model Score*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "ekrjJPx_5-rJ"
|
|
},
|
|
"source": [
|
|
"from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n",
|
|
"from sklearn.linear_model import LogisticRegression\n",
|
|
"from sklearn.tree import DecisionTreeClassifier\n",
|
|
"from sklearn.neighbors import KNeighborsClassifier\n",
|
|
"from sklearn.naive_bayes import GaussianNB\n",
|
|
"from sklearn.svm import SVC\n",
|
|
"\n",
|
|
"from sklearn.model_selection import cross_val_score\n",
|
|
"from sklearn.model_selection import StratifiedKFold"
|
|
],
|
|
"execution_count": 10,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "7fmWEBDq6fUM"
|
|
},
|
|
"source": [
|
|
"models = []\n",
|
|
"models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))\n",
|
|
"models.append(('LDA', LinearDiscriminantAnalysis()))\n",
|
|
"models.append(('KNN', KNeighborsClassifier()))\n",
|
|
"models.append(('CART', DecisionTreeClassifier()))\n",
|
|
"models.append(('NB', GaussianNB()))\n",
|
|
"models.append(('SVM', SVC(gamma='auto')))"
|
|
],
|
|
"execution_count": 11,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "r0dYFpqw6iXs",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 923
|
|
},
|
|
"outputId": "c7d83a67-7567-499b-b99c-3792b5c0f9c5"
|
|
},
|
|
"source": [
|
|
"results = []\n",
|
|
"names = []\n",
|
|
"res = []\n",
|
|
"for name, model in models:\n",
|
|
" kfold = StratifiedKFold(n_splits=10, random_state=None)\n",
|
|
" cv_results = cross_val_score(model, X_train, y_train, cv=kfold, scoring='accuracy')\n",
|
|
" results.append(cv_results)\n",
|
|
" names.append(name)\n",
|
|
" res.append(cv_results.mean())\n",
|
|
" print('%s: %f' % (name, cv_results.mean()))\n",
|
|
"\n",
|
|
"pyplot.ylim(.900, .999)\n",
|
|
"pyplot.bar(names, res, color ='maroon', width = 0.6)\n",
|
|
"\n",
|
|
"pyplot.title('Algorithm Comparison')\n",
|
|
"pyplot.show()"
|
|
],
|
|
"execution_count": 12,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stderr",
|
|
"text": [
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n",
|
|
"/usr/local/lib/python3.11/dist-packages/sklearn/linear_model/_logistic.py:1256: FutureWarning: 'multi_class' was deprecated in version 1.5 and will be removed in 1.7. Use OneVsRestClassifier(LogisticRegression(..)) instead. Leave it to its default value to avoid this warning.\n",
|
|
" warnings.warn(\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"LR: 0.981285\n",
|
|
"LDA: 0.957863\n",
|
|
"KNN: 0.964839\n",
|
|
"CART: 0.929568\n",
|
|
"NB: 0.941417\n",
|
|
"SVM: 0.979014\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
],
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMkpJREFUeJzt3XtYVWX+///XBoKNIuIBIRVF0MnUhFIhc0azmCg6mOMpR1PRnDLRHJw8ZaD2KbLS0cg8lIkapeUpa4oyFCc/UuRpPs1Qpl8THRKwUnBIUNnr90c/d+0BD4C6b+z5uK51de17vde973uxbb9Y+94Lm2VZlgAAAAzm4e4BAAAAXAiBBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFuEJsNptmzJjhtucPDQ3ViBEjLrr2nnvuubwDwnmlpaXJZrPp4MGD7h4KYAQCC3AJvPzyy7LZbIqOjnb3UC5abm6uZsyYYfQb4vr163XXXXepadOm8vb2VvPmzTVw4EBt3rzZ3UMDcIURWIBLID09XaGhocrJydH+/fvdPZwq7d27V6+88orzcW5urmbOnGlkYLEsS/Hx8frDH/6gwsJCJSYmatGiRRo7dqwOHDig22+/Xdu3b3f3MC+rBx98UCdPnlTr1q3dPRTACF7uHgBQ133zzTfavn271q1bp4cffljp6elKTk5297Ak/fTGX1ZWJl9fX/n4+Lh7OBdtzpw5SktL04QJEzR37lzZbDbnvieeeEIrV66Ul9fV+b+v0tJS1a9fX56envL09HT3cABjcIUFqKX09HQ1atRId999t/r376/09PSLPjYrK0tdu3aV3W5XeHi4Fi9erBkzZri8QUvSmTNn9NRTTyk8PFw+Pj4KDQ3VtGnTVF5e7lJ3du3Jhx9+qK5du8rX11eLFy927ju7hiUtLU0DBgyQJPXu3Vs2m002m01ZWVku/W3btk1RUVGy2+0KCwvTihUrXPafXWexbds2jR8/XoGBgQoICNDDDz+sU6dO6fjx4xo2bJgaNWqkRo0aadKkSbrQH4g/efKkUlJS1L59e73wwguVzoX009WHqKgo5+MDBw5owIABaty4serVq6ebb75Zf/vb3yqda5vNprfeekszZ85UixYt1KBBA/Xv31/FxcUqLy/XhAkT1KxZM/n5+Sk+Pr7S+bXZbEpISFB6erquu+462e12denSRX//+99d6vLy8vToo4/quuuuk6+vr5o0aaIBAwZUupp19vxt3bpVjz76qJo1a6aWLVu67PvlMTt27FBsbKyaNm0qX19ftWnTRiNHjnTps7S0VBMnTlRISIh8fHx03XXX6YUXXqh03s/OZcOGDerUqZN8fHzUsWNHZWRknPfnA7jL1fkrCnAFpaen6w9/+IO8vb01ePBgLVy4UJ9//rm6det23uN2796tO++8U9dee61mzpypiooKzZo1S4GBgZVqH3roIS1fvlz9+/fXxIkT9dlnnyklJUVffvml1q9f71K7d+9eDR48WA8//LBGjx6t6667rlJ/PXv21Pjx4/Xiiy9q2rRpuv766yXJ+V9J2r9/v/r3769Ro0Zp+PDheu211zRixAh16dJFHTt2dOlv3LhxCg4O1syZM/Xpp59qyZIlCggI0Pbt29WqVSs988wzev/99/X888+rU6dOGjZs2DnPy7Zt2/TDDz9owoQJF3WFobCwULfccot+/PFHjR8/Xk2aNNHy5ct13333ac2aNerbt69LfUpKinx9fTVlyhTt379fqampuuaaa+Th4aFjx45pxowZ+vTTT5WWlqY2bdooKSnJ5fitW7dq9erVGj9+vHx8fPTyyy/rzjvvVE5Ojjp16iRJ+vzzz7V9+3Y98MADatmypQ4ePKiFCxfq1ltvVW5ururVq+fS56OPPqrAwEAlJSWptLS0ynkWFRXpjjvuUGBgoKZMmaKAgAAdPHhQ69atc9ZYlqX77rtPW7Zs0ahRoxQZGakPP/xQjz/+uPLz8/XXv/610rlet26dHn30UTVo0EAvvvii+vXrp0OHDqlJkyYXPPfAFWUBqLEdO3ZYkqxNmzZZlmVZDofDatmypfXYY49VqpVkJScnOx/fe++9Vr169az8/Hxn2759+ywvLy/rl/809+zZY0myHnroIZf+/vKXv1iSrM2bNzvbWrdubUmyMjIyKj1/69atreHDhzsfv/3225Yka8uWLVXWSrL+/ve/O9uKioosHx8fa+LEic62ZcuWWZKs2NhYy+FwONu7d+9u2Ww265FHHnG2nTlzxmrZsqXVq1evSs/3S/Pnz7ckWevXrz9v3VkTJkywJFmffPKJs+3EiRNWmzZtrNDQUKuiosKyLMvasmWLJcnq1KmTderUKWft4MGDLZvNZt11110u/Xbv3t1q3bq1S5skS5K1Y8cOZ1teXp5lt9utvn37Ott+/PHHSuPMzs62JFkrVqxwtp09f7/97W+tM2fOuNSf3ffNN99YlmVZ69evtyRZn3/++TnPxYYNGyxJ1v/8z/+4tPfv39+y2WzW/v37Xebi7e3t0vaPf/zDkmSlpqae8zkAd+EjIaAW0tPTFRQUpN69e0v66TL7oEGDtGrVKlVUVJzzuIqKCn388ce6//771bx5c2d727Ztddddd7nUvv/++5KkxMREl/aJEydKUqWPPtq0aaPY2NiaT+r/16FDB/3ud79zPg4MDNR1112nAwcOVKodNWqUy0c30dHRsixLo0aNcrZ5enqqa9euVR7/SyUlJZKkBg0aXNQ433//fUVFRem3v/2ts83Pz09/+tOfdPDgQeXm5rrUDxs2TNdcc02lsf73RyvR0dE6fPiwzpw549LevXt3denSxfm4VatW6tOnjz788EPnz9zX19e5//Tp0/r+++/Vtm1bBQQEaNeuXZXmMHr06AteTQoICJAkvffeezp9+nSVNe+//748PT01fvx4l/aJEyfKsix98MEHLu0xMTEKDw93Pu7cubP8/f0v+DMC3IHAAtRQRUWFVq1apd69e+ubb77R/v37tX//fkVHR6uwsFCZmZnnPLaoqEgnT55U27ZtK+3777a8vDx5eHhUag8ODlZAQIDy8vJc2tu0aVOLWf2sVatWldoaNWqkY8eOXbC2YcOGkqSQkJBK7VUd/0v+/v6SpBMnTlzUOPPy8qr82Ovsx1v/fX6qM1aHw6Hi4mKX9nbt2lV6rt/85jf68ccfdfToUUk/rcNJSkpyriNp2rSpAgMDdfz48Ur9SRf3M+vVq5f69eunmTNnqmnTpurTp4+WLVvmss4mLy9PzZs3rxT2LvZcSOf+GQPuRmABamjz5s06cuSIVq1apXbt2jm3gQMHSlK1Ft9ejKoWn1bll7/d18a5fuO3qlg0e67aqtqrOv6X2rdvL0n64osvLjTEGqnOWKULj7cq48aN09NPP62BAwfqrbfe0kcffaRNmzapSZMmcjgcleov5mdms9m0Zs0aZWdnKyEhQfn5+Ro5cqS6dOmi//znP9Ueo3Rp5wxcbiy6BWooPT1dzZo104IFCyrtW7dundavX69FixZV+WbUrFkz2e32Ku/Z8t9trVu3lsPh0L59+1wWxRYWFur48eM1vk/HxQagK+23v/2tGjVqpDfffFPTpk274EclrVu31t69eyu1f/XVV879l9K+ffsqtX399deqV6+ec8H0mjVrNHz4cM2ZM8dZU1ZWpuPHj9f6+W+++WbdfPPNevrpp/XGG29oyJAhWrVqlR566CG1bt1aH3/8sU6cOOFyleVynQvgSuIKC1ADJ0+e1Lp163TPPfeof//+lbaEhASdOHFCGzdurPJ4T09PxcTEaMOGDfr222+d7fv376+0ziAuLk6SNG/ePJf2uXPnSpLuvvvuGs2hfv36knRJ3kQvpXr16mny5Mn68ssvNXny5Cp/23/99deVk5Mj6afzk5OTo+zsbOf+0tJSLVmyRKGhoerQocMlHV92drbLOpTDhw/rnXfe0R133OEMV56enpXGnZqaet51TRdy7NixSn1GRkZKkvNjobi4OFVUVOill15yqfvrX/8qm81WaX0UUJdwhQWogY0bN+rEiRO67777qtx/8803KzAwUOnp6Ro0aFCVNTNmzNBHH32kHj16aMyYMc43mk6dOmnPnj3OuoiICA0fPlxLlizR8ePH1atXL+Xk5Gj58uW6//77nQt+qysyMlKenp6aPXu2iouL5ePjo9tuu03NmjWrUX+X0uOPP65//etfmjNnjrZs2aL+/fsrODhYBQUF2rBhg3Jycpx3up0yZYrefPNN3XXXXRo/frwaN26s5cuX65tvvtHatWvl4XFpfy/r1KmTYmNjXb7WLEkzZ8501txzzz1auXKlGjZsqA4dOig7O1sff/xxrb4qvHz5cr388svq27evwsPDdeLECb3yyivy9/d3htp7771XvXv31hNPPKGDBw8qIiJCH330kd555x1NmDDBZYEtUNcQWIAaSE9Pl91u1+9///sq93t4eOjuu+9Wenq6vv/++yrfqLp06aIPPvhAf/nLX/Tkk08qJCREs2bN0pdffum8hH/Wq6++qrCwMKWlpWn9+vUKDg7W1KlTa3VH3eDgYC1atEgpKSkaNWqUKioqtGXLFiMCi4eHh1asWKE+ffpoyZIleuGFF1RSUqLAwED17NlTzz33nLp37y5JCgoK0vbt2zV58mSlpqaqrKxMnTt31rvvvlvjq0/n06tXL3Xv3l0zZ87UoUOH1KFDB6Wlpalz587Omvnz58vT01Pp6ekqKytTjx49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\n"
|
|
},
|
|
"metadata": {}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "ospEktZ3_KgQ"
|
|
},
|
|
"source": [
|
|
"### *Training & Prediction using the algorithm with high accuracy*"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "zbi3Uvd0_Yn7",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "c3532d24-4239-4945-daee-c3d5ba95fcda"
|
|
},
|
|
"source": [
|
|
"from sklearn.svm import SVC\n",
|
|
"model.fit(X_train, y_train)\n",
|
|
"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": 13,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"[[1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 1]\n",
|
|
" [1 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 1]\n",
|
|
" [1 1]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [0 0]\n",
|
|
" [1 1]]\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"source": [
|
|
"models = []\n",
|
|
"models.append(('LR', LogisticRegression(**best_params['LR'])))\n",
|
|
"models.append(('LDA', LinearDiscriminantAnalysis(**best_params['LDA'])))\n",
|
|
"models.append(('KNN', KNeighborsClassifier(**best_params['KNN'])))\n",
|
|
"models.append(('CART', DecisionTreeClassifier(**best_params['CART'])))\n",
|
|
"models.append(('NB', GaussianNB(**best_params['NB'])))\n",
|
|
"models.append(('SVM', SVC(**best_params['SVM'])))"
|
|
],
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "lgTzkaw8B0ZZ"
|
|
},
|
|
"execution_count": 28,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"source": [
|
|
"from sklearn.model_selection import GridSearchCV\n",
|
|
"\n",
|
|
"param_grids = {\n",
|
|
" 'LR': {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
|
|
" 'LDA': {'solver': ['svd', 'lsqr', 'eigen']},\n",
|
|
" 'KNN': {'n_neighbors': [3, 5, 7, 9, 11], 'weights': ['uniform', 'distance']},\n",
|
|
" 'CART': {'criterion': ['gini', 'entropy'], 'max_depth': [None, 5, 10, 15]},\n",
|
|
" 'NB': {'var_smoothing': [1e-9, 1e-8, 1e-7, 1e-6, 1e-5]},\n",
|
|
" 'SVM': {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf'], 'gamma': ['scale', 'auto']}\n",
|
|
"}\n",
|
|
"\n",
|
|
"# Initialize best_params before the loop\n",
|
|
"best_params = {}\n",
|
|
"\n",
|
|
"# Define models outside the loop to avoid redefinition within each loop\n",
|
|
"models = [\n",
|
|
" ('LR', LogisticRegression()),\n",
|
|
" ('LDA', LinearDiscriminantAnalysis()),\n",
|
|
" ('KNN', KNeighborsClassifier()),\n",
|
|
" ('CART', DecisionTreeClassifier()),\n",
|
|
" ('NB', GaussianNB()),\n",
|
|
" ('SVM', SVC())\n",
|
|
"]\n",
|
|
"\n",
|
|
"results = []\n",
|
|
"names = []\n",
|
|
"\n",
|
|
"for name, model in models:\n",
|
|
" grid_search = GridSearchCV(estimator=model, param_grid=param_grids[name], cv=5, scoring='accuracy')\n",
|
|
" grid_search.fit(X_train, y_train)\n",
|
|
" results.append(grid_search.best_score_)\n",
|
|
" names.append(name)\n",
|
|
" best_params[name] = grid_search.best_params_ # Populating best_params inside the loop\n",
|
|
" print(f'{name}: Best Accuracy = {grid_search.best_score_}, Best Parameters = {grid_search.best_params_}')\n",
|
|
"\n",
|
|
"\n",
|
|
"# Now you can use best_params to create your models\n",
|
|
"models = []\n",
|
|
"models.append(('LR', LogisticRegression(**best_params['LR'])))\n",
|
|
"models.append(('LDA', LinearDiscriminantAnalysis(**best_params['LDA'])))\n",
|
|
"models.append(('KNN', KNeighborsClassifier(**best_params['KNN'])))\n",
|
|
"models.append(('CART', DecisionTreeClassifier(**best_params['CART'])))\n",
|
|
"models.append(('NB', GaussianNB(**best_params['NB'])))\n",
|
|
"models.append(('SVM', SVC(**best_params['SVM'])))\n",
|
|
"\n",
|
|
"# ... (Rest of your code)"
|
|
],
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "FuOHDHRpCGBD",
|
|
"outputId": "cc1ace9b-2ba2-44fe-98cf-b525f30e5355"
|
|
},
|
|
"execution_count": 26,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"LR: Best Accuracy = 0.9812038303693571, Best Parameters = {'C': 1}\n",
|
|
"LDA: Best Accuracy = 0.9459917920656634, Best Parameters = {'solver': 'svd'}\n",
|
|
"KNN: Best Accuracy = 0.9625170998632011, Best Parameters = {'n_neighbors': 9, 'weights': 'uniform'}\n",
|
|
"CART: Best Accuracy = 0.922435020519836, Best Parameters = {'criterion': 'entropy', 'max_depth': 5}\n",
|
|
"NB: Best Accuracy = 0.9460465116279069, Best Parameters = {'var_smoothing': 1e-09}\n",
|
|
"SVM: Best Accuracy = 0.9835567715458277, Best Parameters = {'C': 1, 'gamma': 'scale', 'kernel': 'linear'}\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"source": [
|
|
"results = []\n",
|
|
"names = []\n",
|
|
"best_params = {}\n",
|
|
"\n",
|
|
"for name, model in models:\n",
|
|
" grid_search = GridSearchCV(estimator=model, param_grid=param_grids[name], cv=5, scoring='accuracy')\n",
|
|
" grid_search.fit(X_train, y_train)\n",
|
|
" results.append(grid_search.best_score_)\n",
|
|
" names.append(name)\n",
|
|
" best_params[name] = grid_search.best_params_\n",
|
|
" print(f'{name}: Best Accuracy = {grid_search.best_score_}, Best Parameters = {grid_search.best_params_}')\n",
|
|
"\n",
|
|
"# Print the results\n",
|
|
"pyplot.ylim(.900, .999)\n",
|
|
"pyplot.bar(names, results, color ='maroon', width = 0.6)\n",
|
|
"pyplot.title('Algorithm Comparison')\n",
|
|
"pyplot.show()"
|
|
],
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 556
|
|
},
|
|
"id": "CP9Tm2JRB2ee",
|
|
"outputId": "62b247dc-d239-4a9e-edca-45b0c8231ee8"
|
|
},
|
|
"execution_count": 24,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"LR: Best Accuracy = 0.9812038303693571, Best Parameters = {'C': 1}\n",
|
|
"LDA: Best Accuracy = 0.9459917920656634, Best Parameters = {'solver': 'svd'}\n",
|
|
"KNN: Best Accuracy = 0.9625170998632011, Best Parameters = {'n_neighbors': 9, 'weights': 'uniform'}\n",
|
|
"CART: Best Accuracy = 0.9248974008207934, Best Parameters = {'criterion': 'gini', 'max_depth': 10}\n",
|
|
"NB: Best Accuracy = 0.9460465116279069, Best Parameters = {'var_smoothing': 1e-09}\n",
|
|
"SVM: Best Accuracy = 0.9835567715458277, Best Parameters = {'C': 1, 'gamma': 'scale', 'kernel': 'linear'}\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
],
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMkRJREFUeJzt3XtcVVXi///3AYKDIuIFIRVF0MnUhFIhc0azmCi6mOMtR1PRnDIvOTh5y0DtU2Slo5F5KRM1Sstb1hRlKE5+pMjbfJqhTL8mOiRgpeCQoHL2749+njrD8QJezsJez8djP3yctddeZ63FwfNm73X2sVmWZQkAAMBgXp7uAAAAwPkQWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYgCvEZrNp+vTpHnv+8PBwDRs27ILr3nPPPZe3Qzin9PR02Ww2HThwwNNdAYxAYAEugZdfflk2m02xsbGe7soFy8vL0/Tp041+Q1y3bp3uuusuNW7cWL6+vmratKn69++vTZs2ebprAK4wAgtwCWRkZCg8PFy5ubnat2+fp7vj1p49e/TKK684H+fl5WnGjBlGBhbLspSYmKg//OEPKioqUlJSkhYuXKjRo0dr//79uv3227Vt2zZPd/OyevDBB3XixAm1bNnS010BjODj6Q4Atd0333yjbdu2ae3atXr44YeVkZGhlJQUT3dL0k9v/OXl5fL395efn5+nu3PBZs+erfT0dI0fP15z5syRzWZz7nviiSe0YsUK+fhcnf99lZWVqW7duvL29pa3t7enuwMYgzMswEXKyMhQgwYNdPfdd6tv377KyMi44GOzs7PVuXNn2e12RUZGatGiRZo+fbrLG7QknT59Wk899ZQiIyPl5+en8PBwTZ06VRUVFS71zqw9+fDDD9W5c2f5+/tr0aJFzn1n1rCkp6erX79+kqSePXvKZrPJZrMpOzvbpb2tW7cqJiZGdrtdERERWr58ucv+M+sstm7dqnHjxik4OFhBQUF6+OGHdfLkSR07dkxDhgxRgwYN1KBBA02cOFHn+4L4EydOKDU1VW3bttULL7xQZS6kn84+xMTEOB/v379f/fr1U8OGDVWnTh3dfPPN+tvf/lZlrm02m9566y3NmDFDzZo1U7169dS3b1+VlJSooqJC48ePV5MmTRQQEKDExMQq82uz2TRmzBhlZGTouuuuk91uV6dOnfT3v//dpV5+fr4effRRXXfddfL391ejRo3Ur1+/Kmezzszfli1b9Oijj6pJkyZq3ry5y75fHrN9+3bFx8ercePG8vf3V6tWrTR8+HCXNsvKyjRhwgSFhYXJz89P1113nV544YUq835mLOvXr1eHDh3k5+en9u3bKzMz85w/H8BTrs4/UYArKCMjQ3/4wx/k6+urgQMHasGCBfr888/VpUuXcx63a9cu3Xnnnbr22ms1Y8YMVVZWaubMmQoODq5S96GHHtKyZcvUt29fTZgwQZ999plSU1P15Zdfat26dS519+zZo4EDB+rhhx/WyJEjdd1111Vpr3v37ho3bpxefPFFTZ06Vddff70kOf+VpH379qlv374aMWKEhg4dqtdee03Dhg1Tp06d1L59e5f2xo4dq9DQUM2YMUOffvqpFi9erKCgIG3btk0tWrTQM888o/fff1/PP/+8OnTooCFDhpx1XrZu3aoffvhB48ePv6AzDEVFRbrlllv0448/aty4cWrUqJGWLVum++67T6tXr1bv3r1d6qempsrf31+TJ0/Wvn37lJaWpmuuuUZeXl46evSopk+frk8//VTp6elq1aqVkpOTXY7fsmWLVq1apXHjxsnPz08vv/yy7rzzTuXm5qpDhw6SpM8//1zbtm3TAw88oObNm+vAgQNasGCBbr31VuXl5alOnToubT766KMKDg5WcnKyysrK3I6zuLhYd9xxh4KDgzV58mQFBQXpwIEDWrt2rbOOZVm67777tHnzZo0YMULR0dH68MMP9fjjj6ugoEB//etfq8z12rVr9eijj6pevXp68cUX1adPHx08eFCNGjU679wDV5QFoMa2b99uSbI2btxoWZZlORwOq3nz5tZjjz1Wpa4kKyUlxfn43nvvterUqWMVFBQ4y/bu3Wv5+PhYv/zV3L17tyXJeuihh1za+8tf/mJJsjZt2uQsa9mypSXJyszMrPL8LVu2tIYOHep8/Pbbb1uSrM2bN7utK8n6+9//7iwrLi62/Pz8rAkTJjjLli5dakmy4uPjLYfD4Szv2rWrZbPZrEceecRZdvr0aat58+ZWjx49qjzfL82bN8+SZK1bt+6c9c4YP368Jcn65JNPnGXHjx+3WrVqZYWHh1uVlZWWZVnW5s2bLUlWhw4drJMnTzrrDhw40LLZbNZdd93l0m7Xrl2tli1bupRJsiRZ27dvd5bl5+dbdrvd6t27t7Psxx9/rNLPnJwcS5K1fPlyZ9mZ+fvtb39rnT592qX+mX3ffPONZVmWtW7dOkuS9fnnn591LtavX29Jsv7nf/7Hpbxv376WzWaz9u3b5zIWX19fl7J//OMfliQrLS3trM8BeAqXhICLkJGRoZCQEPXs2VPST6fZBwwYoJUrV6qysvKsx1VWVurjjz/W/fffr6ZNmzrLW7durbvuusul7vvvvy9JSkpKcimfMGGCJFW59NGqVSvFx8fXfFD/v3bt2ul3v/ud83FwcLCuu+467d+/v0rdESNGuFy6iY2NlWVZGjFihLPM29tbnTt3dnv8L5WWlkqS6tWrd0H9fP/99xUTE6Pf/va3zrKAgAD96U9/0oEDB5SXl+dSf8iQIbrmmmuq9PW/L63Exsbq0KFDOn36tEt5165d1alTJ+fjFi1aqFevXvrwww+dP3N/f3/n/lOnTun7779X69atFRQUpJ07d1YZw8iRI897NikoKEiS9N577+nUqVNu67z//vvy9vbWuHHjXMonTJggy7L0wQcfuJTHxcUpMjLS+bhjx44KDAw8788I8AQCC1BDlZWVWrlypXr27KlvvvlG+/bt0759+xQbG6uioiJlZWWd9dji4mKdOHFCrVu3rrLvv8vy8/Pl5eVVpTw0NFRBQUHKz893KW/VqtVFjOpnLVq0qFLWoEEDHT169Lx169evL0kKCwurUu7u+F8KDAyUJB0/fvyC+pmfn+/2steZy1v/PT/V6avD4VBJSYlLeZs2bao8129+8xv9+OOPOnLkiKSf1uEkJyc715E0btxYwcHBOnbsWJX2pAv7mfXo0UN9+vTRjBkz1LhxY/Xq1UtLly51WWeTn5+vpk2bVgl7FzoX0tl/xoCnEViAGtq0aZMOHz6slStXqk2bNs6tf//+klStxbcXwt3iU3d++df9xTjbX/yWm0WzZ6vrrtzd8b/Utm1bSdIXX3xxvi7WSHX6Kp2/v+6MHTtWTz/9tPr376+33npLH330kTZu3KhGjRrJ4XBUqX8hPzObzabVq1crJydHY8aMUUFBgYYPH65OnTrpP//5T7X7KF3aMQOXG4tugRrKyMhQkyZNNH/+/Cr71q5dq3Xr1mnhwoVu34yaNGkiu93u9p4t/13WsmVLORwO7d2712VRbFFRkY4dO1bj+3RcaAC60n7729+qQYMGevPNNzV16tTzXipp2bKl9uzZU6X8q6++cu6/lPbu3Vul7Ouvv1adOnWcC6ZXr16toUOHavbs2c465eXlOnbs2EU//80336ybb75ZTz/9tN544w0NGjRIK1eu1EMPPaSWLVvq448/1vHjx13OslyuuQCuJM6wADVw4sQJrV27Vvfcc4/69u1bZRszZoyOHz+uDRs2uD3e29tbcXFxWr9+vb799ltn+b59+6qsM0hISJAkzZ0716V8zpw5kqS77767RmOoW7euJF2SN9FLqU6dOpo0aZK+/PJLTZo0ye1f+6+//rpyc3Ml/TQ/ubm5ysnJce4vKyvT4sWLFR4ernbt2l3S/uXk5LisQzl06JDeeecd3XHHHc5w5e3tXaXfaWlp51zXdD5Hjx6t0mZ0dLQkOS8LJSQkqLKyUi+99JJLvb/+9a+y2WxV1kcBtQlnWIAa2LBhg44fP6777rvP7f6bb75ZwcHBysjI0IABA9zWmT59uj766CN169ZNo0aNcr7RdOjQQbt373bWi4qK0tChQ7V48WIdO3ZMPXr0UG5urpYtW6b777/fueC3uqKjo+Xt7a1Zs2appKREfn5+uu2229SkSZMatXcpPf744/rXv/6l2bNna/Pmzerbt69CQ0NVWFio9evXKzc313mn28mTJ+vNN9/UXXfdpXHjxqlhw4ZatmyZvvnmG61Zs0ZeXpf277IOHTooPj7e5WPNkjRjxgxnnXvuuUcrVqxQ/fr11a5dO+Xk5Ojjjz++qI8KL1u2TC+//LJ69+6tyMhIHT9+XK+88ooCAwOdofbee+9Vz5499cQTT+jAgQOKiorSRx99pHfeeUfjx493WWAL1DYEFqAGMjIyZLfb9fvf/97tfi8vL919993KyMjQ999/7/aNqlOnTvrggw/0l7/8RU8++aTCwsI0c+ZMffnll85T+Ge8+uqrioiIUHp6utatW6fQ0FBNmTLlou6oGxoaqoULFyo1NVUjRoxQZWWlNm/ebERg8fLy0vLly9WrVy8tXrxYL7zwgkpLSxUcHKzu3bvrueeeU9euXSVJISEh2rZtmyZNmqS0tDSVl5erY8eOevfdd2t89ulcevTooa5du2rGjBk6ePCg2rVrp/T0dHXs2NFZZ968efL29lZGRobKy8vVrVs3ffzxxxf16a0zQXXlypUqKipS/fr1FRMTo4yMDOeiXS8vL23YsEHJyclatWqVli5dqvDwcD3//PPOT5UBtZXNYnUVYJT7779f//rXv9yulYBn2Ww2jR49usolFwCXH2tYAA86ceKEy+O9e/fq/fff16233uqZDgGAobgkBHhQRESEhg0bpoiICOXn52vBggXy9fXVxIkTPd01ADAKgQXwoDvvvFNvvvmmCgsL5efnp65du+qZZ55xe3MyAPg1Yw0LAAAwHmtYAACA8QgsAADAeFfNGhaHw6Fvv/1W9erVM/aW4wAAwJVlWTp+/LiaNm16zhs9XjWB5dtvv63ybasAAKB2OHTokJo3b37W/VdNYDnzRV+HDh1yfj09AAAwW2lpqcLCwly+sNOdqyawnLkMFBgYSGABAKCWOd9yDhbdAgAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYz8fTHQAA4Ndghs3m6S5clBTL8ujzc4YFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAeN467ANzsBwAAz6rRGZb58+crPDxcdrtdsbGxys3NPWvdU6dOaebMmYqMjJTdbldUVJQyMzNd6lRWVurJJ59Uq1at5O/vr8jISD311FOyeKMFAACqQWBZtWqVkpKSlJKSop07dyoqKkrx8fEqLi52W3/atGlatGiR0tLSlJeXp0ceeUS9e/fWrl27nHVmzZqlBQsW6KWXXtKXX36pWbNm6bnnnlNaWlrNRwYAAK4aNquapzFiY2PVpUsXvfTSS5Ikh8OhsLAwjR07VpMnT65Sv2nTpnriiSc0evRoZ1mfPn3k7++v119/XZJ0zz33KCQkREuWLDlrnfMpLS1V/fr1VVJSosDAwOoM6by4JAQAuFi8l7h3oe/f1TrDcvLkSe3YsUNxcXE/N+Dlpbi4OOXk5Lg9pqKiQna73aXM399fW7dudT6+5ZZblJWVpa+//lqS9I9//ENbt27VXXfddda+VFRUqLS01GUDAABXp2otuv3uu+9UWVmpkJAQl/KQkBB99dVXbo+Jj4/XnDlz1L17d0VGRiorK0tr165VZWWls87kyZNVWlqqtm3bytvbW5WVlXr66ac1aNCgs/YlNTVVM2bMqE73AQBALXXZP9Y8b948tWnTRm3btpWvr6/GjBmjxMREeXn9/NRvvfWWMjIy9MYbb2jnzp1atmyZXnjhBS1btuys7U6ZMkUlJSXO7dChQ5d7KAAAwEOqdYalcePG8vb2VlFRkUt5UVGRQkND3R4THBys9evXq7y8XN9//72aNm2qyZMnKyIiwlnn8ccf1+TJk/XAAw9Ikm644Qbl5+crNTVVQ4cOdduun5+f/Pz8qtN9AABQS1XrDIuvr686deqkrKwsZ5nD4VBWVpa6du16zmPtdruaNWum06dPa82aNerVq5dz348//uhyxkWSvL295XA4qtM9AABwlar2jeOSkpI0dOhQde7cWTExMZo7d67KysqUmJgoSRoyZIiaNWum1NRUSdJnn32mgoICRUdHq6CgQNOnT5fD4dDEiROdbd577716+umn1aJFC7Vv3167du3SnDlzNHz48Es0TAAAUJtVO7AMGDBAR44cUXJysgoLCxUdHa3MzEznQtyDBw+6nC0pLy/XtGnTtH//fgUEBCghIUErVqxQUFCQs05aWpqefPJJPfrooyouLlbTpk318MMPKzk5+eJHCAAAar1q34fFVNyH5ey4DwsAeB7vJe5dlvuwAAAAeAKBBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYz8fTHQBwfjNsNk934aKkWJanuwCgluMMCwAAMB6BBQAAGI/AAgAAjEdgAQAAxqtRYJk/f77Cw8Nlt9sVGxur3Nzcs9Y9deqUZs6cqcjISNntdkVFRSkzM7NKvYKCAg0ePFiNGjWSv7+/brjhBm3fvr0m3QMAAFeZageWVatWKSkpSSkpKdq5c6eioqIUHx+v4uJit/WnTZumRYsWKS0tTXl5eXrkkUfUu3dv7dq1y1nn6NGj6tatm6655hp98MEHysvL0+zZs9WgQYOajwwAAFw1bJZVvc8bxsbGqkuXLnrppZckSQ6HQ2FhYRo7dqwmT55cpX7Tpk31xBNPaPTo0c6yPn36yN/fX6+//rokafLkyfrf//1fffLJJzUeSGlpqerXr6+SkhIFBgbWuB13+EgpPI3XIFD78Xvs3oW+f1frDMvJkye1Y8cOxcXF/dyAl5fi4uKUk5Pj9piKigrZ7XaXMn9/f23dutX5eMOGDercubP69eunJk2a6MYbb9Qrr7xyzr5UVFSotLTUZQMAAFenagWW7777TpWVlQoJCXEpDwkJUWFhodtj4uPjNWfOHO3du1cOh0MbN27U2rVrdfjwYWed/fv3a8GCBWrTpo0+/PBDjRo1SuPGjdOyZcvO2pfU1FTVr1/fuYWFhVVnKAAAoBa57J8Smjdvntq0aaO2bdvK19dXY8aMUWJiory8fn5qh8Ohm266Sc8884xuvPFG/elPf9LIkSO1cOHCs7Y7ZcoUlZSUOLdDhw5d7qEAAAAPqVZgady4sby9vVVUVORSXlRUpNDQULfHBAcHa/369SorK1N+fr6++uorBQQEKCIiwlnn2muvVbt27VyOu/7663Xw4MGz9sXPz0+BgYEuGwAAuDpVK7D4+vqqU6dOysrKcpY5HA5lZWWpa9eu5zzWbrerWbNmOn36tNasWaNevXo593Xr1k179uxxqf/111+rZcuW1ekeAAC4SlX7yw+TkpI0dOhQde7cWTExMZo7d67KysqUmJgoSRoyZIiaNWum1NRUSdJnn32mgoICRUdHq6CgQNOnT5fD4dDEiROdbf75z3/WLbfcomeeeUb9+/dXbm6uFi9erMWLF1+iYQIAgNqs2oFlwIABOnLkiJKTk1VYWKjo6GhlZmY6F+IePHjQZX1KeXm5pk2bpv379ysgIEAJCQlasWKFgoKCnHW6dOmidevWacqUKZo5c6ZatWqluXPnatCgQRc/QgAAUOtV+z4spuI+LGfHPTBqP16DQO3H77F7l+U+LAAAAJ5AYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4Pp7uAADAfDNsNk934aKlWJanu4CLQGDBFVHb/7PjPzoA8CwuCQEAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADj1SiwzJ8/X+Hh4bLb7YqNjVVubu5Z6546dUozZ85UZGSk7Ha7oqKilJmZedb6zz77rGw2m8aPH1+TrgEAgKtQtQPLqlWrlJSUpJSUFO3cuVNRUVGKj49XcXGx2/rTpk3TokWLlJaWpry8PD3yyCPq3bu3du3aVaXu559/rkWLFqljx47VHwkAALhqVTuwzJkzRyNHjlRiYqLatWunhQsXqk6dOnrttdfc1l+xYoWmTp2qhIQERUREaNSoUUpISNDs2bNd6v3nP//RoEGD9Morr6hBgwY1Gw0AALgqVSuwnDx5Ujt27FBcXNzPDXh5KS4uTjk5OW6PqaiokN1udynz9/fX1q1bXcpGjx6tu+++26Xtc6moqFBpaanLBgAArk7VCizfffedKisrFRIS4lIeEhKiwsJCt8fEx8drzpw52rt3rxwOhzZu3Ki1a9fq8OHDzjorV67Uzp07lZqaesF9SU1NVf369Z1bWFhYdYYCAABqkcv+KaF58+apTZs2atu2rXx9fTVmzBglJibKy+unpz506JAee+wxZWRkVDkTcy5TpkxRSUmJczt06NDlGgIAAPCwagWWxo0by9vbW0VFRS7lRUVFCg0NdXtMcHCw1q9fr7KyMuXn5+urr75SQECAIiIiJEk7duxQcXGxbrrpJvn4+MjHx0dbtmzRiy++KB8fH1VWVrpt18/PT4GBgS4bAAC4OlUrsPj6+qpTp07KyspyljkcDmVlZalr167nPNZut6tZs2Y6ffq01qxZo169ekmSbr/9dn3xxRfavXu3c+vcubMGDRqk3bt3y9vbuwbDAgAAVxOf6h6QlJSkoUOHqnPnzoqJidHcuXNVVlamxMRESdKQIUPUrFkz53qUzz77TAUFBYqOjlZBQYGmT58uh8OhiRMnSpLq1aunDh06uDxH3bp11ahRoyrlAADg16nagWXAgAE6cuSIkpOTVVhYqOjoaGVmZjoX4h48eNC5PkWSysvLNW3aNO3fv18BAQFKSEjQihUrFBQUdMkGAQAArm7VDiySNGbMGI0ZM8btvuzsbJfHPXr0UF5eXrXa/+82AADArxvfJQQAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIzn4+kOAMCVMMNm83QXLkqKZXm6C4BHcYYFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHg1Cizz589XeHi47Ha7YmNjlZube9a6p06d0syZMxUZGSm73a6oqChlZma61ElNTVWXLl1Ur149NWnSRPfff7/27NlTk64BAICrULUDy6pVq5SUlKSUlBTt3LlTUVFRio+PV3Fxsdv606ZN06JFi5SWlqa8vDw98sgj6t27t3bt2uWss2XLFo0ePVqffvqpNm7cqFOnTumOO+5QWVlZzUcGAACuGtUOLHPmzNHIkSOVmJiodu3aaeHChapTp45ee+01t/VXrFihqVOnKiEhQRERERo1apQSEhI0e/ZsZ53MzEwNGzZM7du3V1RUlNLT03Xw4EHt2LGj5iMDAABXjWoFlpMnT2rHjh2Ki4v7uQEvL8XFxSknJ8ftMRUVFbLb7S5l/v7+2rp161mfp6SkRJLUsGHDs9apqKhQaWmpywYAAK5O1Qos3333nSorKxUSEuJSHhISosLCQrfHxMfHa86cOdq7d68cDoc2btyotWvX6vDhw27rOxwOjR8/Xt26dVOHDh3O2pfU1FTVr1/fuYWFhVVnKAAAoBa57J8Smjdvntq0aaO2bdvK19dXY8aMUWJiory83D/16NGj9c9//lMrV648Z7tTpkxRSUmJczt06NDl6D4AADBAtQJL48aN5e3traKiIpfyoqIihYaGuj0mODhY69evV1lZmfLz8/XVV18pICBAERERVeqOGTNG7733njZv3qzmzZufsy9+fn4KDAx02QAAwNWpWoHF19dXnTp1UlZWlrPM4XAoKytLXbt2PeexdrtdzZo10+nTp7VmzRr16tXLuc+yLI0ZM0br1q3Tpk2b1KpVq2oOAwAAXM18qntAUlKShg4dqs6dOysmJkZz585VWVmZEhMTJUlDhgxRs2bNlJqaKkn67LPPVFBQoOjoaBUUFGj69OlyOByaOHGis83Ro0frjTfe0DvvvKN69eo518PUr19f/v7+l2KcAACgFqt2YBkwYICOHDmi5ORkFRYWKjo6WpmZmc6FuAcPHnRZn1JeXq5p06Zp//79CggIUEJCglasWKGgoCBnnQULFkiSbr31VpfnWrp0qYYNG1b9UQEAgKtKtQOL9NNakzFjxrjdl52d7fK4R48eysvLO2d7lmXVpBsAAOBXgu8SAgAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAY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9NtJ3nzzTUVGRioqKkqSFB0drZYtW2rVqlUu9erVq6fdu3dr+/btmj17tm666Sa366t+zc73uvvkk0+0e/du7d69W6+++qqeeeYZLViw4Ar30rP69Omjb7/9Vhs2bNCdd96p7Oxs3XTTTc6F2QMHDlRlZaXeeustSdKqVavk5eV11nVQw4cP19KlS7VlyxaVlZUpISHhSg3lkiGwGKJx48Zq3bq1fve73+ntt9/WuHHjlJeX5+lu1Rrff/+9jhw5olatWkmSPvzwQxUUFGjAgAHy8fGRj4+PHnjgAeXn5/8qFu81a9ZM2dnZKigo0J133qnjx4+7rde9e3fFx8drypQp52zPx8dHTz/9tObNm6dvv/32cnTZY9q0aSObzaavvvrqnPWWLFmif/3rX87Xk4+Pj/Ly8qqclvfy8lLr1q11/fXXKykpSTfffLNGjRp1OYdQ65zvddeqVSu1bt1a7du3V2Jioh588MFfZeiz2+36/e9/ryeffFLbtm3TsGHDnGemAgMD1bdvX+dZ46VLl6p///4KCAhw29agQYP06aefavr06XrwwQfl41Pt7z72OAKLgcLCwjRgwIDzvongZ/PmzZOXl5fz47xLlizRAw884Pwr7cz2wAMP/GoW37Zs2VJbtmxRYWHhOUPLs88+q3fffbfKpwj+W79+/dS+fXvNmDHjcnTXY85cLpw/f77Kysqq7D927Ji++OILbd++XdnZ2S6vp+zsbOXk5Jwz7EyePFmrVq36VS0avRAX+rqTflr7cuLEiSvQK7O1a9fO5TU6YsQIbd26Ve+99562bdvmstj2vzVs2FD33XeftmzZUisvB0lS7YtYtVhJSYl2797tUtaoUSO3dR977DF16NBB27dvV+fOna9A78xyrrk6fvy4CgsLderUKX3zzTd6/fXX9eqrryo1NVWtW7fWkSNH9O6772rDhg3q0KGDSxtDhgxR79699cMPP6hhw4ZXajgeExYWpuzsbPXs2VPx8fHKzMysUueGG27QoEGD9OKLL563vWeffVbx8fGXo6seNX/+fHXr1k0xMTGaOXOmOnbsqNOnT2vjxo1asGCB4uPjFRMT43YdRZcuXbRkyRK392WRfvoZ9O7dW8nJyXrvvfcu91BqjXO97oqLi1VeXq6Kigrl5uZqxYoV6tu3rwd66Rnff/+9+vXrp+HDh6tjx46qV6+etm/frueee069evVy1uvevbtat26tIUOGqG3btrrlllvO2W56erpefvnls77vmI4zLFdQdna2brzxRpftbH+ttmvXTnfccYeSk5OvcC/NcK65Sk5O1rXXXqvWrVvrwQcfVElJibKysjRp0iRJ0vLly1W3bl23i01vv/12+fv76/XXX7+i4/Gk5s2bKzs7W999953i4+NVWlpapc7MmTMvaG3Pbbfdpttuu02nT5++HF31mIiICO3cuVM9e/bUhAkT1KFDB/3+979XVlaW5s2bp9dff119+vRxe2yfPn20fPlynTp16qzt//nPf9bf/vY35ebmXq4h1Epne91dd911zt/xSZMm6eGHH75qP6XmTkBAgHMtY/fu3dWhQwc9+eSTGjlypF566SVnPZvNpuHDh+vo0aMXdNbE39+/1oYVSbJZF7riDAAAwEM4wwIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4/1/oh9MC2piR+sAAAAASUVORK5CYII=\n"
|
|
},
|
|
"metadata": {}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |