{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Classifier accuracy\n", "\n", "In this notebook we'll explore the classifier confusion matrix and ROC/PR curves.\n", "\n", "See:\n", "http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html and\n", "http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 62, 18],\n", " [ 10, 138]])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ " \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "plt.style.use('bmh')\n", "from sklearn import cross_validation\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import confusion_matrix\n", " \n", "# first let's load some data\n", "\n", "from sklearn.datasets import load_breast_cancer\n", "data = load_breast_cancer()\n", "X = data.data[:,:10]\n", "y = data.target * 2 - 1\n", "\n", "X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4, random_state=1)\n", " \n", "classifier = LogisticRegression(C=0.1)\n", "_ = classifier.fit(X_train, y_train)\n", "y_pred = classifier.predict(X_test)\n", " \n", "confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The confusion matrix is a matrix $C$ such that $C_{i, j}$ is equal to the\n", "number of observations known to be in group $i$ but predicted to be in group $j$.\n", " " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class Perceptron :\n", " \n", " \"\"\"An implementation of the perceptron algorithm.\n", " Note that this implementation does not include a bias term\"\"\"\n", " \n", " def __init__(self, max_iterations=100, learning_rate=0.2) :\n", " \n", " self.max_iterations = max_iterations\n", " self.learning_rate = learning_rate\n", " \n", " def fit(self, X, y) :\n", " \"\"\"\n", " Train a classifier using the perceptron training algorithm.\n", " After training the attribute 'w' will contain the perceptron weight vector.\n", " \n", " Parameters\n", " ----------\n", " \n", " X : ndarray, shape (num_examples, n_features)\n", " Training data.\n", " \n", " y : ndarray, shape (n_examples,)\n", " Array of labels.\n", " \n", " \"\"\"\n", " self.w = np.zeros(len(X[0]))\n", " converged = False\n", " iterations = 0\n", " while (not converged and iterations <= self.max_iterations) :\n", " converged = True\n", " for i in range(len(X)) :\n", " if y[i] * self.decision_function(X[i]) <= 0 :\n", " self.w = self.w + y[i] * self.learning_rate * X[i]\n", " converged = False\n", " iterations += 1\n", " self.converged = converged\n", " if converged :\n", " print ('converged in %d iterations ' % iterations)\n", " \n", " def decision_function(self, x) :\n", " return np.inner(self.w, x)\n", " \n", " def predict(self, X) :\n", " \"\"\"\n", " make predictions using a trained linear classifier\n", " \n", " Parameters\n", " ----------\n", " \n", " X : ndarray, shape (num_examples, n_features)\n", " Training data.\n", " \"\"\"\n", " \n", " scores = np.inner(self.w, X)\n", " return np.sign(scores)\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ROC curves" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEdCAYAAAD930vVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8VGXWwPHfSSgiTUGKlNARAQWCIkhToogV3cVFQBSV\nBZUSXATU90XXfXVXV3AVEBDZXZHuYl0L4hJE4oIiAUUEKdJjlCIEECnhvH9MTZjJTJLpOd/PJx/n\nzty598zjMM+9TzuiqhhjjDGFSYp2AMYYY2KfVRbGGGMCssrCGGNMQFZZGGOMCcgqC2OMMQFZZWGM\nMSYgqyyMMcYEZJWFiWsi8k8ROeP8Oy0iu0VklojU8bFvYxF5VUT2iMgJEdnr3G7sY98KIvK/IvKV\niBwTkf0islJEhotIhch8OmNih1UWJhF8CtQC6gP9gHbA6947iEg74EugDnAH0ATo69z+UkQu9dq3\nMvBfYBgwGegEtAcmALcD14b34+QnImUjeT5jfLHKwiSCk6q6T1V/UNVMYAbQSUQqee3zKrAT6KWq\nmaq6x7nv9cAe5+sufwaaA1eo6kxV/VpVd6rqG6raHfjEXyAiUlFEXhCRXSLyq4h8LyKPOF9r4LwD\nurLAe7aIyONe22dEZISIzBWRQ8BrIpIpIi/7ON9GEfmT1/YdIrJWRI6LyHYRmSgi5wZXjMb4Z5WF\nSSjO5qfbgTznH867hkuAv6rqGe/9VTUP+CvQRkRai4gA/YE5qrrL1zlUNbeQEN4HbsJxV9ICuBP4\nyfvtQX6Ux4HPcNwl/S8wC+jjfZchIh1wVGqznNuDgJeA55znHgikAdOCPKcxfpWJdgDGhMDVInIE\nx8VPBRw/yBNU9bjz9Yucz33r5/0bAHHu9yNwPrCxqEGISBrQFbhMVdc6n96Bo0nLvVuQh3tLVad6\nHXs/8CJwC/CG8+m7gFWqus25/QTwqKrOc27vFJERwHIRGamqh4v6mYxxsTsLkwhWAZcClwN/AlYC\n44t5rGB/zH1JBX72qihKYrX3hvOH/l0cdwuISBkcfS6uu4oLgAbA8yJyxPUHfIijomwagphMKWZ3\nFiYRHFfV7c7HfxSRpsAUYIjzuc04KoHWwFc+3t8axw/qJmAf8DPQMgxxuprAClZIvjqwj/l47jXg\nTRGpjuMOpiKw0Pma68JvJL77VPYUKVJjCrA7C5OI/gjcIyKpAKr6FfANMEZE8n3nRSQZGAN8paob\n1LFm/zxggIg08HVwEani57xrgPNd5/Vhn/O/7mG9IlITqBvUp4KPgIM4RnwNBN5zNS2p6k/AbqCF\nqn7v4+9kkOcwxierLEzCUdWtwL9xjGpyGYSjmeZDEekqIvVEpCuOZpp6ztdd/gfYAqwSkd+LyKUi\n0lBEbhOR5cBVfs6bAWQCC0XkFud7rhSR+5yv/4qj03qs85jtcTQj/Rrk58oD5gMPADc43+vtf4CR\nIvKYiLQSkeYicquITA/m+MYUxioLk6ieA64VkW4AqpoFXAZk4/jB3QYsAPYC7VX1a9cbnaOdOuEY\nWTQcRx/IGmAc8B6wpJDz3gB8gGME0iZgNlDd6/V7gKM4Ko15wMvADwWOUdiIqVk4RjodwlHRed6k\nOgf4HXAj8DnwBY5RVdYEZUpMIpUpT0T+jmNI4Y+qeqmffSbhGPd+DBikqusiEpwxxphCRfLO4p/A\ndf5eFJHrgSaq2gwYCtitszHGxIiIVRbO2bI/F7JLbxyjPVDVz4GqIlIrErEZY4wpXCz1WdTFMZrD\nZS/BjxIxxhgTRrFUWRhjjIlRsTQpby+OVUNd6jmfO8stt9yiv/76K7Vr1wagYsWKNG3alLZt2wKw\nbp2jX7w0bLsex0o80dwuWCbRjiea21u3bqVPnz4xE080txctWlSqfx8++ugjAGrXrk3FihWZNm1a\nsVYpiNhoKAARaQj8W1Uv8fHaDcAwVb1RRDoCL6hqR1/Hueuuu/TFF18Ma6yxqOfMs1eR2LtkFnV7\n3u14/fsfQ3KeRhfV4Ld3t/f52uLaV/p8Ptxe/cOJgPtsXfEzTbueH4FoPNo17sy4PpMies5gPPPM\nMzzyyCPRDiMmlMayyM3NZfz48cyePRuA1NRUpkyZwrRp03jttdeKVVlE7M5CRObhmMxUXUR24Vj0\nrBygqjpDVT8QkRtEZCuOobP3+DtWTk5OJEKOWUsGt3M/fjDrFaY6tyc8thiAh//cK2TnWjNgNPuW\nrjzr+V45//Wxd/E8u2gka7//LKh9F4xd4/e1B3c8yNSxU/2+Xprs2uVzwdxSqTSWxbhx41i4cCHl\nypXjkUceYfjw4ZQpU7Kf+4hVFqraP4h9hkcilnjxvx9t44vd/lfDfmPWGjZk7XVXEqHgr3LwViOt\nU77tovzYl0S7xp3Dfg5jEsFjjz3GDz/8wF/+8hcuvvjikBwzlvosgnbddX6nayQUXxVFh/qeZYm2\nf7ePSy/qnu/1RhfVKNE5fVUUNdI60X7uRL/vCUVFEYrmnP79A16PlBpWFh6lsSzq16/P22+/fdbz\nbdq0KfYx47KycHXkJBp/dxLezU4FNajbMqTNTi6uZibHXcMn8FfffRjeCmsiioQuXbpE9fyxxMrC\nI5HLIjc3l19//ZWaNWsGtX9JfjvjsrJYt24dqan+FvaMXwUrinY//EyN4ycLbWbaufdboPiVRaBm\np2DvGmKhiSgzMzOhfxiKwsrCI1HLIiMjg/T0dC666CL+9a9/4UjyGD5xWVkkuiUFOqwLc2HKeSU6\nl79mp4KifddgjHEoONKpVq1aHDp0iPPPD+9IwLisLBK1GcrfnUQkRzcVpdkp1iTi1WNxWVl4JFJZ\nLFu2jJEjR7J3796QjnQKRlxWFonAV/9Ez+Nn56cpaYd1UUc3+Wp2ioUmJmMMrF69mr1795Kamsrk\nyZNDNtIpGHFZWSRCn0VhQ2KLcicRqD22OKObID6bnRK1bbo4rCw8EqksHnroIWrWrMmdd94ZkbsJ\nb3FZWSQS75FOoZwvUVAoJ9EZY6KjbNmyDBo0KCrnjsvKIh77LP4y4VPKHvzFvd3T+d+SVhAlvWKK\n1IS6SEiUq8dQsLLwiMeyyMjIAKBHjx5RjsQjLiuLeORdURSmpH0URWV9FMbEDu+RTrVr1+a///0v\n551XshGPoRKXlUU89FkUvJNwCfUEulC1x8ZjH0VBidQ2XVJWFh7xUhaueROukU5DhgyhUqVK0Q7L\nLS4ri1j0xqw1bP9un3u7rI99TlU7N6wxBDPyyRgTe/7yl7/w3HPPAURlpFMw4rKyiMU+C++KwmVf\nhXI8Oz68bY7eV0z+Kgpfk+wSUTxcPUaKlYVHPJRFly5dmDRpEuPGjYvYvImiir2I4kTBeRKuDusl\njaOfNtxGPhkTX7p27cpXX30V9BpP0RCXlUWk+ywCLRXuj/cKseGwZsBoln/8H1omVQzreeJFvLRN\nR4KVhUeslYWq+lzHKZYrCojTyiLS/FUUHepX4anrmgCeIbCFrRAbasGu62SMiT7XSKfzzjuPJ598\nMtrhFFlcVhbh7rMIZqnwN2atYfvyLUxYviWssQTSMqmiNTs5xdLVY7RZWXjEQll4j3SqUKECw4YN\ni/k7iYLisrIItWCamQo2Kfnq0A73HAkb7WRMfPGVC3vy5MlxV1FAnFYWoe6z8JeRztXEVJhwJB7y\nx1dFkd22YcTOH+tirW06mqwsPKJZFn/605+YPXt2xFeIDYf4jDpMItnfUBLezU6ZmZlRjMQYU5hx\n48axa9cunnzyyZibN1FUcVlZRHqeRcEJd5ESTLOTXT16WFl4WFl4RLMsatSoweuvvx6184dSUrQD\niAf+Kopw91HYaCdj4kNubi579uyJdhhhFZd3FqHuswgm1zVEJmOdL4WNdrK2aQ8rCw8rC49wl4Vr\npNOFF17Ihx9+SHJyctjOFU1xWVkUVaDRTr4y1BUU6ruIYCsKu5MwJjb5yoV94MCBuBzpFIy4rCyK\n2mcR7OzrSI5scinpHAm7evSwsvCwsvAIR1lEMxd2tCTuJ/PBNdopWh3WxpjEsGXLlqjlwo6WuKws\nStpnEY0JdeESqD02kTLhBWLt9B5WFh7hKIvBgwdTpUoV+vTpk9B3E95Kx6f0IxrNTpEWTEVhmfGM\nKZqkpCTuuOOOaIcRUXFZWcRiPotocN01TAmi2yMRMuEFYlfSHlYWHiUpi4yMDI4ePcott9wSwoji\nU1xWFsYh2OYlu3Mwpmi8RzpVrVqVDh06ULt27WiHFVVxWVnEQw7uSDm48zhLXvo22mHEBGun97Cy\n8ChqWRTMhZ2ens4FF1wQxgjjQ1xWFoEUN1lROIVixdjS1FltTDQ8//zzPPXUU0Ds5sKOlrisLAL1\nWfhbRTaSgqkcijrhzldFkXb1NUU6RiKzK2kPKwuPopRFjx49+Nvf/sbo0aMTft5EUSV0SURzFVl/\n6zq1nzuxxMcuDZ3VxkRD27Zt+frrrzn//POjHUrMicvKIlCfRbBrPUVCuLPYWdu0h5WFh5WFh7+y\nOHPmDElJZ6+lahWFbwm56myNKKz1ZIyJD7m5uaSnpzNq1KhohxJXInpnISK9gBdwVFJ/V9VnC7xe\nBZgDpADJwERVfbXgcYKdZ1EaJt3Z1aOHlYWHlYWHd1l4j3QqX748Y8aMoX79+lGMLn5E7M5CRJKA\nKcB1QCugn4i0KLDbMGCDqrYFrgYmikhcNpUZY2KH626iT58+7jWdMjIyrKIogkg2Q3UAtqjqTlU9\nBSwAehfYR4HKzseVgQOqerrggdatWxfWQOOJpVX1sLLwsLLwyMzMZOLEie5c2I8//jiLFy+2IbFF\nFMmr9rrAbq/tPTgqEG9TgHdFJBuoBPSNUGzGmAQ2evRotm/fzqOPPmqVRDHFWhPPdcBaVe0hIk2A\nj0XkUlU96r3T1q1befDBB0lJSWHjVz9wPFepdUFDGtRtCcDOva4ZzY4+C9dVlqvtMhLb3545Rsuk\niiU63mc5r7P2+884uPM4ANUaVDhr/y5dukTl89l27G+7xEo80doG+Prrr3nttddiIp5IbmdmZjJv\n3jwAUlJSqFmzJmlpaRSHqGqx3ljkE4l0BP6oqr2c248A6t3JLSLvAX9R1c+c20uBcar6pfexli5d\nqq6hs/6Gx+6rUI5nx/cIx0cBgp+RXZShs8HM0G7XuDPj+kwK+pjGlCa5ubns27ePJk2aRDuUmJSV\nlUVaWpoU572RvLNYDTQVkQbAD8AdQL8C++wErgE+E5FaQHPg+4IH8jXPwnvkU8+Za0MauC/BVBSh\nmKEdqHKw8fQeVhYepbEsXCOdKleuzLJlyyhfvjxQOssiHCJWWahqnogMB5bgGTq7UUSGOl7WGcBT\nwKsi8rXzbWNV9WCkYiyOcEy6sxnaxgSvYC7s1NRUDhw4QJ06daIcWWKJaJ+Fqi4GLirw3Mtej3/A\n0W9RKF/zLCJxNxFKoVoU0K6YPKwsPEpLWSxfvpzhw4cXmgu7tJRFuMVaB3fIRHrhwKLyV1FY7glj\ngvfjjz+WulzY0RKXlYWvPotoLhpYEiVtcrL2WA8rC4/SUha333475cqV46abbvK7QmxpKYtwi8vK\nwhhjAESEW2+9NdphlApxuZCg5eD2sCsmDysLj0Qri4yMDObPn1+s9yZaWUSL3VkYY2KW90inChUq\n0KlTJxo2bBjtsEqluLyziMe1oZ5dNJI7/tre/RcqtgaQh5WFRyKURUZGBp07d3av6TRmzBjq1atX\n5OMkQlnEAruziBB/E+6MMWd76aWXGD9+PGC5sGNFXFYW8dxnEeoJd9Ye62Fl4RHvZXHdddcxYcIE\n0tPTS5wLO97LIlbEZWVhjElsTZs25auvvqJKldieL1WaWJ9FnLP2WA8rC494KovTp89KWQMQsooi\nnsoilgVdWYhIGRHpJCJ9nNsVRKRC+EIzxiQyV/a6e++9l0itfm2KL6hmKBFpBbzj3KwNLALSgAGc\nvXJs2MVzn0WoWXush5WFR6yXhXcu7HLlyrFlyxaaN28elnPFelnEi2DvLKYBT6lqU+CU87lPgK7h\nCMoYk5h85cJetmxZ2CoKEzrBVhaXALOcjxXAmb3u3HAEFYj1WXhYe6yHlYVHrJbFjBkzIp4LO1bL\nIt4EOxpqJ9AOyHI9ISKXAdvCEZQxJjENHz6cLVu2MGrUKJs3EWeCrSweB94XkalAOREZAwwDHghb\nZIWwPgsPa4/1sLLwiNWyOOecc3j55ZcD7xhCsVoW8SaoZihVfRe4BagPfIYjgVFfVf0wjLEZY+JU\nbm4u3377bbTDMCEUVGUhIrep6mpVHaKq16nqYFX9XESisjaw9Vl4WHush5WFRzTLwrWmU79+/Thy\n5EjU4nCx70VoBNvBPcvP8/8IVSDGmPhWcKRTjRo1OHToULTDMiFSaJ+FiKQ4HyaJSH1AvF5uDJwI\nV2CFadu2LRMeWxyNU8cca4/1sLLwiHRZrFixggcffLDQXNjRYt+L0Aj0f3IHzqGyOEZEedsPPBHq\ngIpjX4VyYT3+mgGj2bd0ZVjPYUw8O378uOXCTnCBmqHKAuWBVc7Hrr8yqlpTVaeFOT6f1q1bx8N/\n7sXDf+7Fksa1WHvh+WE9n7+KokZap7CeNxjWHuthZeER6bLo2bMn8+fPj8i8iaKy70VoFHpnoap5\nzocxl3ih58y1ET9nr5z/Br3vs4tG+sxhYUyiuu6666IdggmjYNeGSgaGAt2BC/Dqu1DVHuEJzb+2\nbduyIMuz3aF+aJcxDkWzU6SSHVl7rIeVhUe4yiIjI4OtW7cyZMiQsBw/HOx7ERrB9j49D1wHvAI8\niaOvYiiwIExxBbRkcLuwHdtXRVHcJqdQJzsyJhq8c2GXKVOGrl27xlxzkwmvYCuLPkBnVd0hIo+r\n6kQR+QDHAoMRt27dOlJTU8N+nnhodsrMzLQrJycrC49QlsXSpUtJT08nOzvbPdKpWbNmITl2JNj3\nIjSCrSzOxTMa6hcRqaCqG0Uk/L/YccJybJtENHPmTMaOHQs4cmFPmTKFFi1aRDkqEw3BVhabgMuA\n1cAa4HEROQxkhyuwwsTy2lCRbnayKyYPKwuPUJXF9ddfz3PPPceDDz7IsGHDYmLeRFHZ9yI0gv0/\n/xBwxvl4NPAyUBm4PxxBGWNiQ926dcnKyqJixYrRDsVEWcDlPpwjoZoD3wCo6neqepWqtlfVT8Ic\nn0+2NpSHjSH3sLLwKE5ZnDx50ufz8V5R2PciNAJWFs65FpNVNSpLexhjwsu1plPfvn05c+ZM4DeY\nUinYhQTfF5EbwhpJEcRyn0WkWXush5WFR7BlsXTpUq688kpmz57NypUr2bBhQ5gjizz7XoRGsH0W\nScCbIpIJ7MazXhSqem84AjPGhI/3vAmwkU4msGDvLLYAzwErgT3AXq+/iLM+Cw9rj/WwsvAIVBbz\n5s1z58J+4oknWLx4ccJWFPa9CI2g7ixUdXy4AzHGRM7gwYPZtGkT999/f8JWEia0gr2zCAkR6SUi\nm0Rks4iM87PPVSKyVkS+EZFlvvaxPgsPa4/1sLLwCFQWZcqU4YUXXigVFYV9L0IjYpWFiCQBU3Cs\nMdUK6CciLQrsUxV4CbhJVVsDt0cqPmMSUW5uLllZWYF3NCaASN5ZdAC2qOpOVT2FYxHC3gX26Q+8\noap7AVR1v68DWZ+Fh7XHelhZeGRmZrpHOvXr148DBw5EO6Sose9FaESysqiLYySVyx7nc96aA9VE\nZJmIrBaRgRGLzpgEkZuby+TJk7n99tvJzs6mfv36HDlyJNphmTgX9EIvInIP0A+ooartRKQrUEtV\nF4U4nlSgB1ARWCkiK1V1q/dO1mfhYe2xHlYW8NlnnzF06FD3CrGPPvpo3K7pFCr2vQiNYJMfPQnc\nALyIo98BHIsIvgAEW1nsBVK8tutx9tDbPcB+Vf0V+FVEPgXaAPkqi0WLFjFz5kxSUhyHq1q1Kpdc\ncon7S+G67Szu9rdnjgHQy3m+YU//ji3Z31CtQQUADu48DuB3u6Tnt23bLu52cnIy2dnZNGvWjFmz\nZtGiRYuYis+2I7udmZnJvHnzAEhJSaFmzZqkpaVRHKKqgXcS2QW0V9V9IvKzqp4vIgIcVNWgEmA7\n15j6DkgDfgC+APqp6kavfVoAk3H8TpcHPgf6quq33seaOHGi3ntv+OYCLq59JeDJZ3HHX9sH9b52\njTszrs+ksMXli63V72Fl4bB8+XIAunfvHuVIYoN9LzyysrJIS0uTwHueLdh70zJArvOxq3apBBwN\n9kSqmiciw4ElOPpK/u7MiTHU8bLOUNVNIvIR8DWQB8woWFFEk2W9M/Gge/fu1qlrQi7YymIxMEFE\n/uD13B+B94tyMlVdDFxU4LmXC2xPACYUdhzrs/CwKyaP0lQWS5cuZd26dYwePdrn66WpLAKxsgiN\nouSzmAMcBsqLSC6wHLgzXIEZY85WcE2nq666ivbtg2smNaYkgho6q6qHVfVmoBnQBWipqjer6uGw\nRueHzbPwsOYGj0QvC+8VYl1rOrVp08bnvoleFkVhZREawY6GmgDMVdW1RGnxQGNKszlz5jBy5EjA\nVog10RHspLwKwGIR2Sgi40WkSTiDCsT6LDysPdYjkcvihhtuoF69ekGvEJvIZVFUVhahEeyqs8NE\nZCTQE8fEvCwR2YTjbiOyY0WNKYWqVavGF198wTnnnBPtUEwpFfRyH6qap6ofqupdwMU4Orv/FrbI\nCmF9Fh7WHuuRKGVx/Phxn88XpaJIlLIIBSuL0Ai6shCRCiJyh4i8gyMZEsB94QnLmNLHlQv7pptu\n4vTp09EOx5h8gu3gng/cCHwDzAeGqOqP4QysMNZn4WHtsR7xXBZLly4lPT3dvaZTVlYWHTp0KPbx\n4rksQs3KIjSCnWexHnhMVbeHMxhjShvLhW3iRbDzLP4cSxWF9Vl4WHusRzyWxb///e+w5MKOx7II\nFyuL0PB7ZyEi61X1Eufj7XjWhMpHVRuHKTZjEl7//v359ttvGThwoN1NmJhWWDPUcK/Hg8MdSFFY\nn4WHtcd6xGNZiAhPP/10yI8bj2URLlYWoeG3slDV5V6bVVT1rYL7iMitYYnKmASTm5vLhg0b6NSp\nU7RDMaZYgh06O8vP8/8IVSBFYX0WHtYe6xGrZeFa0+mOO+5gz549ETlnrJZFNFhZhEaho6FExJXZ\nLklE6gPeSTMaAyfCFZgx8c7XSKeTJ09GOSpjiifQ0NkdeDq2dxZ4bT/wRKgDCob1WXhYe6xHLJXF\nqlWrGDx4cNRyYcdSWUSblUVoBPrmlsVxN7Ec6Ob1vKrqmbBFZUycq1SpEj/99JPNmzAJo9A+C+d6\nUKdVtbPzsesvqhWF9Vl4WHusRyyVRevWrXn33XdDNm+iqGKpLKLNyiI0Cptn8b6q3uh8vAz/8yx6\nhCk2Y+Jax44dox2CMSFTWDPUQq/Hc8IdSFFYn4WHtcd6RKMsli5dyooVK/jjH/8Y8XMXxr4XHlYW\noVHYPIvXvB7/PTLhGBMfCo506tGjB926dQvwLmPiV1DzLETkdyLSwvm4mYgsFZGPRaR5eMPzzfos\nPKw91iNSZeErF/aVV14ZkXMHy74XHlYWoRHsOL4/A52djycCXwPHgGlAWhjiMiYmLVq0iCFDhgC2\nQqwpXYKtLGqq6o8iUh7oCtwOnAb2hS2yQoS6z2LNgNHsW7oypMeMFGuP9YhEWfTq1YtmzZrRv3//\niM6bKCr7XnhYWYRGsN/0AyLSGLgE+FJVT4hIBfLP6I5bviqKGmm2ho85W6VKlcjMzKRs2bLRDsWY\niAp2baingCzgn8AE53NpOJqjIi5cfRa9cv7r/ms/d2JYzhFq1h7rEeqyOHr0qM/n46GisO+Fh5VF\naASb/OjvQH2ggap+5Hz6S6B/uAIzJlpcubDT0tI4fvx4tMMxJiYUpcE1CbhRROoCe4H3VfVweMIq\nnM2z8LD2WI9QlEXBXNhffvklXbt2DUF0kWXfCw8ri9AIduhsB2AbMAroAKQD20TkijDGZkzEuO4m\nbr/9drKzs0lNTeWTTz6Jy4rCmHAIts9iEjBKVTuo6u2qegUw0vl8xNk8Cw9rj/UoSVksX748LLmw\no8W+Fx5WFqERbDPURcC8As8tBF4KbTjGRMfNN9/MmDFjuO222+K6kjAmXIKtLLYCfYDXvZ77DfB9\nyCMKgvVZeFh7rEdJy+LRRx8NUSTRZ98LDyuL0Ai2sngIeE9ERuJIgtQQaAncEqa4jAmL3NxcVq9e\nTVqaLTxgTFEEO3Q2E2gKzAQ2AK8AzVR1RRhj88v6LDysPdYjUFm41nS688472bx5c4Siig77XnhY\nWYRG0ENnVXW/iHwI1AGyVXV/+MIyJnR85cIWSYjFB4yJmKAqCxGpB8zGsS5ULlBFRFYAd6nq7jDG\n55P1WXhYe6yHr7L44osvuPfee6OWCzta7HvhYWURGsEOnZ2Fo/mpmqpWA6oD3wCvFfquAkSkl4hs\nEpHNIjKukP0uF5FTIvKbohzfmIJq1KjBoUOH3PMm0tPTE76iMCYcgq0sLgceUtVcAOfM7YeB9sGe\nSESSgCnAdUAroJ8rR4aP/Z4BPir4mov1WXhYe6yHr7Jo1KgR7733XtzPmygq+154WFmERrCVxRec\nXTG0dT4frA7AFlXdqaqngAVAbx/7jQAWAT8V4djG+NW2bVu7mzCmhIL9F7QJ+FBE/g3sxrGo4M3A\nHBF53LWTqv6pkGPUdb7XZQ+OCsRNROoAt6rq1c4lRnyyPgsPa491WLp0Ke+99x6dO3e2zmvse+HN\nyiI0gq0sqgLv4chfkeJ87j3gPOcfgIYgnhcA774M+1dvClVwpNO1117LDTfcEOWojEk8QVUWqjow\nBOfai6eiAajnfM7bZcACcVwaXgBcLyKnVPVd751efPFFKlasSEqK43BVq1blkksucV9BuNoog93+\n9swxAHo5j1/w9YM78y9TXdTjh3Pbuz02FuKJ5PaJEyfcK8SWKVOGAQMG0LNnz5iJL5rb69ev54EH\nHoiZeKK5PW3atBL9PsTzdmZmJvPmOVZqSklJoWbNmsWekCqqobghCOJEIsnAdziSJv2Ao7+jn6pu\n9LP/P4EbW0aGAAAgAElEQVR/q+qbBV+bOHGi3nvvvSGLbXHtKwFH8iNf7viro7tmwdg1ITtnqGRm\nZpbK2+z333+fgQMd1zCuXNj79+8vlWXhS2n9XvhiZeGRlZVFWlpasVpsItbrp6p5IjIcWIKjY/3v\nqrpRRIY6XtYZBd/i71jWZ+FRWv8RXHPNNbRr145bbrmlVMybKKrS+r3wxcoiNCL6L0xVF+NYwdb7\nuZf97Bu6WweTcMqXL8+SJUtITk7mwIEDnDhxItohGRMTypcvT/Xq1UN+3Li8HFu3bh2pqanRDiMm\nlIZb7MOHD1O1atWznk9OTnbnya5Tp06kwzImJh04cICjR49SqVKlkB432HkWiMjVIvKyiLzt3E4V\nke4hjcYYL67sdZ07dyY3N9fnPocPH6ZatWoRjsyY2FWtWjUOHw59xutg06o+CPwdxzyJq51PnwSe\nDnlEQbA+C49EvatwrRA7e/Zs9u/fz+eff+5zPxGxeRXGeAnXv4lg7yxGA9eo6lPAGedzG4GLQx6R\nKdX85cK+9tprox2aMaVasJVFZRxJj8AzSqkMjruLiLO1oTwSbd2btWvXJlQubGMSRbCVRSaOhQO9\nDQOWhzYcU9p1796dJ598MiFWiG3bti2ffvppiY8zevRoJk6cWOT37dmzh5SUFCI1lyqaVq1axRVX\nXBHtMBJasJXFCOAOEdkKVBaRDcBAHOlWI876LDwSsc9ixIgRdjfhZeLEiYwePTrgfgUrp3r16rFr\n165S0afTsWNHv/1aJXXq1CmeeeYZLr/8clJSUmjXrh0jR45kz549RTrO22+/Ta9evahXrx69e5+9\nhur69evp0aMH9erVIy0tjW+++Sbf61OnTuXiiy+mYcOGjBw5klOnTpXocxVVsGlV9wKpwN3AXcBQ\n4DJV/SGMsZkElpuby3vvvRftMEwQ8vLyYvp44Xb33XezZMkSZs6cyY4dO/j0009p164dy5cXrWGl\nWrVqPPDAA4waNeqs106dOsWdd95J37592b59O3379mXAgAGcPn0acAz4mDx5Mu+88w5ff/01O3bs\n4JlnngnJ5wtW0ENn1eEzVZ2vqpmqGrX/49Zn4RGPfRaukU6DBg0iKysr2uFExMmTJ3n00Udp1aoV\nrVq14rHHHst3ZThp0iRatmxJq1atmD17NtWrV2fHjh0ADBs2jD//+c8AHDx4kH79+tGoUSOaNGnC\nTTfdBMADDzzAnj176N+/PykpKUyePJndu3dTvXp1zpxxjEk5dOgQw4cPp1WrVjRp0oS77rrLZ6zz\n58/n+uuv53/+539o2rQpzz77LABz5syhY8eONGnShNtvvz3flXVGRgZXXHEFjRo1YsyYMdx8883M\nmTOn2Md77LHHuOiii2jQoAFdu3Zl06ZNAHz88cd06tSJlJQUWrduzUsvvQTAZ599RuvWrd3v37x5\nM7fccguNGjWic+fOLF682P3asGHDGDt2LHfccQcpKSn07NmTnTt34ssnn3zCp59+yty5c2nTpg1J\nSUlUrlyZe+65hwEDBhT6/7ygbt260bt3b2rVqnXWa5mZmeTl5TF06FDKli3LkCFDUFX3neLChQu5\n8847ad68OVWqVGHMmDHuNZ8iJdi0qtvxs/yGqjYOaUQmYfnKhR3qiUPees5cG7JjLRncrkTvnzBh\nAllZWaxYsQKA/v37M2HCBB599FH+85//MH36dN5++21SUlIYNWqU36ajl156ibp167Jt2zZUldWr\nVwOOxfJWrlzJ5MmT6dq1KwC7d+/Od5yhQ4dSuXJlVq5cScWKFfniC//paNasWUOfPn3YvHkzp06d\n4oMPPuDFF19k/vz5NG7cmBdeeIHBgwezePFiDhw4wD333MO0adPo1asXr7zyCrNnz6Zv377FOl5G\nRgaff/45X375JZUrV2bLli3uSZnp6en885//5IorriA3Nzffj7zrs54+fZr+/fszcOBA3nzzTVau\nXMmAAQNYtmwZTZo0AeCtt97iX//6F5deeikPPPAATz31FK+88spZ5fDpp5+SmprKhRde6LesxowZ\nw6JFixARVNUdh6pSv379oPqtNm3aRKtWrfI917p1azZt2kSPHj3YtGlTvtWUW7duzb59+zh06BDn\nnXdewcOFRbB3FoOB33v9PQ7sAyaFKa5ClbTPYs2A0SyufaX7L57FS59FVlaWe96E90in5s2bRzu0\niHjjjTcYO3Ys1apVo1q1aowdO5bXX38dgHfeeYf+/fvTvHlzzjnnHMaN85txmDJlyvDjjz+yc+dO\nkpOT6dixY77X/XVm5+TkkJGRwfPPP0+VKlVITk6mU6dOfs9z4YUXct9995GUlET58uV59dVXGTVq\nFE2bNiUpKYlRo0bxzTffsGfPHv7zn/9w8cUXc8MNN5CUlMTQoUOpUaNGsY9XtmxZjh49ynfffYeq\n0qxZM2rWrAlA2bJl2bRpE0eOHKFKlSpccsklZ8W+evVqfvnlF/cAia5du3LdddfxxhtvuPe58cYb\nadu2LUlJSfTp04f169f7LIeDBw/6vBPw9txzz7F9+3a+//57939dj4Md4HDs2DGqVKmS77nKlSu7\nVygo+HrlypVRVffrkRDsEuVLCz4nIkuBD3DkoIgr+5auPOu5GmmefzjPLhrJ2u8/i2RICa9OnTr8\n8ssv7hViI9GBXdK7gVDKycmhXr167u369euTk5Pjfs17+Zq6dev6/dEfMWIEzz77LL/97W8REe66\n6y7S09MDnj87O5vzzz//rB8kf+rWrZtve/fu3Tz66KOMHz8ewH0F/cMPP5CTk3PW/gWXXynK8bp2\n7crgwYMZO3Yse/bs4aabbuJPf/oTlSpVYtasWUyYMIEnn3yS1q1bM378eC6//PJ8x87JyTnr/PXr\n1+eHHzxdrK7KB+Dcc8/l2LFjPsuhWrVqfP/9937LKVQqVqzIkSNH8j2Xm5vrvvMu+Hpubi4iEtY7\n84KC7rPw4TgQlSaoUPVZ9Mr5r/uv/VzP0ERfFUW7xp1Dcs5Qi5c+i9q1a5fKXNgutWvXZvduT6LI\n3bt3U7t2bQBq1apFdna2+7U9e/b4bYaqVKkS//d//0dWVhZz585l6tSp7qatwkY91a1bl59//tnv\nsikFFTxWvXr1+Nvf/pbvqnn37t1cfvnl1KpVi71786em8f48RT0ewO9//3syMjJYuXIlW7duZfLk\nyYCjVWHOnDls2bKF66+/Hl+pCi688MKzzr9nz55Cm5L86d69O1lZWfkqmoJGjx5NSkqKz7/OnYP7\n3WjRogUbNmzI99yGDRu4+OKL3a97j45av349NWvWjFgTFAS/3MfjBf6eAVbgWG48YS0Yu8b9N65P\nVFrcEkrLli3jet5ESfzmN79h4sSJHDhwgAMHDjBhwgR+97vfAXDrrbcyb948Nm/ezC+//FLonIol\nS5awfft2wFFxlClThuTkZABq1Kjh7hR3cd2h1KpVi2uuuYYxY8Zw+PBhTp8+zcqVZ99h+zNo0CCe\nf/55d0dzbm4u77zzDgA9e/Zk48aNfPjhh+Tl5fHKK6+wb9++Yh9v7dq1rFmzhtOnT3POOedQvnx5\nkpKSOHXqFIsWLSI3N5fk5GQqVark/uze2rdvT4UKFZg0aRKnT58mMzOTjz76iN/+9rdBf16X7t27\nc9VVVzFw4EC++uor8vLyOHr0KK+++qq7g3nixIns2rXL599nn3kuPM+cOcOJEyc4ffo0eXl57sfg\naE5OTk5mxowZnDx5kpdffpmkpCR3/1Pfvn2ZO3cu3333HYcOHWLixIn079+/yJ+nJIK9s2hW4O88\n4CUccy0irqh9FonUR1FQrPVZLF26lMGDB7tH4JRm3lfTDz/8MG3btqVr165069aNtm3buudOXHPN\nNQwZMoTevXtz+eWXu6+uy5Urd9Yxt23bxm233UZKSgrXX3899913H1de6fhOP/TQQ0yYMIHGjRu7\nRwl5xzB9+nTKlCnDFVdcwUUXXcT06dOD/iw33ngjo0aNYvDgwTRs2JAuXbqwdKmjdbpatWr885//\n5IknnqBp06Zs2bKFtm3bUr58+WId78iRI4waNYrGjRvTrl07qlevzogRIwDHqKB27drRsGFDZs2a\nxYwZBdPgOPo15s2bx8cff0zTpk0ZO3Ys06dPd3duF3Xeyauvvsq1117LfffdR6NGjejSpQvr1q2j\ne/eiraO6cOFC6tSpw5gxY1i1ahV169Z1D6MtW7Ysc+bMYcGCBTRu3JiFCxcyd+5c98VVWloaI0aM\noHfv3rRt25aGDRsW2rcVDgEz5Tkz3A0AXlfVXyMSVQBLly7VoixR7quCqJHWKV/Tk7dYzowXqwqO\ndJo2bVq+0TDhkp2dnXDLk2/evJkuXbqQk5NDUlJJWoqjQ1Vp3bo1M2bMCLoZxoSWv38XJcmUF/Cb\n6JxPMTlWKgoofp+Fvz6KeBYLfRbeK8S6RjoV55a/NHv//fc5efIkhw4d4sknn6RXr15xVVFkZGSQ\nm5vLiRMn3M1ol112WZSjMqEU7LfxfRG5IfBuprTJyMg4a4XYeF/TKRpeffVVmjdvzmWXXUaZMmWY\nMGFCtEMqktWrV5Oamkrz5s1ZsmQJc+bMKbQZysSfYP9FJwFvikgmjpwW7raraKQ/tbWhPKLdZ9G9\ne3e6devG1VdfbbmwS+Bf//pXtEMokXHjxkW8Dd1EVrD/srcAz4UzEBOfkpOTefPNN+OqycQYU3SF\nVhYi0s+5FtT4SAUUDMvB7RHJHNz79+/nggsuOOt5qyiMSXyB/pW/HJEoTExzZa/r2LEjP/30U7TD\nMcZEQaDKIiYXwrc+C49w31V4j3Q6evSoe+E6Y0zpEqjPIllErqaQSkNVM0IbkokFvlaIjdSaTsaY\n2BPozqI88PdC/maGNTo/LJ+FR7jmWWzZsoW5c+daLuwSsLSqkWNpVcMvUGVxTFUbq2ojP3+WyyJB\ntW/fngkTJti8iRhgaVUDi4e0qidPnmT48OE0aNCAli1bMnXqVL/7/vjjjwwYMIBWrVpRvXr1Ip8r\nHOLyFyDUfRbxvCR5OPssBg0aFLZjm/iRl5fnc8G+WDleuN19993k5OQwc+ZMLrnkEo4dO8aiRYtY\nvnx5kbLlPfPMM+zYsYP169eTk5ND7969adGiBT169Dhr36SkJK655hoeeughevXqFcqPU2xx2cEd\navG0JHmo5ebmxv2EsHhgaVUtrerChQsZM2YMVapUoXnz5tx1113Mnz/f5741atTgnnvuoV27djHT\njFjonYWqVo5UIEURrnkW8bhwYEnmWSxdupT09HSys7OpWbNmkVfRjHWhXGG4V85/S/R+S6tautOq\nHj58mJycnHypU1u3bs0HH3zg97ixxmZTlUKueRPeazoFSh1pSsbSqpbutKpHjx5FRM5KjRrJtKgl\nlZB9FmsGjPaZOjURFfWuYv369fTr14/s7GzKlSvHo48+mrBrOpX0biCULK1q6U6r6kp/euTIEapX\nrw7kT5saDxLyziJQju3SzDWU0laIjSxLq1q606pWrVqVWrVq5UuN+s0338TVcPS4rCyCnWeRiPkr\nCirqPIuqVavy7rvv2ryJCLO0qsEfL1HTqvbt25eJEydy+PBhvvvuO2bPnl1oatQTJ07w66+ONEK/\n/vorJ06cKHL8oRSXlYUpmSZNmtjdRARYWlVLq+rtkUceoUGDBlx66aXceuutpKenc/XVV7tfT0lJ\nYdWqVe7tOnXq0KBBA0SEK6644qymvEgLmFY1FgVKq+oaBRNsm3UiplHNyMhg5syZvPrqqz5/dBKF\npVWNPZZWNfqiklbVxJfc3FxGjRpFnz59WLx4sXusu4ltllbVxLqIfhtFpJeIbBKRzSJy1vhAEekv\nIl85/zJF5OxxcdjaUN68+ywyMjLo3Lkzr732GuXKlWP8+PF+J16Z2GJpVU2si1jDtYgkAVOANCAb\nWC0i76jqJq/dvge6qephEekFvAJ0PPtopqBVq1bRp08fANq1a8eUKVO4+OKLoxyVCVa8z6K3tKqJ\nL5K9nB2ALaq6E0BEFgC9AXdloaqrvPZfBfjs0bF8Fh6ueRZXXHEFN954I6mpqYwYMcI6sI0xIRXJ\nX5S6wG6v7T04KhB/BgMfhjWiBCIivPbaa6VihVFjTOTF5OWnM+HSPYDP6ckvvvgiFStWJCUlBXDM\nHbjkkkvcV9nfnnHMxnSt1ehq13e9XnD74M7j+Y4faP9ob7/77rtUq1aNLl265OuziJX4Ir1tjMnv\n8OHD1KlTh8zMTPd8kJSUFGrWrElaWlqxjhmxobMi0hH4o6r2cm4/AqiqPltgv0uBN4BeqrrN17Em\nTpyovmZuuiTq0Nnc3Fwef/xx3nzzTVasWEGDBg1KtJBgIkjEobPGlFS8D51dDTQVkQYiUg64A3jX\newcRScFRUQz0V1FA6eyz8B7pdPLkSdascVRspbmiMMZETsQqC1XNA4YDS4ANwAJV3SgiQ0VkiHO3\n8UA1YKqIrBUR/2solxLe8yb27t1Lu3btWLZsGb/5zW+iHZoJwNKqRo6lVQ2/iM6zUNXFqnqRqjZT\n1Wecz72sqjOcj3+vqtVVNVVV26mqzw7w0jTPIjs7mwULFrjnTXz00Uf5hsSGKwe3iR2WVjWweEir\n+vbbb9OrVy/q1atH7969z3p9/fr19OjRg3r16pGWlpZv0cFYED9TREupFi1aMGnSJJYtW8ZDDz1k\nQ2JNxOXl5cX08cLt7rvvZsmSJcycOZMdO3bw6aef0q5dO5YvX16k41SrVo0HHniAUaNGnfXaqVOn\nuPPOO+nbty/bt2+nb9++DBgwgNOnT4fqY5RYXFYWpa3P4ne/+53fCXbWZxEfLK2qpVXt1q0bvXv3\n9plMKTMzk7y8PIYOHUrZsmUZMmQIqhqSZsxQscvUGJGbm8tbb73F3XffHe1QEsaExxYH3ilID/+5\nV+CdCmFpVUt3WtVANm3alC/lKjjSrm7atIkePXoEfH8kxOWdRaL1WbhGOj300EO8++67gd/gxfos\n4oOlVS3daVUDOXbs2FlZDGMt7Wrc31kUJ4Xqs4tGsvb7zwLvGGa5ubmMHz+e2bNnA5CamkqzZs2i\nHFXiKOndQChZWtXSnVY1kIoVK3LkyJF8z8Va2tW4vLPw7rPwV1EUlkbVV0XRrnFk193fuHEjnTt3\nZvbs2ZQrV47HH3+cxYsXF3nxP+uziA+WVrV0p1UNpEWLFmzYsCHfcxs2bIipbJZxWVn44p1CNdg0\nqgvGrnH/jeszKQJRejRo0IDy5cuTmprKsmXLGDVqlI10SmCWVjX44yVqWtUzZ85w4sQJTp8+TV5e\nnvsxOC76kpOTmTFjBidPnuTll18mKSmJbt26FTnmcInLyiIR+izOPfdc3nrrrWLdTXizPovYZWlV\nLa2qt4ULF1KnTh3GjBnDqlWrqFu3rnsYbdmyZZkzZw4LFiygcePGLFy4kLlz58bUBWRcplX1Xhuq\nqOtAQfysBRUMWxsq8daGsrSqpqTifW2okGnbti2La1/prihiWUZGBr179/bbgVZSpbmiSCSWVtXE\nuvj5NhaisM7saMnNzSU9PZ0+ffqwYsUK/vGPf0Q7JBPDLK2qiXWx0yBWBOvWrePeIjQ7RVpGRgbp\n6ens3buXcuXK8cgjj/DAAw+E5VylvRkqUVhaVRPr4rKyiGVff/21Oxd2amoqkydPtlzYxpi4F5eV\nRSyvDXXppZfSr18/mjVrxvDhw8M+msHuKowxkRCXlUWsmzJlSqlYFtoYU3rEZQd3rMyz8LeefSQr\nCptnYYyJhFJxZxHqtaBcazotXLiQjIwMWrZsGbJjG2NMLIrLO4ui9lmEci0o1wqxrsX/op3Nyvos\njDGRUCruLFxKMmPb1wqxNtLJFKZNmzbs37+f5ORkKlasSI8ePXjuuec499xzox0a4LjomjRpUkyt\nP2RiV1zeWUSjz+LQoUO89dZbJVohNhyszyJ2iQgLFixg165dLFu2jHXr1hW6SKAv0UxBGm/pT014\nxWVlEQ0pKSlMnTrVVog1ReJae6127dpcc801bNy4kdzcXEaMGEHLli1p3bo1Tz/9tHs/fylIZ82a\nRceOHUlJSeHKK690J+vJycnh7rvvpnnz5qSmpuZbWO/ZZ59l0KBB3HfffaSkpNCjRw++/fZboPA0\nrHPmzOHSSy/l1ltvBeDDDz/kyiuvpHHjxvTu3ZvNmze7z9G2bVumTJlC165dadSoEYMHD+bkyZPh\nL1gTcXH5ixeozyJcyY1c+Y5jifVZ+OdaMDIUSrro5J49e/j444+5+eabGT58ODVr1iQrK4tjx45x\nxx13UK9ePXdK3YIpSN9++22ee+45dx7oHTt2UKZMGVSV/v37c+ONN/KPf/yDvXv3ctttt9GsWTOu\nvvpqABYvXszMmTOZMWMG06ZNY8CAAXz55Zd+07ACrFy5ks8//5ykpCS2bdvGkCFDmDt3Lp07d+al\nl16if//+rFq1yn3B9M477/DGG29Qvnx5rrvuOubNm8egQYNKVF4m9iTknUVJOrRzc3OZPn2630xl\nxhTFnXfeSePGjbnpppvo2rUrAwcO5OOPP+bpp5/mnHPOoXr16tx///28+eab7vcUTEE6Z84cRo4c\nSZs2bQBo2LAh9erVIysriwMHDjB69GiSk5NJSUlx5512adOmDTfddBPJyckMGzaMEydOuPN2w9lp\nWEWERx55hAoVKlC+fHneeustevbsSbdu3UhOTmbEiBEcP348X/7u+++/n5o1a1K1alV69eoV9UEf\nJjzi8s5i3bp1+dJQ+lPUq0HvNZ0qVqzIwIEDixtixNjaUP7FwhL0c+fOdV+5g2OJ6FOnTrn7u1QV\nVc2XcrVgCtK9e/fSqFGjs469e/dufvjhBxo3buw+1pkzZ9z5LQoeS0SoU6eOO52rP95LW+fk5FC/\nfv18x6hbt26+zHHe+bYrVKjAjz/+WOjxTXyKy8oi1HyNdLLllU0oFLxyr1u3Lueccw7btm3zO3mz\n4PN169Z1Z8cr+HzDhg3zXeUX5J3uVFXJzs52pxcN5vy1a9dm48aNZx0z0XKImMDishkqlGtDbdu2\nLSS5sKPF7iriS61atbj66qt57LHHOHLkCKrKjh07+O9//a+iPHDgQKZMmcJXX30FwPbt29mzZw/t\n27enUqVKTJo0iV9//ZW8vDw2btzI2rVr3e/96quveP/998nLy2Pq1KmUL1/efSFUs2ZNv2lYXW69\n9VY+/vhjVqxYwenTp5k8eTLnnHOOO5ufKT3isrIIpZSUFKpVq2a5sE3I+btynzp1KqdOnaJTp040\nbtyYe+65p9Cmm969e/OHP/yBIUOGuPslDh06RFJSEvPnz2f9+vW0a9eO5s2bM2rUKI4cOeJ+7/XX\nX89bb71Fo0aNWLRoEbNnz3bnrR41alShaVgBmjZtyvTp0xk7dizNmjXj448/Zt68ee5/I7YGWukR\n92lVfSlq2tScnBwuuOCCuKwkSnufRSKmVQ2VZ599lh07djBt2rRoh2IiLBxpVePv17EEVNXnlVDt\n2rWjEI0xxsSPuGyGKk6fRUZGBj179uTQoUNhiCh6SvNdhTEmchL+zqLgSKfp06fzyCOPRDkqY8LP\n0pyaUIrLO4tg14byXiHWNdLp4YcfDnN0kWVrQxljIiGh7yxuv/12VNVWiE1grkltNirHGAfXv4lQ\ni8vKItg+i/vvv58aNWpEJBd2tJT2PouqVaty8OBBqlevHu1QjIkJBw8epGrVqiE/bmL+gjo9/fTT\n0Q7BhFmlSpU4ceIE2dnZ0Q7FmJhQvnx5KlWqFPLjRrSyEJFewAs4+kr+rqrP+thnEnA9cAwYpKpn\ndVAUXBvq+++/d6+PU9qU9nkWgPuuwsrCw8rCw8oiNCLWwS0iScAU4DqgFdBPRFoU2Od6oImqNgOG\nAtN9HWvr1q2AY6RTeno6HTp0KHR9nETmymtgrCy8WVl4WFl4lCRxXCTvLDoAW1R1J4CILAB6A5u8\n9ukNvAagqp+LSFURqaWq+dZCOHbsGEuXLiU9PZ1aV+ZxzdgGPP/JA/BJZD5ILDl8+HC0Q4gZVhYe\nVhYeVhYervXFiiOSQ2frAru9tvc4nytsn70+9gEcI52ys7Op0dR3PuNg81cYY4wJLC47uHNycuj5\nSP71/WMhd0E07Nq1K9ohxAwrCw8rCw8ri9CIZGWxF0jx2q7nfK7gPvUD7EOTJk04tteznlObNm3I\nysoKXaRx5LLLLiu1n70gKwsPKwuP0lwW69aty9f0VLFixWIfK2KrzopIMvAdkAb8AHwB9FPVjV77\n3AAMU9UbRaQj8IKqdoxIgMYYY/yK2J2FquaJyHBgCZ6hsxtFZKjjZZ2hqh+IyA0ishXH0Nl7IhWf\nMcYY/+Iyn4UxxpjIiumFBEWkl4hsEpHNIuJzCU0RmSQiW0RknYiELt9qjAlUFiLSX0S+cv5lisgl\n0YgzEoL5Xjj3u1xETonIbyIZXyQF+W/kKhFZKyLfiMiySMcYKUH8G6kiIu86fyvWi8igKIQZdiLy\ndxH5UUS+LmSfov9uuhadirU/HBXZVqABUBZYB7QosM/1wPvOx1cAq6IddxTLoiNQ1fm4V2kuC6/9\nlgLvAb+JdtxR/F5UBTYAdZ3bF0Q77iiWxaPAX1zlABwAykQ79jCURRegLfC1n9eL9bsZy3cW7kl8\nqnoKcE3i85ZvEh9QVURqRTbMiAhYFqq6SlVds49W4Wd+SgII5nsBMAJYBPwUyeAiLJiy6A+8oap7\nAVR1f4RjjJRgykKBys7HlYEDqno6gjFGhKpmAj8XskuxfjdjubII6SS+OBdMWXgbDHwY1oiiJ2BZ\niEgd4FZVnQYk8trlwXwvmgPVRGSZiKwWkYERiy6ygimLKUBLEckGvgLSIxRbrCnW72ZcTsoz/onI\n1ThGkZXmldNeALzbrBO5wgikDJAK9AAqAitFZKWqbo1uWFFxHbBWVXuISBPgYxG5VFWPRjuweBDL\nlY8egMsAAAZ3SURBVEXIJvElgGDKAhG5FJgB9FLVwm5D41kwZXEZsEAcGZEuAK4XkVOq+m6EYoyU\nYMpiD7BfVX8FfhWRT4E2ONr3E0kwZXEP8BcAVd0mItuBFsCXEYkwdhTrdzOWm6FWA01FpIGIlAPu\nAAr+Y38XuAvAOYnvkBZYdDBBBCwLEUkB3gAGquq2KMQYKQHLQlUbO/8a4ei3eDABKwoI7t/IO0AX\nEUkWkXNxdGhuJPEEUxY7gWsAnG30zYHvIxpl5Aj+76iL9bsZs3cWapP43IIpC2A8UA2Y6ryiPqWq\nHaIXdXgEWRb53hLxICMkyH8jm0TkI+BrIA+YoarfRjHssAjye/EU8KrXkNKxqnowSiGHjYjMA64C\nqovILuAJoBwl/N20SXnGGGMCiuVmKGOMMTHCKgtjjDEBWWVhjDEmIKssjDHGBGSVhTHGmICssjDG\nGBOQVRYmrojIbBF5PNpxBCIid4nI+4W83l1E1kcyJmNKwioLExUiskNEfhGRXBE54vxv7cDvjA+q\n+pqq3giOlMIicsY5y971+nJVjXrOEV+xGeNLzM7gNglPgRtVNWGT8XgRojSTXESSVTWvsF1I4Fnu\nJnTszsJE01lr14jDv0TkBxE5KCIZItLC55tFaojI+yLys4gcEJFPvF6rKyJvishPIrJNRB70G4Sj\naWuKiPzHeYezVETqeb3exbm8988iskpEOni9dp+IbHe+b6uI/M7reVdFuNz532+d+90mImnOhewQ\nkcdEZH6BmF4SkQnOx1VF5B8iki0iu0TkyUI+y/+JyAIRmScih4EBItJRRFY6498rIi+KSLK/2JzH\nuUUcWdR+FpFPRaSVv3Oa0sEqCxOL/g00AWoD3wCz/ew3BtgGVAdqAf8LjgoHR4a8z4ELgWuBh8Wx\nfLs/A5zvr45job3ZzmNd4DzWc87XpgAfOH/AKwMTgTRVrQJ0xrEGk4vrir0bjorxYlWtoqpvFXh9\nPnCjiFRwnjMZ6APMdb4+B8caPo2A9sANIlLYej63AnNUtSqwEDgFjMSxdlhnHEt1D/UXm4hcDrwM\n3Ot8zz+Ad0TEWiJKMassTDS97bx7OCgib4JjpTNne/8vqnoS+BPQ3vVDWsApoA7QUFVPOzOEAXQC\nKqvqs6qap6rf4/jBu6OQWP7tzDZ4CngM6OpcmfQm4BtVfV1Vz6jqHBwrld7ofN8Z4BIRKa+qP6rq\npkLO4XMVUFXdjqNSdGV26wkcVNW1IlIXSAP+oKonVHUf8CLQr5DzZKrqB85jn1DVNaq62lm2O4BX\ngO6FxPZ7YKqqZjnf86rz+csLOadJcFZZmGjqrarVnH+/ARCRJBH5q7Pp6BCwBccV+AU+3v8XYBew\nVBzJ5x92Pt8AaOBVEf2M4y6ksNSR7sxhqpoL5OKoiOrgWNra204cOa2P4PjRHg7kiMi7ItKsaEXg\nNh9PBdAPmOd8nAKUB370+ixTgBrBfBYAEblIRN5zNu0dBp7Ed3m6NADGFSi/2iRmFkoTJKssTDT5\nutK+C+gFXKWq5wFN8bM2v6oeVdU/OPNW3IrjB64rjh/LzV4V0fmqWlVVby0kFncyGBGpClQBsp1/\nDQvsm4IzWYyqfqSq1+L4Md0GTPdx7GA6kF8HrhFHStjeeCqL3cCxAp/lPFVtV8ixCp7vZWA90NjZ\nNPUEnvL0Fdtu4MkC56ykqouC+BwmQVllYWJNZeAE8LOIVAT+jJ8fWxG5SUQaOzePAKdxNAutBE6K\nyB9EpLxzeGhrEUkt5Lw3i8gVIlIeR96DFc6EMO/hyNt8u/M4/XH0p7wvIrWdMVRwnvuY8/z5qOoZ\nYD/QuOBrXvv8CHwGvApsciWwUtU9wHIRmSgilZ0DAJo4K8VgVQYOq+pxEbkYT3+Fv9heAYaJyGUA\nIlLJ63OaUsoqCxMt/q62/wn8gOOKfj2Q6Wc/gIuADBE5AqwAXlDVz5xDRW8AOgA7gJ9wXPFXLuRY\nc4CngX1Aa5yZxFR1P3AL8AiOH9V0HEN+DwPJOJq3sp3v6wQM83P8J4D5zmYdf3c483D0T8wt8Pyd\nOPJnfwscxHEXUliTWkGjgUEikgtMAxYUFpuqfg48AEwTkYPAJhwDAEwpZsmPTKknIrOBLar6p2jH\nYkyssjsLY4wxAVllYYzNYDYmIGuGMsYYE5DdWRhjjAnIKgtjjDEBWWVhjDEmIKssjDHGBGSVhTHG\nmICssjDGGBPQ/wOCpkj8pTdPCAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import roc_curve, auc\n", "\n", "classifiers = {'Perceptron' : Perceptron(),\n", " 'logistic regression C=0.1': LogisticRegression(C=0.1),\n", " 'logistic regression C=10': LogisticRegression(C=10),\n", " 'logistic regression C=100': LogisticRegression(C=100),\n", " }\n", "# note that the parameter C of\n", "# the scikit-learn LogisticRegression class is inversely\n", "# proportional to the strength of regularization\n", "\n", "results = {}\n", "for description,classifier in classifiers.items() :\n", " _ = classifier.fit(X_train, y_train)\n", " scores=classifier.decision_function(X_test)\n", " fpr, tpr, _ = roc_curve(y_test, scores)\n", " results[description] = (fpr, tpr)\n", " \n", "plt.figure()\n", "plt.plot([0, 1], [0, 1], 'k--');\n", "for c in results :\n", " fpr, tpr = results[c]\n", " plt.plot(fpr, tpr, label=c);\n", "\n", "plt.xlabel('False positive rate');\n", "plt.ylabel('True positive rate');\n", "plt.title('ROC curve');\n", "plt.legend(loc='best');\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\npQs9e/bk0KFDZGVlkZER0VQdSqWkI0eOsGrVKsrLy72/sD1t+OmyPGPGDLp06ZI05YnnclFREfPm\nzQMgOzubpk2bkpubSzTENd4uyAYiu/G5TDYAY4wJeedZEckEtgK5wEHgU+AOY8zmKrZ/EfjfQFdD\nFRYWmqXfPAPA/IK13vUHDhygefPmmiiUcjPGcODAAbKyskJvnKKKioq0Kcpt3bp15ObmRtxiA2HU\nLIwxbaLZcYD9lIvIWGAp1qWzm0VkjOtpM8v/JVXtK9g4C00USllEBFdFPX1porBHJOMsqs0YswS4\n2G/ds1Vse29cCqWUUiokR/4M13EWSqlw6TgLezgyWThVt27dWLlyZbX3M3HiRAoLCyN+XUlJCdnZ\n2YTqp0oFq1evplevXokuhlIpw5HJIt3HWRQWFjJx4sSQ2/knp5YtW7J37960aMPu3bs3n3zySUz2\nXVZWxmOPPcaVV15JdnY23bt358EHH6SkpCSi/SxatIi8vDxatmxJfn7l8akbN25kwIABtGzZktzc\nXL744osKz0+fPp1LLrmENm3a8OCDD1JWVlat95WqtM/CHo5MFiqxysvLk3p/sXb33XezdOlSnn/+\neXbv3s3KlSvp3r07H374YUT7adSoEffffz8TJkyo9FxZWRl33nknQ4cOZdeuXQwdOpThw4dz9uxZ\nAJYvX860adNYvHgxn3/+Obt37+axxx6z5f0pFYgjk0Uq9FmcOXOGhx9+mE6dOtGpUyceeeSRCr8M\np06dyqWXXkqnTp14+eWXady4Mbt37wbggQce4C9/+QsAR48e5Y477qBt27a0a9eOG290DbC///77\nKSkpYdiwYWRnZzNt2jT27dtH48aNOXfuHADHjh1j7NixdOrUiXbt2nHXXXcFLOsrr7zCkCFD+N3v\nfkf79u2ZPNl1/8c5c+bQu3dv2rVrx89//vMKv6xXrFhBr169aNu2LZMmTeKmm25izpw5Ue/vkUce\n4eKLL6Z169b07duXLVu2ALBs2TKuuuoqsrOz6dy5M88847qk+qOPPqJz587e12/bto2f/vSntG3b\nlquvvpolS5Z4n3vggQcoKCjg9ttvJzs7m0GDBrFnz56Asfjggw9YuXIlc+fOpWvXrmRkZFC/fn1G\njhzJ8OHDg/6f++vXrx/5+fk0a9as0nNFRUWUl5czZswYatasyejRozHGeGuKCxYs4M4776RDhw40\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import precision_recall_curve\n", "\n", "results = {}\n", "for description,classifier in classifiers.items() :\n", " _ = classifier.fit(X_train, y_train)\n", " scores = classifier.decision_function(X_test)\n", " precision, recall, _ = precision_recall_curve(y_test, scores)\n", " results[description] = (precision, recall)\n", " \n", "\n", "plt.figure()\n", "for c in results :\n", " precision, recall = results[c]\n", " #plt.plot(precision, recall, label=c);\n", " plt.step(recall, precision, where='post', label=c)\n", "\n", "plt.xlabel('Recall');\n", "plt.ylabel('Precision');\n", "plt.title('PR curve');\n", "plt.ylim([0.0, 1.05])\n", "plt.legend(loc='best');" ] }, { "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }