{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import pickle\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.metrics import precision_score, accuracy_score, f1_score, recall_score, confusion_matrix, roc_curve, auc\n", "\n", "from keras.utils.np_utils import to_categorical\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Set ups" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1. Load models & scaler" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-11-27 13:04:59.224051: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2022-11-27 13:04:59.224496: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: )\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Metal device set to: Apple M1\n", "\n", "systemMemory: 16.00 GB\n", "maxCacheSize: 5.33 GB\n", "\n" ] } ], "source": [ "# Load all sklearn models\n", "with open(\"./model/sklearn/err_all_sklearn.pkl\", \"rb\") as f:\n", " sklearn_models = pickle.load(f)\n", "\n", "# Load all deep learning models\n", "with open(\"./model/dp/all_models.pkl\", \"rb\") as f:\n", " dp_models = pickle.load(f)\n", "\n", "# Load input scaler\n", "with open(\"./model/input_scaler.pkl\", \"rb\") as f:\n", " sc = pickle.load(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2. Important functions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def describe_dataset(dataset_path: str):\n", " '''\n", " Describe dataset\n", " '''\n", "\n", " data = pd.read_csv(dataset_path)\n", " print(f\"Headers: {list(data.columns.values)}\")\n", " print(f'Number of rows: {data.shape[0]} \\nNumber of columns: {data.shape[1]}\\n')\n", " print(f\"Labels: \\n{data['label'].value_counts()}\\n\")\n", " print(f\"Missing values: {data.isnull().values.any()}\\n\")\n", " \n", " duplicate = data[data.duplicated()]\n", " print(f\"Duplicate Rows : {len(duplicate.sum(axis=1))}\")\n", "\n", " return data\n", "\n", "\n", "def round_up_metric_results(results) -> list:\n", " '''Round up metrics results such as precision score, recall score, ...'''\n", " return list(map(lambda el: round(el, 3), results))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Process Test set" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Headers: ['label', 'nose_x', 'nose_y', 'nose_z', 'nose_v', 'left_shoulder_x', 'left_shoulder_y', 'left_shoulder_z', 'left_shoulder_v', 'right_shoulder_x', 'right_shoulder_y', 'right_shoulder_z', 'right_shoulder_v', 'left_hip_x', 'left_hip_y', 'left_hip_z', 'left_hip_v', 'right_hip_x', 'right_hip_y', 'right_hip_z', 'right_hip_v', 'left_knee_x', 'left_knee_y', 'left_knee_z', 'left_knee_v', 'right_knee_x', 'right_knee_y', 'right_knee_z', 'right_knee_v', 'left_ankle_x', 'left_ankle_y', 'left_ankle_z', 'left_ankle_v', 'right_ankle_x', 'right_ankle_y', 'right_ankle_z', 'right_ankle_v', 'left_heel_x', 'left_heel_y', 'left_heel_z', 'left_heel_v', 'right_heel_x', 'right_heel_y', 'right_heel_z', 'right_heel_v', 'left_foot_index_x', 'left_foot_index_y', 'left_foot_index_z', 'left_foot_index_v', 'right_foot_index_x', 'right_foot_index_y', 'right_foot_index_z', 'right_foot_index_v']\n", "Number of rows: 1107 \n", "Number of columns: 53\n", "\n", "Labels: \n", "L 561\n", "C 546\n", "Name: label, dtype: int64\n", "\n", "Missing values: False\n", "\n", "Duplicate Rows : 0\n" ] } ], "source": [ "# load dataset\n", "test_df = describe_dataset(\"./err.test.csv\")\n", "\n", "# Categorizing label\n", "test_df.loc[test_df[\"label\"] == \"C\", \"label\"] = 1\n", "test_df.loc[test_df[\"label\"] == \"L\", \"label\"] = 0\n", "\n", "# Standard Scaling of features\n", "test_x = test_df.drop(\"label\", axis = 1)\n", "test_x = pd.DataFrame(sc.transform(test_x))\n", "\n", "test_y = test_df[\"label\"].astype('int')\n", "\n", "# # Converting prediction to categorical\n", "test_y_cat = to_categorical(test_y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Test set evaluation for all models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1. Sklearn models evaluation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelPrecision ScoreAccuracy ScoreRecall ScoreF1 ScoreConfusion Matrix
0LR0.9733140.9719960.9719960.971987[[545, 1], [30, 531]]
1SVC0.7519470.7199640.7199640.711815[[488, 58], [252, 309]]
2KNN0.7684030.7651310.7651310.764652[[445, 101], [159, 402]]
3DTC0.9192260.9168930.9168930.916730[[479, 67], [25, 536]]
4SGDC0.9606280.9575430.9575430.957496[[545, 1], [46, 515]]
5NB0.7703550.7687440.7687440.768213[[395, 151], [105, 456]]
6RF0.8545290.8419150.8419150.840738[[510, 36], [139, 422]]
\n", "
" ], "text/plain": [ " Model Precision Score Accuracy Score Recall Score F1 Score \\\n", "0 LR 0.973314 0.971996 0.971996 0.971987 \n", "1 SVC 0.751947 0.719964 0.719964 0.711815 \n", "2 KNN 0.768403 0.765131 0.765131 0.764652 \n", "3 DTC 0.919226 0.916893 0.916893 0.916730 \n", "4 SGDC 0.960628 0.957543 0.957543 0.957496 \n", "5 NB 0.770355 0.768744 0.768744 0.768213 \n", "6 RF 0.854529 0.841915 0.841915 0.840738 \n", "\n", " Confusion Matrix \n", "0 [[545, 1], [30, 531]] \n", "1 [[488, 58], [252, 309]] \n", "2 [[445, 101], [159, 402]] \n", "3 [[479, 67], [25, 536]] \n", "4 [[545, 1], [46, 515]] \n", "5 [[395, 151], [105, 456]] \n", "6 [[510, 36], [139, 422]] " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "testset_final_results = []\n", "\n", "for name, model in sklearn_models.items():\n", " # Evaluate model\n", " model_results = model.predict(test_x)\n", "\n", " p_score = precision_score(test_y, model_results, average=\"weighted\")\n", " a_score = accuracy_score(test_y, model_results)\n", " r_score = recall_score(test_y, model_results, average=\"weighted\")\n", " f1_score_result = f1_score(test_y, model_results, average=\"weighted\")\n", " cm = confusion_matrix(test_y, model_results, labels=[1, 0])\n", " testset_final_results.append(( name, p_score, a_score, r_score, f1_score_result, cm ))\n", "\n", "\n", "sklearn_eval = pd.DataFrame(testset_final_results, columns=[\"Model\", \"Precision Score\", \"Accuracy Score\", \"Recall Score\", \"F1 Score\", \"Confusion Matrix\"])\n", "\n", "sklearn_eval" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2. Deep learning models" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-11-27 13:05:38.881823: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz\n", "2022-11-27 13:05:38.941570: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-27 13:05:39.153747: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-27 13:05:39.316420: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-27 13:05:39.450061: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelPrecision ScoreAccuracy ScoreRecall ScoreF1 ScoreConfusion Matrix
07_layers_with_dropout0.8920700.8644990.8644990.862354[[544, 2], [148, 413]]
15_layers0.8605090.8310750.8310750.827950[[531, 15], [172, 389]]
23_layers0.9365070.9277330.9277330.927442[[545, 1], [79, 482]]
37_layers0.8379100.7732610.7732610.762745[[541, 5], [246, 315]]
\n", "
" ], "text/plain": [ " Model Precision Score Accuracy Score Recall Score \\\n", "0 7_layers_with_dropout 0.892070 0.864499 0.864499 \n", "1 5_layers 0.860509 0.831075 0.831075 \n", "2 3_layers 0.936507 0.927733 0.927733 \n", "3 7_layers 0.837910 0.773261 0.773261 \n", "\n", " F1 Score Confusion Matrix \n", "0 0.862354 [[544, 2], [148, 413]] \n", "1 0.827950 [[531, 15], [172, 389]] \n", "2 0.927442 [[545, 1], [79, 482]] \n", "3 0.762745 [[541, 5], [246, 315]] " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_set_results = []\n", "\n", "for name, model in dp_models.items():\n", " # Evaluate model\n", " predict_x = model.predict(test_x, verbose=False) \n", " y_pred_class = np.argmax(predict_x, axis=1)\n", " y_test_class = np.argmax(test_y_cat, axis=1)\n", "\n", " cm = confusion_matrix(y_test_class, y_pred_class, labels=[1, 0])\n", " p_score = precision_score(y_test_class, y_pred_class, average=\"weighted\")\n", " a_score = accuracy_score(y_test_class, y_pred_class)\n", " r_score = recall_score(y_test_class, y_pred_class, average=\"weighted\")\n", " f1_score_result = f1_score(y_test_class, y_pred_class, average=\"weighted\")\n", " \n", " test_set_results.append(( name, (p_score), a_score, (r_score), (f1_score_result), cm ))\n", "\n", "dp_eval = pd.DataFrame(test_set_results, columns=[\"Model\", \"Precision Score\", \"Accuracy Score\", \"Recall Score\", \"F1 Score\", \"Confusion Matrix\"])\n", "\n", "dp_eval" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3. Final Results" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelPrecision ScoreAccuracy ScoreRecall ScoreF1 ScoreConfusion Matrix
0LR0.9733140.9719960.9719960.971987[[545, 1], [30, 531]]
1SGDC0.9606280.9575430.9575430.957496[[545, 1], [46, 515]]
23_layers0.9365070.9277330.9277330.927442[[545, 1], [79, 482]]
3DTC0.9192260.9168930.9168930.916730[[479, 67], [25, 536]]
47_layers_with_dropout0.8920700.8644990.8644990.862354[[544, 2], [148, 413]]
5RF0.8545290.8419150.8419150.840738[[510, 36], [139, 422]]
65_layers0.8605090.8310750.8310750.827950[[531, 15], [172, 389]]
7NB0.7703550.7687440.7687440.768213[[395, 151], [105, 456]]
8KNN0.7684030.7651310.7651310.764652[[445, 101], [159, 402]]
97_layers0.8379100.7732610.7732610.762745[[541, 5], [246, 315]]
10SVC0.7519470.7199640.7199640.711815[[488, 58], [252, 309]]
\n", "
" ], "text/plain": [ " Model Precision Score Accuracy Score Recall Score \\\n", "0 LR 0.973314 0.971996 0.971996 \n", "1 SGDC 0.960628 0.957543 0.957543 \n", "2 3_layers 0.936507 0.927733 0.927733 \n", "3 DTC 0.919226 0.916893 0.916893 \n", "4 7_layers_with_dropout 0.892070 0.864499 0.864499 \n", "5 RF 0.854529 0.841915 0.841915 \n", "6 5_layers 0.860509 0.831075 0.831075 \n", "7 NB 0.770355 0.768744 0.768744 \n", "8 KNN 0.768403 0.765131 0.765131 \n", "9 7_layers 0.837910 0.773261 0.773261 \n", "10 SVC 0.751947 0.719964 0.719964 \n", "\n", " F1 Score Confusion Matrix \n", "0 0.971987 [[545, 1], [30, 531]] \n", "1 0.957496 [[545, 1], [46, 515]] \n", "2 0.927442 [[545, 1], [79, 482]] \n", "3 0.916730 [[479, 67], [25, 536]] \n", "4 0.862354 [[544, 2], [148, 413]] \n", "5 0.840738 [[510, 36], [139, 422]] \n", "6 0.827950 [[531, 15], [172, 389]] \n", "7 0.768213 [[395, 151], [105, 456]] \n", "8 0.764652 [[445, 101], [159, 402]] \n", "9 0.762745 [[541, 5], [246, 315]] \n", "10 0.711815 [[488, 58], [252, 309]] " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eval_df = pd.concat([sklearn_eval, dp_eval])\n", "eval_df = eval_df.sort_values(by=['F1 Score'], ascending=False).reset_index(drop=True)\n", "eval_df.to_csv(f\"err.evaluation.csv\", sep=',', encoding='utf-8', index=False)\n", "eval_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Best model - ROC - Confusion Matrix\n", "\n", "As we can see from the evaluation, the best model according to the F1 Score is the LR model." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0.9981203 , 0.94782609]),\n", " array([0.94652406, 0.9981685 ]),\n", " array([0.97163769, 0.97234612]))" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "best_model = sklearn_models[\"LR\"]\n", "y_predictions = best_model.predict(test_x)\n", "\n", "p_score = precision_score(test_y, y_predictions, labels=[0, 1], average=None)\n", "r_score = recall_score(test_y, y_predictions, labels=[0, 1], average=None)\n", "f1_score_result = f1_score(test_y, y_predictions, labels=[0, 1], average=None)\n", "\n", "p_score, r_score, f1_score_result" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9724999999999999" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(0.998 + 0.947) / 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1. Confusion Matrix" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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m7crr7wyV111Va655pqsXbs2LS0tOf3007N9+/b6PWbPnp1bbrklK1asyJo1a7Jjx45MmzYte/fu7VYtpmIBADppb29Pe3t7h3ONjY1pbGwsjD3zzDM7vP/MZz6TJUuW5I477shb3vKWLF68OAsWLMg555yTJFm2bFmam5uzfPnyXHDBBdm6dWtuuOGG3HTTTZk8eXKS5Oabb86oUaNy22235Ywzzuhy3RI7AKCUGhp67mhtbU1TU1OHo7W19WVr2rt3b1asWJGdO3fmlFNOySOPPJK2trZMmTKlPqaxsTGnnnpqbr/99iTJunXrsmfPng5jRo4cmbFjx9bHdJXEDgCgk/nz52fOnDkdzr1UWvdr69evzymnnJLnn38+hx12WG655Za85S1vqTdmzc3NHcY3Nzfn0UcfTZK0tbWlf//+GTp0aGFMW1tbt+rW2AEAdLKvadd9edOb3pR77rknzz77bP71X/815513XlavXl2/3tBp071arVY411lXxnRmKhYAKKWenIrtrv79++eYY47JiSeemNbW1rz1rW/NF77whbS0tCRJIXnbvHlzPcVraWnJ7t27s2XLln2O6SqNHQDAflar1dLe3p7Ro0enpaUlq1atql/bvXt3Vq9enYkTJyZJxo8fn379+nUYs2nTpmzYsKE+pqtMxQIA5XSQbFD8iU98IlOnTs2oUaOyffv2rFixIt/73vdy6623pqGhIbNnz86iRYsyZsyYjBkzJosWLcqAAQMyY8aMJElTU1POP//8zJ07N8OHD8+wYcMyb968jBs3rv6UbFdp7AAAXoUnnngiH/zgB7Np06Y0NTXl+OOPz6233prTTz89SXLppZdm165dmTlzZrZs2ZIJEyZk5cqVGTRoUP0eV199dfr27Zvp06dn165dmTRpUpYuXZo+ffp0q5aGWq1W26+/3as07oS5vV0CsB+tv/vz9dfL7/5CL1YC7G8zTrikV3/+Wz91VY/d+yeXzXn5QQcha+wAACrCVCwAUEqv5OnVqpPYAQBUhMYOAKAiTMUCAKVkKrZIYgcAUBESOwCglAR2RRI7AICKkNgBAOUksiuQ2AEAVITEDgAoJU/FFknsAAAqQmIHAJSSwK5IYwcAlJPOruCga+zW3/353i4B6CEzTrikt0sAqLSDrrEDAOgKgV2RhycAACrioEvslvzoi71dArAfXXjKx+uvx530F71YCbC/rb/zs7368213UiSxAwCoiIMusQMA6BKJXYHEDgCgIiR2AEApCeyKNHYAQCl5eKLIVCwAQEVI7ACAkhLZdSaxAwCoCIkdAFBK1tgVSewAACpCYgcAlJPErkBiBwBQERI7AKCUBHZFEjsAgIqQ2AEApeSp2CKJHQBARWjsAAAqwlQsAFBKpmKLJHYAABUhsQMASklgVySxAwCoCIkdAFBOIrsCiR0AQEVI7ACAUvJUbJHGDgAoJX1dkalYAICKkNgBAOUksiuQ2AEAVITEDgAoJYFdkcQOAKAiJHYAQCnZ7qRIYgcAUBESOwCgnER2BRo7AKCUtHVFpmIBACpCYgcAlJPIrkBiBwBQERI7AKCUBHZFEjsAgIqQ2AEApWS3kyKJHQBARUjsAIByktgVaOwAgFLS1xWZigUAqAiJHQBQSh6eKJLYAQBUhMYOAKAiNHYAABVhjR0AUErW2BVJ7AAAKkJiBwCUksSuSGIHAFARGjsAgIowFQsAlJKp2CKJHQBARWjsAIBSaujBoztaW1vz9re/PYMGDcrhhx+es88+Ow8++GCHMbVaLQsXLszIkSNz6KGH5rTTTst9993XYUx7e3tmzZqVESNGZODAgTnrrLOycePGbtWisQMAeBVWr16diy66KHfccUdWrVqVF154IVOmTMnOnTvrY6688spcddVVueaaa7J27dq0tLTk9NNPz/bt2+tjZs+enVtuuSUrVqzImjVrsmPHjkybNi179+7tci3W2AEA5XSQrLG79dZbO7y/8cYbc/jhh2fdunV55zvfmVqtlsWLF2fBggU555xzkiTLli1Lc3Nzli9fngsuuCBbt27NDTfckJtuuimTJ09Oktx8880ZNWpUbrvttpxxxhldqkViBwDQSXt7e7Zt29bhaG9v79Jnt27dmiQZNmxYkuSRRx5JW1tbpkyZUh/T2NiYU089NbfffnuSZN26ddmzZ0+HMSNHjszYsWPrY7pCYwcAlFJDQ88dra2taWpq6nC0tra+bE21Wi1z5szJ7//+72fs2LFJkra2tiRJc3Nzh7HNzc31a21tbenfv3+GDh26zzFdYSoWACilnpyJnT9/fubMmdPhXGNj48t+7uKLL869996bNWvWFK41dNqfpVarFc511pUxv0liBwDQSWNjYwYPHtzheLnGbtasWfna176Wf//3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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "KNN_cm = eval_df[ eval_df[\"Model\"] == 'LR' ][\"Confusion Matrix\"].values[0]\n", "\n", "cm_array_df = pd.DataFrame(KNN_cm, index=[\"C\", \"L\"], columns=[\"C\", \"L\"])\n", "\n", "fig, ax = plt.subplots(figsize=(8,6)) \n", "sns.heatmap(cm_array_df, linewidths=1, annot=True, ax=ax, fmt='g', cmap=\"crest\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3. F1 Score and Confidence correlation" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def to_labels(y_pred, y_pred_proba, threshold):\n", " '''Return prediction taking confidence threshold into account'''\n", " results = []\n", "\n", " for index, predicted_class in enumerate(y_pred):\n", " prediction_probabilities = y_pred_proba[index]\n", " class_prediction_probability = round(prediction_probabilities[np.argmax(prediction_probabilities)], 2)\n", "\n", " results.append(predicted_class if class_prediction_probability >= threshold else -1)\n", " \n", " return results\n", "\n", "\n", "def calculate_correlation_score_confidence(test_x, test_y):\n", " '''Calculate correlation between Precision score/Recall score/F1 score and confidence threshold'''\n", " y_predictions = best_model.predict(test_x)\n", " y_predict_proba = best_model.predict_proba(test_x)\n", "\n", " thresholds = list(np.arange(0, 1.05, 0.01))\n", "\n", " f1_score_results = []\n", "\n", " for threshold in thresholds:\n", " true_predictions = to_labels(y_predictions, y_predict_proba, threshold)\n", " f1_s = list(f1_score(test_y, true_predictions, labels=[1, 0], average=None))\n", " all_class_f1 = f1_score(test_y, true_predictions, labels=[0, 1, 2], average=\"weighted\")\n", " f1_s.append(all_class_f1)\n", " f1_score_results.append(f1_s)\n", " \n", " return thresholds, f1_score_results\n", "\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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XcXihRdeoFOnTjRq1IjAwED++OMPwsPDadOmTa52P/74I+3atSv2gYqIiIhI+Wbzzg5dLyYa+Po65jqFnkFu3749P/zwA9WqVePChQsMGzaMBQsW5GoTHR3NiRMn6Nu3b7EPVERERETKN5uPu/114tkEh13nqpaavv3227n99tsLPB4cHMy2bduueVAiIiIiIpfy9M6e2714Lg5wzGrH17SSnoiIiIhISfH2zn598dwFh11HAbKIiIiIlAneXtmvL55PdNh1FCCLiIiISJng7Z1d5i3xvOPKWChAFhEREZEyIdcMclyyw66jAFlEREREygQ/3xwLhVxIcdh1FCCLiIiISJng45MzQE5z2HUUIIuIiIhImeCbI0BOTMh02HUUIIuIiIhImeCb8yG9xAyHXUcBsoiIiIiUCf5+OVIsEg2HXUcBsoiIiIiUCf4+2aFrUpLlMi2vjQJkERERESkT/H2zQ9fEFBukOabUmwJkERERESkTclWxSPOEi2ccch0FyCIiIiJSJnh7Z7++mOYJSWcdch0FyCIiIiJSJthsgMV8OO9imhckagZZRERERMoxiwWsbmZ5N80gi4iIiIgAVjdzgZDEVG8FyCIiIiIiru45ZpCVYiEiIiIi5Z2LuzmDbKZYKEAWERERkXLO1ZYVIHthJJ5zyDUUIIuIiIhImeH29wxyhuFKany8Q66hAFlEREREygw3m2F/fTH+okOuoQBZRERERMoMN49M++skBcgiIiIiUt6523IEyBdSHXINBcgiIiIiUma4e2SnWCSmeTrkGgqQRURERKTMsOUIkJMUIIuIiIhIeefhmeMhPQXIIiIiIlLe2XIEyEnpCpBFREREpJzz8Mh+nZh6HQfIU6ZMoU6dOnh4eBAaGsrq1asLbDtkyBAsFkuerVmzZvY2s2bNyrdNcnJySdyOiIiIiDiIp1fOHGQvh1zD6QHyvHnzGDFiBC+99BJbt24lPDycXr16ERkZmW/7999/n6ioKPt2/PhxKlasyL333purnZ+fX652UVFReOT8lUNEREREyhyvHDHxxXTHxHauDun1Krz77rsMHTqUYcOGATBp0iSWLFnC1KlTmTBhQp72/v7++Pv7299///33nDt3jocffjhXO4vFQnBwcKHHkZKSQkpKiv19vIOWLhQRERGRovP0vM5nkFNTU9myZQvdu3fPtb979+6sW7euUH1Mnz6dW2+9lZCQkFz7ExISCAkJoUaNGtxxxx1s3br1sv1MmDDBHnz7+/tTs2bNq7sZEREREXE4b+/s19dlFYvY2FgyMjIICgrKtT8oKIjo6Ogrnh8VFcXixYvts89ZGjduzKxZs1i4cCFz5szBw8ODTp06ceDAgQL7Gj16NHFxcfbt+PHjRbspEREREXEYrxwxsaMCZKenWICZDpGTYRh59uVn1qxZBAQE0K9fv1z7O3ToQIcOHezvO3XqRJs2bfjwww/54IMP8u3LZrNhs9mufvAiIiIiUmJ8fLJjxOuyzFtgYCAuLi55ZotjYmLyzCpfyjAMZsyYwaBBg3B3d79sW6vVSrt27S47gywiIiIipZ93zof00hzzkJ5TA2R3d3dCQ0NZtmxZrv3Lli0jLCzssueuXLmSgwcPMnTo0CtexzAMIiIiqFq16jWNV0REREScyzvHDPLFNO/LtCw6p6dYjBo1ikGDBtG2bVs6duzIJ598QmRkJI8//jhg5gafPHmSzz//PNd506dPp3379jRv3jxPn+PGjaNDhw40aNCA+Ph4PvjgAyIiIvjoo49K5J5ERERExDH8fLJfX0y/TgPkgQMHcubMGV577TWioqJo3rw5ixYtsleliIqKylMTOS4ujvnz5/P+++/n2+f58+d57LHHiI6Oxt/fn9atW7Nq1SpuvPFGh9+PiIiIiDiOn2+OHORMX4dcw2IYhnHlZuVPfHw8/v7+xMXF4efn5+zhiIiIiAiwav9fdG0UCFgIrbWRLZHtiz1ec/pKeiIiIiIihWVztWJxywAgMfU6rGIhIiIiInI13HMEyEmpjinRqwBZRERERMoMNxcrFlczQL6YpgBZRERERMo5m6sVq2aQRURERERMOVMsElMUIIuIiIhIOZczQDZwccg1FCCLiIiISJmRMwfZURQgi4iIiEiZ4Z4jB9lRFCCLiIiISJnh7pKdYuEoCpBFREREpMxQgCwiIiIikoPVasHFLdOx13Bo7yIiIiIixczVphlkERERERE7N5vh0P4VIIuIiIhImeJmU4qFiIiIiIidu2aQRURERESy2Tw1gywiIiIiYufuoRlkERERERE7mwJkEREREZFsCpBFRERERHLw9FSALCIiIiJi5+Hl2P4VIIuIiIhImaIZZBERERGRHLw8Hdu/AmQRERERKVO8vB3bvwJkERERESlTPD0sgOPSLBQgi4iIiEiZYnOzYnHLcFj/CpBFREREpExxc1GALCIiIiJi5+5qxeKqAFlEREREBDADZKtmkEVERERETDZXpViIiIiIiNi5uVgUIIuIiIiIZHF3UQ6yiIiIiIidu6uLcpBFRERERLK4KwdZRERERCSbcpBFRERERHKwqQ6yiIiIiEg21UEWEREREclBS02LiIiIiOTgrgBZRERERCSbu3KQRURERESyubtasborQBYRERERAbSSnoiIiIhILlooREREREQkBwXIIiIiIiI5uLuoDrKIiIiIiJ1beahiMWXKFOrUqYOHhwehoaGsXr26wLZDhgzBYrHk2Zo1a5ar3fz582natCk2m42mTZuyYMECR9+GiIiIiJSA674O8rx58xgxYgQvvfQSW7duJTw8nF69ehEZGZlv+/fff5+oqCj7dvz4cSpWrMi9995rb7N+/XoGDhzIoEGD2LZtG4MGDWLAgAFs2LChpG5LRERERBzE3cUKFsNh/VsMw3Bc74XQvn172rRpw9SpU+37mjRpQr9+/ZgwYcIVz//++++5++67OXLkCCEhIQAMHDiQ+Ph4Fi9ebG/Xs2dPKlSowJw5cwo1rvj4ePz9/YmLi8PPz+8q70pEREREHKnOM79x9IN2QPHHa06dQU5NTWXLli1079491/7u3buzbt26QvUxffp0br31VntwDOYM8qV99ujR47J9pqSkEB8fn2sTERERkdLJzcXisL6dGiDHxsaSkZFBUFBQrv1BQUFER0df8fyoqCgWL17MsGHDcu2Pjo6+6j4nTJiAv7+/fatZs+ZV3ImIiIiIlCR3t+s0QM5iseS+QcMw8uzLz6xZswgICKBfv37X3Ofo0aOJi4uzb8ePHy/c4EVERESkxLm7Oi6MdXVYz4UQGBiIi4tLnpndmJiYPDPAlzIMgxkzZjBo0CDc3d1zHQsODr7qPm02Gzab7SrvQEREREScwd31Op1Bdnd3JzQ0lGXLluXav2zZMsLCwi577sqVKzl48CBDhw7Nc6xjx455+ly6dOkV+xQRERGRssGRAbJTZ5ABRo0axaBBg2jbti0dO3bkk08+ITIykscffxwwUx9OnjzJ559/nuu86dOn0759e5o3b56nz2eeeYYuXbowceJE+vbtyw8//MCvv/7KmjVrSuSeRERERMSx3N2u0xQLMEuynTlz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vvsuQ4cOZdiwYQBMmjSJJUuWMHXqVCZMmJCn/S+//MLKlSs5fPiwPceydu3aedpZLJbL/qlZHKtp06aAmTrQoEEDPD09+e233+yf86VtP/vsMxITE+1B49q1a7FarblSCC7Vpk0b5s2bR5UqVfDz8yvUuEJCQq7Ypnv37gQGBvLmm2+yYMGCPMfPnz9PQEAATZs2Zf78+bkC5XXr1uHr65snyL2Spk2bYrPZiIyMpGvXrvm2admyJZ999hlpaWn5ziK7u7uTkZFx2etc6bO41OrVqwkLC+OJJ56w78tvdr5169a0bt2a0aNH07FjR7766is6dOgAmL9wNGzYkJEjR3L//fczc+ZMBcgiIlIsrssyb6mpqWzZsiVPrmj37t1Zt25dvucsXLiQtm3b8uabb1K9enUaNmzIv//9b5KSknK1S0hIICQkhBo1anDHHXewdevWy44lJSWF+Pj4XFt5lJCQQEREhH2hiCNHjhAREUFkZGSB5/Tv35/33nuPDRs2cOzYMVasWMGTTz5Jw4YNady4MR4eHrzwwgs8//zzfP755xw6dIg//viD6dOnA+aDXB4eHgwePJidO3eyfPlynn76aQYNGmRPr8jPgw8+SGBgIH379mX16tUcOXKElStX8swzz3DixIkifw+ycp1//vln7rzzTn799VeOHj3K5s2bef7553n88ccBeOKJJzh+/DhPP/00e/fu5YcffuDVV19l1KhR9vzjwvL19eXf//43I0eO5LPPPuPQoUNs3bqVjz76iM8++wyAp556ivj4eO677z42b97MgQMH+OKLL+x/Kalduzbbt29n3759xMbG2mfKc7rSZ3Gp+vXrs3nzZpYsWcL+/ft55ZVX2LRpk/34kSNHGD16NOvXr+fYsWMsXbqU/fv306RJE5KSknjqqadYsWIFx44dY+3atWzatClXjrKIiMi1cNQMslPLvJ08edIAjLVr1+ba/8YbbxgNGzbM95wePXoYNpvNuP32240NGzYYP//8sxESEmI8/PDD9jbr1683vvjiCyMiIsJYtWqVcc899xienp7G/v37CxxLfmWyuIoyb2XFlcq8ZZUgu3QbPHhwged88sknRrdu3YzKlSsb7u7uRq1atYwhQ4bYS30ZhllabPz48UZISIjh5uZm1KpVy/jPf/5jP17YMm+XioqKMh566CEjMDDQsNlsRt26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q1czfPhwevfubX84MDY2NlcbT09P7rzzTj744ANWrFjB+vXr2bFjBwCurq7ceuutvPnmm2zfvp2jR4/y+++/F+raIiJSPmmhECkRCQkJREREEBERAcCRI0eIiIiw/5k8P/379+e9995jw4YNHDt2jBUrVvDkk0/SsGFDGjdujIeHBy+88ALPP/88n3/+OYcOHeKPP/5g+vTpADz44IN4eHgwePBgdu7cyfLly3n66acZNGiQPb0iPw8++CCBgYH07duX1atXc+TIEVauXMkzzzzDiRMnivX7ciVPPfUU8fHx3HfffWzevJkDBw7wxRdfsG/fPgCee+45Jk6cyLx589i3bx8vvvgiERERuXKEC6sw9z127FjeeecdPvjgAw4cOMCff/7Jhx9+aO8jK4COjo4usBzf/fffT3BwMP369WPt2rUcPnyY+fPns379+nzb169fny+++II9e/awYcMGHnzwwVyz0LNmzWL69Ons3LmTw4cP88UXX+Dp6UlISAg//fQTH3zwARERERw7dozPP/+czMxMGjVqdNXfHxERKT9U5k1KxObNm2ndurX9AalRo0bRunVrxowZU+A5PXr04Mcff6RPnz40bNiQwYMH07hxY5YuXYqrq5nF88orr/Dss88yZswYmjRpwsCBA+35u15eXixZsoSzZ8/Srl07+vfvzy233MLkyZMvO1YvLy9WrVpFrVq1uPvuu2nSpAmPPPIISUlJ+Pn5FdN3pHAqVarE77//bq/8EBoayqeffmpPyxg+fDjPPvsszz77LC1atOCXX35h4cKFuSpYFFZh7nvw4MFMmjSJKVOm0KxZM+644w4OHDhg7+Odd95h2bJl1KxZs8CH4dzd3Vm6dClVqlShd+/etGjRgv/+978FVr2YMWMG586do3Xr1gwaNIjhw4dTpUoV+/GAgAA+/fRTOnXqRMuWLfntt9/48ccfqVSpEgEBAXz33XfcfPPNNGnShP/973/MmTOHZs2aXfX3R0REyo8C/pd0zSyGcZVFdMuJ+Ph4/P39iYuLyxNsJScnc+TIEerUqYOHh4eTRihSPunnT0REsvR55Cg/zayTb7x2LTSDLCIiIiJlktXqmHleBcgiIiIiUiZZHVTGQgGyiIiIiJRJmkEWEREREcnBpYB1FK6VAmQRERERKZMsmkEWEREREclmddEMsoiIiIiInYsWChER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jiQyMpLHH38cMFMfHnroIXv7Bx54gEqVKvHwww+ze/duVq1axXPPPccjjzxiT6945plnWLp0KRMnTmTv3r1MnDiRX3/9lREjRjjjFkVERESkDHF6DvLAgQM5c+YMr732GlFRUTRv3pxFixYREhICQFRUVK6ayD4+Pixbtoynn36atm3bUqlSJQYMGMD48ePtbcLCwpg7dy4vv/wyr7zyCvXq1WPevHm0b9++xO9PnMNms/Hqq6/mSZuR658++/JLn335pc++/HLUZ+/0OsgiIiIiIqWJ01MsRERERERKEwXIIiIiIiI5KEAWEREREclBAbKIiIiISA4KkKVMmjJlCnXq1MHDw4PQ0FBWr15dYNvvvvuO2267jcqVK+Pn50fHjh1ZsmRJCY5WitvVfP45rV27FldXV2644QbHDlAc5mo/+5SUFF566SVCQkKw2WzUq1ePGTNmlNBopThd7Wc/e/ZsWrVqhZeXF1WrVuXhhx/mzJkzJTRaKS6rVq2iT58+VKtWDYvFwvfff3/Fc1auXEloaCgeHh7UrVuX//3vf1d9XQXIUubMmzePESNG8NJLL7F161bCw8Pp1atXrnKAOa1atYrbbruNRYsWsWXLFrp160afPn3YunVrCY9cisPVfv5Z4uLieOihh7jllltKaKRS3Iry2Q8YMIDffvuN6dOns2/fPubMmUPjxo1LcNRSHK72s1+zZg0PPfQQQ4cOZdeuXXzzzTds2rSJYcOGlfDI5VolJibSqlUrJk+eXKj2R44coXfv3oSHh7N161b+7//+j+HDhzN//vyru7AhUsbceOONxuOPP55rX+PGjY0XX3yx0H00bdrUGDduXHEPTUpAUT//gQMHGi+//LLx6quvGq1atXLgCMVRrvazX7x4seHv72+cOXOmJIYnDnS1n/1bb71l1K1bN9e+Dz74wKhRo4bDxiiOBxgLFiy4bJvnn3/eaNy4ca59//znP40OHTpc1bU0gyxlSmpqKlu2bKF79+659nfv3p1169YVqo/MzEwuXLhAxYoVHTFEcaCifv4zZ87k0KFDvPrqq44eojhIUT77hQsX0rZtW958802qV69Ow4YN+fe//01SUlJJDFmKSVE++7CwME6cOMGiRYswDIPTp0/z7bffcvvtt5fEkMWJ1q9fn+ffSo8ePdi8eTNpaWmF7sfpK+mJXI3Y2FgyMjII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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "thresholds, f1_scores = calculate_correlation_score_confidence(test_x, test_y)\n", "\n", "first_class = [ el[0] for el in f1_scores ]\n", "second_class = [ el[1] for el in f1_scores ]\n", "all_classes = [ el[2] for el in f1_scores ]\n", "\n", "fig, ax = plt.subplots(figsize=(8,6))\n", "plt.plot(thresholds, first_class, label = \"F1 Score - Correct class\")\n", "plt.plot(thresholds, second_class, label = \"F1 Score - Incorrect class\")\n", "plt.plot(thresholds, all_classes, label = \"F1 Score - All classes\", linewidth=2.0, color=\"blue\")\n", "plt.legend(loc = 'lower left')\n", "plt.ylim([0.6, 1])\n", "plt.xlim([0.025, 1])\n", "plt.xlabel(\"Threshold\", fontsize = 12)\n", "plt.ylabel(\"F1 Score\", fontsize = 12)\n", "# plt.axvline(thresholds[np.argmin(abs(precision-recall))], color=\"k\", ls = \"--\")\n", "# plt.title(label = F\"Threshold = {thresholds[np.argmin(abs(precision-recall))]:.3f}\", fontsize = 12)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2. ROC curve" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal Threshold: 0.6863927762156125\n" ] }, { "data": { "image/png": "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+nLq1CmXjjVs2DB69epF48aNad68Oe+99x779u0j6n8DF0eOHMnBgweZN28eHh4e3HDDDVleHxISgp+fX7Z2EcmF9evhwQetSfkOH4bly+2uSETELVwONzVq1CAuLo5q1aplaf/yyy+pX7++S8eKjIzk6NGjjBs3joSEBG644QaWL1/uPHZCQsIV57wRERdlZsLrr8O//gUZGRAeDuPH212ViIjbuLz8wpw5c3jhhRd48803GTBgAO+//z67d+9m/PjxvP/++zz44IP5VatbaPkFKdH++gt694avvrK2e/aE6dOhdGl76xIRuQJXvr9d7rnp168f6enpjBgxgpSUFHr06EGlSpV46623Cn2wESnRfv4ZOnSAQ4fA3x/eeQf69dOgYREpdq5q4cwjR46QmZlJSEiIO2vKV+q5kRLr5ElrwUuHAxYtAo1VE5EiJF97bi5Urly5q3m5iOS3o0fhmmusBS5LlbIGDYeEKH2LSLGWpwHFOU2yd86ePXuuqiARcZNvvrHG1Awfbj0AatSwtyYRkQLgcrgZMmRIlu2zZ88SGxvLV199xbPPPuuuukQkrzIyYOxYazI+Y2DBAms5hVwuWSIiUtS5/Lfd008/nWP71KlT2bJly1UXJCJX4dAh6NEDVq+2th95xFoEU8FGREoQty2c2alTJxYvXuyuw4mIq77+Gm6+2Qo2pUpZPTbvvWfdGSUiUoK47Z9zn376Kddee627DicirkhIsNaFSk2FBg0gOtqanE9EpARyOdw0bNgwy4BiYwyJiYn89ddfTJs2za3FiUguVawIr70GO3fCm2+Cn5/dFYmI2MblcHPPPfdk2fbw8KB8+fLcfvvt1K1b1111iciVfPEFVKpk9dQAXGI8nIhISeNSuElPT6d69ep06NCBChUq5FdNInI5aWnw/PNWD81110FMjJZPEBG5gEsDir28vHj88cdJTU3Nr3pE5HL++ANuu80KNgBduoCPj60liYgUNi7fLdW0aVNiY2PzoxYRuZxly6BhQ/jhByhTxtqeNAl8fW0uTESkcHF5zM2gQYN45plnOHDgABEREQReNI37TTfd5LbiRAQ4e9aaYXjKFGu7WTP4+GOoVs3eukRECqlch5v+/fszefJkIiMjARg8eLDzOYfDgTEGh8NBRkaG+6sUKck8PGD7duvn4cPhlVfA29vemkRECrFcrwru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7oZKTbXavLygWzcFGxERkTxQuLHTn39Cx47wr3/BDz9YA4ZFRETkqijc2OXbb627oVauBH9/mD0beva0uyoREZEiT+GmoGVkWGNq2raFxESoXx+2bIF+/XQZSkSkGKpevTqTJ0+2u4wSReGmoA0bBmPHWjMP9+8PmzdbAUdERPJF3759cTgcOBwOvLy8qFq1Ko8//jjHjh2zu7R8l5yczAsvvMD111+Pv78/ZcuW5ZZbbuH1118v1p9fd0sVtKefhsWL4dVX4eGH7a5GRKRE6NixI3PmzCE9PZ3t27fTv39/jh8/zsKFC+0uLd/8/fff3HrrrSQnJ/Pvf/+biIgIfHx8+P3331mwYAELFizgiSeesLvMfKGem/yWnm6NqzmnZk3YvVvBRkSKj1OnLv04cyb3+54+feV988jX15cKFSpQuXJl2rdvT2RkJCtWrHA+n5GRwYABA6hRowb+/v7UqVOHt956K8sx+vbtyz333MOECROoWLEiZcuW5YknnuDs2bPOfQ4fPkzXrl3x9/enRo0azJ8/P1st+/bt4+6776ZUqVIEBQXRvXt3/vzzT+fzY8aMoUGDBsyePZuqVatSqlQpHn/8cTIyMnj99depUKECISEhvPzyy5f9zM8//zz79u3jhx9+oF+/ftx0003UrVuXf/zjHyxYsIBBgwY593U4HCxbtizL68uUKcPcuXOd2wcPHiQyMpJrrrmGsmXLcvfdd/PHH384n1+1ahVNmjQhMDCQMmXK0LJlS/bu3QvAjz/+SJs2bShdujRBQUFERESwZcuWy9Z/NdRzk58OHIAePWDdOvjqK2jf3mr39bW3LhERdypV6tLPde4MX3xxfjskBFJSct63dWtYter8dvXqcORI1n2MyWuVTnv27OGrr77C29vb2ZaZmUnlypVZtGgR5cqVY8OGDTz66KNUrFiR7t27O/f77rvvqFixIt999x2///47kZGRNGjQgEceeQSwAtD+/fv59ttv8fHxYfDgwRw+fPiC8g333HMPgYGBrF69mvT0dAYNGkRkZCSrLvjsu3fv5ssvv+Srr75i9+7d3H///cTHxxMeHs7q1avZsGED/fv3584776RZs2bZPmNmZibR0dE8/PDDVKpUKcfz4HBhnGdKSgpt2rShVatWrFmzBi8vL1566SU6duzITz/9hIeHB/fccw+PPPIICxcuJC0tjU2bNjnfo2fPnjRs2JDp06fj6elJXFxclvPvdsZmU6dONdWrVze+vr6mUaNGZs2aNZfdf9WqVaZRo0bG19fX1KhRw0yfPt2l90tKSjKASUpKupqyszl50hjr/zrrZ/PFF8aULWs1lC5tzJIlbn0/EZGCdPr0abN9+3Zz+vTp7E+e+8svp0fnzln3DQi49L6tW2fdt1y57PvkQZ8+fYynp6cJDAw0fn5+BjCAmThx4mVfN2jQIHPfffdlOU61atVMenq6s+2BBx4wkZGRxhhjfvvtNwOY77//3vn8jh07DGAmTZpkjDFmxYoVxtPT0+zbt8+5zy+//GIAs2nTJmOMMaNHjzYBAQEmOTnZuU+HDh1M9erVTUZGhrOtTp06Zvz48TnWnpiYmONnbNSokQkMDDSBgYHmwQcfdLYDZunSpVn2DQ4ONnPmzDHGGDNr1ixTp04dk5mZ6Xw+NTXV+Pv7m6+//tocPXrUAGbVqlU51lO6dGkzd+7cHJ+70OV+z1z5/ra15yY6OpohQ4Ywbdo0WrZsybvvvkunTp3Yvn07VatWzbZ/fHw8nTt35pFHHuGjjz5i/fr1DBo0iPLly3PffffZ8Amy8+Is3v8aBZPfsBoaNYLoaGuNKBGR4ujkyUs/5+mZdfuCXoxsPC4aKXHBJY+r1aZNG6ZPn05KSgrvv/8+O3fu5Kmnnsqyz4wZM3j//ffZu3cvp0+fJi0tjQYNGmTZ5/rrr8fzgs9UsWJFtm3bBsCOHTvw8vKicePGzufr1q1LmQsWPN6xYwdVqlShSpUqzrb69etTpkwZduzYwS233AJYd1iVLl3auU9oaCienp54XHCOQkNDs/QK5eTi3pmlS5eSlpbGP//5T05ffBnwMmJiYvj999+z1ARw5swZdu/eTfv27enbty8dOnSgXbt2tG3blu7du1OxYkUAhg0bxsCBA/nwww9p27YtDzzwALVq1cr1+7vK1jE3EydOZMCAAQwcOJB69eoxefJkqlSpwvTp03Pcf8aMGVStWpXJkydTr149Bg4cSP/+/ZkwYUIBV56zquxlDbfhcy7YPPWUtbq3go2IFGeBgZd++Pnlfl9//yvvm+cSA6lduzY33XQTU6ZMITU1lbFjxzqfX7RoEUOHDqV///6sWLGCuLg4+vXrR1paWpbjXHwpxeFwkJmZCViXnM61XYoxJsfnL27P6X0u994XK1++PGXKlOHXX3/N0l61alVq166dLaQ4HA5n/edcOJYoMzOTiIgI4uLisjx27txJjx49AJgzZw4bN26kRYsWREdHEx4ezvfffw9Y44h++eUXunTpwrfffkv9+vVZunRpjrW7g23hJi0tjZiYGNqfG4fyP+3bt2fDhg05vmbjxo3Z9u/QoQNbtmzJ8odwodTUVJKTk7M88sttrKE532OCg607oqZM0fgaEZFCaPTo0UyYMIFDhw4BsHbtWlq0aMGgQYNo2LAhtWvXZvfu3S4ds169eqSnp2cZKPvbb79x/Phx53b9+vXZt28f+/fvd7Zt376dpKQk6tWrd3Uf6gIeHh50796djz76iIMHD15x//Lly5OQkODc3rVrFykXjI1q1KgRu3btIiQkhNq1a2d5BAcHO/dr2LAhI0eOZMOGDdxwww0sWLDA+Vx4eDhDhw5lxYoV3HvvvcyZM8dNnzY728LNkSNHyMjIIDQ0NEt7aGgoiYmJOb4mMTExx/3T09M5cvGgs/8ZP348wcHBzseFXYHu9hG9GMkrnF4fC/fem2/vIyIiV+f222/n+uuv55VXXgGgdu3abNmyha+//pqdO3fywgsvsHnzZpeOWadOHTp27MgjjzzCDz/8QExMDAMHDsT/gh6ptm3bctNNN9GzZ0+2bt3Kpk2b6N27N61bt85yOcsdXnnlFSpVqkTTpk2ZPXs2P/30E7t372bp0qVs3Lgxy+W1O+64g3feeYetW7eyZcsWoqKisvQU9ezZk3LlynH33Xezdu1a4uPjWb16NU8//TQHDhwgPj6ekSNHsnHjRvbu3cuKFSvYuXMn9erV4/Tp0zz55JOsWrWKvXv3sn79ejZv3uzWMHcx228Fv7h77lJddpfbP6f2c0aOHElSUpLzcWFadqeAAOuy879OjsS/fo18eQ8REXGfYcOGMXPmTPbv309UVBT33nsvkZGRNG3alKNHj2a5VTq35syZQ5UqVWjdujX33nsvjz76KCEhIc7nz91yfc0113DbbbfRtm1batasSXR0tDs/GgBly5Z1hqc33niDJk2acOONNzJmzBgiIyOZOXOmc98333yTKlWqcNttt9GjRw+GDx9OQECA8/mAgADWrFlD1apVuffee6lXrx79+/fn9OnTBAUFERAQwK+//sp9991HeHg4jz76KE8++SSPPfYYnp6eHD16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ihUrUqlSJYKDg51t9erVwxjDgQMHuO666/K15qIoL+d5/PjxtGzZkmeffRaAm266icDAQFq1asVLL72knnU3set7UD03ueTj40NERAQrV67M0r5y5UpatGiR42uaN2+ebf8VK1bQuHFjvL29863Woiwv5xmsHpu+ffuyYMECXTPPBVfPc1BQENu2bSMuLs75iIqKok6dOsTFxdG0adOCKr1Iycvvc8uWLTl06BAnT550tu3cuRMPDw8qV66cr/UWVXk5zykpKXh4ZP0K9PT0BM73LMjVs+17MF+HKxcz5241nDVrltm+fbsZMmSICQwMNH/88YcxxpjnnnvO9OrVy7n/uVvghg4darZv325mzZqlW8FzwdXzvGDBAuPl5WWmTp1qEhISnI/jx4/b9RGKBFfP88V0t1TuuHqeT5w4YSpXrmzuv/9+88svv5jVq1eb6667zgwcONCuj1AkuHqe58yZY7y8vMy0adPM7t27zbp160zjxo1NkyZN7PoIRcKJEydMbGysiY2NNYCZOHGiiY2Ndd5yX1i+BxVuXDR16lRTrVo14+PjYxo1amRWr17tfK5Pnz6mdevWWfZftWqVadiwofHx8THVq1c306dPL+CKiyZXznPr1q0NkO3Rp0+fgi+8iHH19/lCCje55+p53rFjh2nbtq3x9/c3lStXNsOGDTMpKSkFXHXR4+p5njJliqlfv77x9/c3FStWND179jQHDhwo4KqLlu++++6yf98Wlu9BhzHqfxMREZHiQ2NuREREpFhRuBEREZFiReFGREREihWFGxERESlWFG5ERESkWFG4ERERkWJF4UZERESKFYUbERERKVYUbkQki7lz51KmTBm7y8iz6tWrM3ny5MvuM2bMGBo0aFAg9YhIwVO4ESmG+vbti8PhyPb4/fff7S6NuXPnZqmpYsWKdO/enfj4eLccf/PmzTz66KPObYfDwbJly7LsM3z4cL755hu3vN+lXPw5Q0ND6dq1K7/88ovLxynKYVPEDgo3IsVUx44dSUhIyPKoUaOG3WUB1irjCQkJHDp0iAULFhAXF8ddd91FRkbGVR+7fPnyBAQEXHafUqVKUbZs2at+ryu58HN+8cUXnDp1ii5dupCWlpbv7y1SkinciBRTvr6+VKhQIcvD09OTiRMncuONNxIYGEiVKlUYNGgQJ0+evORxfvzxR9q0aUPp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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# calculate the fpr and tpr for all thresholds of the classification\n", "probs = best_model.predict_proba(test_x)\n", "preds = probs[:,1]\n", "fpr, tpr, threshold = roc_curve(test_y, preds)\n", "roc_auc = auc(fpr, tpr)\n", "\n", "optimal_idx = np.argmax(tpr - fpr)\n", "optimal_threshold = threshold[optimal_idx]\n", "print(f\"Optimal Threshold: {optimal_threshold}\")\n", "\n", "# method I: plt\n", "plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)\n", "plt.plot([0, 1], [0, 1],'r--', label=\"Random Guess\")\n", "plt.legend(loc=4)\n", "plt.ylabel('True Positive Rate')\n", "plt.xlabel('False Positive Rate')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.13 (conda)", "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.13" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "9260f401923fb5c4108c543a7d176de9733d378b3752e49535ad7c43c2271b65" } } }, "nbformat": 4, "nbformat_minor": 2 }