Skip to content
Permalink
bd208cefbd
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
1583 lines (1583 sloc) 65 KB
{
"cells": [
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"'''numpy'''\n",
"import numpy as np\n",
"\n",
"'''pandas'''\n",
"import pandas as pd \n",
"\n",
"'''time'''\n",
"import time\n",
"\n",
"'''seaborn'''\n",
"import seaborn as sn\n",
"\n",
"'''sklearn'''\n",
"from sklearn import neighbors, metrics \n",
"from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV, RandomizedSearchCV, RepeatedStratifiedKFold\n",
"from sklearn.preprocessing import LabelEncoder, StandardScaler\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.metrics import classification_report, confusion_matrix\n",
"from sklearn.impute import SimpleImputer\n",
"\n",
"'''matplotlib'''\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Report ID Arrest Date Time Area ID Area Name \\\n",
"0 5666847 2019-06-22T00:00:00.000 1630.0 14 Pacific \n",
"1 5666688 2019-06-22T00:00:00.000 1010.0 10 West Valley \n",
"2 5666570 2019-06-22T00:00:00.000 400.0 15 N Hollywood \n",
"3 5666529 2019-06-22T00:00:00.000 302.0 17 Devonshire \n",
"4 5666742 2019-06-22T00:00:00.000 1240.0 14 Pacific \n",
"... ... ... ... ... ... \n",
"1276155 100504416 2010-01-01T00:00:00.000 1430.0 5 Harbor \n",
"1276156 101104731 2010-01-01T00:00:00.000 2215.0 11 Northeast \n",
"1276157 101104211 2010-01-01T00:00:00.000 1310.0 11 Northeast \n",
"1276158 2179817 2010-01-01T00:00:00.000 319.0 14 Pacific \n",
"1276159 2180332 2010-01-01T00:00:00.000 1815.0 19 Mission \n",
"\n",
" Reporting District Age Sex Code Descent Code Charge Group Code \\\n",
"0 1457 44 M W 24.0 \n",
"1 1061 8 M O NaN \n",
"2 1543 31 F O 22.0 \n",
"3 1738 23 F W 22.0 \n",
"4 1472 28 M W 8.0 \n",
"... ... ... ... ... ... \n",
"1276155 521 17 M H 24.0 \n",
"1276156 1118 12 M H 24.0 \n",
"1276157 1128 52 M H 18.0 \n",
"1276158 1408 24 M H 22.0 \n",
"1276159 1994 25 M W 16.0 \n",
"\n",
" ... Charge Description \\\n",
"0 ... VANDALISM \n",
"1 ... NaN \n",
"2 ... DRUNK DRIVING ALCOHOL/DRUGS \n",
"3 ... DRUNK DRIVING ALCOHOL/DRUGS \n",
"4 ... OBSTRUCT/RESIST EXECUTIVE OFFICER \n",
"... ... ... \n",
"1276155 ... MINOR BUY/ETC TOBACCO/ETC \n",
"1276156 ... CURFEW - JUV ONLY \n",
"1276157 ... DRINKING IN PUBLIC \n",
"1276158 ... DRUNK DRIVING ALCOHOL/DRUGS \n",
"1276159 ... POSSESSION CONTROLLED SUBSTANCE \n",
"\n",
" Address \\\n",
"0 12300 CULVER BL \n",
"1 19000 VANOWEN ST \n",
"2 MAGNOLIA AV \n",
"3 HAYVENHURST ST \n",
"4 6600 ESPLANADE ST \n",
"... ... \n",
"1276155 4TH \n",
"1276156 AVENUE 58 \n",
"1276157 YORK BL \n",
"1276158 NATIONAL BL \n",
"1276159 ROSCOE \n",
"\n",
" Cross Street \\\n",
"0 NaN \n",
"1 NaN \n",
"2 LAUREL CANYON BL \n",
"3 N REGAN FY \n",
"4 NaN \n",
"... ... \n",
"1276155 GAFFEY \n",
"1276156 FIGUEROA ST \n",
"1276157 AVENUE 63 \n",
"1276158 MANNING AV \n",
"1276159 WILLIS \n",
"\n",
" Location Zip Codes \\\n",
"0 {'latitude': '33.992', 'human_address': '{\"add... 24031.0 \n",
"1 {'latitude': '34.1687', 'human_address': '{\"ad... 19339.0 \n",
"2 {'latitude': '34.1649', 'human_address': '{\"ad... 8890.0 \n",
"3 {'latitude': '34.2692', 'human_address': '{\"ad... 19329.0 \n",
"4 {'latitude': '33.9609', 'human_address': '{\"ad... 25075.0 \n",
"... ... ... \n",
"1276155 {'latitude': '33.7406', 'human_address': '{\"ad... 3342.0 \n",
"1276156 {'latitude': '34.1101', 'human_address': '{\"ad... 23673.0 \n",
"1276157 {'latitude': '34.1148', 'human_address': '{\"ad... 23673.0 \n",
"1276158 {'latitude': '34.0301', 'human_address': '{\"ad... 23451.0 \n",
"1276159 {'latitude': '34.2215', 'human_address': '{\"ad... 19730.0 \n",
"\n",
" Census Tracts Precinct Boundaries LA Specific Plans \\\n",
"0 918.0 1137.0 10.0 \n",
"1 321.0 1494.0 NaN \n",
"2 205.0 1332.0 17.0 \n",
"3 69.0 388.0 NaN \n",
"4 937.0 241.0 10.0 \n",
"... ... ... ... \n",
"1276155 975.0 1205.0 NaN \n",
"1276156 370.0 477.0 28.0 \n",
"1276157 359.0 575.0 NaN \n",
"1276158 872.0 1124.0 9.0 \n",
"1276159 147.0 418.0 NaN \n",
"\n",
" Council Districts Neighborhood Councils (Certified) \n",
"0 10.0 85.0 \n",
"1 4.0 10.0 \n",
"2 5.0 39.0 \n",
"3 2.0 78.0 \n",
"4 10.0 16.0 \n",
"... ... ... \n",
"1276155 15.0 36.0 \n",
"1276156 11.0 93.0 \n",
"1276157 9.0 93.0 \n",
"1276158 6.0 75.0 \n",
"1276159 3.0 59.0 \n",
"\n",
"[1276160 rows x 23 columns]\n"
]
}
],
"source": [
"'''Read and display data'''\n",
"data = pd.read_csv(\"Datasets/LA Crime Data/arrest-data-from-2010-to-present.csv\") #Load in the arrest data\n",
"print(data) #Display the data"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {},
"outputs": [],
"source": [
"'''Assigning attributes to use'''\n",
"data = data.head(n=100000)\n",
"\n",
"selectedData = data[[ #Here I am assigning all the values to see if any make a signifciant difference\n",
" 'Sex Code',\n",
" 'Descent Code',\n",
" 'Charge Description'\n",
"]].values"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Sex Code Decent Code Charge Description\n",
"0 M W VANDALISM\n",
"2 F O DRUNK DRIVING ALCOHOL/DRUGS\n",
"3 F W DRUNK DRIVING ALCOHOL/DRUGS\n",
"4 M W OBSTRUCT/RESIST EXECUTIVE OFFICER\n",
"5 M H PARENT IN CUSTODY, NO CARETAKER AVAILABLE\n",
".. ... ... ...\n",
"994 M H PAROLE WARRANT\n",
"995 M H WARRANT-PETITION TO REVOKE COMMUNITY SUPVN\n",
"996 M B DRINKING IN PUBLIC\n",
"998 M H BURGLARY\n",
"999 F H CORPORAL INJURY ON SPOUSE/COHABITANT/ETC\n",
"\n",
"[938 rows x 3 columns]\n"
]
}
],
"source": [
"selectedData = pd.DataFrame(selectedData, columns = ['Sex Code','Decent Code','Charge Description'])\n",
"selectedData = selectedData.dropna()\n",
"print(selectedData)\n"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(938, 1) (938, 1)\n"
]
}
],
"source": [
"X = selectedData[[ #Here I am assigning all the values to see if any make a signifciant difference\n",
" #'Sex Code',\n",
" 'Charge Description'\n",
"]].values\n",
"\n",
"\n",
"#Set the class\n",
"y = selectedData[[\n",
" 'Decent Code'\n",
"]]\n",
"\n",
"#X = selectedData.to_numpy()\n",
"\n",
"print(X.shape, y.shape)\n",
"\n",
"y = np.ravel(y)"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'A', 'B', 'F', 'O', 'W', 'H'}\n",
"[[186]\n",
" [56]\n",
" [56]\n",
" [115]\n",
" [122]\n",
" [135]\n",
" [56]\n",
" [111]\n",
" [56]\n",
" [112]\n",
" [49]\n",
" [56]\n",
" [149]\n",
" [143]\n",
" [4]\n",
" [182]\n",
" [103]\n",
" [77]\n",
" [39]\n",
" [146]\n",
" [56]\n",
" [56]\n",
" [56]\n",
" [182]\n",
" [122]\n",
" [143]\n",
" [48]\n",
" [165]\n",
" [20]\n",
" [183]\n",
" [56]\n",
" [142]\n",
" [175]\n",
" [165]\n",
" [58]\n",
" [140]\n",
" [56]\n",
" [185]\n",
" [103]\n",
" [56]\n",
" [56]\n",
" [169]\n",
" [59]\n",
" [132]\n",
" [56]\n",
" [59]\n",
" [151]\n",
" [165]\n",
" [139]\n",
" [59]\n",
" [95]\n",
" [84]\n",
" [192]\n",
" [165]\n",
" [120]\n",
" [20]\n",
" [151]\n",
" [48]\n",
" [56]\n",
" [91]\n",
" [56]\n",
" [165]\n",
" [105]\n",
" [59]\n",
" [143]\n",
" [151]\n",
" [56]\n",
" [142]\n",
" [55]\n",
" [163]\n",
" [143]\n",
" [143]\n",
" [37]\n",
" [151]\n",
" [80]\n",
" [17]\n",
" [59]\n",
" [165]\n",
" [123]\n",
" [119]\n",
" [189]\n",
" [51]\n",
" [102]\n",
" [165]\n",
" [56]\n",
" [70]\n",
" [59]\n",
" [56]\n",
" [123]\n",
" [18]\n",
" [20]\n",
" [20]\n",
" [16]\n",
" [56]\n",
" [143]\n",
" [158]\n",
" [142]\n",
" [103]\n",
" [56]\n",
" [56]\n",
" [17]\n",
" [59]\n",
" [50]\n",
" [158]\n",
" [18]\n",
" [59]\n",
" [56]\n",
" [107]\n",
" [159]\n",
" [35]\n",
" [183]\n",
" [34]\n",
" [143]\n",
" [59]\n",
" [143]\n",
" [58]\n",
" [17]\n",
" [105]\n",
" [171]\n",
" [58]\n",
" [20]\n",
" [143]\n",
" [189]\n",
" [56]\n",
" [185]\n",
" [143]\n",
" [56]\n",
" [7]\n",
" [91]\n",
" [165]\n",
" [56]\n",
" [56]\n",
" [161]\n",
" [56]\n",
" [143]\n",
" [21]\n",
" [139]\n",
" [56]\n",
" [151]\n",
" [78]\n",
" [143]\n",
" [59]\n",
" [188]\n",
" [56]\n",
" [147]\n",
" [56]\n",
" [139]\n",
" [165]\n",
" [48]\n",
" [84]\n",
" [56]\n",
" [56]\n",
" [151]\n",
" [56]\n",
" [139]\n",
" [165]\n",
" [55]\n",
" [123]\n",
" [58]\n",
" [56]\n",
" [151]\n",
" [140]\n",
" [59]\n",
" [17]\n",
" [143]\n",
" [175]\n",
" [62]\n",
" [98]\n",
" [56]\n",
" [132]\n",
" [131]\n",
" [139]\n",
" [111]\n",
" [146]\n",
" [36]\n",
" [136]\n",
" [192]\n",
" [178]\n",
" [15]\n",
" [143]\n",
" [151]\n",
" [192]\n",
" [137]\n",
" [101]\n",
" [117]\n",
" [151]\n",
" [142]\n",
" [151]\n",
" [167]\n",
" [25]\n",
" [114]\n",
" [59]\n",
" [114]\n",
" [131]\n",
" [56]\n",
" [77]\n",
" [166]\n",
" [13]\n",
" [180]\n",
" [191]\n",
" [17]\n",
" [20]\n",
" [151]\n",
" [146]\n",
" [126]\n",
" [154]\n",
" [46]\n",
" [56]\n",
" [34]\n",
" [36]\n",
" [50]\n",
" [146]\n",
" [169]\n",
" [94]\n",
" [186]\n",
" [45]\n",
" [154]\n",
" [44]\n",
" [130]\n",
" [55]\n",
" [103]\n",
" [123]\n",
" [116]\n",
" [56]\n",
" [55]\n",
" [13]\n",
" [34]\n",
" [6]\n",
" [159]\n",
" [143]\n",
" [6]\n",
" [6]\n",
" [138]\n",
" [178]\n",
" [142]\n",
" [143]\n",
" [192]\n",
" [86]\n",
" [144]\n",
" [37]\n",
" [58]\n",
" [6]\n",
" [42]\n",
" [159]\n",
" [74]\n",
" [191]\n",
" [25]\n",
" [84]\n",
" [142]\n",
" [50]\n",
" [143]\n",
" [56]\n",
" [126]\n",
" [28]\n",
" [84]\n",
" [101]\n",
" [141]\n",
" [71]\n",
" [126]\n",
" [5]\n",
" [165]\n",
" [91]\n",
" [28]\n",
" [45]\n",
" [17]\n",
" [143]\n",
" [182]\n",
" [192]\n",
" [65]\n",
" [143]\n",
" [35]\n",
" [56]\n",
" [56]\n",
" [178]\n",
" [131]\n",
" [169]\n",
" [114]\n",
" [55]\n",
" [178]\n",
" [30]\n",
" [105]\n",
" [152]\n",
" [131]\n",
" [17]\n",
" [126]\n",
" [43]\n",
" [10]\n",
" [192]\n",
" [132]\n",
" [56]\n",
" [143]\n",
" [6]\n",
" [61]\n",
" [175]\n",
" [123]\n",
" [51]\n",
" [84]\n",
" [73]\n",
" [86]\n",
" [192]\n",
" [18]\n",
" [123]\n",
" [36]\n",
" [178]\n",
" [186]\n",
" [191]\n",
" [186]\n",
" [142]\n",
" [123]\n",
" [100]\n",
" [159]\n",
" [123]\n",
" [56]\n",
" [178]\n",
" [124]\n",
" [94]\n",
" [34]\n",
" [186]\n",
" [70]\n",
" [191]\n",
" [34]\n",
" [20]\n",
" [191]\n",
" [156]\n",
" [192]\n",
" [165]\n",
" [23]\n",
" [84]\n",
" [96]\n",
" [20]\n",
" [12]\n",
" [141]\n",
" [165]\n",
" [192]\n",
" [55]\n",
" [103]\n",
" [130]\n",
" [131]\n",
" [165]\n",
" [178]\n",
" [169]\n",
" [20]\n",
" [77]\n",
" [191]\n",
" [139]\n",
" [51]\n",
" [186]\n",
" [188]\n",
" [34]\n",
" [165]\n",
" [123]\n",
" [25]\n",
" [149]\n",
" [89]\n",
" [114]\n",
" [45]\n",
" [46]\n",
" [164]\n",
" [171]\n",
" [143]\n",
" [56]\n",
" [59]\n",
" [10]\n",
" [2]\n",
" [18]\n",
" [143]\n",
" [11]\n",
" [56]\n",
" [103]\n",
" [143]\n",
" [58]\n",
" [47]\n",
" [115]\n",
" [192]\n",
" [22]\n",
" [34]\n",
" [20]\n",
" [162]\n",
" [90]\n",
" [36]\n",
" [187]\n",
" [144]\n",
" [143]\n",
" [25]\n",
" [46]\n",
" [20]\n",
" [15]\n",
" [56]\n",
" [99]\n",
" [143]\n",
" [104]\n",
" [175]\n",
" [46]\n",
" [175]\n",
" [123]\n",
" [77]\n",
" [33]\n",
" [79]\n",
" [46]\n",
" [6]\n",
" [58]\n",
" [154]\n",
" [60]\n",
" [159]\n",
" [151]\n",
" [36]\n",
" [137]\n",
" [56]\n",
" [56]\n",
" [101]\n",
" [56]\n",
" [183]\n",
" [17]\n",
" [110]\n",
" [155]\n",
" [6]\n",
" [165]\n",
" [17]\n",
" [19]\n",
" [126]\n",
" [46]\n",
" [34]\n",
" [6]\n",
" [118]\n",
" [20]\n",
" [132]\n",
" [37]\n",
" [180]\n",
" [124]\n",
" [18]\n",
" [155]\n",
" [51]\n",
" [6]\n",
" [186]\n",
" [165]\n",
" [85]\n",
" [53]\n",
" [72]\n",
" [34]\n",
" [34]\n",
" [35]\n",
" [77]\n",
" [47]\n",
" [56]\n",
" [103]\n",
" [85]\n",
" [50]\n",
" [143]\n",
" [24]\n",
" [46]\n",
" [79]\n",
" [118]\n",
" [17]\n",
" [145]\n",
" [192]\n",
" [46]\n",
" [64]\n",
" [143]\n",
" [192]\n",
" [25]\n",
" [25]\n",
" [56]\n",
" [6]\n",
" [34]\n",
" [19]\n",
" [25]\n",
" [59]\n",
" [36]\n",
" [77]\n",
" [50]\n",
" [137]\n",
" [79]\n",
" [191]\n",
" [34]\n",
" [158]\n",
" [173]\n",
" [150]\n",
" [6]\n",
" [159]\n",
" [34]\n",
" [17]\n",
" [29]\n",
" [57]\n",
" [143]\n",
" [20]\n",
" [191]\n",
" [177]\n",
" [77]\n",
" [17]\n",
" [171]\n",
" [31]\n",
" [42]\n",
" [17]\n",
" [86]\n",
" [190]\n",
" [85]\n",
" [171]\n",
" [193]\n",
" [56]\n",
" [46]\n",
" [36]\n",
" [171]\n",
" [20]\n",
" [6]\n",
" [50]\n",
" [6]\n",
" [20]\n",
" [36]\n",
" [159]\n",
" [180]\n",
" [14]\n",
" [32]\n",
" [85]\n",
" [114]\n",
" [7]\n",
" [25]\n",
" [171]\n",
" [187]\n",
" [55]\n",
" [143]\n",
" [55]\n",
" [34]\n",
" [41]\n",
" [171]\n",
" [25]\n",
" [55]\n",
" [159]\n",
" [171]\n",
" [146]\n",
" [85]\n",
" [20]\n",
" [123]\n",
" [34]\n",
" [143]\n",
" [169]\n",
" [171]\n",
" [34]\n",
" [6]\n",
" [192]\n",
" [182]\n",
" [159]\n",
" [131]\n",
" [10]\n",
" [56]\n",
" [97]\n",
" [46]\n",
" [143]\n",
" [131]\n",
" [179]\n",
" [142]\n",
" [128]\n",
" [176]\n",
" [17]\n",
" [56]\n",
" [56]\n",
" [57]\n",
" [86]\n",
" [6]\n",
" [56]\n",
" [158]\n",
" [114]\n",
" [69]\n",
" [56]\n",
" [56]\n",
" [144]\n",
" [46]\n",
" [174]\n",
" [10]\n",
" [143]\n",
" [56]\n",
" [109]\n",
" [34]\n",
" [149]\n",
" [51]\n",
" [123]\n",
" [134]\n",
" [191]\n",
" [55]\n",
" [52]\n",
" [8]\n",
" [151]\n",
" [159]\n",
" [129]\n",
" [6]\n",
" [46]\n",
" [50]\n",
" [22]\n",
" [115]\n",
" [146]\n",
" [144]\n",
" [77]\n",
" [56]\n",
" [85]\n",
" [190]\n",
" [165]\n",
" [143]\n",
" [143]\n",
" [158]\n",
" [34]\n",
" [6]\n",
" [157]\n",
" [136]\n",
" [25]\n",
" [143]\n",
" [56]\n",
" [123]\n",
" [6]\n",
" [20]\n",
" [29]\n",
" [56]\n",
" [143]\n",
" [10]\n",
" [192]\n",
" [36]\n",
" [165]\n",
" [37]\n",
" [51]\n",
" [192]\n",
" [159]\n",
" [135]\n",
" [59]\n",
" [34]\n",
" [29]\n",
" [34]\n",
" [83]\n",
" [56]\n",
" [95]\n",
" [172]\n",
" [184]\n",
" [159]\n",
" [34]\n",
" [25]\n",
" [87]\n",
" [140]\n",
" [35]\n",
" [166]\n",
" [151]\n",
" [137]\n",
" [94]\n",
" [191]\n",
" [126]\n",
" [146]\n",
" [15]\n",
" [56]\n",
" [175]\n",
" [86]\n",
" [6]\n",
" [143]\n",
" [113]\n",
" [24]\n",
" [6]\n",
" [131]\n",
" [143]\n",
" [50]\n",
" [41]\n",
" [126]\n",
" [153]\n",
" [112]\n",
" [45]\n",
" [144]\n",
" [36]\n",
" [77]\n",
" [165]\n",
" [46]\n",
" [159]\n",
" [25]\n",
" [169]\n",
" [41]\n",
" [183]\n",
" [41]\n",
" [153]\n",
" [88]\n",
" [171]\n",
" [155]\n",
" [123]\n",
" [143]\n",
" [176]\n",
" [165]\n",
" [20]\n",
" [57]\n",
" [86]\n",
" [56]\n",
" [5]\n",
" [115]\n",
" [181]\n",
" [56]\n",
" [143]\n",
" [56]\n",
" [165]\n",
" [56]\n",
" [85]\n",
" [131]\n",
" [86]\n",
" [6]\n",
" [75]\n",
" [95]\n",
" [126]\n",
" [151]\n",
" [148]\n",
" [142]\n",
" [176]\n",
" [58]\n",
" [143]\n",
" [76]\n",
" [142]\n",
" [40]\n",
" [6]\n",
" [160]\n",
" [3]\n",
" [165]\n",
" [118]\n",
" [51]\n",
" [169]\n",
" [25]\n",
" [17]\n",
" [45]\n",
" [100]\n",
" [157]\n",
" [56]\n",
" [34]\n",
" [6]\n",
" [170]\n",
" [29]\n",
" [192]\n",
" [44]\n",
" [126]\n",
" [20]\n",
" [183]\n",
" [189]\n",
" [126]\n",
" [63]\n",
" [77]\n",
" [79]\n",
" [28]\n",
" [51]\n",
" [159]\n",
" [157]\n",
" [84]\n",
" [41]\n",
" [56]\n",
" [56]\n",
" [0]\n",
" [34]\n",
" [17]\n",
" [20]\n",
" [137]\n",
" [9]\n",
" [86]\n",
" [34]\n",
" [154]\n",
" [27]\n",
" [10]\n",
" [86]\n",
" [30]\n",
" [51]\n",
" [123]\n",
" [52]\n",
" [29]\n",
" [149]\n",
" [169]\n",
" [101]\n",
" [85]\n",
" [20]\n",
" [166]\n",
" [181]\n",
" [51]\n",
" [191]\n",
" [143]\n",
" [67]\n",
" [155]\n",
" [20]\n",
" [20]\n",
" [151]\n",
" [81]\n",
" [56]\n",
" [20]\n",
" [165]\n",
" [94]\n",
" [17]\n",
" [6]\n",
" [46]\n",
" [34]\n",
" [176]\n",
" [17]\n",
" [57]\n",
" [143]\n",
" [159]\n",
" [73]\n",
" [66]\n",
" [106]\n",
" [30]\n",
" [25]\n",
" [93]\n",
" [26]\n",
" [86]\n",
" [18]\n",
" [10]\n",
" [54]\n",
" [149]\n",
" [159]\n",
" [144]\n",
" [191]\n",
" [189]\n",
" [171]\n",
" [44]\n",
" [82]\n",
" [171]\n",
" [56]\n",
" [190]\n",
" [169]\n",
" [20]\n",
" [169]\n",
" [95]\n",
" [171]\n",
" [131]\n",
" [126]\n",
" [85]\n",
" [56]\n",
" [151]\n",
" [47]\n",
" [77]\n",
" [34]\n",
" [124]\n",
" [144]\n",
" [25]\n",
" [36]\n",
" [168]\n",
" [17]\n",
" [189]\n",
" [34]\n",
" [56]\n",
" [56]\n",
" [132]\n",
" [146]\n",
" [134]\n",
" [171]\n",
" [159]\n",
" [92]\n",
" [1]\n",
" [29]\n",
" [140]\n",
" [27]\n",
" [86]\n",
" [68]\n",
" [5]\n",
" [144]\n",
" [159]\n",
" [86]\n",
" [38]\n",
" [56]\n",
" [84]\n",
" [132]\n",
" [52]\n",
" [137]\n",
" [46]\n",
" [143]\n",
" [34]\n",
" [20]\n",
" [165]\n",
" [123]\n",
" [51]\n",
" [181]\n",
" [151]\n",
" [10]\n",
" [10]\n",
" [17]\n",
" [192]\n",
" [100]\n",
" [55]\n",
" [126]\n",
" [192]\n",
" [27]\n",
" [190]\n",
" [84]\n",
" [123]\n",
" [35]\n",
" [20]\n",
" [34]\n",
" [90]\n",
" [27]\n",
" [22]\n",
" [108]\n",
" [56]\n",
" [86]\n",
" [166]\n",
" [169]\n",
" [169]\n",
" [20]\n",
" [165]\n",
" [73]\n",
" [86]\n",
" [36]\n",
" [133]\n",
" [6]\n",
" [56]\n",
" [123]\n",
" [6]\n",
" [182]\n",
" [189]\n",
" [126]\n",
" [126]\n",
" [34]\n",
" [56]\n",
" [115]\n",
" [56]\n",
" [2]\n",
" [143]\n",
" [51]\n",
" [168]\n",
" [143]\n",
" [169]\n",
" [20]\n",
" [34]\n",
" [20]\n",
" [6]\n",
" [34]\n",
" [34]\n",
" [103]\n",
" [125]\n",
" [27]\n",
" [22]\n",
" [121]\n",
" [127]\n",
" [171]\n",
" [151]\n",
" [143]\n",
" [25]\n",
" [85]\n",
" [82]\n",
" [34]\n",
" [125]\n",
" [165]\n",
" [20]\n",
" [123]\n",
" [192]\n",
" [46]\n",
" [25]\n",
" [34]] [5 4 5 5 3 1 3 1 3 3 1 3 5 5 5 1 5 3 5 5 5 1 4 3 3 3 3 4 3 3 1 3 1 5 1 4 3\n",
" 5 3 3 1 3 1 1 1 3 1 3 3 1 1 1 3 3 5 1 3 3 5 1 3 1 3 3 3 3 1 4 3 5 5 1 3 3\n",
" 1 3 1 4 3 1 3 5 1 1 3 1 1 1 3 3 5 3 3 3 3 5 5 1 5 3 5 3 1 1 3 4 3 4 1 5 5\n",
" 5 1 3 1 3 4 3 1 3 1 1 3 5 1 3 4 5 3 3 3 3 1 3 4 1 3 3 4 3 5 1 5 1 3 3 3 1\n",
" 1 3 3 3 3 3 3 3 3 1 3 5 3 3 3 3 1 5 3 3 3 3 3 3 3 5 3 5 1 1 1 5 1 3 3 2 1\n",
" 3 3 3 3 1 3 1 5 5 3 1 5 3 1 1 1 1 3 1 4 3 5 3 3 3 3 1 1 3 1 1 5 5 3 1 3 1\n",
" 5 3 5 3 3 1 1 5 3 3 3 1 1 3 1 1 1 3 3 1 3 1 3 5 3 3 3 1 3 1 1 3 5 3 3 1 5\n",
" 3 5 1 1 1 5 3 5 5 3 5 3 3 3 1 5 1 3 5 1 1 5 3 3 1 1 3 5 1 3 3 5 3 3 3 3 3\n",
" 5 5 5 3 1 5 4 1 1 3 3 4 4 3 3 3 3 1 3 1 3 3 4 3 1 1 3 5 3 5 1 5 5 1 1 3 5\n",
" 3 1 3 3 5 1 1 5 1 5 1 4 3 3 3 1 3 1 5 3 5 1 1 1 1 3 5 3 3 1 1 4 3 3 3 3 1\n",
" 3 3 1 3 1 3 3 5 3 3 3 3 3 1 3 1 1 3 3 3 1 1 1 3 5 1 1 1 3 4 5 3 3 5 3 1 5\n",
" 3 3 1 3 3 3 3 3 4 3 3 1 1 3 3 3 1 1 1 3 3 3 5 3 3 3 5 3 1 3 3 1 1 3 1 3 1\n",
" 4 5 3 1 3 3 1 3 4 3 1 3 1 1 3 1 3 5 1 3 5 3 3 1 3 3 5 5 3 3 5 3 1 1 1 5 3\n",
" 3 3 3 3 1 1 1 3 3 5 1 3 3 1 3 3 3 3 5 5 5 1 5 3 5 1 1 1 5 3 5 5 3 3 3 1 3\n",
" 1 5 3 3 3 3 3 5 3 3 3 1 3 3 3 5 3 3 3 3 1 5 1 5 1 3 1 3 1 5 4 3 3 1 3 5 1\n",
" 3 3 3 3 3 3 1 1 1 1 3 1 1 1 3 5 5 4 3 1 3 5 3 3 3 1 1 1 1 3 3 3 5 5 3 1 3\n",
" 3 1 3 5 3 4 1 3 1 4 3 1 3 3 1 5 3 5 1 3 1 3 1 4 3 5 1 1 5 4 3 3 5 3 3 3 1\n",
" 1 3 3 5 1 3 1 1 5 3 1 1 1 1 3 1 5 1 3 5 3 1 1 3 3 5 5 1 1 5 3 3 1 1 3 1 3\n",
" 3 3 1 3 1 3 3 5 5 1 1 3 1 3 4 3 3 3 1 3 1 5 5 3 3 3 1 1 1 1 1 5 4 5 1 3 3\n",
" 3 1 3 3 3 3 3 3 1 3 1 5 1 5 1 3 1 1 3 1 3 5 1 1 3 3 5 3 1 1 1 1 3 1 0 3 5\n",
" 3 1 3 5 5 1 3 4 3 3 3 3 5 3 3 3 3 3 1 1 5 3 3 3 3 3 1 3 1 3 3 1 4 3 3 1 5\n",
" 3 3 3 3 4 1 1 5 5 1 1 1 5 1 3 1 5 3 4 3 3 3 1 5 3 1 3 1 3 1 5 3 1 1 3 1 3\n",
" 4 5 3 3 5 3 5 3 3 3 1 1 1 5 3 3 3 1 1 1 5 3 3 5 5 3 3 3 5 3 3 3 3 3 3 3 5\n",
" 5 3 4 3 3 3 4 5 1 3 4 0 1 3 3 5 1 3 5 3 3 3 3 1 3 3 3 3 3 4 1 3 1 5 3 5 1\n",
" 3 1 3 3 1 1 3 1 1 3 3 1 1 4 3 1 3 5 3 1 1 3 1 5 1 5 3 3 3 4 3 3 1 1 3 5 5\n",
" 5 3 3 0 3 3 3 4 3 3 1 3 3]\n"
]
}
],
"source": [
"'''Translate classification values into numerical values'''\n",
"Le = LabelEncoder() #Use the LabelEncoder library\n",
"for i in range(len(X[0])): #Iterate over instances of the data\n",
" X[:, i] = Le.fit_transform(X[:, i]) #Use fit_transform to convert values \n",
"\n",
"print(set(y))\n",
"yRealValues, y = np.unique(y, return_inverse=True)\n",
"\n",
"y = np.ravel(y) #Put the classification into a single 1D array to avoid future warning and error messages\n",
"print(X, y) #Ensure that the transformations have taken place correctly"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [],
"source": [
"'''Simple function to train the models from the data'''\n",
"def trainModel(model):\n",
" model.fit(X_train, y_train) #Fit the model\n",
" prediction = model.predict(X_test) #Give the predictions for the y values\n",
" return round(metrics.accuracy_score(y_test, prediction), 3), classification_report(y_test, prediction) #Return the accuracy value and the report for the data"
]
},
{
"cell_type": "code",
"execution_count": 190,
"metadata": {},
"outputs": [],
"source": [
"knn = neighbors.KNeighborsClassifier(n_neighbors=11, weights='uniform') #Define the KNN algorithm"
]
},
{
"cell_type": "code",
"execution_count": 191,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) #Split the dataset"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [],
"source": [
"def trainData(model):\n",
" start_time = time.time() #Set the starting execution time\n",
" acc, rep = trainModel(model) #set knn accuracy and report values on uncleaned data\n",
" finish_time = round(time.time() - start_time, 3)\n",
" print(\"{} seconds to run for {}\".format(finish_time, model)) #Display the runtime\n",
" return acc, rep"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.011 seconds to run for KNeighborsClassifier(n_neighbors=11)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\2011h\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
}
],
"source": [
"knn_acc, knn_rep = trainData(knn)"
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.059 seconds to run for LogisticRegression()\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\2011h\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:762: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
"Please also refer to the documentation for alternative solver options:\n",
" https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
" n_iter_i = _check_optimize_result(\n",
"C:\\Users\\2011h\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
}
],
"source": [
"log_acc, log_rep = trainData(LogisticRegression())"
]
},
{
"cell_type": "code",
"execution_count": 195,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy = 0.463\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 1\n",
" 1 0.46 0.44 0.45 64\n",
" 3 0.49 0.73 0.58 81\n",
" 4 0.00 0.00 0.00 9\n",
" 5 0.00 0.00 0.00 33\n",
"\n",
" accuracy 0.46 188\n",
" macro avg 0.19 0.23 0.21 188\n",
"weighted avg 0.37 0.46 0.40 188\n",
"\n",
"Accuracy = 0.431\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 1\n",
" 1 0.00 0.00 0.00 64\n",
" 3 0.43 1.00 0.60 81\n",
" 4 0.00 0.00 0.00 9\n",
" 5 0.00 0.00 0.00 33\n",
"\n",
" accuracy 0.43 188\n",
" macro avg 0.09 0.20 0.12 188\n",
"weighted avg 0.19 0.43 0.26 188\n",
"\n"
]
}
],
"source": [
"print(\"Accuracy = {}\\n{}\".format(knn_acc, knn_rep)) #Display the accuracy and report for the entire dataset for knn\n",
"print(\"Accuracy = {}\\n{}\".format(log_acc, log_rep)) #Display the accuracy and report for the entire dataset for logistic regression"
]
},
{
"cell_type": "code",
"execution_count": 196,
"metadata": {},
"outputs": [],
"source": [
"scaler = StandardScaler() #Define which scaler to use\n",
"scale_X = scaler.fit_transform(X) #Scale the entire dataset\n",
"X_train, X_test, y_train, y_test = train_test_split(scale_X, y, test_size=0.2) #Split the dataset"
]
},
{
"cell_type": "code",
"execution_count": 197,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.01 seconds to run for KNeighborsClassifier(n_neighbors=11)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\2011h\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
}
],
"source": [
"knn_acc, knn_rep = trainData(knn)"
]
},
{
"cell_type": "code",
"execution_count": 198,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.025 seconds to run for LogisticRegression()\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\2011h\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
}
],
"source": [
"log_acc, log_rep = trainData(LogisticRegression())"
]
},
{
"cell_type": "code",
"execution_count": 199,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy = 0.394\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 1\n",
" 1 0.36 0.31 0.33 59\n",
" 3 0.47 0.62 0.54 88\n",
" 4 0.00 0.00 0.00 6\n",
" 5 0.05 0.03 0.04 34\n",
"\n",
" accuracy 0.39 188\n",
" macro avg 0.18 0.19 0.18 188\n",
"weighted avg 0.34 0.39 0.36 188\n",
"\n",
"Accuracy = 0.468\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 1\n",
" 1 0.00 0.00 0.00 59\n",
" 3 0.47 1.00 0.64 88\n",
" 4 0.00 0.00 0.00 6\n",
" 5 0.00 0.00 0.00 34\n",
"\n",
" accuracy 0.47 188\n",
" macro avg 0.09 0.20 0.13 188\n",
"weighted avg 0.22 0.47 0.30 188\n",
"\n"
]
}
],
"source": [
"print(\"Accuracy = {}\\n{}\".format(knn_acc, knn_rep)) #Display the accuracy and report for the entire dataset for knn\n",
"print(\"Accuracy = {}\\n{}\".format(log_acc, log_rep)) #Display the accuracy and report for the entire dataset for logistic regression"
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [],
"source": [
"'''Plot a confusion matrix'''\n",
"def c_m():\n",
" start_time = time.time() #Set the starting execution time\n",
" y_pred = accpred() #Get the predicted values for y\n",
" matrix = confusion_matrix(y_test, y_pred) #Build a confusion matrix for the predicted and actual values\n",
" #real_vals = ['K', 'P', 'S', 'D', 'F', 'G', 'C', 'H', 'L', 'A', 'I', 'X', 'W', 'Z', 'U', 'B', 'J', 'V', 'O'] #Set the prediction values back to diagnosis\n",
" real_vals = ['A', 'B', 'C', 'D', 'E']\n",
" df_cm = pd.DataFrame(matrix, columns=np.unique(real_vals), index = np.unique(real_vals)) #Set the columns as the real values\n",
" df_cm.index.name = 'Actual' #Label the x axis as Actual\n",
" df_cm.columns.name = 'Predicted' #Label the y axis as Predicted\n",
" plt.figure(figsize = (10,7)) #Set the size\n",
" sn.set(font_scale=1.4) #Label size\n",
" sn.heatmap(df_cm, cmap=\"Blues\", annot=True,annot_kws={\"size\": 16}) #Font size\n",
" finish_time = round(time.time() - start_time, 3)\n",
" print(\"{} seconds to run\".format(finish_time)) #Display the runtime"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {},
"outputs": [],
"source": [
"def accpred():\n",
" model.fit(X_train, y_train) #Fit the model\n",
" return model.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"KNN\n",
"0.07 seconds to run\n"
]
},
{
"data": {
"image/png": "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c9V/qAABAIBisFgsTntcjuTkZD322GNq2bKlmjZtqiFDhujPP/8s2L59+3bFxsaqSZMmio6OVnx8fLHmvWQFqG/fvsUOzmKxaO7cucV+PQAAgCM2m02DBw9WUFCQ4uPj5e/vr3feeUf9+/fXl19+qaysLPXv31+33nqrxo0bp82bN2vcuHEKDg5W7969i5z7kgmQ1UpxCAAAnGM1oAd2/Phx1a5dWw8//LBq1aolSXrooYd01113aefOnVq3bp18fHw0btw4eXt7q3bt2tq3b5+mTZt25QnQnDlznPspAACA2zJiIcSKFSvq7bffLnh+/PhxxcfHq1KlSqpbt67effddNW/eXN7ef6czLVu21JQpU5ScnKzKlStfcm6nnAS9c+dO1a1b1xlTAQAAk0tNTVVqamqh8ZCQEIWEhFz0PU8//bSWLl0qX19fTZkyRYGBgUpOTtZ1111n97pKlSpJkg4fPnz1CdCpU6f01ltv6eeff1Z2drZsNpskKT8/XxkZGUpLS9P27duLMxUAAHBDziwAzZo1S5MnTy40PnLkSI0aNeqi7xk4cKD69u2rjz76SCNGjNC8efOUmZkpX19fu9edf56VlVVkDMVKgP7zn//o008/Vbt27bRnzx75+/srIiJCGzZs0NmzZzV+/PjiTAMAANyUM1tg/fr1U0xMTKHxS1V/JKlOnTqSpFdeeUWbNm3SnDlz5Ofnp+zsbLvXnX8eEBBQZAzFSoBWr16thx56SCNGjNDMmTO1du1aTZw4UWlpaerbt6927txZnGkAAACKbHX909GjR7Vu3TrdcccdBQmY1WrVddddp+TkZIWFheno0aOF3iNJYWFhRc5drEu9UlNT1axZM0nnMrCtW7dKkoKCgvTggw/q+++/L840AADATVktznsU1+HDh/X4449rw4YNBWM5OTnatm2bateurRYtWmjDhg3Kzc0t2L527VpFRESoYsWKRX+e4gRQrly5gpOVwsPDdeLECZ06dUqSVLlyZSUnJxf/0wAAALdjxEKIjRo1UsuWLfXCCy9o/fr12rlzp5566imlpKSof//+6tmzpzIyMjR27Fjt2rVLiYmJmjlzpoYOHepw7mIlQDfddJPef/997du3T9WrV1f58uWVmJgoSfr2229Vrly5Yn8YAACA4rBarZo0aZJuuOEGPfLII+rVq5dOnz6tefPmqUaNGqpQoYLi4+O1f/9+xcTEKC4uTmPGjFGPHj0czm2xnb+kqwgHDx5UbGysKleurPnz52vWrFl69dVXFRgYqPT0dI0YMUIjR450yoe9Upm5jl+DK7dsy0GjQ/AI/Qe8anQIpnfql8JXnsC5Nuw5ZXQIHqFNHdcWHwYkbHHaXDPua+S0ua5UsU6CrlatmlasWKE9e/ZIOnf2dvny5fXrr7+qcePGuvvuu0s0SAAAYCyrAQshlqRiL4RYpkwZRUVFFTzv3r27unfvXiJBAQAAlKRiJUAXW6zoQka3wAAAQMkxWQHo6hOgwMBAhYaGkgBdhsULF2jmjOlKTj6iyKh6evzJp9W4SVOjw3J7O9av0aLJ/9ZzMz8rGEs7fUor50zRzo1rJUnXNmim2/41TOUqFb0+BOyVLxuog6teKzS+9OuNuv+JeDWrX1Nr5j1ZaPvE2d/ombeXuiJEU+JYUXI2rvtB094YpykLv73o9jOnU/Ts8PvUqVtP3d13sIujK52MuBdYSSpWAvT7778XGktLS9O6dev0yiuv6JVXXnF6YGa1fFmiJrz8ooYOH6EGDRtp/rw5Gj5koBYsWabq1WsYHZ7b2v/HVi1+91XpH+f05+bmaOaEx5WWclKd+wxR2dBKWrtyiaa/OEojXp+ugOCyBkbsXhrVrSZJumP4ZJ05m1kwfuL0WUlSwzpVlZaepW7DJtm97/Cx064L0mQ4VpScXds364M3xtkdLy700bS3lJaa4rqg4HLFSoC8vLwKjZUtW1adO3fW8ePH9dprr2nhwoVOD85sbDab3pscp569emvYQ+cqZq1uaq277rhdc2fP0tNjnzM4QveTm5Otn1Ys0bcLPpRvGT/l5ecXbPtjw086mrRHsc+8pjqNW0iSajVoorhH+2n1Jwm6ra/jdSJwTqM6VXXkeKq+WbvjEturaduuQ/p5y17XBmZSHCtKRk5Otr5e9rGWzp2mMn7+ys3Nuejrflu3Wr9vXCcf3zIujrB0M1kBqHjrABUlIiLism6FcerUKeXl5dmNbd68WSdPnrzaUEq9/fv36dChg4ru2KlgzMfHR+3aR2vNj6sNjMx9/fnbz1q97CPd1neoWt5uf1+ZE4cPyGq16tqGzQrGvH18Va12pHZt+sXVobq1hnWqaeufl14KoWGdqtry5yEXRmRuHCtKxpb1P+mzhbPVa8BI3dy910Vfk342TXPee133DnxY3j4+Lo6wdLNaLE57lAZXlQBlZWUpISHB4XLT582bN0+dOnUquJXGeW+99Zaio6NNX0Xat3evJKlGzXC78erVa+hA0v5CiSEcq1Y7Uo/GfaRWXQovelW2QkXl5+frzKnjduOnjh1RyrEjrgrRFBrWraYAP199N/MxnVr7tnatHK/H+t1SsL1BnaqqHnaN1iY8rdM/T9TWZS+qb/eWBkbs3jhWlIxaderp9fgluvXOey/5mgXxcapas5ba3NzNhZHBCMVqgXXo0KHQyU95eXlKSUlRTk6Onn32WYdzrFq1ShMmTFBsbKxq1qxpt+21115TfHy8XnjhBVWvXl033XTTZXwE93E2LU2SFBgQaDceGBio/Px8ZWRkKCgoyIjQ3FZI+Usn39c1vlEBwWW1+N1XdeegRxUYco3Wrlyqo0l7lJfLL5DislgsqlcrTGczs/TM24lKOnxSt7dtoJdH3akyZbw1c+lPqlguWNfVqKQXJn2iU2fS1fv2GzT95VjZbDZ99OnPRn8Et8OxomSUC61U5Pbtm9Zr3Q9f6eXJ81wUkXspJYUbpylWAnTTTTdd9OzvoKAgderUqVgJy4wZMzRw4EA9/vjjhbZVrlxZY8eOVW5urqZNm2baBOj8otsX7svz46WlLGgWgSFl1WfMy1r87quaNOZBSVLdZq10Q6du2vj9FwZH5z4sFqnH6KlKOnJSu5POVdN+WP+nAgPKaEz/WzVx9jfq/tC72vrnQR05fu6egd+t+0NVKpbVs0O6kABdAY4VrpeVmamZk17VXfcPUsWwqkaHUyp55FVg//nPf4rcnpubK2/voqf6448/9MILLxT5mnvuuUcDBw4sTkhuKSg4WJJ09uxZVQgNLRhPT0+X1WqVf0CAUaGZVnhUIz0aN0+njh6Wt4+PQspX1NIpr8k/KNjo0NxGfr5N3/9S+Dy/r/63TUN6tVOtaqH6+qfthbev2a7b2jRQoL+vzmZkuyJU0+BY4XpL5kyVf2Cgbu7eS3l5f99byWazKS8vV15exV43GG6iWOcA3Xzzzdq2bdtFt23YsEFt2rRxOEdubq58HJxQFhwcrKysrOKE5JZqhp/r5x84kGQ3fuBAkiIiapkuuzba2dTT2rhqpbKzMlW+ctWCdtmR/btVJfw6g6NzH1UqltWAHm0UWs6+5eJfxleSVK5sgAbd01a+Pva/IPz9fJSekU3ycwU4Vrjerz+t0v6/dmpoTHsNvqutBt/VVhln07Q8YYYG39XW6PBKBasTH6XBJVPaadOmKSMjQ9K5m6HOmTNHYWGFF4/btGmT8v9x6fGlXHvttfrtt98UHh5+ydf8+uuvqlatWnHidkvh4REKC6ui7775Wq3bnPsLlZOTo9U/rFK79tHGBmdCebk5Wjr1dZUJCFD9G9tLkvbv/F2H9/ypG2+90+Do3Ievj7fefb6PAv19NWnedwXjd9/cWDv3JsvLatWkZ+/T0ROp+uS7zQXb7+rUWGs2/mVEyG6PY4XrjcaPUoEAACAASURBVH7hDeXk2F8W//rYEWrZ/lZ1uJ37XUoe1ALLz8/XlClTJJ370EuXFl7N1Wq1Kjg4WI888ojDH3TnnXcqLi5ON910kypVKnwi2tGjR/XOO++oV6+LX5poBhaLRQMGDdarr4xXSNmyatK0mRI+mquUU6cU+0B/o8MznZDyoYq6obVWzpkqyaK83FytmP2uwsJrq3H7zkaH5zb2HTqhj1es1wsP3aH8fJt27DmiHrc21d03N1Hvxz7Qj7/u0ppfdynu2ft0TUiAjhxP1aCebdSwTjXdPOBto8N3SxwrXK96ROGqsNVq1TXlQ1WrTj0DIkJJu2QCNGzYMA0bNkySFBUVpXnz5umGG2644h90//33a+XKlerWrZvuueceNWnSRCEhIUpJSdFvv/2mJUuWqFatWhowYMAV/wx3cG+fvsrMytJHc2Zr7uyZioyqpynT4lW9Biu7loS7hz+pFbPe1bJpb8pisSiyWSt17jtU3t6s73E5hr00T88Mvl0j+0YrLLSsduw5oj6PT9dn32+RJPV6dJpeGnWnXhjeTeXLBuq3HUm6Y/hk/bptv8GRuy+OFShtrOYqAMlisxWxFvj/O3jwoCpVqqRDhw4VtLBOnjyp3bt3q3nz5sX+YdnZ2Zo4caIWL16s06f/XiI/NDRU99xzj4YNGyY/P78r+BhSZq7j1+DKLdty6UXw4Dz9B7xqdAimd+oXxzd3xtXZsOeU0SF4hDZ1yrn05z32ycVXgr8Sb90Z5bS5rlSxTmv39/dXbGysTpw4oa+++kqStGXLFg0dOlStW7dWXFxcsdak8PX11ZNPPqnHHntMSUlJOn36tMqXL68aNWqYrrcIAICZmO33dLFOxv7vf/+rQ4cO6fnnny8Ya9eunWbMmKHdu3dr4sSJl/VDvb29VatWLTVp0kQ1a9Y03U4FAAClW7ESoNWrV+vxxx9X+/bt/36j1arWrVvr4YcfLqgKAQAAc7JanPcoDYrVAjt79qwCLrHwVrly5ZSSkuLUoAAAQOlitmZNsSpADRo0uOSNShctWqR69bhEEAAAuI9iVYCGDRumIUOGqHv37urcubMqVKigkydP6ptvvtGOHTs0bdq0ko4TAAAYyGz3oCtWAtS2bVtNnTpVkyZN0nvvvSebzXbuDtH16mnq1Klq0qRJSccJAAAMVFpuYeEsxb67W/v27dW+fXtlZWUpJSVFwcHB2r17txISEvTII49o48aNJRknAACA01zR7W3XrFmj+fPna+vWrbLZbGrWrJmz4wIAAKWIyTpgxU+A9uzZo4SEBCUmJio1NVVVqlTRsGHDFBMTo5o1a5ZkjAAAwGAedQ5QXl6evv76a82fP1/r1q2Tj4+POnTooK+//lpvvPEGlR8AAOCWLpkAxcXFaeHChTp27JgaNGig5557Tt27d5eXl9dV3RQVAAC4H5MVgC6dAL333nuKjIxUXFycmjZtWjCenp7uksAAAEDpUVpWcHaWS17V1qtXLx08eFCxsbHq16+fli5dqoyMDFfGBgAAUCIumQCNHz9eP/74o8aPH6+8vDw988wzatOmjV544QVZLBZuYAoAgAexWixOe5QGRZ4E7efnp5iYGMXExGjfvn1atGiREhMTZbPZNGbMGHXr1k3dunVTVFSUq+IFAAAGKCV5i9MUe2HH8PBwjRkzRt9//72mTp2qevXq6cMPP1RMTIy6detWkjECAAA41WUvhGi1WhUdHa3o6GidPHlSS5cu1ZIlS0oiNgAAUEp4zEnQxVG+fHkNHDhQn332mbPiAQAApZDFiX9KA7Pd2wwAAMChK7oXGAAA8Cxma4GRAAEAAIfMlgDRAgMAAB6HChAAAHDIbAsgkwABAACHaIEBAAC4OSpAAADAIZN1wEiAAACAY6XlJqbOQgsMAAB4HCpAAADAIbOdBE0CBAAAHDJZB4wWGAAA8DxUgFAst9YNMzoEj3Dwx3eMDgG4ajfUKmd0CCgB1lJyF3dnIQECAAAO0QIDAABwc1SAAACAQ1wFBgAAPA4LIQIAALg5KkAAAMAhkxWASIAAAIBjtMAAAADcHAkQAABwyGJx3uNypKWl6d///rc6deqkpk2bqkePHvrmm28Ktm/fvl2xsbFq0qSJoqOjFR8fX6x5SYAAAIBDVic+LsczzzyjVatWacKECUpMTFTnzp01cuRI/fTTTzp58qT69++v8PBwLV68WKNHj1ZcXJwWLFjgcF7OAQIAAKXSsWPH9OWXX+r9999X69atJUnDhg3TTz/9pEWLFqlOnTry8fHRuHHj5O3trdq1a2vfvn2aNm2aevfuXeTcVIAAAIBDFovFaY/i8vf31wcffKDmzZsXiuX06dNav369mjdvLm/vv+s5LVu2VFJSkpKTk4ucmwQIAAA4ZHHiIzU1VQcOHCj0SE1NtfuZQUFBat++vYKCggrGfvvtN61du1bR0dFKTk5WWJj9zborVaokSTp8+HCRn4cWGAAAcKlZs2Zp8uTJhcZHjhypUaNGXfJ9f/31l0aOHKnGjRvr3nvv1axZs+Tr62v3mvPPs7KyioyBBAgAADjkzHWA+vXrp5iYmELjISEhl3zPL7/8opEjR6pq1ap6//335ePjIz8/P2VnZ9u97vzzgICAImMgAQIAAA45cxnEkJCQIpOdC33yyScaO3asbrzxRsXFxRW0xMLCwnT06FG7155/fmFr7EKcAwQAAEqt5cuX68knn1SXLl30/vvv250P1KJFC23YsEG5ubkFY2vXrlVERIQqVqxY5LwkQAAAwCEjFkI8cuSInn/+ebVs2VJPPPGEUlJSdOzYMR07dkwpKSnq2bOnMjIyNHbsWO3atUuJiYmaOXOmhg4d6nBuWmAAAMChy7l83Vm+/PJLZWRkaO3atWrXrp3dtmbNmmn+/PmKj4/XK6+8opiYGFWsWFFjxoxRjx49HM5tsdlstpIK3JUycx2/BlcuPSvP6BAApwgo42V0CIBT+Lm4hDF/40GnzdWnaTWnzXWlqAABAACHzHbODAkQAABwyIgWWEkiAQIAAA6ZK/0xX0ULAADAISpAAADAIVpgAADA45itZWS2zwMAAOAQFSAAAOAQLTAAAOBxzJX+0AIDAAAeiATIAIsXLlD3Lp11Y7PrFXv/vdr020ajQzKVnJxsvf/uO4rperM6tr5BI4c8qD+2bzM6LFNhH7sGxwrXYD8XjxE3Qy1JJEAutnxZoia8/KK6db9Tb06cpODgYA0fMlAHDiQZHZppTHzjNS1ImKvYBwfrP2/GqYyfn0YM7a/Dh5x3HxtPxz4ueRwrXIP9XHxWWZz2KA24GaoL2Ww2de18s9q0a6fnXnhJkpSTk6O77rhd7Tt01NNjnzM4wktzl5uhpp05oy43t9FDDz+mPv/qL0nKzMzU7Z1aq9+AIXpw0DBjAzQBd9/H7nAzVHc+VrgTd9/Prr4Z6vItyU6bq3ujyk6b60pxErQL7d+/T4cOHVR0x04FYz4+PmrXPlprflxtYGTm4efvr+mzE1Sl6t93Gvb29pZFFmVnZxsYmXmwj0sexwrXYD9fntLSunIWQxKgnJwc7du3T2fOnFFISIgiIiLk5VX6/1V2tfbt3StJqlEz3G68evUaOpC0X3l5eR6xH0qSt7e3IqPqS5Ly8/N15PAhfTB1siwW6fau3Q2OzhzYxyWPY4VrsJ8vj6WUtK6cxaUJUHJyst566y19+eWXyszMLBj39/fXHXfcoYcfflihoaGuDMmlzqalSZICAwLtxgMDA5Wfn6+MjAwFBQUZEZopffjBFE1//11J0uDhoxQeUcvgiMyHfVwyOFa4BvvZs7ksAUpOTlbv3r1ls9nUr18/RUVFKSQkRGfOnNHWrVuVmJio1atXa8GCBapYsaKrwnKp86dbXbiY1Plxq9nqiwbr0PEWNW1+o379ZZ1mfDBFOTk5GvrQw0aHZSrs45LBscI12M+Xx2y7w2UJ0MSJExUaGqoPP/xQISEhdttuu+02DR06VA888IBmzJihp556ylVhuVRQcLAk6ezZs6rwj0pXenq6rFar/AMCjArNlK6rGylJanZDC6Wnn9VHs2do4ODh8vbxMTgy82AflwyOFa7Bfr48peXqLWdx2WXwa9as0ZgxYwolP+cFBQVp9OjRWrVqlatCcrma4ef6zBdeXnngQJIiImqZbplxI5w4fkyfLluis2fP2o3Xjayn7OxsnT6dYlBk5sE+LnkcK1yD/ezZXJYAnTx5UhEREUW+pk6dOjpy5IhrAjJAeHiEwsKq6Ltvvi4Yy8nJ0eofVunGVjcZGJl5nDlzRq+89Jy++/oLu/F1a/+ncuUrqFz5CgZFZh7s45LHscI12M+Xx2wLIbqsBZabm6syZcoU+RpfX1+7k6PNxmKxaMCgwXr1lfEKKVtWTZo2U8JHc5Vy6pRiH+hvdHimEFHrWnW8ubPi3n5dOTk5qla9hlZ9+5VWfvaJnn1xgqxW1v68WuzjksexwjXYz5entCQuzuKyhRCjoqK0Zs0aVahw6X8dHj9+XO3atdP27dsve353WAjxvFkzZ+ijObOVknJKkVH1NOaJp9S4SVOjwyqSuyyEKEmZGRmKn/aevv5yhU4cP6aIa2ur/8Ch6nTLbUaHZhruvI/dYSHE89zxWOGO3HU/u3ohxC+3H3PaXJ3rGX+xk0sToAcffFB+fn6XfE1GRoZmzZpl+gTIHblTAgQUxZ0SIKAork6Avtp+3Glz3VrP+CVvXLb7qlatqi+++MLh66pUqeKCaAAAwOWwmqwF5rIE6Ntvv3XVjwIAACgS9wIDAAAOcSsMAADgccx2FRjXqwIAAI9DBQgAADhECwwAAHgcs10FRgsMAAB4HCpAAADAIVpgAADA43AVGAAAgJujAgQAABwyWQGIBAgAADhmNVkPjBYYAADwOFSAAACAQ+aq/5AAAQCA4jBZBkQLDAAAeBwqQAAAwCEWQgQAAB7HZBeB0QIDAACehwoQAABwyGQFIBIgAABQDCbLgGiBAQAAj0MFCAAAOMRVYAAAwONwFRgAAICbowIEAAAcMlkBiAQIAAAUg8kyIFpgAADA41ABAgAADnEVGAAA8DhcBQYAAODmqAChWA6lZBgdgkf4YtdRo0MwvRFtrjU6BNPLy7cZHYKHcG1JxmQFIBIgAABQDCbLgGiBAQAAhyxO/HOl3n//ffXp08dubPv27YqNjVWTJk0UHR2t+Pj4Ys1FAgQAAEq9efPm6e2337YbO3nypPr376/w8HAtXrxYo0ePVlxcnBYsWOBwPlpgAADAIaOuAktOTtaLL76odevWqVatWnbbFixYIB8fH40bN07e3t6qXbu29u3bp2nTpql3795FzksFCAAAOGRx4uNy/P777woMDNQnn3yixo0b221bv369mjdvLm/vv+s5LVu2VFJSkpKTk4uclwoQAABwqdTUVKWmphYaDwkJUUhIiN1Yp06d1KlTp4vOk5ycrOuuu85urFKlSpKkw4cPq3LlypeMgQQIAAA45sQW2KxZszR58uRC4yNHjtSoUaOKPU9mZqZ8fX3txs4/z8rKKvK9JEAAAMAhZ94Ko1+/foqJiSk0fmH1xxE/Pz9lZ2fbjZ1/HhAQUOR7SYAAAIBLXazVdSXCwsJ09Kj9ArLnn4eFhRX5Xk6CBgAADlkszns4S4sWLbRhwwbl5uYWjK1du1YRERGqWLFike8lAQIAAA4ZdRVYUXr27KmMjAyNHTtWu3btUmJiombOnKmhQ4c6fC8JEAAAcEsVKlRQfHy89u/fr5iYGMXFxWnMmDHq0aOHw/dabDabKe5al5nr+DW4cruS04wOwSNwM9SSx81QSx43Q3WNQF/Xrky4/fBZp81Vr0qg0+a6UpwEDQAAHHLmVWClAS0wAADgcagAAQAAh4y6F1hJIQECAAAOmSz/oQUGAAA8DxUgAADgmMlKQCRAAADAIa4CAwAAcHNUgAAAgENcBQYAADyOyfIfWmAAAMDzUAECAACOmawERAIEAAAc4iowAAAAN0cFCAAAOMRVYAAAwOOYLP+hBQYAADwPCZABFi9coO5dOuvGZtcr9v57tem3jUaHZAq/rPlefbu1sxuz2WxaNDdeQ+/rqj5dWuulJx7Sgf17DIrQfeXn52nzV0u04IUhmjHybi14cYi2fvuJbDabJCk7/ax+nDdZcx6/Xx+O6qEv3n1JqUcPGRy1++NY4Vrff/et2rZsZnQYpZfFiY9SgATIxZYvS9SEl19Ut+536s2JkxQcHKzhQwbqwIEko0Nzazu2btI7rz4v/f8v5PMWzv5Ai+fG687esXrsuVeVnpaml8YM19m0MwZF6p5+/XS+flk6U9e17KjbRryoa29or58WvK9NXyySJH0z/TXt/e0ntew5UDcPeVoZZ1K0/M2nlJ1x1uDI3RfHCtfa9Nuveu6ZJy48hOAfLE78UxqQALmQzWbTe5Pj1LNXbw17aKTate+gdyZP0TXlymnu7FlGh+eWcrKzlZgwSy+OGSovLy+7bRnpZ7VswRz17jdE3Xr0UYs2HfT865OVkZGub1YsMyhi92PLz9eWr5fo+tvuUbNufVStXlM1v/Nfqte+qzZ/tVinDu1T0tZf1KbPQ6p7082q2ehG3Tz4aZ09dVz7Nq0zOny3xLHCdbKzszVzxnQNGdBPXl6cFutJSIBcaP/+fTp06KCiO3YqGPPx8VG79tFa8+NqAyNzX7/+vEZLPvpQDwwdrS4x99pt27ltizIz0tWidYeCsaDgENW/vpl++/l/rg7VbWVnnFWdVreoVtPWduPXVK6uzDOnFVShsu5++m3VaNSiYJuXl48kKS83x6WxmgXHCtdZs/oHfTh9mh4Z84Tuvb+v0eGUahaL8x6lgcsSoD179hScL3ApWVlZ+vjjj10Ukevt27tXklSjZrjdePXqNXQgab/y8vIMiMq9XRfZQFM+Wq5uPfoUKqseOrBfklS5anW78cpVqxVsg2NlAoPV9v6HFFrzOrvxfZvXKbBcqHzK+KnStVHy9vFVfl6eTh3ap+9nvS3/kHKKaHKTQVG7N44VrtOgYSN9uvJr9en7gCyl5TdzKWWyU4BclwB17dpVJ0+etBsbPny4jh07VvD8zJkzGjdunKtCcrmzaWmSpMCAQLvxwMBA5efnKyMjw4iw3FqFipUUGBR80W0Z6Wny8fGVj4+P3bi/f6Ay0jk35WrsWL1SB7dvVOPb7rEb/2HOO1o4bpgObPtVLXs8KL+gEIMidG8cK1ynUuXKCg7he+qJXNbwvFj1Z+3atcrMzHRVCIY7vw8u/FfG+XEr//pwKput8L6WJJts/EvvKvy57lutnjdJtZq1VYOOd9ptq9+hm+q2ull7f/tJq2a+pfz8fEW1vc2gSN0XxwqURmb72nHGlwsFBZ+rVJw9e1YVQkMLxtPT02W1WuUfEGBUaKYUEBiknJxs5ebmyNv77ypQZka6AgKDDIzMfW3+aqnWLvpA4de3UqdBTxb6BV2pVqQkqWpUY6WdOq6NnyeQAF0BjhUoncyVAXEStAvVDD/Xz7/wMtYDB5IUEVGLqoSTValWQzabTUcP269Hk3zooKrWiDAmKDf289KZWrtwmuq06qRbhz0rr/9PKlOPHdaOH78oVOUNrVlb6SknjAjV7XGsAEoeCZALhYdHKCysir775uuCsZycHK3+YZVubMXJos4W2bCxfH3L6Oc1qwrG0s6katvmX3V9sxaXfiMK2fJNon5b8bEa3nyXovuPkfUfSw6cTj6oH2ZP1OE/NheM2Ww2Hdz2q8pXizAgWvfHsQKlkdmuAnNpC8zT/9VisVg0YNBgvfrKeIWULasmTZsp4aO5Sjl1SrEP9Dc6PNPx9w9Ql5h7NX/Ge7JYLKpaPVyL58XLPyBQN3e92+jw3EZ6ykn9vHiGyleLUO0WHXR0zw677dXqNVWla6O0auZbanF3P/kFhWjHj1/oyF/b1OXh8QZF7d44VqA0MttvcJcmQC+99JLKlClT8DwnJ0evvfaaAv6/n52VleXKcAxxb5++yszK0kdzZmvu7JmKjKqnKdPiVb1GDaNDM6W+g0bIYrHokwVzlZmRrsgG12vk0y9d8soxFJa0bYPycnN08uBeLfvPY4W2P/Bmgm4f+ZJ+Xvqh1i2ZoayzZxRa8zp1e+TfqhrV2ICIzYFjBVCyLDZHi/M4SWxsbLFfO2fOnMuePzP3st+Cy7ArOc3oEDzCF7uOGh2C6Y1oc63RIZheXj73k3CFQF/X1mQOn8522lxVyvo6ba4r5bIK0JUkNQAAoHQoLffwchZOggYAAB6HdYAAAIBj5ioAkQABAADHTJb/0AIDAACehwoQAABwyGxL+ZEAAQAAh7gKDAAAwM1RAQIAAI6ZqwBEAgQAABwzWf5DCwwAAHgeKkAAAMAhrgIDAAAex2xXgZEAAQAAh8xWAeIcIAAA4HFIgAAAgMehBQYAAByiBQYAAODmqAABAACHuAoMAAB4HFpgAAAAbo4KEAAAcMhkBSASIAAAUAwmy4BogQEAAI9DBQgAADjEVWAAAMDjcBUYAACAmyMBAgAADlmc+Lgc+fn5iouLU7t27dS4cWMNGDBA+/btu+rPQwIEAAAcMygDevfddzV//nxNmDBBH3/8sby8vDRw4EBlZWVd1cchAQIAAKVSdna2ZsyYoZEjR6pDhw6KiorS22+/rePHj2vFihVXNTcJEAAAcMjixD/FtX37dqWnp6tVq1YFY0FBQapfv77Wr19/VZ+Hq8AAAIBDzrwKLDU1VampqYXGQ0JCFBISUvA8OTlZklS5cmW711WqVEmHDx++qhhMkwD5meaTlE4NqwUZHYJHYD/DHEx2vTQkOff37AezZmny5MmFxkeOHKlRo0YVPM/IyJAk+fr62r3O19dX2dnZVxUDaQMAAHCpfv36KSYmptD4P6s/kuTn5yfp3LlA/0yCsrOzFRAQcFUxkAABAACXurDVdSlVqlSRJB09elRBQX9XyI8eParrrrvuqmLgJGgAAFAqRUVFKSgoSD///HPBWFpamrZt26Ybb7zxquamAgQAAEolX19f/etf/9Lbb7+t0NBQVa9eXW+++aYqV66szp07X9XcJEAAAKDUevjhh5WXl6cXXnhBGRkZuuGGGzR9+vRCJ0ZfLovNZrM5KUYAAAC3wDlAAADA45AAAQAAj0MCBAAAPA4nQRsgPT1dbdu2ldVq1Q8//HDViznhb506ddLBgwcLnvv4+Khq1aq65557NHjwYFmcuZa7B8vNzdX8+fO1bNky7d69Wz4+Pqpbt64GDBigjh07Gh2e27vY97hcuXJq27atRo8erbCwMAOjM4/Y2Fi7y6sv9Pnnn6t27doujAiuRAJkgJUrVyooKEhpaWn67LPP1KtXL6NDMpV+/fpp8ODBkqTMzExt2bJFzz77rPz9/RUbG2twdO4vKytLAwYM0OHDhzVq1Cg1adJEOTk5WrZsmYYPH67nnntO//rXv4wO0+3983uclZWlvXv36q233lLv3r21YMECkiAnue222/T8889fdFv58uVdHA1ciQTIAIsWLVKbNm2UkZGh+fPnkwA5mb+/vypWrFjwvEaNGlq7dq0WLVpEAuQE77zzjnbs2KHPPvvM7pfwE088oezsbL3xxhvq2rUrvzyu0oXf4+rVq6tRo0a644479Oabb+q///2vgdGZh6+vr91+hufgHCAX27t3rzZs2KDWrVurS5cu+v3337V582ajwzK98/eTwdXJycnR4sWL1bNnz4tWIIYPH64PP/xQwcHBBkRnfmXLllWPHj305ZdfXvWNIAFPRwLkYosWLVKZMmXUsWNHRUdHKzAwUPPnzzc6LFPbvHmzPv30U/Xu3dvoUNxeUlKSUlJS1LRp04tuL1++vJo2bSofHx8XR+Y5oqKilJmZqb179xodCuDWaIG5UF5enhITE9WhQ4eCm7rdcsst+vzzz/X000+rbNmyBkdoDvHx8Zo9e7akcxWLnJwcNWrUSF27djU4Mvd3+vRpSeK7aqDzN5A8c+aMwZGYw4oVK/TNN98UGm/ZsqWmTp1qQERwFRIgF/r+++917Ngxu1/E3bp107Jly7R06VL179/fuOBMpFevXgX7Mjc3V4cOHdKUKVPUs2dPLV26lF/eV+H8eT0pKSkGR+K5zic+xbmTNhzr0KGDnnrqqULjtM3NjxaYCy1evFiSNGbMGNWvX1/169fX8OHDJUkJCQlGhmYqISEhCg8PV3h4uGrXrq127drprbfe0sGDB/Xpp58aHZ5bq1GjhkJDQ7Vx48aLbk9OTla/fv20adMmF0fmOX7//XcFBAQoIiLC6FBMISAgoOB48c9H5cqVjQ4NJYwKkIucOHFC33//ve666y4NGjTIbtuiRYs0a9YsrV27Vq1atTIoQnPLz8+3+19cGavVqnvuuUdz587VoEGDCv2SiI+P14YNG1S9enWDIjS3tLQ0LV26VF27duU8K+AqkQC5SGJionJycjR48GDVqVPHbtvQoUOVkJCg+fPnkwA5QUZGho4dOyZJstlsOnLkiN5++20FBASoc+fOBkfn/oYNG6Y1a9bovvvu0+jRo9WsWTOdOXNGixcv1rx58/Tyyy+rQoUKRofp9v75Pc7OztauXbv0zjvvyGq1avTo0QZHZx7Z2dkF+/lCwcHBtMJMjLvBu0jXrl0VGhpacHLuhZ5//nktXbpU3333HWtSXIULV9C1Wq0KCQnRjTfeqKFDh6phw4YGRmceGRkZmjFjhlasWKGDBw/K19dXUVFRGjx4sNq2bWt0eG7vwu+xv7+/KleurOjoaA0YMID2jJM4Wgl63Lhx6tOnjwsjgiuRAAEAAI/DSdAAAMDjkAABAACPQwIEAAA8DgkQAADwOCRAAADA45AAATAEF6ACMBIJEOCmYmNjFRkZafdo2LChOnXqpHHjxpXY/boOHDigyMhILVy4UJK0bt06RUZG6n//+1+xjOCdrQAABitJREFU51i4cKH+/e9/OyWeSZMmKTIyUrm5uU6ZD4BnYCVowI3VrVtXL774YsHznJwcbdu2TRMnTtSOHTs0f/58WSyWEo2hfv36mjdvniIjI4v9nilTpqhZs2YlGBUAFI0ECHBjQUFBat68ud3YTTfdpMzMTMXFxWnTpk1q0qRJicYQHBxcKAYAKO1ogQEmdP6WH4cOHVJsbKyefPJJjRkzRk2bNtW9994r6dw9kN544w1FR0erYcOG6tatm5YuXVporkWLFqlLly66/vrr1atXL+3atctu+8VaYFu2bNGgQYN0ww03qGXLlho1apSSkpIkSZGRkTp48KCWL19uVzXatWuXhg0bpmbNmqlp06YaOnSodu/ebfezzpw5o+eff16tWrVSs2bNNG7cOGVnZztnpwHwKFSAABPas2ePJKlmzZqSpM8//1zR0dGaNGlSQcIwatQorVu3TsOHD1dUVJS+/fZbPf3000pPT1ffvn0lSQkJCXrxxRfVu3dvPf3009q8ebMeffTRIn/2jh07dP/99ysyMlLjx4+Xl5eX3nnnHT344INavny55s2bp0ceeUSRkZEaPny4JGnfvn267777VLVqVY0fP16S9MEHH6hPnz5KTExUlSpVZLPZNHjwYO3evVujR49W5cqVNX/+fK1bt65E9iEAcyMBAtzcP0/+PX36tH755RdNmTJFTZs2VYMGDSSdu+LqP//5j4KCgiRJ//vf/7Rq1Sq99tpruvvuuyVJHTp0UH5+viZOnKiePXuqTJkymjx5sjp16lSQlHTo0KEgobmUqVOnKigoSLNmzVJgYKAk6dprr9XgwYO1efNmtWzZUr6+vipXrlxB62zSpEny8vLS7Nmzdc0110iS2rdvr1tvvVVTpkzRyy+/rB9//FEbN27U5MmTdeutt0qSOnbsqG7duhUkfABQXCRAgBv79ddfC5Kc86xWq1q3bq0JEyYUnABdtWrVguRHkn766SdJ5+46/s8E6pZbbtGCBQu0efNmhYaG6tixYwXJxnndu3cvMgFav3692rVrV5D8SFKdOnW0atWqS75n7dq1atmypYKCggri8ff3V+vWrfXjjz9Kkn7++Wd5eXmpY8eOBe/z8vJSly5d9N57711ybgC4GBIgwI1FRUVpwoQJkiSLxaIyZcqoatWqdsmHJIWGhto9P3XqlCSpRYsWF503OTlZ3t7nDg/ly5e321apUqUiYzp16pQqVKhQ/A/x/+/54osvCiVzkuTj4yNJSklJUUhISEFc/9feHbukFsZhHP/eA4EdqMExG4oyKnAIxAMN0RYN4VZIS4gkiIIRNbQ0uNViYUuIDYlbDRFFUJND/0EQ2uDiIg5OCUr3Dpd7QPBKXbjDve/zgbOc9/39eHmHw8PLOZzPrkdEpB8FIJF/mG3bBAKBL9eNjIzg8XgoFot9x8fHx2m1WgA0Go2esV/haVDvfnPK5TJTU1OMjY31rXEch1gs9tu+Xq+XVqtFp9NxQ9Fn1iMi0o++AhMxkOM4tNttOp0OgUDAvWq1Gtlslvf3dyYmJvD5fNzd3fXUPj4+DuwdDAYpl8u02233Xq1WIxaLuS8sW1bvoycUClGtVpmdne1Zz+XlJbe3twAsLi7y8fHB/f19T+3T09Mf74OImEsnQCIGWlpaIhQKkUwmicfj+P1+Xl5eyOVyLCwsuKc0e3t77OzssLu7y9raGpVKhXw+P7B3IpFgY2ODaDTK1tYW3W6Xs7MzpqenWVlZAWB0dJTX11een59xHIdkMunWbG5uMjw8zNXVFQ8PDxwdHQE/Q9vy8jKHh4c0m00mJye5vr7m7e3t726WiPyXdAIkYiDLsjg/PyccDnNxccH29jalUolIJEIul3Pnra6ucnJyQqVSIZVKcXNzw/Hx8cDe8/PzFItFhoaG2N/fJ5PJMDc3R6FQwLZtAOLxOI1Gg0QiQb1eZ2ZmhlKphG3bHBwckE6nqdfrZLNZwuGw2/v09JT19XXy+TzpdBrLstxP6UVEvuLbd/2RUERERAyjEyARERExjgKQiIiIGEcBSERERIyjACQiIiLGUQASERER4ygAiYiIiHEUgERERMQ4CkAiIiJiHAUgERERMc4Pllvh+lxnE+4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x504 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"'''Display the confusion matrix for knn'''\n",
"model = knn #Set the model as knn\n",
"print(\"KNN\")\n",
"c_m()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"'''Display the confusion matrix for logistic regession'''\n",
"model = LogisticRegression() #Set the model as logistic regression\n",
"print(\"Logistic Regression\")\n",
"c_m()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}