{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "We will reviewed a number of metrics for **evaluating classification** and **regression** models. \n", "For that we use the functions we use of the **sklearn** library. \n", "We'll learn how to generate model data and how to train linear models and evaluate their quality. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## sklearn.metrics\n", "\n", "[Docs](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "from sklearn import model_selection, datasets, linear_model, metrics \n", "from matplotlib.colors import ListedColormap\n", "\n", "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Datasets generation\n", "Since we are to solve 2 problems: Classification and Regression, we'll need 2 sets of data. \n", "\n", "For that we use **make_classification** and **make_regression** functions. \n", "\n", "For each problem we generate datasets of 2 features and we visualize them. In the Classification problem both features are informative, while in Regression problem, only 1 of 2 features is an informative feature." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "clf_data, clf_target = datasets.make_classification(n_features = 2, n_informative = 2, n_classes = 2, \n", " n_redundant = 0, n_clusters_per_class = 1, \n", " random_state = 7)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "reg_data, reg_target = datasets.make_regression(n_features = 2, n_informative = 1, n_targets = 1, \n", " noise = 5., random_state = 7)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "image/png": "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LpW22kq6805p8OCgI0PSKi+XDjpI+vhjm+9TVycNGCC9+qrUunXQ0QFNYkQMgJjLypKuuEJassS2+b7+Wtp//6CjQlK77DLpww8toVq5Uiork0pLbXgikMRIpADEVVOF51H59VerZvdhHVaSwvz50h//KG28sdSvn3T//bawgg0wdqy0enXotcpK6YknkvZ/b0AikQKQCubPl3bZRerRQ9p8c9srLC1NyKO9l8aNk7bbzoYgH3209O234V/388/STjtJTz8tLV5sX3PRRdK55yYkzNTXOIlaq6qKRApJjUQKQMusXCk99JBlDGPHWiOpWKqpkXbf3bp5VlbaD9zZs6V99rGMJc6uu0464wxpxgxbEHv+eamkxHK7hu6803ajGq5AlZdLjzxi34f1GDo0fPnSOWnPPWO8rAnEFn86AURv3jypTx/pgguku+6Szj7b9rQWLYrdM157TVqxInyPrLpaevzx2D0nglWrrHC+YXPRujr7/KabQr/23Xctz2ssLy+D+2dVVFjmOXp0eObZ2F132QmFggL7PD9fatNGuu++eEcJtAin9gBE77TTpN9/r09yVq2yFaMLL5SefDI2z1iwwFalGlu9Wpo7NzbPaMLs2TYrsPEiW02NJU4N9etnB84a99CqqpJ69oxrmMnpk0+kP/zB3pC6OvvvOedIt94a+es331z65htbwistlfr3l04/3QrOgCRGIgUgOjU1Nom48UpRTY30UgyHGwwaZFs8jRUX25ZfHHXtaolQJH36hH5+4YXS+PGhq1e5udbyYfPN4xdjUqqpsVYGy5aFXr/vPmnffZs+wrnRRtKll8Y9PCCW2NoDEB3nIic4ktQqhv9GKymR9tqrfstHsv2y7t2lI46I3XMi6NLFhi3n54deLyyULr889Nq220oTJlg9fF6efRxyiF3LOO+/H7l4vKxMevjhxMcDxBGJFIDoZGdLI0bY3ldDeXnSyJGxfdaLL0rXXmtLOz16WGH7hx/akk+cPf64dNRR9tsqKLDk6rHHpF13Df/a/fe3UqDvv7cdz/Hjrcwn46xe3XSSXVaW2FiAOHM+gGOlJSUlvjRBR5cBxNHixba9tmiR7YHl5Fix0Ntvp10GsWqVtHy5tMkmHCJbr/Jyq21qnDQVFUkPPmjNtoAU4pyb6r0vifQaNVIAotepk7Ut/9//rFB4222lvfduejUi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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "colors = ListedColormap(['red', 'blue'])\n", "pylab.scatter(clf_data[:,0], clf_data[:,1], c = clf_target, cmap = colors)\n", "pylab.rcParams['figure.figsize'] = [10, 7]" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pylab.scatter(reg_data[:,1], reg_target, color = 'r')\n", "pylab.scatter(reg_data[:,0], reg_target, color = 'b')\n", "pylab.rcParams['figure.figsize'] = [10, 7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### We split data into train and test sets." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "clf_train_data, clf_test_data, clf_train_labels, clf_test_labels = model_selection.train_test_split(clf_data, clf_target,\n", " test_size = 0.3, random_state = 1)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "reg_train_data, reg_test_data, reg_train_labels, reg_test_labels = model_selection.train_test_split(reg_data, reg_target,\n", " test_size = 0.3, random_state = 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quality metrics in classification tasks\n", "\n", "#### Classification model training\n", "\n", "We'll use **SGDClassifier**. It is a Linear classifier based on [Stochastic gradient decent](/linear-regression-stochastic-gradient-descent/). \n", "- Probabilistic classifier (Loss funciton: loss = 'log')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SGDClassifier(loss='log', random_state=1)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classifier = linear_model.SGDClassifier(loss = 'log', random_state = 1, max_iter=1000)\n", "\n", "classifier.fit(clf_train_data, clf_train_labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate classifier predicted labels:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "predictions = classifier.predict(clf_test_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate a prediction in the form of the probability that the object belongs to the zero class or the first class." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "probability_predictions = classifier.predict_proba(clf_test_data)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0]\n" ] } ], "source": [ "# original dataset labels\n", "print(clf_test_labels)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0]\n" ] } ], "source": [ "# predicted labels\n", "print(predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probabilities that the object belongs to the zero class or the first class. \n", "\n", "The first probability is that object belongs to the the zero class and the second probability is that object belongs to the first class" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.00000000e+00 1.00000000e+00]\n", " [9.99999997e-01 2.90779994e-09]\n", " [9.99990982e-01 9.01818055e-06]\n", " [0.00000000e+00 1.00000000e+00]\n", " [1.00000000e+00 7.01333183e-14]\n", " [5.16838702e-07 9.99999483e-01]\n", " [6.66133815e-16 1.00000000e+00]\n", " [1.00000000e+00 6.21822808e-13]\n", " [0.00000000e+00 1.00000000e+00]\n", " [9.99999998e-01 2.30155106e-09]]\n" ] } ], "source": [ "print(probability_predictions[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We've done the preparational work. Now we come to the calculating metrics.\n", "#### Accuracy\n", "\n", "Accuracy is metric that shows **closeness of the measurements to a specific value**, designating a **portion of correctly classified objects**.\n", "\n", "- **pair[0]** - correct label\n", "- **pair[1]** - predcted label \n", "- **len(clf_test_labels)** - data volume" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9333333333333333 0.9333333333333333\n" ] } ], "source": [ "# calculating thru Python means\n", "acc1 = sum([1. if pair[0] == pair[1] else 0. for pair in zip(clf_test_labels, predictions)])/len(clf_test_labels)\n", "# inbuilt accuracy score\n", "acc2 = metrics.accuracy_score(clf_test_labels, predictions)\n", "print (acc1, acc2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [Confusion matrix](https://en.wikipedia.org/wiki/Confusion_matrix)\n", "\n", "**Confusion matrix** is the **NxN** matrix where N - number of classes (N=2 in our case). Confusion matrix provides to calcualte many statistics metrics." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion matrix\n", " [[17 1]\n", " [ 1 11]]\n" ] } ], "source": [ "matrix = metrics.confusion_matrix(clf_test_labels, predictions)\n", "print(\"Confusion matrix\\n\", matrix)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# manual calculations of True positives and True negatives\n", "sum([1 if pair[0] == pair[1] else 0 for pair in zip(clf_test_labels, predictions)])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matrix.diagonal().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Precision \n", "\n", "Precision describes the random errors, a measure of statistical variability.\n", "\n", "First we estimate the accuracy of the classification to the zero class. We call the **precision_score()** function, pass it the correct class labels, the predicted class labels. And since by default our label is 1, we need to explicitly say that in this case we estimate the classification accuracy to the zero class. To do this, we use the **pos_label** argument and say that it is equal to **0**." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9444444444444444" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.precision_score(clf_test_labels, predictions, pos_label = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We estimate the accuracy of the objects classification to the first class. Default pos_label = 1." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9230769230769231" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.precision_score(clf_test_labels, predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [Recall](https://en.wikipedia.org/wiki/Precision_and_recall#Recall)\n", "A good picture of precision and recall is below:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9444444444444444" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.recall_score(clf_test_labels, predictions, pos_label = 0)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9166666666666666" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.recall_score(clf_test_labels, predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [F-score](https://en.wikipedia.org/wiki/F-score)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9444444444444444" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.f1_score(clf_test_labels, predictions, pos_label = 0)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9166666666666666" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.f1_score(clf_test_labels, predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Classification report \n", "We use the **classification_report** function to get the summary table for each class." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.94 0.94 0.94 18\n", " 1 0.92 0.92 0.92 12\n", "\n", " accuracy 0.93 30\n", " macro avg 0.93 0.93 0.93 30\n", "weighted avg 0.93 0.93 0.93 30\n", "\n" ] } ], "source": [ "print(metrics.classification_report(clf_test_labels, predictions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [ROC curve](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) - receiver operating characteristic curve\n", "\n", "An ROC curve plots TPR vs FPR at different classification thresholds. We use **probability_predictions** in our case.\n", "- **probability_predictions[:,1]** is the probability that object is of the first class.\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "fpr, tpr, _ = metrics.roc_curve(clf_test_labels, probability_predictions[:,1])\n", "# _ contains thresholds, we not using them " ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "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iI+PZ9KkSTRp0uTKT6wkVMJERESkyvrqq6/o3r07gwcPJiIiwus4V0UlTERERKqMwsJCPvvsM1JSUoiIiOA73/lOlStfF6iEiYiISJVw+PBhUlNTOXToEDVr1qRLly5VtoCBSpiIiIhUckVFRaxYsYIlS5YQHR3NXXfdRbt27byOdd1UwkRERKRSmzdvHhkZGXTo0IGRI0dSo0YNryOVC5UwERERqXScc+Tn5xMREUGvXr1o0qQJHTt2rBT3fCwvKmEiIiJSqZw6dYq0tDQiIiKYMGEC8fHxxMfHex2r3KmEiYiISKXgnGPdunXMmzePoqIihg0b5nWkgFIJExEREc9lZ2cza9YstmzZQrNmzRg7dixxcXFexwoolTARERGpFA4dOsTQoUPp1atXtbr263JUwkRERMQT58+f57PPPqNfv37UrFmTxx9/nLCw4KkmwfOZioiISKWxbds20tPTOXfuHC1btqRp06ZBVcBAJUxEREQqUG5uLvPnz+fzzz8nISGBiRMnkpiY6HUsT6iEiYiISIWZPn06X331FX369GHgwIFBN/pVUvB+5iIiIlIh8vPzAQgPD2fQoEH069ePpk2bepzKeyphIiIiEjD79+8nNTWV5s2bM3LkSBo1auR1pEpDJUxERETKXWFhIR999BGffPIJMTExtG/f3utIlY5KmIiIiJSro0ePMmPGDA4dOkSXLl0YPnw4UVFRXseqdFTCREREpFyFhISQk5PDhAkTNAJWhhCvA4iIiEjVd+zYMRYvXoxzjvj4eCZPnqwCdgUaCRMREZFr5pwjIyODhQsXEhoaSteuXYmLiyMkROM8V6ISJiIiItfk1KlTpKens2PHDlq3bs3o0aOpXbu217GqDJUwERERuWpFRUW88cYbnDlzhlGjRtGtW7eguOl2eVIJExEREb9lZ2cTHR1NSEgIo0ePJjY2lri4OK9jVUk6YSsiIiJ+2bx5M88//zwrVqwAoHnz5ipg10EjYSIiIlKm8+fP88EHH7BhwwYaNWpEu3btvI5ULaiEiYiIyGXt3LmTmTNnkp2dzYABA7j55psJDQ31Ola1oBImIiIilxUeHk6NGjW4++67SUxM9DpOtaJrwkRERORrdu3axbJlywBISkri0UcfVQELAI2EiYiICAD5+fksXryYTz/9lPj4eHr16kVERISmnggQlTARERFh//79pKamcvToUVJSUhgyZAgRERFex6rWVMJERESCXE5ODm+++SaRkZHce++9tGrVyutIQUElTEREJEidPHmS2NhYoqKiuPPOO2nUqBFRUVFexwoaujBfREQkyBQVFbF8+XL+/ve/s2HDBgBatmypAlbBNBImIiISRI4fP05qaip79+7lhhtu0KlHD6mEiYiIBInMzEzmzp1LaGgo48ePp1OnTnrno4dUwkRERIJEVFQUzZo1Y/To0dSuXdvrOEFPJUxERKSacs6xbt06cnNz6dmzJ+3bt6ddu3Ya/aokVMJERESqobNnzzJ79my2bNlCixYt6NGjB2amAlaJqISJiIhUM5s3b2bOnDnk5uYydOhQevbsqfJVCamEiYiIVCPHjx/nvffeo2HDhowfP56EhASvI8llqISJiIhUA1lZWSQkJBAfH899991H06ZNCQ0N9TqWlEGTtYqIiFRhubm5zJo1ixdeeIHdu3cD0KJFCxWwKkAjYSIiIlXU7t27SU1N5eTJk/Tp04fGjRt7HUmugkqYiIhIFbR48WI+/vhj4uLimDRpEk2bNvU6klwllTAREZEqKCYmhpSUFIYMGUJERITXceQaqISJiIhUAYWFhSxbtoy6devSuXNnunfv7nUkuU4qYaX412d7SMvcX2H723zwNB0SdfsIEREp3ZEjR5g5cyaHDh2iR48edO7c2etIUg5UwkqRlrm/QotRh8TajE3WxZQiIvJ1RUVFrFy5kiVLlhAZGcmECRNo376917GknKiEXUaHxNpMe7S31zFERCSI7d69m4ULF9K+fXtGjRpFzZo1vY4k5UglTEREpBJxznHo0CESExNp0aIFkyZNokmTJrrtUDWkyVpFREQqiVOnTvHWW2/x6quvcvz4cQCaNm2qAlZNaSRMRETEY8451q9fzwcffEBRURHDhw8nLi7O61gSYCphIiIiHnLOMX36dL744guaNm3K2LFjiY+P9zqWVACVMBEREQ+ZGfXr1ycpKYlevXoREqIrhYKFSpiIiEgFO3/+PPPmzaNLly60bNmSAQMGeB1JPKASJiIiUoG2b99Oeno62dnZNG7cmJYtW3odSTwS0BJmZsOBZ4FQ4BXn3H9esj4WeAto6svyjHPutUBmEhER8UJeXh4ffvgha9asISEhgbvuuotGjRp5HUs8FLASZmahwPPAEGAfkGFm6c65zSU2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Z+PGjQCcPHnya/t65JFH+OSTTxg1ahS33347u3bturjucl9fgFWrVrFx48armoriclTCylFeXh4ffvgha9asISEhgfj4eK8jiYiIH65lxKqifOtb3wLgpptuulgUPvzwQ9avX3/x9NmpU6fYtm0bSUlJ/PznP2fZsmWEhISwf/9+Dh8+DECzZs3o1avXZfdzoax16tSJs2fPEhMTQ0xMDFFRUZw8eZJPPvmEu+++m9DQUBo0aED//v3JyMhg2bJlFx9v1KgRgwYNAopL38aNGxkyZAhQfPqurFGwM2fOsH//fsaPHw8UT356qfz8fB5//HEyMzMJDQ1l69atAHTv3v1i8Rs3bhzJycm0bNmSHTt2MHnyZEaOHHmxRPnjcl/fiIgIevToUS4FDFTCys2ePXuYOXMmJ0+epE+fPgwcOJCwMH15RUTk+kRGRgIQGhpKQUEBUHxd19/+9jeGDRv2tW2nTp1KVlYWa9asITw8nObNm1+8I8CV3hB2YT8hISEXP76wXFBQ8LXTjJcqbXoG5xw33ngjK1eu9OOzpMzXv+C///u/adCgAevWraOoqOhiUevXrx/Lli1jzpw53HffffzoRz/i/vvvZ926dcyfP5/nn3+ef//732WOwl2apbSv79KlS8v1jXXBeVVeAJw5cwYzY9KkSQwZMkQFTEREAmbYsGG8+OKL5OfnA7B161ays7M5deoU9evXJzw8nCVLlrB79+5y22e/fv2YNm0ahYWFZGVlsWzZMnr06EG/fv149913KSws5ODBgyxZsgSAdu3akZWVdbGE5efns2nTpsu+fu3atUlKSiI1NRWA3Nxczp0797VtTp06RWJiIiEhIbz55psUFhYCsHv3burXr893vvMdHn74YdauXcvRo0cpKiri29/+Nn/4wx9Yu3at35/r5b6+5U1N4TocOHCArKwsunTpwo033ki7du1UvkRExG/nzp0jKSnp4vIPf/hDv573yCOPsGvXLrp164ZzjoSEBFJTU7nnnnsYPXo0KSkpJCcn0759+3LLOn78eFauXEmXLl0wM/785z/TsGFDxo8fz+LFi+nUqRNt27alf//+AERERPDee+/xxBNPcOrUKQoKCnjyySe58cbLn/p98803efTRR/n1r39NeHg406dP/9q7OL/3ve/x7W9/m+nTpzNw4MCLo1JLly7lL3/5C+Hh4dSq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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pylab.plot(fpr, tpr, label = 'Linear model classifier')\n", "pylab.plot([0, 1], [0, 1], '--', color = 'grey', label = 'Random classifier')\n", "pylab.xlim([-0.05, 1.05])\n", "pylab.ylim([-0.05, 1.05])\n", "pylab.xlabel('False Positive Rate')\n", "pylab.ylabel('True Positive Rate')\n", "pylab.title('ROC curve')\n", "pylab.legend(loc = \"lower right\") \n", "pylab.rcParams['figure.figsize'] = [10, 7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ROC AUC\n", "\n", "ROC AUC shows a square area under ROC function." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9305555555555554" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.roc_auc_score(clf_test_labels, predictions)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9907407407407407" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.roc_auc_score(clf_test_labels, probability_predictions[:,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### PR AUC - Precision AUC" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.873611111111111" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.average_precision_score(clf_test_labels, predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### log_loss - logistical losses of [Logistic regression](https://en.wikipedia.org/wiki/Logistic_regression)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.21767621111290084" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.log_loss(clf_test_labels, probability_predictions[:,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Metrics in the Regression problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Training the regression model" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:1208: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n", " warnings.warn(\"Maximum number of iteration reached before \"\n" ] }, { "data": { "text/plain": [ "SGDRegressor(max_iter=20, random_state=1)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regressor = linear_model.SGDRegressor(random_state = 1, max_iter = 20)\n", "\n", "regressor.fit(reg_train_data, reg_train_labels)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "reg_predictions = regressor.predict(reg_test_data)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2.67799047 7.06525927 -56.43389936 10.08001896 -22.46817716\n", " -19.27471232 59.44372825 -21.60494574 32.54682713 -41.89798772\n", " -18.16390935 32.75688783 31.04095773 2.39589626 -5.04783924\n", " -70.20925097 86.69034305 18.50402992 32.31573461 -101.81138022\n", " 15.14628858 29.49813932 97.282674 25.88034991 -41.63332253\n", " -92.11198201 86.7177122 2.13250832 -20.24967575 -27.32511755]\n" ] } ], "source": [ "print(reg_test_labels)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ -1.46503565 5.75776789 -50.13234306 5.05646094 -24.09370893\n", " -8.34831546 61.77254998 -21.98350565 30.65112022 -39.25972497\n", " -17.19337022 30.94178225 26.98820076 -6.08321732 -3.46551\n", " -78.9843398 84.80190097 14.80638314 22.91302375 -89.63572717\n", " 14.5954632 31.64431951 95.81031534 21.5037679 -43.1101736\n", " -95.06972123 86.70086546 0.47837761 -16.44594704 -22.72581879]\n" ] } ], "source": [ "print(reg_predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### MAE - Mean Absolute Error" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.748761311885298" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.mean_absolute_error(reg_test_labels, reg_predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### MSE - Mean Squared Error" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24.114925597460914" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.mean_squared_error(reg_test_labels, reg_predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Mathematical Square Root of MSE" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.91069502183356" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(metrics.mean_squared_error(reg_test_labels, reg_predictions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [Coefficient of determination](https://en.wikipedia.org/wiki/Coefficient_of_determination) - R2 score\n", "\n", "The close R2 score to 1 the better/preciser model we have." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.989317615054695" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.r2_score(reg_test_labels, reg_predictions)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }