{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(ch2)=\n", "# Evaluating Classification Problems\n", "\n", "\n", "Classification problems are the problems were the desired output is a categorical value. For instance, learning to detect different kinds of objects such as car, bicycle, etc., predicting whether someone has a cancer or not, etc are few examples of classification problem. Similar to {ref}`Chapter 1 `, the objective of this chapter is to understand the different metrics used to evaluate classification models. We start with an open source breast cancer dataset and build a classifier. Thereafter, we try to intutively develop various metrics such as accuracy, precision, recall, and area-under-curve to compare and evaluate the classifier. Eventually, we look how to generalize these metrics from evaluating binary classification problem such as the breast cancer dataset to multi-categorical (or multiclass) problem. \n", "\n", "## Predicting Cancer\n", "Assuming we have been asked to build a model that can predict whether a person has a breast cancer or not based on various features as described in the following [dataset](https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29).\n", "In order to train the classification model, we randomly divide the dataset into training and testing dataset. As shown in the code snippet below, the training dataset is then used to build a random forest classifier. Finally we try to evaluate the performance of the classifier using the test dataset." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:24:10.725209Z", "start_time": "2020-05-19T23:24:10.687585Z" } }, "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", " \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", "
mean radiusmean texturemean perimetermean areamean smoothnessmean compactnessmean concavitymean concave pointsmean symmetrymean fractal dimension...worst textureworst perimeterworst areaworst smoothnessworst compactnessworst concavityworst concave pointsworst symmetryworst fractal dimensionhasCancer
37813.6615.1588.27580.60.082680.075480.0424900.024710.17920.05897...19.6497.96657.00.127500.310400.256900.105400.33870.096381
46413.1718.2284.28537.30.074660.059940.0485900.028700.14540.05549...23.8995.10687.60.128200.196500.187600.104500.22350.069251
29814.2618.1791.22633.10.065760.052200.0247500.013740.16350.05586...25.26105.80819.70.094450.216700.156500.075300.26360.076761
14714.9518.7797.84689.50.081380.116700.0905000.035620.17440.06493...25.47107.10809.70.099700.252100.250000.084050.28520.092181
17912.8113.0681.29508.80.087390.037740.0091930.013300.14660.06133...16.1586.70570.70.116200.054450.027580.039900.17830.073191
\n", "

5 rows × 31 columns

\n", "
" ], "text/plain": [ " mean radius mean texture mean perimeter mean area mean smoothness \\\n", "378 13.66 15.15 88.27 580.6 0.08268 \n", "464 13.17 18.22 84.28 537.3 0.07466 \n", "298 14.26 18.17 91.22 633.1 0.06576 \n", "147 14.95 18.77 97.84 689.5 0.08138 \n", "179 12.81 13.06 81.29 508.8 0.08739 \n", "\n", " mean compactness mean concavity mean concave points mean symmetry \\\n", "378 0.07548 0.042490 0.02471 0.1792 \n", "464 0.05994 0.048590 0.02870 0.1454 \n", "298 0.05220 0.024750 0.01374 0.1635 \n", "147 0.11670 0.090500 0.03562 0.1744 \n", "179 0.03774 0.009193 0.01330 0.1466 \n", "\n", " mean fractal dimension ... worst texture worst perimeter worst area \\\n", "378 0.05897 ... 19.64 97.96 657.0 \n", "464 0.05549 ... 23.89 95.10 687.6 \n", "298 0.05586 ... 25.26 105.80 819.7 \n", "147 0.06493 ... 25.47 107.10 809.7 \n", "179 0.06133 ... 16.15 86.70 570.7 \n", "\n", " worst smoothness worst compactness worst concavity \\\n", "378 0.12750 0.31040 0.25690 \n", "464 0.12820 0.19650 0.18760 \n", "298 0.09445 0.21670 0.15650 \n", "147 0.09970 0.25210 0.25000 \n", "179 0.11620 0.05445 0.02758 \n", "\n", " worst concave points worst symmetry worst fractal dimension hasCancer \n", "378 0.10540 0.3387 0.09638 1 \n", "464 0.10450 0.2235 0.06925 1 \n", "298 0.07530 0.2636 0.07676 1 \n", "147 0.08405 0.2852 0.09218 1 \n", "179 0.03990 0.1783 0.07319 1 \n", "\n", "[5 rows x 31 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "# import packages\n", "from sklearn import datasets\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.ensemble import RandomForestClassifier\n", "import pandas as pd\n", "import numpy as np\n", "from plotnine import *\n", "\n", "import warnings\n", "warnings.filterwarnings(action=\"ignore\") #, module=\"scipy\", message=\"^internal gelsd\")\n", "\n", "# load dataset\n", "cancer = datasets.load_breast_cancer()\n", "data = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n", "data.loc[:, 'hasCancer'] = cancer.target\n", "data.sample(n=5)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:49.288443Z", "start_time": "2020-05-19T23:23:49.282137Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train: (455, 31)\n", "Test: (114, 31)\n", "Number of Positive Cases In Test Dataset: 75\n", "Number of Negative Cases In Test Dataset: 39\n" ] } ], "source": [ "# split data into training and test\n", "train, test = train_test_split(data, test_size=0.2, random_state=10)\n", "print(\"Train: \", train.shape)\n", "print(\"Test: \", test.shape)\n", "print(\"Number of Positive Cases In Test Dataset: \", test[test.hasCancer == 1].shape[0])\n", "print(\"Number of Negative Cases In Test Dataset: \", test[test.hasCancer == 0].shape[0])\n", " " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:50.065125Z", "start_time": "2020-05-19T23:23:50.033155Z" } }, "outputs": [], "source": [ "clf = RandomForestClassifier(n_estimators=10, max_depth=5, random_state=10)\n", "clf.fit(train[cancer.feature_names], train['hasCancer'])\n", "test['prediction'] = clf.predict(test[cancer.feature_names])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accuracy as a Metric\n", "\n", "Once we have trained a classifier, the next challenge is how to evaluate its performance. To start with, one of the most intutive metric we can think of is \"accuracy\" i.e. percentage of test cases for which the classifier's prediction is correct. Mathematically, accuracy can be represented as \n", "$$ acc = \\frac{|T|}{|T| + |F|} $$\n", "where \n", "* $|T|$ is the number of test cases where the actual class and the predicted class match. \n", "* $|F|$ is the number of test cases where the actual class and the predicted class differ.\n", "\n", "Below code snippet shows how to calculate accuracy manually and using sklearn." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:51.488468Z", "start_time": "2020-05-19T23:23:51.479475Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy (manually): 0.97\n", "Accuracy (sklearn): 0.97\n" ] } ], "source": [ "# count number of predictions that are True i.e. predicted value == actual value\n", "true_results = test[test.hasCancer == test.prediction].shape[0]\n", "false_results = test[test.hasCancer != test.prediction].shape[0]\n", "\n", "# compute accuracy \n", "accuracy1 = float(true_results)/(true_results + false_results)\n", "print(\"Accuracy (manually): {:.2f}\".format(accuracy1))\n", "\n", "# compute accuracy using sklearn\n", "from sklearn.metrics import accuracy_score\n", "accuracy2 = accuracy_score(test['hasCancer'], test['prediction'])\n", "print(\"Accuracy (sklearn): {:.2f}\".format(accuracy2))\n", "\n", "# assert two accuracy are same\n", "assert accuracy1 == accuracy2, \"Accuracy don't match\"" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "center" }, "source": [ "Accuracy as metric suffers from two limitations. First, it can be misleading if you have a skewed dataset. Second, it's a point estimate of the performance of the model. The two points are further elaborated in the following sub sections. \n", "\n", "\n", "### Skewed Dataset\n", "\n", "Assume we are provided with a home loan application dataset and asked to build a classifier that can predict whether a home loan application is likely to get defaulted or not in future. In general, the home loan default rate is less than 1% and let's assume our dataset is representative of the population, i.e., only 1% of all the home application in our dataset have been defaulted. Now, if somebody approaches us that his/her classifier is able to achieve an accuracy of 99% of the above given dataset, it shouldn't suprise you. Given the skeweness, it can be achieved even by a constant classifier that always returns 0 i.e. the application is not likely to be defaulted. This constant classifier will be correct 99% of the time. **Thus, in the case of a skewed dataset, accuracy as a metric can be misleading.** \n", "\n", "One way to overcome the skewed dataset issue is to measure accuracy for each individual categories. This idea leads us to confusion matrix. As shown in the table below, a confusion matrix is a simple matrix where one axes contains actual categories and the other contains predicted categories. The cells contains number of test cases falling in a particular combination of actual and predicated categories.\n", "\n", "|_ | **Predicted Positive** | **Predicted Negative** |\n", "|:-------:|:-----------------------:|:--------------------:|\n", "| **Actual Positive** | True Positive (FP) | False Negatives (FN) |\n", "| **Actual Negative** | False Positive (FP) | True Negative (TN) |\n", "\n", "\n", "An easy way to remember the nomeclature (TP, FN, FP and TN) is to remember that\n", "1. T/F indicates whether the actual class and the predicted class matches or not. \n", "2. P/N indicates the predicted category. \n", "\n", "Below code snippets computes shows how to compute confusion matrix based on the model we trained above for the breast cancer dataset. \n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:52.440959Z", "start_time": "2020-05-19T23:23:52.418777Z" } }, "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", "
prediction01
hasCancer
0381
1273
\n", "
" ], "text/plain": [ "prediction 0 1\n", "hasCancer \n", "0 38 1\n", "1 2 73" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cm = test.groupby(['hasCancer', 'prediction']).size().reset_index().rename(columns={0: 'NumTestCases'})\n", "cm.pivot_table(index='hasCancer', columns='prediction', values='NumTestCases')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the above matrix, we can construct many different interesting matrix. For instance, we can notice that our trained classifier for the breast cancer dataset is able to detect 97% (73 of 75) positive cases correctly. This is known as True Positive Rate (TPR). TPR is also referred as sensitivity or recall. We can also compute what percentage of negative cases have been classified as positive. This is known as false positive rate or FPR. Based on the above confusion matrix we known that FPR is $1/39$ or about 2.5%. There are many other metrics defined based on confusion matrix and you can find a good summary of those over [here](https://en.wikipedia.org/wiki/Confusion_matrix). \n", "\n", "\n", "### Point Estimate\n", "\n", "Classifiers usually assign probability scores to each of the output categories and the category with the highest probability score is usually treated as the predicted category. As shown below, one can examine probability score of individual categories using `predict_proba` function. Notice that the final prediction correspond to the class with the highest probability score. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:53.319989Z", "start_time": "2020-05-19T23:23:53.265297Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
prob_0 prob_1 prediction
5370.030.971
160.780.220
3080.040.961
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "probs = clf.predict_proba(test[cancer.feature_names])\n", "test['prob_{}'.format(clf.classes_[0])] = probs[:, 0]\n", "test['prob_{}'.format(clf.classes_[1])] = probs[:, 1]\n", "\n", "test.sample(3)[['prob_0', 'prob_1', 'prediction']].style.format({\n", " 'prob_0': \"{:.2f}\",\n", " 'prob_1': \"{:.2f}\",\n", "})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the case of binary classifier, the predicted category naturally has probability score more than 0.5. Thus, we can say that $y=1$ only if $P(y=1|x) > 0.5$, otherwise its $y=0$. We can further generalize above condition by replacing static 0.5 with a threshold, say $\\tau$. Thus, $y=1$ only if $P(y=1|x) > \\tau$, otherwise its $y=0$. \n", "\n", "Introducing $\\tau$ has an advantage. By changing $\\tau$ we can influence TPR, FPR, etc and thereby influence the same model to have higher precision or recall. For instance, in the case of breast cancer dataset, let's assume that the cost of false negative (i.e predicting negative when one has a breast cancer) is very high and thereby one of the requirements is to have false positive rate less than 1%. From the above confusion matrix, we can examine that the existing trained model has false negative rate (FNR) of $2/75 \\approx 2.5%$. One simple way to meet the requirement of having FNR is to lower down $\\tau$. By reducing the value of $\\tau$, we will allow more samples to be predicted as positives and thereby decreases FNR. Below code snippet demonstrates this by changing $\\tau$ from 0 to 1 in step of 0.01. \n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:56.898074Z", "start_time": "2020-05-19T23:23:53.948250Z" } }, "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", "
thresholdtprfprfnraccuracy
460.0461.0000000.4615380.0000000.842105
2130.2131.0000000.2820510.0000000.903509
4060.4060.9866670.1025640.0133330.956140
9700.9700.6800000.0000000.3200000.789474
9830.9830.6533330.0000000.3466670.771930
\n", "
" ], "text/plain": [ " threshold tpr fpr fnr accuracy\n", "46 0.046 1.000000 0.461538 0.000000 0.842105\n", "213 0.213 1.000000 0.282051 0.000000 0.903509\n", "406 0.406 0.986667 0.102564 0.013333 0.956140\n", "970 0.970 0.680000 0.000000 0.320000 0.789474\n", "983 0.983 0.653333 0.000000 0.346667 0.771930" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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izXPMNeQTp4XLlyoffbZR3PmzJHP55PP5+zX8cXP93o9jseTyfhu06P9e+X7TS++3/Rg/A4Ovt/0YPwODr7fvvNleWXHu/nOPJLHsjo97qbx64YY4F6seXYjizYKAAAAMJfXpx67bTPFEqYieQYAAACQUh5vD922LapEMBfJswtZ4pwCAAAAc/XcbVuyuNCFoUieXYgWCgAAADCZx2cp3t20bapEMBjJMwAAAICU2lPlGTAVybMrWdyQAwAAgLG8PSTPsixZNAyDoUieAQAAAKQU07aRiUieXcgSHfwBAABgLk8PW1XZJM8wGMmzC7EUBAAAACbrac2z6LYNg5E8AwAAAEip1uRZsnebTknlGSYjeXYj9o4HAACAwby+1rmUdnz3ZywqzzAWyTMAAACAlPK0Jc9dmoZZNs19HDBx4kRdeumlSb3npZdekmVZeuutt/b4uuXLlysnJ2cg4RnD53QA6KrtPp3DUQAAAAD90548777u2baYYumExx9/XMOGDXM6DOORPLsQS0EAAABgMk9bltFd0zCmbQ+exsZGhUIhHXjggU6HkhGYtg0AAAAgpXqqPLMna1crVqyQz+dTaWlpp8crKioUCAR0xx136PXXX9epp56q0aNHKxwOa9asWVq5cmWn17dPs/7Tn/6kBQsWKC8vT2eddZakrtO2+3K8dmVlZTrjjDMUDodVXFys66+/vtefqaqqSt/5zndUXFysrKwszZkzR88//3yyX43rkDy7FKcUAAAAmMrbkTx3ftxmq6ouTj/9dPl8Pj3yyCOdHn/sscckSWeddZY2bdqkww47THfddZeefPJJnXnmmfrGN76he++9t8vxLrnkEk2ePFmPP/64rrjiim4/sz/HW716tRYvXqyrr75at99+e48/T0tLi+bPn6+nnnpK1113nf74xz9qv/3200knnaT3338/ma/GdZi2DQAAACClOhqGxbtWnik8d5afn68TTzxRq1at6lQdXrVqlY477jgVFBTo3HPP7Xjctm195Stf0ZYtW3THHXdoyZIlnY536qmn6uc///kePzOZ4x199NH6xS9+IUn66le/qtLSUl177bW65JJL5PF0rcXef//9Wrt2rd59913tt99+He/7+OOP9bOf/UwPP/xwH78Z96Hy7EIWe1UBAADAYD1O25ZkkT13sXDhQr3++uvavHmzJGn79u16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9BeFw2E1NDR0/LqkpKTLayxr1+/3K6+8ohtuuEEvvviiZsyYIY/Ho2HDhnVM5W+PY9asWV2OM2vWLI0ZM0bPPPOM7rvvPl111VX9+h4GgsqzC1mWReUZAAAARutu2rYtW7KpPDuhvr5ekjRy5EhJrVXodevWSZIuueQS3XzzzXrjjTdk27a2bNmiDz/8UB6PRxdffLG+973vafPmzbJtW++++6527twpSTrwwAO1cuVKxeNxvfbaa3riiSf2GENtba18Pp9GjBihWCym6667rtPNg0suuUTXXHON/vnPf8q2bX388cfatGlTx/MXXnihfvzjH+uzzz7TaaedltLvpy9IngEAAACknMdnaeenzXr+2q0d/2T94TRZCSrPTthvv/30/e9/X4cddpgKCwu1du1aHXrooZKkM844Q9dee60uuugi5eXl6aijjupIWm+66SYdcsghOvzww5Wfn6+LL75YjY2NkqRf/epX+stf/qJIJKKbb75ZCxcu3GMMX/3qV3XSSSdp33331YQJE+T3+zVu3LiO5//93/9d559/vk455RTl5ubqjDPOUEVFRcfzixYt0ocffqhzzjlHwWAw1V9Rryx7iLe7W7NmjebMmaO3335bs2fPdjSW9oHx0/JafW3kMM0bludoPJmofX85n48VC+nQPoYLCgocjiQzMX7Ti/GbXozf9GL8phfjt39qS6P69G+1Hc186sqj+uTlas08YYVmn399x+vcNH4HOzewLCst07Zzc3NTfkw3iMViGj16tJ544gnNnTt30D+fM4BLDek7GgAAADBebqFfB5y5KyEu/bBRG16qlYZ27Q4DcO+992r06NGOJM4SyTMAAACAQdDRN4olz+iHKVOmqLGxUQ899JBjMZA8u5AlbsgBAAAgQ3Ghi37orhv4YBtQwzDbtrVt27aOdSAAAAAA0B3L01p6pmEYTNWv5Pm5557Tl7/8ZQWDQY0fP17vvfeepNbW4vfff39KAxyKWk8n3JEDAABABkpwnQszJT1te9WqVVq8eLHOPvtsLV26VEuXLu14bvLkybrnnnu0aNGilAY55FikzgAAAMgsVlvZzrapPLcb4hsfGSfpyvPPfvYzXXbZZVq1apUuuOCCTs9Nnz69Y6NtAAAAAOiChmEwVNLJ86effqoTTzyx2+fC4bCqq6sHHNRQZ4nKMwAAADJMW8HZotoK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XtBFF12ks846q+cynn8RRocccoi+//3v6/e//712794ddDnAgOi2HQKtra2qra3VmjVrNGPGDEnSsmXL9P7772vlypUBV4dSNpKxuXPnTo0fP167d+/WmDFjtGrVKl100UW8eUPBDHX8GmO0fv36PsPzsmXL9N577+nJJ5+UJDU3N2vs2LFas2aNjjnmmPz+IihJI3n+/da3vqXRo0frgQcekCSefxF6y5cv17vvvqvHH3886FKAg2LZdgi8//77ymQyPS+OkjRr1iytW7cuwKqAkY3NP/7xj6qvr9eYMWN6LtuzZ4/q6+s1ZcoUXXXVVdq7d29e6gak4Y3fOXPmaPz48fra176md955p+fydevWadasWT1fV1VV6YgjjuB5Gnkz3OffPXv26De/+Y0uu+yyAy7n+RcARobwHAItLS2qrq7udVlNTY2am5sDqgjIGu7Y/PDDD7VkyZJe+/OOOuoorV27Vtu2bdPq1au1ZcsWXXrppXmpG5CGPn5XrVqljRs36oMPPtAXvvAFnXHGGWpqauq5r5qamkHfFzBSw33+ffTRR3XEEUfopJNO6rmM518AyA3CcwhUVlb2vEHr1tjYqKqqqoAqArKGMzY//vhjnX766brxxht14YUX9lxeX1+vY445Ro7jaNKkSbrnnnv0/PPPK51O561+lLahjt+vfOUrKi8vV1VVlW677TZFo1G99tprPffV2Ng46PsCRmq47w0efvjhA2adef4FgNwgPIfAtGnTZIzptURw7dq1vZZqAUEY6tjcsmWL5syZoyuvvFLXX3/9Qe/bcRz5vi/aLiBfRvrc2j1GJWnGjBlau3Ztz/daWlq0YcMGnqeRN8MZv2+99ZbWrVunSy655KD3zfMvAAwP4TkEksmkzj//fC1btkzNzc1at26dHnroIS1atCjo0lDihjI2t23bptNOO00XX3yxli5desD3X3rpJW3cuFG+72v79u265pprdMYZZyiZTBbiV0EJGsr4feedd/SXv/xFrusqnU5r+fLlamtr61n6evHFF+uFF17Q73//e7W3t+vWW2/VscceS7Mw5M1w3hs8/PDDOvvss1VfX9/rcp5/EVau66q9vV2u6yqTyai9vV1dXV1BlwX0i/AcEvfee6/Kyso0YcIEzZs3T0uXLuWYKoTCwcZmZWWlXnnlFUnSgw8+qA8++EA//vGPe50lunnzZknZGZFTTjlFyWRSs2fPVl1dnX7xi18E9nuhNAx2/O7cuVMLFy5UdXW1Jk+erDfeeEO//e1ve/Y5H3300Xr44Yd15ZVXqra2Vm+99ZaeeOKJwH4vlIbBjl9J6uzs1GOPPdZnuOb5F2F12223KR6P6/bbb9fKlSsVj8d1xRVXBF0W0C+OqgIAAAAAYADMPAMAAAAAMADCMwAAAAAAAyA8AwAAAAAwAMIzAAAAAAADIDwDAAAAADAAwjMAAAAAAAMgPAMAAAAAMADCMwAAAAAAAyA8AwBGxBgz4D+PPPKIVq1aJWOM/vznPwdW68aNG2WM0ZNPPlmw+3rmmWdkjNHGjRtH/DMBAEBwokEXAACw2+uvv97r65NOOklXX321Fi5c2HPZEUccoXfeeafQpQEAAOQM4RkAMCInnnjiAZdNnjy5z8uHw/d9dXZ2qqKiIif3BwAAMBws2wYAFFRDQ4MWLlyoqqoqTZkyRXfeeWev73/nO9/RjBkz9Pzzz+u4445TRUWFnn32WUnZWe45c+YomUyqurpaCxcu1M6dO3vd/o477tDUqVMVi8U0duxYnX766froo496Xae9vV1LlizR6NGjNWHCBP3TP/2TXNftdZ2XX35ZJ598suLxuOrq6rRo0SLt3bv3oL9bV1eXvvvd76q2tlbV1dW6/PLL1dLSMtyHCgAAhAjhGQBQUIsXL9a0adP09NNP65xzztGNN96oF198sdd1tm3bpmuuuUbXXXedXnzxRc2aNUuvv/66Tj31VFVXV+tXv/qVHnjgAb355puaP39+z+1+/vOf65ZbbtHll1+uF198UQ899JBmzZqlpqamXve/bNkyOY6jJ554QosXL9ZPfvITPfTQQz3fX7NmjebNm6eqqiqtXLlS//Iv/6Jnn31WZ599tjzP6/d3u+mmm3Tffffpe9/7np544gl5nqelS5fm6JEDAABBYtk2AKCgvvnNb2r58uWSpLlz5+q5557Tk08+qbPOOqvnOg0NDXrhhRf0pS99qeeyyy+/XCeccIKeeuopGWMkSTNnzuyZpf7qV7+qP/3pTzr22GN100039dzu0+G625e+9CX99Kc/lSTNmzdPL730kp588kktXrxYknT77bervr5e//Ef/6GysjJJ0qRJk3TmmWfq+eef1znnnHPAfe7du1f33Xefli5d2vPzzzzzTH3lK1/R1q1bR/KQAQCAEGDmGQBQUGeccUbPvxtjdPTRR2vLli29rjNmzJhewTmdTuvVV1/Vt771LXmeJ9d15bqupk2bpkmTJunNN9+UJB1//PF66623dP3112v16tXq6uoasAZJ+vznP9+rhldeeUXz58/vCc7dt6mpqdHq1av7vM+3335bbW1tOu+883pd/s1vfvNgDwcAALAE4RkAUFA1NTW9vi4vL1d7e3uvy8aPH9/r64aGBnmep+uuu05lZWW9/tm8ebM+/vhjSdn90nfddZd++9vf6pRTTtHYsWN17bXXqq2tbUg1NDQ0HFBDd1397Xv+5JNPJEnjxo076O8CAADsxLJtAEDodC/L7lZTUyNjjG6++WZ94xvfOOD6dXV1kiTHcXTttdfq2muv1datW/X4449r6dKlqqur0y233DLon19bW3tAIzJJ2rFjh2pra/u8zYQJEyRJO3fu1MSJE3vdBgAA2I+ZZwBA6CWTSZ100klav369TjjhhAP+Oeywww64zcSJE3XDDTfo2GOP1fr164f087785S/rmWee6dWB+3e/+51SqZS+/OUv93mbmTNnKh6P6+mnn+51+b//+78P6WcDAIBwYuYZAGCFH//4x5ozZ44uvPBCXXTRRRo9erS2bNmi3/3ud7rssst06qmn6qqrrtLo0aN14oknavTo0Xr11Vf117/+Vf/4j/84pJ+1bNkynXzyyfr617+uq6++Wjt27NDSpUv1xS9+UV/96lf7vE1tba0WL16sO+64Q/F4XMcff7xWrFihDRs25OLXBwAAASM8AwCscPLJJ2v16tW69dZbddlll6mzs1OHHnqo5s6dq6lTp/Zc58EHH9SDDz6odDqtz33uc7rrrrt0+eWXD+lnzZ49W//5n/+pm266Sd/85jeVTCZ17rnn6ic/+YkikUi/t7vjjjvkuq7uvPNOZTIZnXfeebrjjjt0ySWXjOh3BwAAwTO+7/tBFwEAAAAAQJix5xkAAAAAgAEQngEAAAAAGADhGQAAAACAARCeAQAAAAAYAOEZAAAAAIABEJ4BAAAAABgA4RkAAAAAgAEQngEAAAAAGADhGQAAAACAARCeAQAAAAAYAOEZAAAAAIAB/P/Ppflqc8Bv8wAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def point_estimates(df):\n", " \"\"\"\n", " Computes various metrics for a given threshold value\n", " \"\"\"\n", " p = float(df[df.hasCancer == 1].shape[0])\n", " n = float(df[df.hasCancer == 0].shape[0])\n", " \n", " def _compute(threshold):\n", " \n", " tp = df[(df.prob_1 >= threshold) & (df.hasCancer == 1)].shape[0]\n", " fp = df[(df.prob_1 >= threshold) & (df.hasCancer == 0)].shape[0]\n", " fn = df[(df.prob_1 < threshold) & (df.hasCancer == 1)].shape[0]\n", " t = df[\n", " ((df.prob_1 >= threshold) & (df.hasCancer == 1))\n", " | ((df.prob_1 < threshold) & (df.hasCancer == 0))\n", " ].shape[0]\n", " return (threshold, tp / p, fp / n, fn / p, t / (p + n))\n", " \n", " return _compute\n", " \n", "estimator = point_estimates(test)\n", "df = pd.DataFrame(\n", " [estimator(threshold/1000) for threshold in range(0, 1001, 1)],\n", " columns=['threshold', 'tpr', 'fpr', 'fnr', 'accuracy']\n", ")\n", "display(df.sample(5).sort_values('threshold'))\n", "\n", "(\n", " ggplot(df.melt(id_vars='threshold'), aes(x='threshold', y='value'))\n", " + geom_line(aes(group='variable', colour='variable'))\n", " + xlab(\"Threshold\") + ylab(\"Value\")\n", " + theme_linedraw()\n", " + theme(figure_size=(10, 8))\n", ")" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-03-26T16:47:16.154094Z", "start_time": "2019-03-26T16:47:16.143054Z" } }, "source": [ "## Area Under Curve\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As discussed above, accuracy and other metrics are point estimates. This creates a problem. For instance, consider two models both have same accuracy at 0.5. But one model has a higher accuracy when $\\tau = 0.25$ and another has a higher accuracy when $\\tau = 0.75$. How do you decide which one is better. For a moment let's think about an ideal model. \n", "\n", "As shown in the below plot (grey region), one might notice that TRP and FPR curves form a closed region. Now for a momemnt think about an ideal model and how the region bounded by TPR and FPR curve will look like ? An ideal model will be one that definitively distinguishes positive and negative test cases and is accurate 100%. Thus, an ideal will be the one that assigns a probability of 1 to positive test cases and 0 for negative test cases. As a result, TPR will be always 100% irrespective what threshold value we choose. Thus, TPR will be a horizontal line intersecting y axis at 100% point. Similarly, for an ideal model FPR will be always 0% and therefore it will be a horizontal line intersecting y-axis at 0%. TPR and FPR curves for an ideal model then form the bounding box for the below shown plot. \n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:57.310890Z", "start_time": "2020-05-19T23:23:56.899762Z" } }, "outputs": [ { "data": { "image/png": "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HpnebjAnrckzv0wMYwYAYDt1vUCHZKCa/Oua9bnxmZV1rAjKRWe3lLR2AQB4Yd1JTsjWtx36adrzRNrys3Ub61sUlIiwW0ayLgAA29CW5FXZ+sJUz6aSJ9JmWyJaWimGMa9evToLFy7MzJkzs+eee+ayyy7b6nHXXXdduru7R/90dXWlUqnkxhtvTJLcdtttaWtrG3fMZz7zmXp+KzvHMGYAACbByHze1bYlooWVorN77rnnpre3N8uXL89jjz2WY445JgcddFBOPPHEcce9+93vzrvf/e7Rj//5n/8573rXu3LCCSeM3rf77rvnySefrFvtteEFCQCAHdc1/Hc1yZrBwczpKMVlP9RV4Z3d9evXZ8mSJbnkkksya9asHH744Tn77LNz1VVXbfOxV111Vd75zndmxowZdai0HnR2AQDYeWNXau7ptwcvranwt3geeuihDA0N5bDDDhu974gjjhgdmvx8nn322dx888257bbbtrh/3rx5mTp1ak444YR89rOfzdy5c7dZR09PT1auLHq1Oh1dAAB23tiVmn+1alVmbpxSYDUvbNWqVUWXMKqnp6foEphEhYfddevWZfbs2ePumzNnTtauXfuCj7vuuuuy//7758gjjxy97+CDD87SpUtzyCGHZPny5fnABz6QM888M7fccsu4xy5evDiLFy9OUrYn9HBn17wKAAB2wtjO7poh15a0psLDbnd3d9asWTPuvp6ensycOfMFH3f11Vfn93//98fdN2/evMybNy9J8pKXvCSXX355XvrSl2bDhg3jhjovWrQoixYtSpLcc889WbBgQWbPnr1dHeBaWmmBKgAAJsHmObvVJJX0T52WuXN3Kbag7VD0tXiSLZpwNLbC5+weeOCBqVQqeeCBB0bvW7p06bhhzb/p3nvvzf3335/3vOc9L3jutra2VKvVVHVKAQBoIW1JRlo9q20/RIsqPOx2dXXltNNOy0UXXZS1a9fm/vvvz5VXXpn3ve99z/uYq6++OieeeOJoF3fED3/4w/zyl79MtVrNk08+mfPPPz/HH398urq6nudMJaOxCwDAJBm7/RC0osLDbpJ86UtfSmdnZ+bPn5/jjjsuF1544ei2Q93d3bn99ttHj+3r68v111+/1TB877335vWvf326urqyYMGC7Lbbbrn22mvr9n1MlopONAAAO2k07Pbr7NKaCp+z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Ejq7FE3YBQAAJp2wS9GEXQAAYNKNDbuDwi4FEHbLyIsBAAANTmeXogm7ZWLOLgAATWL8AlUFFkLLEnbLRNgFAKBJjA0aOrsUQdgtI68FAAA0OMOYKZqwCwAATDphl6IJu6XkxQAAgMYm7FI0YbdMRubsei0AAKDBjV2gql/YpQDCLgAAMOnGdXaHhF3qT9gtJS8GAAA0tvHDmAsrgxYm7JaJrYcAAGgS5uxSNGG3jLwWAADQ4IRdiibslkglI51dLwYAADS2sUFjUNilAMJumRjFDABAk2hLUhlu4ujsFmvffffNueeeO6HH3HbbbalUKrnrrrte8LiLL7443d3dO1NezXQUXQAAANCc2pMMRNgt2k033ZRddtml6DLqTtgtFa1dAACah7BbrI0bN2b69On5rd/6raJLKYRhzCVU8WIAAEATGFmkaum6Dbnq18/k+idX5OfrNxZaU9lcc8016ejoyFNPPTXu/pUrV2bKlCn5yle+kjvvvDOnnHJK9txzz3R1deWII47ItddeO+74kWHH//RP/5TTTjsts2bNyjve8Y4kWw5j3p7zjXj66afztre9LV1dXZk/f34+85nPbPN7Wr16dT70oQ9l/vz5mTp1ahYsWJDvfve7E/3R7DRht0w0dgEAaCIjYfexTX357sqe3Lxidf7s0eX51551hdZVJqeeemo6OjqyZMmScff//d//fZLkHe94Rx577LH8zu/8Tq688srccsstefvb357/8T/+R/7u7/5ui/Odc8452X///XPTTTflox/96Fa/5o6c78Ybb8wZZ5yRiy66KFdcccXzfj99fX057rjj8s1vfjOXXHJJbr755rzsZS/LSSedlJ/97GcT+dHsNMOYy8Q+uwAANJE5qY7rrm1I0p9Kbl3Zk/8+u5yLGtXb7Nmz8+Y3vzmLFy8e131dvHhxjj/++MydOzfvete7Ru+vVqv53d/93Tz++OP5yle+kjPPPHPc+U455ZR8/vOff8GvOZHzHX300fnCF76QJHnTm96Up556Kp/+9KdzzjnnpK1ty97pddddl6VLl+anP/1pXvayl40+7r/+67/yqU99Kl//+te38yez83R2y8gwZgAAmsCZ6ct56R39c0iGkiQrBwYKrqxcFi1alDvvvDPLli1LkjzxxBP50Y9+lEWLFiVJVq1alfPPPz/77LNPOjs709nZmb/5m7/JQw89tMW5TjrppG1+vYmc79RTTx338WmnnZbly5fn8ccf3+q5v/vd7+bwww/PgQcemIGBgdE/xx13XP793/99m7VNJp1dAACgLka2Iorezjgnn3xyurq6csMNN+RjH/tYvv71r2fatGn5vd/7vSTJWWedlTvuuCN/+qd/mkMPPTSzZs3KX//1X+drX/vaFufaY489tvn1JnK+3Xfffavnf+KJJ7L33ntvcfyKFSty7733prOzc4vPtbe3b3FfLQm7AABAXQ0VXUDJTJ8+Pb/3e783GnZvuOGGvOUtb0lXV1c2bdqUb37zm/niF2SXJQUAACAASURBVL+Y8847b/QxQ0Nb/ylWtjE1cqLne/rpp8d9PLKQ1vz587d6/Ny5c/Pyl788f/u3f/uCddSDsFsmI09Mw5gBAGhCVqh5fosWLcpJJ52U73znO/nJT36SCy+8MEnS29uboaGhTJkyZfTYtWvX5uabb96hrzPR8910003jhjJ/4xvfyJ577pkXv/jFWz3+2GOPzbe+9a3sueee2XPPPXeoxsmyU2G3Wq3miSeeyO67756ODrkZAAB4fiNhV2tnS8cdd1x23XXXvO9978ucOXNy4oknJtm8gNWrX/3qfO5zn8uLXvSidHR05HOf+1xmz569Rdd1e0z0fD/4wQ/yv/7X/8pxxx2XW2+9Nddee22+9KUvbXVxqiR573vfm6985Ss56qij8tGPfjQHHnhgVq9enXvvvTd9fX357Gc/O+Gad9QOLVD1ne98J695zWsybdq07L333rnvvvuSbF6W+rrrrpvUAluL97oAAGh+VSMZt9DZ2ZnTTjstv/71r/P2t799XOf1+uuvz0tf+tKceeaZOf/883Paaaflve997w5/rYmc7ytf+UoeeuihnHrqqbn22mvzqU99Kh/60Iee99xTp07ND37wg5x88sm55JJLcvzxx+dDH/pQ7rrrrrzuda/b4Zp3RKU6wWfa4sWLc8YZZ2ThwoU59thjc/bZZ+euu+7KK1/5ynz+85/Prbfemu9973u1qnfS3XPPPVmwYEHuvvvuvPKVryy0lsf+z2fSf/99Gdrzxek7/axCawEAgMn2rXTknnTkRZ0d+auD9k2SrFy5MsnmuZ5FK1M2YOdNuLP7qU99Kh/+8IezePHinHXWWeM+d+ihh+b++++frNpal3e6AABoYq52qYcJh91HHnkkb37zm7f6ua6urvT09Ox0Ua3LMGYAAJqXObvU04TD7rx58/Lzn/98q5+77777ss8+++x0UQAAQPMZDbvSbpLN2wTV4g+bTXgJ5dNPPz0XX3xxDj744Bx11FFJNv9Puv/++3PppZfmgx/84GTX2Dr89gMA0AKqeruj1qxZU3QJTWvCYffiiy/OAw88MLo0dpKceOKJeeaZZ3LyySeP7gfFjvAuDAAAzcvVLvU04bA7ZcqU/OM//mN++MMf5tZbb82KFSsyd+7cHHvssTn22GNrUSMAANAERsLuUKFV0ComHHZHvPGNb8wb3/jGyawF4+sBAGhio1e7RjFTBxMOu8uWLdvmMXvvvfcOFcMIv/0AADSvIde71MGEw+6+++67zRW+BgcHd7iglmYtdgAAmphxjMV65plnsnDhwtx9991ZuHBhrrzyyqJLqqkJh92bbrppi/tWrVqV73znO/nJT36Sz33uc5NSWCuq+PUHAKCJ6e0U62/+5m/S3d2dnp6eltiiaMJh961vfetW7z/rrLNywQUX5Ec/+lHe+c537nRhrc2vPwAAzctOm8V49NFHc+ihh0446Far1QwNDaW9vb1GldXGDi9QtTVvfvObs3Dhwnz5y1+ezNO2juZ/cwUAgBamszvef535zjx13tmTft6Z19ywxX3vec97csMNN6RSqeTyyy/PfvvtlwMOOCAzZszIP/7jP2bvvffOl7/85bzhDW9Ikhx11FF57WtfmzvuuCP/9m//lu9///s58sgjJ73WWmqbzJPdcccdmTZt2mSesjX57QcAoAk9F3Zd8Nbbtddem3e/+9254IILsm7durz97W/PzTffnDe96U1ZtWpVPvaxj+Wtb31rVq1aNfqYa665JpdddlnWrVuXV77ylQVWv2Mm3Nk9//zzt7ivr68vDz74YP7lX/4lH/3oRyelsNbkvS4AAJqXq91yecUrXpH3vOc9SZIzzzwzl112Wf7pn/4pZ5xxRpLkve99b4444ogkydSpUwurc0dNOOzecsstW9w3bdq0vPjFL86Xv/zl/MEf/MGkFNaSWmCSOAAACLvl8Jtbxu6zzz5Zvnz5uI8b2YSHMT/66KNb/HnwwQdz66235v3vf/8OTVpevXp1Fi5cmJkzZ2bPPffMZZdd9rzHViqVdHV1pbu7O93d3TnxxBPHff4b3/hG9t9//8yYMSPHHHNMHnvssQnXUzi//QAANKHRzq7r3VJYtmzZFh/vtddeox83+orNk7pA1Y4699xz09vbm+XLl+exxx7LMccck4MOOmiLIDvi7rvvzsEHH7zF/Q8++GDOOuus3HjjjXn961+fj3/841m4cGH+9V//tdbfAgAAsA2V4a6OrLvZAX/3taxZs6awr//Tn/40119/fRYuXJjFixfn4Ycfzpvf/ObC6pls2xV2v/jFL273CSuVSv7oj/5ou49fv359lixZkrvvvjuzZs3K4YcfnrPPPjtXXXXV84bd5/PVr341J5xwQo4//vgkyZ//+Z/nRS96UR544IEceuihEzpXsfz6AwDQvCxQVQ6nnHJKvvWtb+X9739/XvKSl+Smm27K3Llziy5r0mxX2J3IolMTDbsPPfRQhoaGcthhh43ed8QRR+TGG2983sccffTRGRwczKte9apceumlo0H2/vvvz6tf/erR42bOnJn9998/999//zbDbk9PT1auXLnddddCX3//5ht+9wEAaEJjhzGPXHuPXf23aD09PUWXUFPXXHPNuI+nTJmSr371q1s99rbbbqt9QTW2XWF3aGioZgWsW7cus2fPHnffnDlzsnbt2q0ef9ttt+XII49Mb29vPv/5z+f444/Pgw8+mFmzZmXdunWZM2fONs+1ePHiLF68OEnzP6EBAKAsrMZMPRU+Z7e7u3uLceo9PT2ZOXPmVo8f2eR4ypQp+fSnP51rr702d9xxR0444YR0d3dvEV63dq5FixZl0aJFSZJ77rknCxYsyOzZswtv2a+bMiV9Sfz6AwDQjMaG3d+89i76WjzJFk04GtsOh91NmzblkUceyaZNm7b43EQ2HD7wwANTqVTGzatdunTpuGHNL6StrS3V4eXcDjvssCxdunT0c+vWrcvDDz+83ecqXIOvdgYAADSGiy++uOgSam7CYbevry8f/OAH89WvfjUDAwNbPWZwcHC7z9fV1ZXTTjstF110Ua699to89thjufLKK3P11VdvcewDDzyQ3t7evPzlL09fX18uvfTSbNy4MUceeWSS5IwzzsirX/3qfO9738vrXve6fPKTn8zLX/7yBlucCgAAmptxjNTDhPfZ/bM/+7N897vfzTXXXJNqtZrLL788V199dY455pjsu+++ueWWWyZcxJe+9KV0dnZm/vz5Oe6443LhhReOrsTc3d2d22+/PUny9NNP5/TTT8/s2bOz99575yc/+Um+853vjM7TPeSQQ3L11VfnnHPOydy5c3Pvvffm61//+oTrKYyNxwAAaGJjxzFWXfNSYxPu7C5ZsiQXX3xxFi5cmHe/+9357d/+7SxYsCDvfe97c+aZZ+aWW26Z8N5Mc+bMyZIlS7b6uXXr1o3efuMb35if//znL3iud7zjHXnHO94xoa9fHoYxAwDQvMaF3bj6Ffhra8Kd3ccffzwHHnhg2tvbM23atHFLhZ9xxhnPG1oBAIDW9pthF2ppwmF3/vz5Wb16dZJkv/32G7f/0kMPPTRphbUkC1QBANAihF1qbbuGMT/66KPZb7/9kiRHHXVUbr/99rzlLW/J2WefnY9+9KN58MEHM2XKlPzDP/xDTj/99JoW3BIMZwAAoAmNn7Oblh/HXKlRs8vw6M22K+zuv//+ee1rX5vTTz89F1988ei+uB/+8IdTrVbzjW98Ixs3bsz555+fP/3TP61pwQAAQGMaP4xZ2k0ymq2YfNs1jPkv/uIvUq1Wc+6552b//ffPxz72sVx//fXZsGFD/uiP/ig//vGPc8899+Tzn/98urq6al1z8zKMGQCAFqH3SK1tV9g977zz8uMf/ziPPvpo/uzP/iy/+tWvcsYZZ2SPPfbIGWeckW9961sT2luXbTDsAACAJmSBKuppQgtU7bPPPvnjP/7j3Hfffbnvvvty/vnn584778zJJ5+c+fPn53/+z/+ZH//4x7WqFQAAaGBbzNmFGprwaswjDjvssFxyySV5+OGHc+edd+aUU07JFVdckTe84Q2TWR8AANAkdHappx0Ou0kyMDCQb37zm/nLv/zL3HDDDalWqznssMMmq7aWM7oam7e5AABoeq55623ffffNt7/97aLLqJsdCru33XZb3v/+92fevHk55ZRTcuedd+YP//AP87Of/SxLly6d7BpbiAWqAABoXmOvdocKq4IdMTAwUHQJE7bdYffuu+/ORz7ykbzkJS/JMccck3/4h3/Iu971rvzLv/xLHnnkkVxyySU59NBDa1krAADQwMa1djR262rRokVZtmxZTj311HR3d+eiiy5KpVLJX/3VX+WlL31p5s6dm7PPPju9vb1JNjc4582bl8suuyx77bVXTj755IK/g4nbrn12DzzwwDz88MPp6urKW9/61px++uk5/vjj097e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s+Yvv7D5g/7+SakDACivkbDb29eXlStXluoauKenp+gSmESFX/GvW7cus2fPHnffnDlzsnak0/M8HnnkkZx77rn5y7/8y9H7Dj744CxdujSHHHJIli9fng984AM588wzc8stt4x77OLFi7N48eIkntBQuKlTR29W+nq9ywsAwKQoPOx2d3dnzZo14+7r6enJzJkzn/cxv/rVr3Lsscfmf//v/513vvOdo/fPmzcv8+bNS5K85CUvyeWXX56XvvSl2bBhw7hFqxYtWpRFixYlSe65554sWLAgs2fP3q4OcD2UpY5mpLNbHxN5DvcPDWb0FaBPZxcAmt1IZ7ezs3PcNUMZroF/swlHYyt866EDDzwwlUolDzzwwOh9S5cuHTeseazHH388Rx99dM4555xccMEFL3jutra2VKvVVKt6RVBWbWMWpKqYswsALcMVOrVWeNjt6urKaaedlosuuihr167N/fffnyuvvDLve9/7tjj217/+dd74xjfmjDPOyIUXXrjF53/4wx/ml7/8ZarVap588smcf/75Of7449PV1VWPbwXYAW0je/0m9vsFgBZQGY65wi61VnjYTZIvfelL6ezszPz583PcccflwgsvHF15ubu7O7fffnuS5P/+3/+bX/ziF/nCF76Q7u7u0T/Lli1Lktx77715/etfn66urixYsCC77bZbrr322sK+L2DbKh0dyciw8j5hFwCAyVGKiYtz5szJkiVLtvq5devWjd7+5Cc/mU9+8pPPe54LLrhgm0ObgfJpmzotQwPrUhF2AaDpPbf1kN4utVWKzi7Q2kaHMhvGDAAtw7I61JqwCxRuJOzq7AJA86ts+xCYFMIuULjKyIrMwi4AtAyNXWpN2AUKNzqMWdgFgKb33JxdqK1SLFAFtLbRYcwb1qXy68cn56QdnanuvsfknAsAgIYj7AKFm7rf/ll/97+n7dkVmXr9NZNyzqG5u6bvfR+clHMBAJNPZ5daM4wZKNzsNx6bqfsfMLknHRyc3PMBAJNidBiz5ZipMZ1doHDtXd158Sf+PP2/Xp7BtWt26lyrb/121t/9b6kIuwAALU3YBUqhUqlkyl4v3unzrF969+Ybwi4AlJIFqqgXw5iBplLpGH4PT9gFgFITdqk1YRdoKpWOzs03hoRdACijyrYPgUkh7ALNZaSzOzBQbB0AwAvS2aXWhF2gqVTa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5xB2AQAxMQzjij+//e1vtWXLFhmGoX/+85+O1VpVVSXDMLR27Vrb9rVhwwYZhqGqqqqYPxMAAFw9v9MFAADcbfv27VHPhw8frscff1xTp06NbOvdu7f27t1rd2kAACCJEXYBADEZNmzYRdt69ux5ye0dYZqmmpqalJ6eHpf9AQCA5MAwZgCArWprazV16lRlZ2erV69eev7556N+/8gjj2jAgAHauHGjvve97yk9PV2vvfaapNZe5JEjRyoYDConJ0dTp07VkSNHot6/ePFi9enTRxkZGercubNGjRqlL7/8Muo1DQ0Nmjt3rvLy8tStWzf95Cc/USgUinrN1q1bNWLECAUCARUWFmrWrFk6fvz4Zb9bc3OzfvSjHyk/P185OTmaPXu26uvrO3qoAABADAi7AABbzZkzR3379tX69et177336qmnntLmzZujXnPo0CE98cQTmj9/vjZv3qySkhJt375dd9xxh3JycvSHP/xBL730knbs2KH7778/8r5XXnlFCxcu1OzZs7V582YtX75cJSUlOnnyZNT+y8vL5fP5tHr1as2ZM0dLlizR8uXLI7/fuXOnRo8erezsbK1Zs0bPPfecXnvtNY0bN04tLS3f+t0WLFigF198UT/96U+1evVqtbS0qKysLE5HDgAAtAfDmAEAtho/frwqKiokSaWlpfrzn/+stWvX6q677oq8pra2Vps2bdItt9wS2TZ79mwNHTpU69atk2EYkqSBAwdGeoHvvvtuffDBBxo0aJAWLFgQed+FYbjNLbfcol/+8peSpNGjR+udd97R2rVrNWfOHEnSM888o6KiIr3++utKTU2VJBUXF2vs2LHauHGj7r333ov2efz4cb344osqKyuLfP7YsWN1++23q6amJpZDBgAAOoCeXQCArcaMGRN5bBiGbrjhBh08eDDqNQUFBVFB98yZM3rvvfc0ceJEtbS0KBQKKRQKqW/fviouLtaOHTskSYMHD9auXbv05JNPatu2bWpubr5iDZJ04403RtXwt7/9Tffff38k6La9Jzc3V9u2bbvkPj/++GOdPXtWDz74YNT28ePHX+5wAAAAixB2AQC2ys3NjXqelpamhoaGqG1du3aNel5bW6uWlhbNnz9fqampUT/79+/XgQMHJLXO9126dKneeOMN3XbbbercubPmzZuns2fPtquG2trai2poq+vb5u1+9dVXkqQuXbpc9rsAAAB7MIwZAJBw2oYpt8nNzZVhGHr66af1wAMPXPT6wsJCSZLP59O8efM0b9481dTU6NVXX1VZWZkKCwu1cOHCq/78/Pz8ixa+kqTDhw8rPz//ku/p1q2bJOnIkSPq0aNH1HsAAID96NkFACS8YDCo4cOHq7KyUkOHDr3o59prr73oPT169NCPf/xjDRo0SJWVle36vFtvvVUbNmyIWqH5zTff1IkTJ3Trrbde8j0DBw5UIBDQ+vXro7b/8Y9/bNdnAwCA+KBnFwDgCr/4xS80cuRIPfTQQ5o8ebLy8vJ08OBBvfnmm5o5c6buuOMOPfroo8rLy9OwYcOUl5en9957Tx999JEee+yxdn1WeXm5RowYoe9///t6/PHHdfjwYZWVlenmm2/W3Xfffcn35Ofna86cOVq8eLECgYAGDx6sVatW6fPPP4/H1wcAAO1E2AUAuMKIESO0bds2LVq0SDNnzlRTU5OuueYalZaWqk+fPpHXvPzyy3r55Zd15swZXXfddVq6dKlmz57drs8aMmSI/vKXv2jBggUaP368gsGg7rvvPi1ZskQpKSnf+r7FixcrFArp+eefVzgc1oMPPqjFixdrxowZMX13AADQfoZpmqbTRQAAAAAAEE/M2QUAAAAAeA5hFwAAAADgOYRdAAAAAIDnEHYBAAAAAJ5D2AUAAAAAeA5hFwAAAADgOYRdAAAAAIDnEHYBAAAAAJ5D2AUAAAAAeA5hFwAAAADgOYRdAAAAAIDn/D/hpHKRx4L+XQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " ggplot()\n", " + geom_line(\n", " aes(group='variable', colour='variable', x='threshold', y='value'),\n", " size=2, data=df[['threshold', 'fpr', 'tpr']].melt(id_vars='threshold')\n", " )\n", " + geom_ribbon(\n", " aes(ymin='fpr', ymax='tpr', x='threshold'), \n", " fill='lightgrey', data=df\n", " )\n", " + xlab(\"Threshold\") + ylab(\"Value\")\n", " + theme_linedraw()\n", " + theme(figure_size=(10, 8))\n", ")" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-03-29T16:13:55.405307Z", "start_time": "2019-03-29T16:13:55.385412Z" } }, "source": [ "Based on the above discussion, it is easy to notice that as the quality of our model improves the TPR curve should move towards the top left corner and FPR should move towards the bottom right corner. In other words, the quality of our trained model improves as the area between the curves increases. This essentially forms the intution behind the Area Under Curve (AUC) metric. \n", "\n", "In pratice, however there is one small difference. As shown below, instead of plotting two separate curves (TPR and FPR) as a function of threshold, we can plot TPR as a function of FPR. As the model quality improves, the line will move towards top right corner and the area under the curve will increase. Similar to $R^2$ metric discussed in {ref}`Chapter 1`, the region above the curve (red colored region) is the opportunity area to improve our model. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:23:57.558633Z", "start_time": "2020-05-19T23:23:57.313088Z" } }, "outputs": [ { "data": { "image/png": "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+/dXXFyccnNzJUndunXT3//+dz3xxBPKzc316ju5srOztW7dOu3atUuStG/fPn311VfKzs42pf/33nuvsrKyNG7cuGrnfPfdd+rXr58SEhIUEhKiiIgIlZWVnXXcTvNGfUCgIOwAfiQoKEipqanVPho1aqT3339f9957r3r06KFly5bpu+++0/vvvy9JOn78eJ3Xcrlc+utf/6r27dvrscce08UXX6zU1FStXbtWklRcXKzKykqNGTNGoaGh1T527dql3bt3n7Pe6dOna8OGDdq8ebPKysq0dOlSJSQkuK/ftGnTWl/TtGlT9xLOfffdp5kzZ+rTTz/Vddddp8aNG2v06NHn9fbtmm6++WZFRkZqyZIlkqRly5YpLCzMvfTnzf6vXr1agwcP1pIlS6rtB9q1a5f69++vyspKzZs3T9988402bNigJk2anHXcTvNGfUCg4N1YgAMsX75cXbp0qfaL9Kuvvjrn17Vt21bLly9XeXm5vv32Wz3zzDMaNGiQ9u7dq7i4OLlcLj3zzDN17v05c9/J2bRs2VKpqal1HmvUqFGdG2mLiorUqFEjSafC3ejRozV69Gjt3btXS5Ys0fjx45WYmOjet3K+wsPDdcstt2jJkiUaN26clixZokGDBikyMlKSvN7/3r1768orr9TEiRN19913KzIyUqtWrXK/LT8uLk7SqT1ZNTdp18Ub9QGBgrADOMCxY8fUoEGDam2LFy+u99eHhoYqPT1d48ePV2Zmpn7++We1bdtW11xzjQoKCvTcc895u2T17NlTH3zwgWbMmKGQkFP/FK1evVqHDh1yL8GdqXnz5ho7dqz++7//WwUFBWe9boMGDc45K3Jadna2Bg4cqE8//VTfffedxo8f7z4WGRnp1f4HBwfrpZdeUr9+/fTGG29ozJgxOnbsmFwuV7WlvGXLlqmiouKcffJ2fYCTEXYAB+jXr58ee+wx/fGPf9Q111yjFStW6PPPP//dr/nhhx80duxYDRkyRK1atVJJSYleeOEFXXrppWrVqpUk6U9/+pMyMjI0ZMgQDR06VPHx8dqzZ49Wr16t+++/X9dff/151zxhwgSlpaXp5ptv1uOPP66ioiKNHz9ePXr0cO9DevjhhxUfH6+rr75a8fHx+uabb/T999//7s312rdvry+++EKrV69WfHy8LrvsMvfSWU2n98oMHz5ccXFxuummm6od93b/+/btq549e2rmzJkaOXKkMjIyJEn333+/Hn74YW3evFkzZsxwz/Kc2ac333xTOTk5atOmjRITE3XppZeaOj6Ao1i9QxpA/UyaNMmIjIys81hFRYUxduxYo3HjxkZ0dLSRlZVlfPfdd7/7TqWioiLj7rvvNlq2bGk0bNjQaNKkiXH77bcbW7durXbtDRs2GAMGDDBiY2ON8PBwo02bNsYjjzxi7N69+6y11vUuqbqsWbPGuOaaa4yGDRsajRo1Mu677z7jwIED7uMLFy40rr32WqNRo0ZGWFiY0aFDB+O111773e+Tn59vXHfddUZ0dLQhyXjrrbdq9f1MDz/8sCHJeOCBB+qs0dv9X716dbW63nnnHaNly5ZGWFiYcfXVVxvr16+vVWtJSYkxdOhQIyEhwZBkDBs27ILqAwKNyzAMw7qoBQAAYC7ejQUAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAAByNsAMAABzt/wAKfd+SXCoTQAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fpr_tpr_curve = df.groupby('fpr')['tpr'].max().reset_index()\n", "(\n", " ggplot(\n", " fpr_tpr_curve,\n", " aes(x='fpr', y='tpr')\n", " ) \n", "# + geom_ribbon(aes(ymax='tpr', ymin='fpr'), fill='green')\n", " + geom_ribbon(aes(ymin='tpr', ymax=1), fill='red') \n", " + geom_line(size=2)\n", " + xlab(\"False Positive Rate\")\n", " + ylab(\"True Positive Rate\")\n", " + theme_linedraw()\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below code snippet computes the area under curve and validates that this what we get from sklearn. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2020-05-19T23:24:17.556951Z", "start_time": "2020-05-19T23:24:17.548606Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Area Under Curve (manually): 0.998\n", "Area Under Curve (Sklearn): 0.998\n" ] } ], "source": [ "from sklearn.metrics import roc_auc_score\n", "auc_manually = np.trapz(fpr_tpr_curve['tpr'], x=fpr_tpr_curve['fpr'])\n", "auc_sklearn = roc_auc_score(test['hasCancer'], test['prob_1'])\n", "\n", "print(\"Area Under Curve (manually): {:.3}\".format(auc_manually))\n", "print(\"Area Under Curve (Sklearn): {:.3}\".format(auc_sklearn))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## $F_1$ and Variants" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-04-02T15:58:10.748375Z", "start_time": "2019-04-02T15:58:10.743547Z" } }, "source": [ "Another popular metric that is often used to evaluate classifiers is $F_1$ score and it's variant. $F_1$ is described as the harmonic mean of precision and recall. To better understand the definition, first let's try to understand what is precision and recall. \n", "\n", "Often when dealing with a classification problem, we are interested in the positive cases and how well the trained model is able to detect these positive test cases. In other words we are interested in true positives (TP). However, the number of TP by themself doesn't make sense. For instance, saying there are 50 TP doesn't communicate any insightful information. In order to evaluate the quality of the model in reference to true positives, we need to normalize the number of true positive cases with the number of positive cases. For instance, it makes more sense if one says that the model is able to detect 50 of 200 positive cases or true positive rate is 25% of actual positive cases.\n", "\n", "There is a however another challenge. We can talk about the total number of positive cases, used for normalizing true positiives, from two different perspectives: from the data perspective or from the model perspective. From the data perspective, the total number of positives cases is the number of cases that are actually labeled as positives. Based on the confusion matrix, the total number of positive cases from the data perspective is the summation of true positives (TP) and false negatives (FN). **True positive rate from the data perspecrtive is known as \"recall\"**. Mathematically, it can be represented as:\n", "\n", "$$ Recall = \\frac{TP}{TP + FN}$$\n", "\n", "In contrast to recall, **precision is true positive rate from the model perspective**. The total number of positive cases is the number of cases that the model predicts to be positive. Based on the confusion matrix, it can be represented as:\n", "\n", "$$ Precision = \\frac{TP}{TP + FP} $$\n", "\n", "Notice that in the formula for recall and precision only the denomoniator is different. One is the total number of actual positive cases in the test dataset and another is the total number of predicted positive cases, respectively. \n", "\n", "Now we have two different ways to talk about true positive rates. However as a metric it we would like to have a single number. One simple way to combine these two different true positive rates is to take the average. When dealing with ratio, harmonic mean makes more sense than arithmetic mean. This harmonic mean of precision and recall is termed as $F_1$ score and written as:\n", "\n", "$$ F_1 = \\frac{2}{\\frac{1}{Precision} + \\frac{1}{Recall}} = \\frac{2 \\times Precision \\times Recall}{Precsiion + Recall } $$\n", "\n" ] }, { "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.7.6" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }