{ "cells": [ { "cell_type": "markdown", "id": "8a9ac0ba-6c8b-4ac9-9e1f-af53d02425ab", "metadata": {}, "source": [ "# Introduction\n", "\n", "This article covers:\n", "\n", "* Precision\n", "* Recall\n", "* F1 Score\n", "\n", "# Motivation\n", "\n", "Suppose we are tasked with detecting anomalies in the following dataset." ] }, { "cell_type": "code", "execution_count": 1, "id": "c4d585ea-46f2-4b5c-9ea6-7b4720445322", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "n = 200\n", "f = 4 # Frequency\n", "\n", "x = np.cos(np.linspace(0, 2 * f * np.pi, n))\n", "x[50] = 2\n", "x[75] = -1.5\n", "\n", "y = np.zeros(n)\n", "y[50] = 1\n", "y[75] = 1\n", "\n", "outlier_pos = np.argwhere(y)[:, 0]\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot(x)\n", "ax.scatter(outlier_pos, x[outlier_pos], color=\"tab:orange\", label=\"outliers\")\n", "ax.legend()" ] }, { "cell_type": "markdown", "id": "b507c9bd-327f-47c1-ab08-487222ad38d5", "metadata": {}, "source": [ "Our dataset `x` has two outliers. Let us use a simple threshold to find these outliers. A threshold of 1.75 means our model will only capture one of the outliers." ] }, { "cell_type": "code", "execution_count": 2, "id": "071cdbc2-70e1-480f-a788-bfd3def79d41", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of outliers found: 1\n" ] } ], "source": [ "def find_outliers(x, threshold=1.5):\n", " return (x >= threshold) | (x <= - threshold)\n", "\n", "y_hat = find_outliers(x, 1.75)\n", "print(\"Number of outliers found:\", sum(y_hat))" ] }, { "cell_type": "markdown", "id": "d4819cca-29f9-40e9-b40a-4ad57d354d4f", "metadata": {}, "source": [ "Now let us calculate the accuracy of our predictions." ] }, { "cell_type": "code", "execution_count": 3, "id": "11d35a8d-cd1d-4d73-b219-c0a1a6a5a456", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.995" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(y == y_hat).mean()" ] }, { "cell_type": "markdown", "id": "27c04cfa-7f56-4678-b992-733391645132", "metadata": {}, "source": [ "The model is 99.5% accuracy. But since this is an outlier detection problem, we know that outliers are going to be rare so have a model that can find the *not anomalous* points is not very useful.\n", "\n", "In fact, in this example, if our model simply predicted *not anomalous* all the time, then it would have an accuract of 99% since there are 200 data points and 2 anomalies. This highlights the limitations of using accuracy in some problems. What we can use instead is precision and recall.\n", "\n", "## Precision\n", "\n", "Precision is a measure of the proportion of predicted positives that were actually true positives." ] }, { "cell_type": "code", "execution_count": 11, "id": "1a23a9c1-ce1b-46ae-93c0-9727c4efbc70", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.core.display import Image\n", "from IPython.display import display\n", "\n", "display(Image(url='Images/precision.png', width=200))" ] }, { "cell_type": "markdown", "id": "000c5c8f-17fa-4807-b7e2-eb68240143f0", "metadata": {}, "source": [ "The formula for precisions is:\n", "\n", "$$\n", " \\text{precision} = \\frac{\\text{TP}}{\\text{TP + FP}}\n", "$$\n", "\n", "Let us calculate precision for our example." ] }, { "cell_type": "code", "execution_count": 17, "id": "2c354102-8236-4cc8-9e12-ec11c1e7ead0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TP: 1, FP: 0\n" ] } ], "source": [ "tp = ((y == 1) & (y_hat == 1)).sum()\n", "fp = ((y == 0) & (y_hat == 1)).sum()\n", "\n", "print(f\"TP: {tp}, FP: {fp}\")" ] }, { "cell_type": "markdown", "id": "a4281034-2f4c-41a9-95b2-f68bd5148cfb", "metadata": {}, "source": [ "So, the precisions is:" ] }, { "cell_type": "code", "execution_count": 19, "id": "3c884d2e-bcb7-470c-b433-b48bb848455a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Precision: 1.0\n" ] } ], "source": [ "precision = tp / (tp + fp)\n", "print(f\"Precision: {precision}\")" ] }, { "cell_type": "markdown", "id": "f15d46f7-aa10-4c25-8d97-daca316aceb5", "metadata": {}, "source": [ "So, the precision higher than the accuracy. This metric still misses the fact that one of the true positives has been missed. This is where recall comes in.\n", "\n", "## Recall\n", "\n", "Recall is the proportion of actuall positives that were predicted to be positive. It involes true positives and false negatives." ] }, { "cell_type": "code", "execution_count": 20, "id": "684892b9-4db2-4bfd-9015-84ad6e4561d6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.core.display import Image\n", "from IPython.display import display\n", "\n", "display(Image(url='Images/recall.png', width=200))" ] }, { "cell_type": "markdown", "id": "55c1d8cc-11d3-44d9-8b53-ef71f8b4a0f2", "metadata": {}, "source": [ "The formula for recall is:\n", "\n", "$$\n", " \\text{recall} = \\frac{\\text{TP}}{\\text{TP} + \\text{FN}}\n", "$$\n", "\n", "Let us calculate recall for our example." ] }, { "cell_type": "code", "execution_count": 22, "id": "239e51e4-b223-4530-9de6-a3b009ff4300", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5\n" ] } ], "source": [ "tp = ((y == 1) & (y_hat == 1)).sum()\n", "fn = ((y == 1) & (y_hat == 0)).sum()\n", "\n", "recall = tp / (tp + fn)\n", "\n", "print(recall)" ] }, { "cell_type": "markdown", "id": "69b976b0-14ec-4e8e-bc25-3b2a3506f7d1", "metadata": {}, "source": [ "Our model detect one anomaly correctly but detected the other incorrectly to recall reflects reflects that property well.\n", "\n", "Recall does not take into account false positives though which may be important. F1 score combines both precision and recall.\n", "\n", "## F1 Score\n", "\n", "F1 score is the harmonic mean of precision and recall. We will discuss the harmonic mean later on but for now let create our own version of F1 score using the arithmetic mean (add up your numbers and divide by how many there are). So, the formula for our version of F1 score which we will call $\\hat{F1}$ is:\n", "\n", "$$\n", " \\hat{F1} = \\frac{\\text{precision} + \\text{recall}}{2}\n", "$$\n", "\n", "Let us calculate $\\hat{F1}$ for our model." ] }, { "cell_type": "code", "execution_count": 24, "id": "a19751f5-876d-42b9-9807-3cfd88c9ae86", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "F1 hat 0.75\n" ] } ], "source": [ "tp = ((y == 1) & (y_hat == 1)).sum()\n", "fp = ((y == 0) & (y_hat == 1)).sum()\n", "fn = ((y == 1) & (y_hat == 0)).sum()\n", "\n", "precision = tp / (tp + fp)\n", "recall = tp / (tp + fn)\n", "\n", "f1_hat = (precision + recall) / 2\n", "\n", "print(f\"F1 hat: {f1_hat}\")" ] }, { "cell_type": "markdown", "id": "475a774f-c543-45b9-aacf-eb4477177039", "metadata": {}, "source": [ "$\\hat{F1}$ is slightly higher than recall, so our score has been increased because the model did not predict any false positives." ] }, { "cell_type": "markdown", "id": "8bdd87ab-86c8-4898-9240-202c1bb51913", "metadata": {}, "source": [ "# F1 Score\n", "\n", "F1 score is a method for quantifying the performance of a model. It is typically used for binarcy classification but F1 score can be extended to multiclass problems as well." ] }, { "cell_type": "code", "execution_count": 4, "id": "ab9e3e9d-da38-46a2-8856-a92bdf0d7324", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: numpy in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (1.26.4)\n", "Requirement already satisfied: scikit-learn in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (1.5.0)\n", "Requirement already satisfied: matplotlib in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (3.8.3)\n", "Requirement already satisfied: scipy>=1.6.0 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from scikit-learn) (1.13.1)\n", "Requirement already satisfied: joblib>=1.2.0 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from scikit-learn) (1.4.2)\n", "Requirement already satisfied: threadpoolctl>=3.1.0 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from scikit-learn) (3.5.0)\n", "Requirement already satisfied: cycler>=0.10 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (0.12.1)\n", "Requirement already satisfied: kiwisolver>=1.3.1 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (1.4.5)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (3.1.2)\n", "Requirement already satisfied: python-dateutil>=2.7 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (2.9.0.post0)\n", "Requirement already satisfied: fonttools>=4.22.0 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (4.49.0)\n", "Requirement already satisfied: packaging>=20.0 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (24.0)\n", "Requirement already satisfied: pillow>=8 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (10.2.0)\n", "Requirement already satisfied: contourpy>=1.0.1 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from matplotlib) (1.2.0)\n", "Requirement already satisfied: six>=1.5 in /home/alex/documents/notes/.venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install numpy scikit-learn matplotlib" ] }, { "cell_type": "code", "execution_count": 34, "id": "b7811b8e-adcd-47e5-9c10-0b8ba8f622b6", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn import linear_model" ] }, { "cell_type": "markdown", "id": "3f48021b-2996-4622-bf14-d1f73cb7377a", "metadata": {}, "source": [ "Let us create a toy dataset classifying two gaussian distributions." ] }, { "cell_type": "code", "execution_count": 31, "id": "324820ef-bad7-477d-bb1d-833a38834ed3", "metadata": {}, "outputs": [], "source": [ "n = 50\n", "x = np.concatenate([\n", " np.random.normal([1, 0], 1, size=(n, 2)),\n", " np.random.normal([-1, 0], 1, size=(n, 2))\n", "])\n", "y = np.asarray([0] * n + [1] * n)" ] }, { "cell_type": "markdown", "id": "8d40b144-4bc4-42db-b567-60cf13152c06", "metadata": {}, "source": [ "Plot `x` and `y`." ] }, { "cell_type": "code", "execution_count": 32, "id": "3a23d4e6-70a5-4569-951b-bb84941c4bf0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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rbfeUkdHh5qbmxUKhfTyyy+bHpK1Nm7cqFtvvVV1dXWaPn267r33Xn3wwQemh2WlLVu26KabbhppZLZo0SL98pe/dOXcBCJZ3HHHHdq+fbs++OAD/fznP9fRo0f1zW9+0/SwrHP48GElk0k9/fTTev/99/XjH/9YTz31lL7//e+bHpqVhoeHdd9996mzs9P0UKzz4osvat26derq6tKBAwc0f/583XXXXTp16pTpoVnnwoULmj9/vjZv3mx6KNZ78803tXr1ar3zzjt67bXXdOnSJX3961/XhQsXTA/NOrNmzdLjjz+u/fv367333tOdd96pe+65R++//77zJ0+hoJ07d6ZCoVBqeHjY9FCs9/d///eplpYW08Ow2jPPPJOKRCKmh2GVtra21OrVq0e+TiQSqebm5tTGjRsNjsp+klI7duwwPQzPOHXqVEpS6s033zQ9FE+45pprUv/4j//o+HmYESng7Nmz+qd/+ictXrxYV111lenhWC8Wi6mhocH0MOAhw8PD2r9/v5YuXTryWlVVlZYuXaq9e/caHBn8JhaLSRLvUQUkEgm98MILunDhghYtWuT4+QhEcnjkkUf0+c9/XlOnTtVHH32knTt3mh6S9Y4cOaInn3xS3/3ud00PBR7y8ccfK5FIaMaMGaNenzFjhgYHBw2NCn6TTCa1du1affWrX1Vra6vp4Vjp0KFDmjJlimpqavTwww9rx44dikajjp83MIHI+vXrFQqF8n4cPnx45Pi//du/1b/927/pV7/6lcLhsFauXKlUQJrQlnqtJOn48eNqb2/Xfffdp4ceesjQyN1XzrUC4L7Vq1ert7dXL7zwgumhWOuLX/yiDh48qHfffVednZ1atWqV+vr6HD9vYFq8nz59WmfOnMl7zPXXX6/q6upxr//hD3/Q7Nmz9fbbb7syTWVaqdfqxIkTWrJkib7yla9o69atqqoKTHxb1t/V1q1btXbtWn3yyScOj84bhoeHNXnyZL300ku69957R15ftWqVPvnkE2Yj8wiFQtqxY8eo64bx1qxZo507d+qtt95SS0uL6eF4xtKlSzVv3jw9/fTTjp7nc47+dotMmzZN06ZNK+tnk8mkJGloaKiSQ7JWKdfq+PHjuuOOO7Rw4UI988wzgQpCpIn9XSGturpaCxcu1J49e0ZuqMlkUnv27NGaNWvMDg6elkql9L3vfU87duzQG2+8QRBSomQy6cp9LzCBSLHeffdd/fa3v9Xtt9+ua665RkePHtXf/d3fad68eYGYDSnF8ePHtWTJEs2dO1c//OEPdfr06ZHvNTY2GhyZnT766COdPXtWH330kRKJhA4ePChJuuGGGzRlyhSzgzNs3bp1WrVqlb785S+rra1NmzZt0oULF/TAAw+YHpp1zp8/ryNHjox83d/fr4MHD6qhoUFz5swxODL7rF69Ws8//7x27typurq6kZyjSCSiSZMmGR6dXTZs2KDly5drzpw5OnfunJ5//nm98cYbevXVV50/ueN1OR7z7//+76k77rgj1dDQkKqpqUldd911qYcffjj1hz/8wfTQrPPMM8+kJGX9wHirVq3Keq1ef/1100OzwpNPPpmaM2dOqrq6OtXW1pZ65513TA/JSq+//nrWv6NVq1aZHpp1cr0/PfPMM6aHZp2/+Zu/Sc2dOzdVXV2dmjZtWuov/uIvUr/61a9cOXdgckQAAIB9grWgDwAArEIgAgAAjCEQAQAAxhCIAAAAYwhEAACAMQQiAADAGAIRAABgDIEIAAAwhkAEAAAYQyACAACMIRABAADGEIgAAABj/n/Rs9qjxHK8bwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(x[:n, 0], x[:n, 1], color=\"tab:orange\", label=0)\n", "plt.scatter(x[n:, 0], x[n:, 1], color=\"tab:blue\", label=1)\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "0638298d-9b2a-4905-a8d3-1fbd05ce8e4b", "metadata": {}, "source": [ "Let us train a logistic regression model on this data." ] }, { "cell_type": "code", "execution_count": 36, "id": "c5bcf519-6be2-4b61-ba3e-39994e111f45", "metadata": {}, "outputs": [], "source": [ "model = linear_model.LogisticRegression()\n", "model.fit(x, y)\n", "y_hat = model.predict(x)" ] }, { "cell_type": "markdown", "id": "807f20ca-3ae9-4062-a88d-c847c3832882", "metadata": {}, "source": [ "Plot the predictions and the true labels." ] }, { "cell_type": "code", "execution_count": 46, "id": "a4766fb2-eb7f-4199-baa2-4342f311f5cb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Predictions')" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAF2CAYAAABNg1aJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABil0lEQVR4nO3de3wU5dk//s9uIAmH7EIwkHCOqYoxFRQNgqhIQQII0latqI94/GoKKtKnFezzkNJqkaqVVhH52Ra0aNHaImA1HhDFA0gV85SYYgsNqJAAgiQQIMHd+f0xzJJN9jCzO4d77vm8Xy9emmXYvSeEueaa+7qv26coigIiIiIiIiJJ+J0eABERERERkZmY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BARERERkVSY5BDZyOfz4Wc/+5nTw0joxhtvRNeuXZ0eBhER6TRw4EDceOONka/ffvtt+Hw+vP3226Z9hhviF1FrTHJIOLW1tZgxYwZOP/10dO7cGZ07d0ZxcTGmT5+Of/zjH04Pz1KjRo2Cz+dL+ivdQHPkyBH87Gc/MzUAEhF51bJly6Ku0dnZ2Tj99NMxY8YM7Nmzx+nh6fbKK68wkSFpdHB6AEStvfzyy/jBD36ADh064LrrrsPgwYPh9/uxdetW/PWvf8XixYtRW1uLAQMGOD1US/z0pz/FrbfeGvn673//O37729/ivvvuw5lnnhl5/eyzz07rc44cOYJ58+YBUBMrIiJK389//nMUFhbi2LFjeO+997B48WK88sorqK6uRufOnW0bx8UXX4yjR48iMzPT0J975ZVXsGjRopiJztGjR9GhA28byT3400rC2L59O6655hoMGDAAa9euRUFBQdTvL1iwAE888QT8/sQTkE1NTejSpYuVQ7XM2LFjo77Ozs7Gb3/7W4wdOzZhMuLmcyYiksX48eNx3nnnAQBuvfVW9OjRA7/+9a+xatUqTJ06td3xVl27/X4/srOzTX1Ps9+PyGosVyNh/OpXv0JTUxOWLl3aLsEBgA4dOuCuu+5Cv379Iq9p60e2b9+OCRMmICcnB9dddx0ANXj86Ec/Qr9+/ZCVlYUzzjgDDz/8MBRFifz5HTt2wOfzYdmyZe0+r21Z2M9+9jP4fD5s27YNN954I7p164ZgMIibbroJR44cifqzzc3NuOeee5CXl4ecnBxMnjwZX375ZZrfoehx1NTU4Nprr0X37t0xcuRIAOqsTKxk6MYbb8TAgQMj55yXlwcAmDdvXtwSuF27dmHKlCno2rUr8vLy8N///d8IhUKmnAMRkReMHj0agFqGnShehcNhLFy4EGeddRays7PRq1cv3H777fj666+j3k9RFNx///3o27cvOnfujEsvvRSffvppu8+Ntybnww8/xIQJE9C9e3d06dIFZ599Nn7zm98AUOPEokWLACCq9E4TK0588sknGD9+PAKBALp27YrvfOc72LhxY9QxWinf+++/j1mzZiEvLw9dunTBd7/7Xezbty/q2I8++gjjxo3DKaecgk6dOqGwsBA333yzzu82UTTO5JAwXn75ZXzrW9/CsGHDDP25b775BuPGjcPIkSPx8MMPo3PnzlAUBZMnT8a6detwyy23YMiQIXjttdfw4x//GLt27cKjjz6a8jivvvpqFBYWYv78+di8eTN+97vfoWfPnliwYEHkmFtvvRXLly/HtddeixEjRuCtt97CxIkTU/7MWK666iqcdtpp+OUvfxmVuCWTl5eHxYsXo7y8HN/97nfxve99D0B0CVwoFMK4ceMwbNgwPPzww3jzzTfxyCOPoKioCOXl5aaeBxGRrLZv3w4A6NGjB4DY8QoAbr/9dixbtgw33XQT7rrrLtTW1uLxxx/HJ598gvfffx8dO3YEAMydOxf3338/JkyYgAkTJmDz5s247LLL0NLSknQsb7zxBi6//HIUFBTg7rvvRn5+Pv75z3/i5Zdfxt13343bb78du3fvxhtvvIE//vGPSd/v008/xUUXXYRAIICf/OQn6NixI5YsWYJRo0bhnXfeaRfL77zzTnTv3h0VFRXYsWMHFi5ciBkzZuD5558HAOzduxeXXXYZ8vLyMHv2bHTr1g07duzAX//6V/3fcKLWFCIBNDQ0KACUKVOmtPu9r7/+Wtm3b1/k15EjRyK/N23aNAWAMnv27Kg/89JLLykAlPvvvz/q9SuvvFLx+XzKtm3bFEVRlNraWgWAsnTp0nafC0CpqKiIfF1RUaEAUG6++eao47773e8qPXr0iHxdVVWlAFB++MMfRh137bXXtnvPZP785z8rAJR169a1G8fUqVPbHX/JJZcol1xySbvXp02bpgwYMCDy9b59++KORfue/vznP496/ZxzzlGGDh2qe+xERF6xdOlSBYDy5ptvKvv27VO++OILZcWKFUqPHj2UTp06KV9++WXcePXuu+8qAJRnn3026vXKysqo1/fu3atkZmYqEydOVMLhcOS4++67TwGgTJs2LfLaunXromLHN998oxQWFioDBgxQvv7666jPaf1e06dPV+LdGraNGVOmTFEyMzOV7du3R17bvXu3kpOTo1x88cXtvjdjxoyJ+qx77rlHycjIUA4ePKgoiqKsXLlSAaD8/e9/j/n5REaxXI2E0NjYCAAxWxePGjUKeXl5kV/adHprbWcXXnnlFWRkZOCuu+6Kev1HP/oRFEXBq6++mvJY77jjjqivL7roIuzfvz9yDq+88goAtPvsmTNnpvyZesZhtljn+Z///MfSzyQicrMxY8YgLy8P/fr1wzXXXIOuXbti5cqV6NOnT+SYtvHqz3/+M4LBIMaOHYuvvvoq8mvo0KHo2rUr1q1bBwB488030dLSgjvvvDOqjExPbPnkk09QW1uLmTNnolu3blG/1/q99AqFQnj99dcxZcoUnHrqqZHXCwoKcO211+K9996LxETN//t//y/qsy666CKEQiHs3LkTACLjevnll3H8+HHDYyJqi+VqJIScnBwAwOHDh9v93pIlS3Do0CHs2bMH119/fbvf79ChA/r27Rv12s6dO9G7d+/I+2q0DmXaRTUV/fv3j/q6e/fuAICvv/4agUAAO3fuhN/vR1FRUdRxZ5xxRsqfGUthYaGp79dadnZ2ZN2Opnv37u3qw4mI6KRFixbh9NNPR4cOHdCrVy+cccYZUc1yYsWrf//732hoaEDPnj1jvufevXsBnIxbp512WtTv5+XlReJQPFrZXElJibETimPfvn04cuRIzLh25plnIhwO44svvsBZZ50VeT1R7ASASy65BN///vcxb948PProoxg1ahSmTJmCa6+9FllZWaaMm7yFSQ4JIRgMoqCgANXV1e1+T6vr3bFjR8w/m5WVlbTjWjzxnmAlWmCfkZER83XFwLoYM3Tq1Kndaz6fL+Y4jDYMiHeOREQUX2lpaaS7Wiyx4lU4HEbPnj3x7LPPxvwzbR84uVWy2Onz+fDiiy9i48aNWLNmDV577TXcfPPNeOSRR7Bx40ZuUk2GsVyNhDFx4kRs27YNmzZtSvu9BgwYgN27d+PQoUNRr2/dujXy+8DJJ0kHDx6MOi6dmZ4BAwYgHA5HnpxpPvvss5TfU6/u3bu3Oxeg/fmkUp5ARETmKyoqwv79+3HhhRdizJgx7X4NHjwYwMm49e9//zvqz+/bty/pLLtWWRDrQWJremNDXl4eOnfuHDOubd26FX6/P6oTqhEXXHABHnjgAXz00Ud49tln8emnn2LFihUpvRd5G5McEsZPfvITdO7cGTfffHPMHaKNzJRMmDABoVAIjz/+eNTrjz76KHw+H8aPHw8ACAQCOOWUU7B+/fqo45544okUzkClvfdvf/vbqNcXLlyY8nvqVVRUhK1bt0a15fy///s/vP/++1HHaR19YiVERERkn6uvvhqhUAi/+MUv2v3eN998E7lOjxkzBh07dsRjjz0WFQ/1xJZzzz0XhYWFWLhwYbvrfuv30vbsSRYbMjIycNlll2HVqlVRVRZ79uzBc889h5EjRyIQCCQdV2tff/11uzg/ZMgQAOq2DERGsVyNhHHaaafhueeew9SpU3HGGWfguuuuw+DBg6EoCmpra/Hcc8/B7/e3q2eOZdKkSbj00kvx05/+FDt27MDgwYPx+uuvY9WqVZg5c2bUeplbb70VDz74IG699Vacd955WL9+Pf71r3+lfB5DhgzB1KlT8cQTT6ChoQEjRozA2rVrsW3btpTfU6+bb74Zv/71rzFu3Djccsst2Lt3L5588kmcddZZUYtAO3XqhOLiYjz//PM4/fTTkZubi5KSEtPqtYmISJ9LLrkEt99+O+bPn4+qqipcdtll6NixI/7973/jz3/+M37zm9/gyiuvjOxXNn/+fFx++eWYMGECPvnkE7z66qs45ZRTEn6G3+/H4sWLMWnSJAwZMgQ33XQTCgoKsHXrVnz66ad47bXXAABDhw4FoDbOGTduHDIyMnDNNdfEfM/7778fb7zxBkaOHIkf/vCH6NChA5YsWYLm5mb86le/Mvx9ePrpp/HEE0/gu9/9LoqKinDo0CE89dRTCAQCmDBhguH3I2KSQ0K54oorsGXLFjzyyCN4/fXX8Yc//AE+nw8DBgzAxIkTcccdd0Sm7hPx+/1YvXo15s6di+effx5Lly7FwIED8dBDD+FHP/pR1LFz587Fvn378OKLL+KFF17A+PHj8eqrr8ZdBKrHH/7wB+Tl5eHZZ5/FSy+9hNGjR+Nvf/tbytP3ep155pl45plnMHfuXMyaNQvFxcX44x//iOeee67dpnC/+93vcOedd+Kee+5BS0sLKioqmOQQETngySefxNChQ7FkyRLcd9996NChAwYOHIjrr78eF154YeS4+++/H9nZ2XjyySexbt06DBs2DK+//rqufdjGjRuHdevWYd68eXjkkUcQDodRVFSE2267LXLM9773Pdx5551YsWIFli9fDkVR4iY5Z511Ft59913MmTMH8+fPRzgcxrBhw7B8+XLD+90BarK3adMmrFixAnv27EEwGERpaSmeffZZSxvtkLx8it2rpYmIiIiIiCzENTlERERERCQVJjlERERERCQVJjlERERERCQVJjlERERERCQVJjlERERERCQVJjlERERERCQVoffJCYfD2L17N3JycuDz+ZweDhGRZyiKgkOHDqF3797w+/k8rDXGJiIiZxiJTUInObt377Z880QiIorviy++QN++fZ0ehlAYm4iInKUnNgmd5OTk5ABQTyQQCDg8GiIi72hsbES/fv0i12E6ibGJiMgZRmKT0EmOVgYQCAQYSIiIHMByrPYYm4iInKUnNrHQmoiIiIiIpMIkh4iIiIiIpMIkh4iIiIiIpCL0mhy9QqEQjh8/7vQwLNGxY0dkZGQ4PQwiIjKIsYmIyDmuTnIURUF9fT0OHjzo9FAs1a1bN+Tn53MBMBGRCzA2ERE5z9VJjhZEevbsic6dO0t3oVUUBUeOHMHevXsBAAUFBQ6PiIiIkmFsIiJynmuTnFAoFAkiPXr0cHo4lunUqRMAYO/evejZs6drygNCYQWbag9g76Fj6JmTjdLCXGT45Qr0RERtMTYJLBwCdn4AHN4DdO0FDBgB+F0wbiJKiaWNBxYvXoyzzz47spfA8OHD8eqrr5ry3lqdc+fOnU15P5Fp5+iW2u7K6jqMXPAWpj61EXevqMLUpzZi5IK3UFld5/TQiIgYm0ziqthUsxpYWAI8fTnwl1vU/y4sUV8nIilZmuT07dsXDz74ID7++GN89NFHGD16NK644gp8+umnpn2GbGUAsbjpHCur61C+fDPqGo5FvV7fcAzlyzcz0SEixzE2mcM151izGnjhBqBxd/TrjXXq60x0iKRkaZIzadIkTJgwAaeddhpOP/10PPDAA+jatSs2btxo5ceSQ0JhBfPW1ECJ8Xvaa/PW1CAUjnUEEZE9GJs8JBwC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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(10, 4))\n", "\n", "ax[0].scatter(x[n:, 0], x[n:, 1], label=0)\n", "ax[0].scatter(x[:n, 0], x[:n, 1], label=1)\n", "ax[0].legend()\n", "ax[0].set_title(\"Ground Truth\")\n", "\n", "ax[1].scatter(x[y_hat == 0, 0], x[y_hat == 0, 1], label=0)\n", "ax[1].scatter(x[y_hat == 1, 0], x[y_hat == 1, 1], label=1)\n", "ax[1].legend()\n", "ax[1].set_title(\"Predictions\")" ] }, { "cell_type": "markdown", "id": "445ff497-3bbc-49f3-b898-08387611058c", "metadata": {}, "source": [ "The model clearly gets several predictions wrong. We can break our predictions, `y_hat`, down into for categories:\n", "\n", "1. `y_hat` is 1 and `y_hat` is 1 (true positive).\n", "2. `y_hat` is 1 and `y_hat` is 0 (false negative).\n", "3. `y_hat` is 0 and `y_hat` is 1 (false positive).\n", "4. `y_hat` is 0 and `y_hat` is 0 (true negative).\n", "\n", "Let us calculate these quantitites for our model." ] }, { "cell_type": "code", "execution_count": 54, "id": "e6cff610-3552-4d66-b382-2e5371fc0197", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true_pos: 44, true_neg: 40, false_pos: 10, false_neg: 6\n" ] } ], "source": [ "true_pos = np.sum((y == 1) & (y_hat == 1))\n", "true_neg = np.sum((y == 0) & (y_hat == 0))\n", "false_pos = np.sum((y == 0) & (y_hat == 1))\n", "false_neg = np.sum((y == 1) & (y_hat == 0))\n", "\n", "print(f\"true_pos: {true_pos}, true_neg: {true_neg}, false_pos: {false_pos}, false_neg: {false_neg}\")" ] }, { "cell_type": "markdown", "id": "935b49dc-e7eb-4fe7-955f-1d4b6515cf0c", "metadata": {}, "source": [ "Our model gives mostly true positives and true negatives which is good. When assessing the quality of the model, our appetite for false positives and false negatives may depend on our application. For example:\n", "\n", "* If 1 means a patients has a disease and 0 means they don't, we may be more willing to accept false positives than false negatives.\n", "\n", "# Precision and Recall\n", "\n", "Precisions and recall is a way of comparing the actual results with the predicted results.\n", "\n", "$$\n", "\\text{precision} = \\frac{\\text{true positive}}{\\text{true positive} + \\text{false positive}}, \\quad\n", "\\text{recall} = \\frac{\\text{true positive}}{\\text{true positive} + \\text{false negative}}\n", "$$\n", "\n", "* Precision is the proportion of positive predictions that were actually positive.\n", "* Recall is the proportion of actual positives that were predicted to be positive.\n", "\n", "Let us write functions to calculate precision and recall." ] }, { "cell_type": "code", "execution_count": 59, "id": "1c1113ec-3e82-4a05-b3c8-9d4c0bf34018", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Precision: 0.8148148148148148, Recall: 0.88\n" ] } ], "source": [ "def calculate_precision(y, y_hat):\n", " true_pos = np.sum((y == 1) & (y_hat == 1))\n", " false_pos = np.sum((y == 0) & (y_hat == 1))\n", " return true_pos / (true_pos + false_pos)\n", "\n", "def calculate_recall(y, y_hat):\n", " true_pos = np.sum((y == 1) & (y_hat == 1))\n", " false_neg = np.sum((y == 1) & (y_hat == 0))\n", " return true_pos / (true_pos + false_neg)\n", "\n", "precision = calculate_precision(y, y_hat)\n", "recall = calculate_recall(y, y_hat)\n", "\n", "print(f\"Precision: {precision}, Recall: {recall}\")" ] }, { "cell_type": "markdown", "id": "51eb22bf-9b17-499e-8bff-e458a663e7e8", "metadata": {}, "source": [ "Precisions would be 1 if we had 0 false positives. Recall would be 1 if we had 0 false negatives.\n", "\n", "# F1 Score\n", "\n", "F1 score is the harmonic mean of precision and recall. Let us first recall the definition of harmonic mean. Suppose we have a sequence of numbers $x_1, x_2, \\dots, x_n$. The harmonic mean of this set of numbers is,\n", "\n", "$$\n", "\\frac{n}{x_1^{-1} + x_2^{-1} + \\dots + x_n^{-1}}\n", "$$\n", "\n", "So, the harmonic mean of precision and recall (F1 score) is,\n", "\n", "$$\n", "F1 = \\frac{2}{\\text{precision}^{-1} + \\text{recall}^{-1}} = 2 \\frac{\\text{precision} \\cdot \\text{recall}}{\\text{precision} + \\text{recall}} = \\frac{\\text{2 tp}}{\\text{2 tp} + fp + fn}\n", "$$\n", "\n", "Let us write a function for calculate the F1 score." ] }, { "cell_type": "code", "execution_count": 62, "id": "8fe37161-50aa-4746-98b0-db1f6aa94d3b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "F1 score: 0.8461538461538461\n" ] } ], "source": [ "def calculate_f1(y, y_hat):\n", " recall = calculate_recall(y, y_hat)\n", " precision = calculate_precision(y, y_hat)\n", " return 2 * (precision * recall) / (precision + recall)\n", "\n", "f1_score = calculate_f1(y, y_hat)\n", "print(f\"F1 score: {f1_score}\")" ] }, { "cell_type": "markdown", "id": "3258961d-d3cf-4298-a5f4-167dc8559be1", "metadata": {}, "source": [ "Why is the harmonic mean used when calculating f1 score as opposed to the arithmetic mean?" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }