Skip to content
Permalink
master
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
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"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",
"from sklearn.svm import SVC\n",
"\n",
"'''matplotlib'''\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"'''Remove warnings'''\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" PRIMARY_KEY REP_DATE REP_TIME SEX APD_RACE_DESC \\\n",
"0 201612402 01/01/2016 2355 F WHITE \n",
"1 201620049 01/02/2016 123 M HISPANIC OR LATINO \n",
"2 201620049 01/02/2016 123 M HISPANIC OR LATINO \n",
"3 201620049 01/02/2016 123 F HISPANIC OR LATINO \n",
"4 201612438 01/01/2016 2212 M WHITE \n",
"... ... ... ... .. ... \n",
"9179 20163651685 12/30/2016 2119 F WHITE \n",
"9180 20163641610 12/29/2016 2320 M HISPANIC OR LATINO \n",
"9181 20163660456 12/31/2016 817 M WHITE \n",
"9182 20163651875 12/30/2016 2354 M HISPANIC OR LATINO \n",
"9183 20163660189 12/31/2016 211 F BLACK \n",
"\n",
" LOCATION PERSON_SEARCHED_DESC \\\n",
"0 BURNET RD / W BRAKER LN YES = 1 \n",
"1 W STASSNEY LN / EMERALD FOREST DR YES = 1 \n",
"2 W STASSNEY LN / EMERALD FOREST DR NO = 2 \n",
"3 W STASSNEY LN / EMERALD FOREST DR YES = 1 \n",
"4 200 BLOCK W ANDERSON LN SVRD EB NO = 2 \n",
"... ... ... \n",
"9179 1906 W SLAUGHTER LN YES = 1 \n",
"9180 3900 S CONGRESS AVE YES = 1 \n",
"9181 2100 S LAMAR BLVD YES = 1 \n",
"9182 2501 S IH 35 SVRD NB YES = 1 \n",
"9183 100 E BEN WHITE BLVD EB NO = 2 \n",
"\n",
" REASON_FOR_STOP_DESC SEARCH_BASED_ON_DESC \\\n",
"0 CALL FOR SERVICE INCIDENTAL TO ARREST \n",
"1 CALL FOR SERVICE PROBABLE CAUSE \n",
"2 NaN NaN \n",
"3 VIOLATION OF PENAL CODE PROBABLE CAUSE \n",
"4 NaN NaN \n",
"... ... ... \n",
"9179 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9180 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS PROBABLE CAUSE \n",
"9181 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9182 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9183 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS NaN \n",
"\n",
" SEARCH_DISC_DESC RACE_KNOWN \\\n",
"0 NOTHING NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"1 OTHER NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"2 NaN NaN \n",
"3 NOTHING YES - RACE OR ETHNICITY WAS KNOWN BEFORE STOP \n",
"4 NaN NaN \n",
"... ... ... \n",
"9179 NOTHING NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"9180 DRUGS NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"9181 NOTHING NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"9182 NOTHING NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"9183 NaN NO - RACE OR ETHNICITY WAS NOT KNOWN BEFORE STOP \n",
"\n",
" X_COORDINATE Y_COORDINATE SECTOR LOCAL_FIELD1 \n",
"0 3119888 10115666 ADAM PD 7.0 \n",
"1 3100814 10049567 FRANK 2.0 \n",
"2 3100814 10049567 FRANK 2.0 \n",
"3 3100814 10049567 FRANK 2.0 \n",
"4 3125331 10098656 IDA 4.0 \n",
"... ... ... ... ... \n",
"9179 3089803 10035918 FRANK 5.0 \n",
"9180 3108121 10054692 DAVID 3.0 \n",
"9181 3105636 10063425 DAVID 5.0 \n",
"9182 3115068 10057440 HENR 3.0 \n",
"9183 3108116 10054117 DAVID 3.0 \n",
"\n",
"[9184 rows x 15 columns]\n"
]
}
],
"source": [
"'''Read and display data'''\n",
"data = pd.read_csv(\"Datasets/2016-rp-arrests-1.csv\") #Load in the arrest data\n",
"print(data) #Display the data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" SEX APD_RACE_DESC PERSON_SEARCHED_DESC \\\n",
"0 F WHITE YES = 1 \n",
"1 M HISPANIC OR LATINO YES = 1 \n",
"2 M HISPANIC OR LATINO NO = 2 \n",
"3 F HISPANIC OR LATINO YES = 1 \n",
"4 M WHITE NO = 2 \n",
"... .. ... ... \n",
"9179 F WHITE YES = 1 \n",
"9180 M HISPANIC OR LATINO YES = 1 \n",
"9181 M WHITE YES = 1 \n",
"9182 M HISPANIC OR LATINO YES = 1 \n",
"9183 F BLACK NO = 2 \n",
"\n",
" REASON_FOR_STOP_DESC SEARCH_BASED_ON_DESC \n",
"0 CALL FOR SERVICE INCIDENTAL TO ARREST \n",
"1 CALL FOR SERVICE PROBABLE CAUSE \n",
"2 NaN NaN \n",
"3 VIOLATION OF PENAL CODE PROBABLE CAUSE \n",
"4 NaN NaN \n",
"... ... ... \n",
"9179 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9180 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS PROBABLE CAUSE \n",
"9181 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9182 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9183 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS NaN \n",
"\n",
"[9184 rows x 5 columns]\n"
]
}
],
"source": [
"'''Assigning attributes to use'''\n",
"#data = data.head(n=100)\n",
"\n",
"dataColumns = [ #Select all columns needed \n",
" 'SEX',\n",
" 'APD_RACE_DESC',\n",
" 'PERSON_SEARCHED_DESC',\n",
" 'REASON_FOR_STOP_DESC',\n",
" 'SEARCH_BASED_ON_DESC']\n",
"\n",
"selectedClass = ['SEX'] #Assign the class column\n",
"\n",
"selectedData = data[dataColumns].values \n",
"\n",
"selectedData = pd.DataFrame(selectedData, columns = [dataColumns]) #Make into pandas dataframe\n",
"print(selectedData)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" SEX APD_RACE_DESC PERSON_SEARCHED_DESC \\\n",
"0 F WHITE TRUE \n",
"1 M HISPANIC OR LATINO TRUE \n",
"2 M HISPANIC OR LATINO FALSE \n",
"3 F HISPANIC OR LATINO TRUE \n",
"4 M WHITE FALSE \n",
"... .. ... ... \n",
"9179 F WHITE TRUE \n",
"9180 M HISPANIC OR LATINO TRUE \n",
"9181 M WHITE TRUE \n",
"9182 M HISPANIC OR LATINO TRUE \n",
"9183 F BLACK FALSE \n",
"\n",
" REASON_FOR_STOP_DESC SEARCH_BASED_ON_DESC \n",
"0 CALL FOR SERVICE INCIDENTAL TO ARREST \n",
"1 CALL FOR SERVICE PROBABLE CAUSE \n",
"2 NONE SPECIFIED NONE SPECIFIED \n",
"3 VIOLATION OF PENAL CODE PROBABLE CAUSE \n",
"4 NONE SPECIFIED NONE SPECIFIED \n",
"... ... ... \n",
"9179 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9180 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS PROBABLE CAUSE \n",
"9181 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9182 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS INCIDENTAL TO ARREST \n",
"9183 VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS NONE SPECIFIED \n",
"\n",
"[9184 rows x 5 columns]\n"
]
}
],
"source": [
"#selectedData[['REASON_FOR_STOP_DESC']] = selectedData[['REASON_FOR_STOP_DESC']].fillna(value=\"NONE SPECIFIED\")\n",
"\n",
"selectedData = selectedData.replace(\"YES = 1\", \"TRUE\") #Making the data a bit cleaner\n",
"selectedData = selectedData.replace(\"NO = 2\", \"FALSE\")\n",
"selectedData.fillna(\"NONE SPECIFIED\", inplace=True) #I think that the absense might be useful so I'm keeping it in for this\n",
"\n",
"print(selectedData)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SEX\n"
]
}
],
"source": [
"print(selectedClass[0]) #Checking the right class is selected after"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[['WHITE' 'TRUE' 'CALL FOR SERVICE' 'INCIDENTAL TO ARREST']\n",
" ['HISPANIC OR LATINO' 'TRUE' 'CALL FOR SERVICE' 'PROBABLE CAUSE']\n",
" ['HISPANIC OR LATINO' 'FALSE' 'NONE SPECIFIED' 'NONE SPECIFIED']\n",
" ...\n",
" ['WHITE' 'TRUE' 'VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS'\n",
" 'INCIDENTAL TO ARREST']\n",
" ['HISPANIC OR LATINO' 'TRUE'\n",
" 'VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS' 'INCIDENTAL TO ARREST']\n",
" ['BLACK' 'FALSE' 'VIOLATION OF TRANSPORTATION CODE/VEHICLE LAWS'\n",
" 'NONE SPECIFIED']] SEX\n",
"0 F\n",
"1 M\n",
"2 M\n",
"3 F\n",
"4 M\n",
"... ..\n",
"9179 F\n",
"9180 M\n",
"9181 M\n",
"9182 M\n",
"9183 F\n",
"\n",
"[9184 rows x 1 columns]\n",
"(9184, 4) (9184, 1)\n",
"{'M', 'F'}\n"
]
}
],
"source": [
"dataColumns.remove(selectedClass[0]) #Remove the class from the columns needed for training\n",
"\n",
"X = selectedData[dataColumns].values \n",
"\n",
"#Set the class\n",
"y = selectedData[selectedClass]\n",
"\n",
"#X = selectedData.to_numpy()\n",
"print(X, y)\n",
"print(X.shape, y.shape)\n",
"\n",
"realYValues = y\n",
"print(set(np.ravel(realYValues)))\n",
"\n",
"y = np.ravel(y)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'M', 'F'}\n",
"[[7 1 0 3]\n",
" [4 1 0 6]\n",
" [4 0 3 5]\n",
" ...\n",
" [7 1 9 3]\n",
" [4 1 9 3]\n",
" [2 0 9 5]] [0 1 1 ... 1 1 0]\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",
"\n",
"classificationValues = set(y)\n",
"\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": 8,
"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": 9,
"metadata": {},
"outputs": [],
"source": [
"knn = neighbors.KNeighborsClassifier(n_neighbors=17, weights='uniform') #Define the KNN algorithm"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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": 11,
"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": 12,
"metadata": {},
"outputs": [],
"source": [
"'''Just run all the models in order to get results for all of them'''\n",
"def runAllModels():\n",
" knn_acc, knn_rep = trainData(knn)\n",
" log_acc, log_rep = trainData(LogisticRegression())\n",
" svc_acc, svc_rep = trainData(SVC())\n",
" return knn_acc, knn_rep, log_acc, log_rep, svc_acc, svc_rep"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def displayAllModels():\n",
" knn_acc, knn_rep, log_acc, log_rep, svc_acc, svc_rep = runAllModels()\n",
" print(\"\\nKNN\\n--------\\nAccuracy = {}\\n{}\".format(knn_acc, knn_rep)) #Display the accuracy and report for the entire dataset for knn\n",
" print(\"Logistic Regression\\n--------\\nAccuracy = {}\\n{}\".format(log_acc, log_rep)) #Display the accuracy and report for the entire dataset for logistic regression\n",
" print(\"SVC\\n--------\\nAccuracy = {}\\n{}\".format(svc_acc, svc_rep)) #Display the accuracy and report for the entire dataset for SVC"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.117 seconds to run for KNeighborsClassifier(n_neighbors=17)\n",
"0.037 seconds to run for LogisticRegression()\n",
"1.293 seconds to run for SVC()\n",
"\n",
"KNN\n",
"--------\n",
"Accuracy = 0.739\n",
" precision recall f1-score support\n",
"\n",
" 0 0.32 0.08 0.13 438\n",
" 1 0.77 0.94 0.85 1399\n",
"\n",
" accuracy 0.74 1837\n",
" macro avg 0.54 0.51 0.49 1837\n",
"weighted avg 0.66 0.74 0.68 1837\n",
"\n",
"Logistic Regression\n",
"--------\n",
"Accuracy = 0.762\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 438\n",
" 1 0.76 1.00 0.86 1399\n",
"\n",
" accuracy 0.76 1837\n",
" macro avg 0.38 0.50 0.43 1837\n",
"weighted avg 0.58 0.76 0.66 1837\n",
"\n",
"SVC\n",
"--------\n",
"Accuracy = 0.762\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 438\n",
" 1 0.76 1.00 0.86 1399\n",
"\n",
" accuracy 0.76 1837\n",
" macro avg 0.38 0.50 0.43 1837\n",
"weighted avg 0.58 0.76 0.66 1837\n",
"\n"
]
}
],
"source": [
"displayAllModels()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"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": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.123 seconds to run for KNeighborsClassifier(n_neighbors=17)\n",
"0.011 seconds to run for LogisticRegression()\n",
"1.272 seconds to run for SVC()\n",
"\n",
"KNN\n",
"--------\n",
"Accuracy = 0.723\n",
" precision recall f1-score support\n",
"\n",
" 0 0.34 0.08 0.12 476\n",
" 1 0.75 0.95 0.84 1361\n",
"\n",
" accuracy 0.72 1837\n",
" macro avg 0.54 0.51 0.48 1837\n",
"weighted avg 0.64 0.72 0.65 1837\n",
"\n",
"Logistic Regression\n",
"--------\n",
"Accuracy = 0.741\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 476\n",
" 1 0.74 1.00 0.85 1361\n",
"\n",
" accuracy 0.74 1837\n",
" macro avg 0.37 0.50 0.43 1837\n",
"weighted avg 0.55 0.74 0.63 1837\n",
"\n",
"SVC\n",
"--------\n",
"Accuracy = 0.741\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 476\n",
" 1 0.74 1.00 0.85 1361\n",
"\n",
" accuracy 0.74 1837\n",
" macro avg 0.37 0.50 0.43 1837\n",
"weighted avg 0.55 0.74 0.63 1837\n",
"\n"
]
}
],
"source": [
"displayAllModels() #Scaled data"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def cross_val(model):\n",
" accuracies = cross_val_score(model, scale_X, y, cv=5, scoring='accuracy') #Cross validate the machine learning model\n",
" return \"Cross validated average scaled accuracy = {}\\nMaximum scaled accuracy = {}\\nMinimum scaled accuracy = {}\\n\".format(round(accuracies.mean(), 3), round(accuracies.max(), 3), round(accuracies.min(), 3)) #Return the maximum and average accuracy using cross validation"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"def displayCrossValidation():\n",
" print(\"KNN\")\n",
" print(cross_val(knn)) #Display the cross validation score for knn using the entire dataset\n",
" print(\"\\nLogistic Regression\")\n",
" print(cross_val(LogisticRegression())) #Display the cross validation score for logistic regression using the entire dataset\n",
" print(\"\\nSVC\")\n",
" print(cross_val(SVC())) #Display the cross validation score for logistic regression using the entire dataset"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"KNN\n",
"Cross validated average scaled accuracy = 0.734\n",
"Maximum scaled accuracy = 0.751\n",
"Minimum scaled accuracy = 0.675\n",
"\n",
"\n",
"Logistic Regression\n",
"Cross validated average scaled accuracy = 0.75\n",
"Maximum scaled accuracy = 0.75\n",
"Minimum scaled accuracy = 0.75\n",
"\n",
"\n",
"SVC\n",
"Cross validated average scaled accuracy = 0.75\n",
"Maximum scaled accuracy = 0.75\n",
"Minimum scaled accuracy = 0.75\n",
"\n"
]
}
],
"source": [
"displayCrossValidation()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"'''Set the parameters for knn'''\n",
"n_neighbors = range(1, 21, 2) #Sets a range for the number of neighbours to check against\n",
"weights = ['uniform', 'distance'] #Checks the difference between distance and uniform usage of knn\n",
"metric = ['euclidean', 'manhattan', 'minkowski'] #Set the knn metrics to check\n",
"\n",
"'''Set variables for grid search'''\n",
"solvers = ['newton-cg', 'lbfgs', 'liblinear'] #Sets the solvers used to optimise the algrorithm\n",
"penalty = ['l1', 'l2'] #Used to penalise the hyperparamter\n",
"c_values = [100, 10, 1.0, 0.1, 0.01, 0.001] #Sets the strength of the penalty\n",
"\n",
"cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) #Set the cross validation parameters\n",
"\n",
"knn_grid = dict(n_neighbors=n_neighbors,weights=weights,metric=metric) #Set the parameters for knn\n",
"log_grid = dict(solver=solvers, penalty=penalty, C=c_values) #Set the parameters for logistic regression"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"'''Functions to run grid search and random search'''\n",
"def display_grid_search():\n",
" start_time = time.time() #Set the starting execution time\n",
" grid_search = GridSearchCV(estimator=model, param_grid=grid, n_jobs=-1, cv=cv, scoring='accuracy',error_score=0) #Define the grid search\n",
" grid_result = grid_search.fit(X, y) #Fit the model\n",
" print(\"{} seconds to run\".format(round(time.time() - start_time, 3))) #Display the runtime \n",
" print(\"Best accuracy {} using {}\".format(round(grid_result.best_score_, 3), grid_result.best_params_)) #Display the best score and the best parameters for grid search\n",
"def display_random_search():\n",
" start_time = time.time() #Set the starting execution time\n",
" rand_search = RandomizedSearchCV(model, grid, n_jobs=-1, cv=cv, scoring='accuracy',error_score=0) #Define the random search\n",
" rand_result = rand_search.fit(X, y) #Fit the model\n",
" print(\"{} seconds to run\".format(round(time.time() - start_time, 3))) #Display the runtime\n",
" print(\"Best accuracy {} using {}\".format(round(rand_result.best_score_, 3), rand_result.best_params_)) #Display the best score and the best parameters for random search"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"35.744 seconds to run\n",
"Best accuracy 0.747 using {'metric': 'manhattan', 'n_neighbors': 17, 'weights': 'uniform'}\n"
]
}
],
"source": [
"'''Grid search with KNN'''\n",
"grid = knn_grid #Set the grid as the ones defined for knn\n",
"model = KNeighborsClassifier() #Set the model to knn\n",
"display_grid_search()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5.722 seconds to run\n",
"Best accuracy 0.745 using {'weights': 'uniform', 'n_neighbors': 15, 'metric': 'minkowski'}\n"
]
}
],
"source": [
"'''Random search with KNN'''\n",
"grid = knn_grid #Set the grid as the ones defined for knn\n",
"model = KNeighborsClassifier() #Set the model to knn\n",
"display_random_search()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"8.813 seconds to run\n",
"Best accuracy 0.75 using {'C': 100, 'penalty': 'l1', 'solver': 'liblinear'}\n"
]
}
],
"source": [
"'''Grid search with Logistic Regression'''\n",
"grid = log_grid #Set the grid as the ones defined for logisic regression\n",
"model = LogisticRegression() #Set the model to logistic regression\n",
"display_grid_search()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.22 seconds to run\n",
"Best accuracy 0.75 using {'solver': 'newton-cg', 'penalty': 'l2', 'C': 0.001}\n"
]
}
],
"source": [
"'''Random search with Logistic Regression'''\n",
"grid = log_grid #Set the grid as the ones defined for logisic regression\n",
"model = LogisticRegression() #Set the model to logistic regression\n",
"display_random_search()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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 = assignRealClasses()\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": 27,
"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": 28,
"metadata": {},
"outputs": [],
"source": [
"realClasses = {\n",
" 0:'FEMALE', \n",
" 1:'MALE'\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"'''Assign the real string data to the numerical values used for training data'''\n",
"def assignRealClasses(): \n",
" real_vals = []\n",
" for i in set(y_test):\n",
" real_vals.append(realClasses[i])\n",
" return real_vals"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{0, 1}\n"
]
}
],
"source": [
"print(set(y_test)) #Check to see which values have been tested"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"KNN\n",
"0.239 seconds to run\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"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": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Logistic Regression\n",
"0.075 seconds to run\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x504 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SVC\n",
"1.259 seconds to run\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x504 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"'''Display the confusion matrix for logistic regession'''\n",
"model = SVC() #Set the model as logistic regression\n",
"print(\"SVC\")\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
}