Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Postprocessing\n",
"This notebook shall evaluate the performance of the trained model in terms of accuracy and false discovery rate.\n",
"To do this, we will plot the accuracy over the training process and a ROC curve to evaluate precision and recall."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pickle\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import matplotlib.patches as mpatches"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the information from previous training"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"date_string = '2017_01_05_17_37_31'\n",
"with open('training/' + date_string + '/accuracies.pkl', 'r') as f:\n",
" test_acc, train_acc, test_ce = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fb4e9c2ac50>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nFmOtXLky559/fv7hH/4hDQ0NGTRoUL785S9n5cqVbdYwZsyY3H777Vm0aFEqlUoqlUp22GGHdR73\nrrvuyl577ZU+ffqkd+/e2XnnnXPuueeu03W+1auvvpovfvGLTe9t//79s//++7eYcfTQQw/lk5/8\nZLbYYov07Nkzo0ePzv3339/0/KRJk/KlL30pyeq/wzfP/fTTT7f5utB+XTu6AAAAANZsxowZGTt2\nbLp27Zrx48dnypQpmTdvXkaNGtWs36mnnpqpU6fm4IMPzumnn55Vq1blvvvuy4MPPpiRI0cmWf0F\ne9KkSdlzzz3zzW9+M926dctDDz2UuXPnZr/99muzjtb2ypkwYUL69euX888/P8uWLUuS/OpXv8qD\nDz6Y8ePHZ8CAAXnqqady5ZVXZsyYMXnsscfS0NCQJFm2bFk+9rGP5Y9//GNOO+207Lrrrlm8eHFu\nu+22PPPMMxkxYkSOOOKIXH/99bnkkkua1fBmQHb88ce3Wfehhx6ae+65J6eddlo++MEPZvbs2Tnn\nnHPy3HPPtQiI7rvvvtx8882ZMGFCevfunSuuuCJjx47NokWLsuWWW65x/GHDhmXy5Mk577zzcsYZ\nZ2SvvfZKknz0ox9t6rNkyZIceOCBOfLII3PsscfmxhtvzFe+8pWMGDEiBxxwQJLVwd6hhx6a+++/\nP2eccUZ23nnn/Pa3v82ll16aJ554IjfffHOr1/j1r389S5cuzbPPPpvLLrssZVmmV69e6zTuY489\nlkMPPTQf/OAH881vfjPdu3fPn/70p6aApj3X+XZnnHFGbr755nz+85/PsGHD8sILL+Q///M/s2DB\ngnzwgx9MksyZMycHHXRQPvShD+Ub3/hGKpVK/v3f/z177713fvnLX+ZDH/pQjjrqqDz++OO57rrr\ncvnll2errbZKkmy99datnpt1VJZlzf0kGZmknDdvXgkAAPB28+bNK9flO8OylcvKec/Nq+rPspXL\nNug1/vrXvy6LoijnzJnT1DZw4MBy4sSJzfrNmTOnLIqiRftb/elPfyq7dOlSjh07ts1zFkVRTpo0\nqUX74MGDy1NOOaXp8dVXX10WRVF+4hOfKBsbG5v1XbFiRYvjH3roobIoinLatGlNbeedd15ZqVTK\nW2+9tdV67rzzzrJSqZSzZ89u1r7LLruUY8aMafNabrnllrIoivJb3/pWs/ajjz667NKlS7lw4cKm\ntqIoyoaGhvLJJ59sanv00UfLoijK73//+22e5833aerUqS2eGz16dFmpVMrp06c3ta1cubLcZptt\nynHjxjW1XXvttWXXrl3L+++/v9nxV111VVmpVMoHHnigzRoOOeSQcsiQIS3a2zvuZZddVlYqlXLJ\nkiXrdZ1rssUWW5Sf//zn2+yz0047lQcddFCzthUrVpQ77LBDecABBzS1ffe73y0rlUq5aNGidp27\nI7Xn/6Y3+yQZWdZABmPGEAAA0On9YfEfMurfRq294zsw7zPzMnLbkRtsvOnTp2ebbbbJ6NGjm9qO\nOeaYTJ8+PRdffHHTDJqbbroplUol5513XqtjzZo1K2VZttlnXRVFkdNPP73FbKLu3bs3/b5q1aq8\n/PLL2WGHHdKnT5/Mnz8/xx13XJLk5ptvzi677JLDDjus1XPsu+++2XbbbTN9+vTsv//+SZLf//73\nefTRR/PjH/+4zfruuOOOdO3aNZ///Oebtf/jP/5jfvKTn+SOO+7IhAkTmtr322+/DB48uOnx8OHD\ns9lmm73jDb979uyZT33qU02PN9lkk+y+++7Nxr3xxhszbNiw7LTTTnnhhRea2seMGZOyLDN37tzs\nscce63zu9o67xRZbJFn9d3LKKadskLupbbHFFnn44Yfz/PPPZ9ttt23x/G9+85s88cQT+V//6381\nq60sy+yzzz6ZNm3aO66B9hEMAQAAnd7OfXfOvM/Mq/o5NpTGxsZcf/31GTNmTLMA4cMf/nAuvvji\n3H333dl3332TJAsXLsx73vOepi/3a7Jw4cJUKpUMGzZsg9WYpFmQ8qYVK1bkn//5n3P11Vfn2Wef\nbdo4uCiKLF26tKnfn//854wdO7bN8YuiyHHHHZcpU6ZkxYoVaWhoyLRp09LQ0LDWYxctWpT3vOc9\n6dmzZ7P2N1+Dt+959OYeSW/Vp0+fvPjii22eZ21aG/e3v/1t0+Mnnngif/jDH9a4PKooivz1r39d\nr3O3d9xjjjkmP/7xj3P66afnK1/5SvbZZ58ceeSRGTt27HqHRN/5zndy8sknZ+DAgRk1alQOOuig\nnHjiiRkyZEhTbUly4oknrvH4SqWSpUuXZvPNN1+v89N+giEAAKDT67FJjw06m6fa5syZk+effz7X\nXXddZs6c2ey5oigyffr0pmDozeClLe3p05bXX399je2bbrppi7bPfe5zmTp1aiZOnJg99tgjm2++\neYqiyDHHHJPGxsZ1PveJJ56Yiy66KLfcckuOPfbYzJw5M4cddlh69+7d5nGtXXNrQUeXLl3WaZz2\nas+4jY2NGT58eC699NI1nm9N4VJ7tHfchoaG3HvvvZk7d25uv/32/OxnP8v111+fffbZJ3feeed6\nhUPjxo3Lxz/+8cyaNSt33nlnvvvd7+bb3/52Zs2alQMOOKDpb+Hiiy/OLrvsssYx3twrieoSDAEA\nANSYadOmpX///rnyyitbfKG/6aabMmvWrEyZMiXdu3fPjjvumLvuuisvvfRSq7OGdtxxxzQ2Nuax\nxx7LiBEjWj1vnz598tJLLzVr+/vf/57nn3++3bXfdNNNOfnkk/Od73ynqe21115rMe7QoUPzu9/9\nbq3jvf/978+uu+6a6dOnZ7vttsvTTz+d73//+2s9bvDgwZkzZ06WLVvWbNbQY489liTZfvvt23tJ\nbdoQy66GDh2aRx99NGPGjNmgNazruGPGjMmYMWPy3e9+N9/61rfy9a9/PXPnzs3ee++9XtfZv3//\nnHnmmTnzzDOzePHi7LrrrrnwwgtzwAEHZOjQoUmS3r17Z++9925znA3xGtM6t6sHAACoIStWrMis\nWbNy6KGH5ogjjsiRRx7Z7Odzn/tcXn755dx2221JkqOOOiqNjY2ZNGlSq2MefvjhKYoikydPbnMG\nzNChQ3Pvvfc2a5syZUqrM4bWpEuXLi1mBl1xxRUtxjjqqKPyyCOP5NZbb13rmCeccEJmz56dyy67\nLH379s0nP/nJtR5z0EEHZdWqVfnXf/3XZu2XXnppKpVKDjzwwHZczdq9GTq9PfhaF0cffXSeeeaZ\n/PCHP2zx3IoVK7J8+fK11vDWZXrrOu6alsvtsssuKcsyr732WtM5kvZdZ2NjY15++eVmbX379s17\n3vOepvFGjRqVoUOH5rvf/W7THe3eavHixc2ur73nZt2ZMQQAAFBDbr311rzyyiutbsq8xx57ZOut\nt8706dMzbty4jB49OieccEKuuOKKPP744/nkJz+ZxsbG3Hfffdl7770zYcKEDB06NOeee24uuOCC\n7LXXXjnyyCPTvXv3/OpXv8p2222XCy+8MEny6U9/OmeeeWbGjh2b/fbbL4888kjuvPPONe5R01rA\ndMghh+Taa6/NZpttlve973154IEHcvfdd6dv377N+p1zzjm58cYbM27cuJxyyikZNWpUXnjhhfz0\npz/NVVddleHDhzf1Pe644/KlL30pt9xySyZMmNDq8qy3Ouyww7L33nvn3HPPzcKFC5tuV//Tn/40\nEydObNrr5p0aOnRotthii0yZMiW9evVKz549s8cee6zTjKQTTjghN9xwQz772c9m7ty52XPPPfP6\n669nwYIF+clPfpI777wzI0e2vhRy1KhRueGGG3L22Wdnt912S69evXLIIYe0e9zJkyfn3nvvzcEH\nH5ztt98+f/nLX/KDH/wggwYNysc+9rFWr3P33Xdf4z5Tr7zySgYMGJCxY8dml112Sa9evXLXXXfl\n17/+dS655JIkq2cB/ehHP8pBBx2U97///TnllFOy3Xbb5dlnn83cuXOz+eabN4WGo0aNSlmW+drX\nvpZjjz02m2yySQ477LA1LmVkPXT0bdHW9BO3qwcAANqwrrer35gcdthhZc+ePcu//e1vrfY55ZRT\nyu7duzfdXryxsbG8+OKLy/e9731lQ0ND2b9///Lggw8u/+u//qvZcVdffXU5atSoctNNNy232mqr\ncsyYMeXdd9/d9HxjY2P51a9+tezXr1/Zq1ev8qCDDioXLlxYDhkypDz11FObjVOpVNb4+i9durQ8\n7bTTyn79+pWbbbZZedBBB5WPP/54izHKsixffPHF8qyzzioHDhxYNjQ0lIMGDSpPPfXUNd42/eCD\nDy4rlUr54IMPtu+FLMty2bJl5dlnn10OGDCg7N69e/ne9763vOSSS1r0q1Qq5VlnndWifU01r8lP\nf/rT8gMf+EDZrVu3slKpNN3SffTo0eWIESNa9D/55JPLHXbYoVnbqlWryosuuqgcPnx40/uz2267\nlRdccEH5yiuvrPU6jz/++HLLLbcsK5VKs1vXt2fcuXPnlkcccUQ5YMCAsqGhoRwwYEB5/PHHl3/6\n05/adZ1vt3LlyvLLX/5yueuuu5abb7552bt373LXXXctr7rqqhZ9H3nkkXLs2LHl1ltvXTY0NJRD\nhgwpjz322HLu3LnN+l144YXlwIEDy65du9b0res3xtvVF+U73EirGoqiGJlk3rx589pMRQEAgPo0\nf/78jBo1Kr4z1I8jjzwyv/vd7/L44493dCnQqvb83/RmnySjyrKc/64WuAb2GAIAAKCmPf/887n9\n9ttbvbU5sP7sMQQAAEBNeuqpp/LLX/4yP/rRj9KtW7d85jOf6eiSoNMxYwgAAICadM899+TEE0/M\n008/nWuuuSb9+vXr6JKg0zFjCAAAgJp00kkn5aSTTuroMqBTM2MIAAAAoE4JhgAAAADqlGAIAAAA\noE4JhgAAAADqlGAIAAAAoE4JhgAAAADqlGAIAAAAoE4JhgAAAKAKRo8enREjRnR0Ge/IokWLUqlU\ncs0116zX8ZVKJZMnT97AVbEhCYYAAABq2JVXXplKpZKPfOQjHV0Ka/D8889n0qRJefTRR1s8VxTF\nu1LDzJkzc/nll1dt/HdyHUVRvGuvQ7W09R53Bl07ugAAAABaN2PGjAwZMiQPP/xwFi5cmB122KGj\nS+ItnnvuuUyaNClDhgzpsNlBM2bMyO9///t84Qtf2OBjb7/99vnb3/6WTTbZZL2O/9vf/pauXTfu\n6KEW3uNqMmMIAACgRj355JO5//77c8kll6Rv376ZPn16R5fUquXLl3d0CR2iLMuOLmGdvPbaa+tc\nc7du3dZ71k+3bt1SqWzc0cPG9h6vq4373QEAAOjEpk+fnj59+uTggw/O2LFjWw2GyrLM5ZdfnhEj\nRmTTTTdNv379cuCBB2b+/PnN+k2bNi277757evbsmS233DKf+MQnctdddzU939p+MIMHD86pp57a\n9Hjq1KmpVCq59957M2HChPTv3z8DBw5Mkjz99NOZMGFCdt555/To0SN9+/bN0UcfnUWLFrUYd+nS\npZk4cWKGDBmShoaGDBw4MCeddFKWLFmSZcuWpVevXpk4cWKL45577rl07do13/72t9t8/ZYvX56z\nzz47gwYNSkNDQ3beeedcfPHFLfpVKpWcddZZufXWWzN8+PA0NDTkAx/4QGbPnt3m+Pfcc08+/OEP\npyiKnHzyyalUKunSpUuL/XgWLFiQMWPGpGfPnhkwYEAuuuiiFmOtXLky559/fv7hH/4hDQ0NGTRo\nUL785S9n5cqVbdYwZsyY3H777U17AVUqlaZZZb/4xS9SqVRy/fXX5+tf/3oGDhyYnj175pVXXsmL\nL76Yf/qnf8qIESPSu3fvbL755jnooINaLJda0x5DJ598cnr37p3nnnsuhx9+eHr37p1+/frlnHPO\naRGivP1v6hvf+EYqlUr+/Oc/5+STT06fPn2yxRZb5NRTT82KFSuaHbtixYqcddZZ2XrrrbPZZpvl\n8MMPz3PPPdfufYu+973v5QMf+EDT3/tuu+2W6667rlmf5557Lqeeemq22Wabpvf9f//v/930fHvf\n443Zxj2fCwAAoBObMWNGxo4dm65du2b8+PGZMmVK5s2bl1GjRjXrd+qpp2bq1Kk5+OCDc/rp9540\nlAAAGdlJREFUp2fVqlW577778uCDD2bkyJFJkkmTJmXSpEnZc889881vfjPdunXLQw89lLlz52a/\n/fZrs47WZotMmDAh/fr1y/nnn59ly5YlSX71q1/lwQcfzPjx4zNgwIA89dRTufLKKzNmzJg89thj\naWhoSJIsW7YsH/vYx/LHP/4xp512WnbdddcsXrw4t912W5555pmMGDEiRxxxRK6//vpccsklzWp4\nMyA7/vjj26z70EMPzT333JPTTjstH/zgBzN79uycc845ee6551oERPfdd19uvvnmTJgwIb17984V\nV1yRsWPHZtGiRdlyyy3XOP6wYcMyefLknHfeeTnjjDOy1157JUk++tGPNvVZsmRJDjzwwBx55JE5\n9thjc+ONN+YrX/lKRowYkQMOOCDJ6mDv0EMPzf33358zzjgjO++8c37729/m0ksvzRNPPJGbb765\n1Wv8+te/nqVLl+bZZ5/NZZddlrIs06tXryT/73375je/me7du+ef/umf8tprr6Vbt275/e9/n9tu\nuy3jxo3LkCFD8pe//CVXXXVVRo8encceeyzbbLNNq+csiiKNjY054IADsscee+Tiiy/Oz3/+81xy\nySXZcccdc8YZZ7R5bJIcffTR2WGHHfIv//IvmT9/fn70ox+lf//++da3vtXU96STTsqNN96YE088\nMbvvvnvuueeeHHzwwe2avfTDH/4wX/jCF3L00Ufni1/8YlasWJFHH300Dz30UI499tgkyV//+tfs\nvvvu6dKlS84666z07ds3d9xxRz796U/n1VdfzVlnndWu93ijV5Zlzf0kGZmknDdvXgkAAPB28+bN\nKzv7d4Zf//rXZVEU5Zw5c5raBg4cWE6cOLFZvzlz5pRFUbRof6s//elPZZcuXcqxY8e2ec6iKMpJ\nkya1aB88eHB5yimnND2++uqry6Ioyk984hNlY2Njs74rVqxocfxDDz1UFkVRTps2rantvPPOKyuV\nSnnrrbe2Ws+dd95ZViqVcvbs2c3ad9lll3LMmDFtXsstt9xSFkVRfutb32rWfvTRR5ddunQpFy5c\n2NRWFEXZ0NBQPvnkk01tjz76aFkURfn973+/zfO8+T5NnTq1xXOjR48uK5VKOX369Ka2lStXltts\ns005bty4prZrr7227Nq1a3n//fc3O/6qq64qK5VK+cADD7RZwyGHHFIOGTKkRfsvfvGLsiiKcscd\ndyxfe+21Zs+tXLmyRf9FixaVDQ0N5QUXXNDU9tRTT7W4vpNPPrmsVCrlhRde2Oz4kSNHlrvttluz\ntrf/TX3jG98oi6IoTz/99Gb9jjzyyHLrrbduejx//vyyKIry7LPPbtbvlFNOKSuVyhr/Tt/q8MMP\nL4cPH95mn9NOO63cbrvtyhdffLFZ+/jx48s+ffo0/S239R6/XXv+b3qzT5KRZQ1kMJaSAQAAnd/y\n5cn8+dX92cB77EyfPj3bbLNNRo8e3dR2zDHH5Lrrrmu2XOemm25KpVLJeeed1+pYs2bNSlmWbfZZ\nV0VR5PTTT28xe6N79+5Nv69atSpLlizJDjvskD59+jRb2nbzzTdnl112yWGHHdbqOfbdd99su+22\nzZbQ/f73v8+jjz6aE044oc367rjjjnTt2jWf//znm7X/4z/+YxobG3PHHXc0a99vv/0yePDgpsfD\nhw/PZpttloULF7Z5nrXp2bNnPvWpTzU93mSTTbL77rs3G/fGG2/MsGHDstNOO+WFF15o+hkzZkzK\nsszcuXPfUQ0nn3xyunXr1qztrZtJNzY2ZsmSJenRo0fe+973tliC2Jq3zwzaa6+92vV6FUWxxmNf\neOGFvPrqq0mSn/3sZymKIp/97Geb9fv85z/frj1/tthiizzzzDP59a9/3Wqfm2++OYceemhef/31\nZq/7/vvvn6VLl7b7ddjYWUoGAAB0fn/4Q/K25Vcb3Lx5yRvLtt6pxsbGXH/99RkzZkyzL9of/vCH\nc/HFF+fuu+/OvvvumyRZuHBh3vOe92SLLbZodbyFCxemUqlk2LBhG6S+N701SHnTihUr8s///M+5\n+uqr8+yzzzZ9iS+KIkuXLm3q9+c//zljx45tc/yiKHLcccdlypQpWbFiRRoaGjJt2rQ0NDSs9dhF\nixblPe95T3r27Nms/c3X4O17Hr25R9Jb9enTJy+++GKb51mb1sb97W9/2/T4iSeeyB/+8IdsvfXW\nLfoWRZG//vWv76iGNb1PZVnmsssuyw9+8IM8+eSTef3115vO17dv37WO2dDQkK222qpZ27q8XoMG\nDWpxbJK8+OKL6dWrV9PeRkOGDGnWb8cdd2zX+F/+8pdz991358Mf/nB23HHH7L///vnUpz7VtATs\nv//7v/PSSy/l3/7t33LVVVe1OH5DvO4bC8EQAADQ+e288+rgptrn2EDmzJmT559/Ptddd11mzpzZ\n7LmiKDJ9+vSmYKg9syfa06ctb4YGb7fpppu2aPvc5z6XqVOnZuLEidljjz2y+eabpyiKHHPMMWls\nbFznc5944om56KKLcsstt+TYY4/NzJkzc9hhh6V3795tHtfaNbe2P02XLl3WaZz2as+4jY2NGT58\neC699NI1nm9N4dK6WNP7dOGFF+a8887LaaedlgsuuCBbbrllKpVKvvCFL7TrfWrtutprfV/v9t4d\nbeedd84f//jH/J//83/ys5/9LDfffHOuvPLKnH/++Tn//PObrvH444/PSSedtMYxOuOt6ddEMAQA\nAHR+PXpssNk874Zp06alf//+ufLKK1t8Ub7pppsya9asTJkyJd27d8+OO+6Yu+66Ky+99FKrs4Z2\n3HHHNDY25rHHHmvzy26fPn3y0ksvNWv7+9//nueff77dtd900005+eST853vfKep7bXXXmsx7tCh\nQ/O73/1ureO9//3vz6677prp06dnu+22y9NPP53vf//7az1u8ODBmTNnTpYtW9Zs1tBjjz2WJNl+\n++3be0ltWt/buL/V0KFD8+ijj2bMmDHvWg033XRT9t577/zwhz9s1v7SSy+tcebSu2377bdPY2Nj\nnnzyyQwdOrSp/fHHH2/3GJtuumnGjRuXcePGZdWqVTniiCNy4YUX5qtf/Wq23nrr9O7dO6+//nr2\n3nvvNsfZEO9xLbPHEAAAQA1ZsWJFZs2alUMPPTRHHHFEjjzyyGY/n/vc5/Lyyy/ntttuS5IcddRR\naWxszKRJk1od8/DDD09RFJk8eXKbMzKGDh2ae++9t1nblClTWp0xtCZdunRpMePkiiuuaDHGUUcd\nlUceeSS33nrrWsc84YQTMnv27Fx22WXp27dvPvnJT671mIMOOiirVq3Kv/7rvzZrv/TSS1OpVHLg\ngQe242rW7s3Q6e3B17o4+uij88wzz7QIaZLVfw/L17J/Vc+ePZst02uPLl26tPhb+MlPfpJnn312\nncaplgMOOCBlWebKK69s1v69732vXUHNkiVLmj3u2rVrhg0blsbGxvz9739PpVLJUUcdlZtuuim/\n//3vWxy/ePHipt83xHtcy8wYAgAAqCG33nprXnnllVY3Zd5jjz2y9dZbZ/r06Rk3blxGjx6dE044\nIVdccUUef/zxfPKTn0xjY2Puu+++7L333pkwYUKGDh2ac889NxdccEH22muvHHnkkenevXt+9atf\nZbvttsuFF16YJPn0pz+dM888M2PHjs1+++2XRx55JHfeeecaZ5C0FjAdcsghufbaa7PZZpvlfe97\nXx544IHcfffdLfatOeecc3LjjTdm3LhxOeWUUzJq1Ki88MIL+elPf5qrrroqw4cPb+p73HHH5Utf\n+lJuueWWTJgwoV3LmA477LDsvffeOffcc7Nw4cKm29X/9Kc/zcSJE1vsXbO+hg4dmi222CJTpkxJ\nr1690rNnz+yxxx7rNCPphBNOyA033JDPfvazmTt3bvbcc8+8/vrrWbBgQX7yk5/kzjvvzMg2ZryN\nGjUqN9xwQ84+++zstttu6dWrVw455JA2z3nIIYfkm9/8Zk499dR89KMfzW9/+9tMnz692eycjjRy\n5MgcddRRueyyy7J48eLsscceueeee/LEE08kWfssnv333z/bbLNN9txzz/Tv3z+PPfZYvv/97+fQ\nQw9tCnr+5V/+Jb/4xS+y++675/TTT8/73ve+LFmyJPPmzcucOXOawqE1vce77777Gvdu2hgJhgAA\nAGrIjBkz0qNHj6Y9hN6uKIocfPDBmTFjRl588cX06dMnV199dXbZZZf8+Mc/zpe+9KVsvvnm+dCH\nPtS00W6STJo0KTvssEO+973v5etf/3p69OiRESNG5MQTT2zqc/rpp+epp57Kj3/848yePTsf//jH\nc9ddd2WfffZp8UW8tS/mV1xxRbp27ZoZM2ZkxYoV+djHPpaf//znOeCAA5od07Nnz/zyl7/M+eef\nn1mzZuWaa65Jv379su+++2bAgAHNxtx6662z//7754477sjxxx/f7tfytttuy3nnnZfrr78+U6dO\nzeDBg/Pd7343EydObHEta7qe1trfqmvXrrnmmmvy1a9+NZ/97GezatWq/Pu//3vT69ra8W9tL4oi\nt956ay699NJcc801ueWWW9KjR4/ssMMOmThxYnbaaac2a5gwYUIeeeSRXH311bnsssuy/fbbNwVD\nrZ3/a1/7WpYvX54ZM2bkhhtuyKhRo/If//Ef+cpXvtKu97o91/Xm4/VdinXttddm2223zcyZM3PL\nLbdkv/32y/XXX5+ddtopDQ0NbR575plnZvr06bn00kvz6quvZsCAAfniF7+Yc889t6lPv3798vDD\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb522fd6b10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"fig = plt.figure(figsize=(14,8))\n",
"plt.plot(test_acc, color='green', label='Accuracy on the test set')\n",
"plt.plot(train_acc, color='red', label='Accuracy on the training set')\n",
"plt.legend(loc=\"lower right\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Final Accuracy on Test Set: 0.990463916558\n",
"Final Accuracy on Training Set: 0.994039998579\n"
]
}
],
"source": [
"print \"Final Accuracy on Test Set: \" + str(test_acc[-1])\n",
"print \"Final Accuracy on Training Set: \" + str(train_acc[-1])"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## Plot ROC curve"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "ImportError",
"evalue": "libcudart.so.7.5: cannot open shared object file: No such file or directory",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-6-de5df1259dc1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mcnn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# load test set\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'test_data_gray_norm_aug.pkl'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rb'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtest_handle\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mtest_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_handle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/home/sasse/cnn/cnn.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mtensorflow\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/home/sasse/.local/lib/python2.7/site-packages/tensorflow/__init__.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0m__future__\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mprint_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/home/sasse/.local/lib/python2.7/site-packages/tensorflow/python/__init__.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0m_default_dlopen_flags\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetdlopenflags\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdlopenflags\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_default_dlopen_flags\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mctypes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mRTLD_GLOBAL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 48\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpywrap_tensorflow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 49\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdlopenflags\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_default_dlopen_flags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/home/sasse/.local/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_mod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0m_pywrap_tensorflow\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswig_import_helper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mswig_import_helper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/home/sasse/.local/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py\u001b[0m in \u001b[0;36mswig_import_helper\u001b[0;34m()\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfp\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0m_mod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_module\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'_pywrap_tensorflow'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpathname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdescription\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mImportError\u001b[0m: libcudart.so.7.5: cannot open shared object file: No such file or directory"
]
}
],
"source": [
"import cnn\n",
"\n",
"# load test set\n",
"with open('test_data_gray_norm_aug.pkl', 'rb') as test_handle:\n",
" test_set, test_labels = pickle.load(test_handle)\n",
"\n",
"path_to_model = 'training/' + date_string + '/model.ckpt'\n",
"model = cnn.cNN()\n",
"print test_set.shape\n",
"print test_labels.shape\n",
"predictions = model.load_model_and_evaluate('training/2016_08_16_07_13_38/model.ckpt', test_set)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'model' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-7-097bdbe6367b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mtpr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mroc_auc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_classes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mfpr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mroc_curve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtest_labels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpredictions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mroc_auc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mauc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfpr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'model' is not defined"
]
}
],
"source": [
"from sklearn.metrics import roc_curve, auc\n",
"from scipy import interp\n",
"\n",
"# Compute ROC curve and ROC area for each class\n",
"fpr = dict()\n",
"tpr = dict()\n",
"roc_auc = dict()\n",
"for c in range(model.n_classes):\n",
" fpr[c], tpr[c], _ = roc_curve(y_true=test_labels[:, c], y_score=predictions[:, c])\n",
" roc_auc[c] = auc(fpr[c], tpr[c])\n",
"\n",
"# Compute micro-average ROC curve and ROC area\n",
"fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(test_labels.ravel(), predictions.ravel())\n",
"roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n",
"\n",
"all_fpr = np.unique(np.concatenate([fpr[i] for i in range(model.n_classes)]))\n",
"\n",
"# Then interpolate all ROC curves at this points\n",
"mean_tpr = np.zeros_like(all_fpr)\n",
"for i in range(model.n_classes):\n",
" mean_tpr += interp(all_fpr, fpr[i], tpr[i])\n",
"\n",
"# Finally average it and compute AUC\n",
"mean_tpr /= model.n_classes\n",
"\n",
"fpr[\"macro\"] = all_fpr\n",
"tpr[\"macro\"] = mean_tpr\n",
"roc_auc[\"macro\"] = auc(fpr[\"macro\"], tpr[\"macro\"])\n",
"\n",
"# Plot all ROC curves\n",
"plt.figure(figsize=(14, 8))\n",
"plt.plot(fpr[\"micro\"], tpr[\"micro\"],\n",
" label='micro-average ROC curve (area = {0:0.2f})'\n",
" ''.format(roc_auc[\"micro\"]),\n",
" linewidth=2)\n",
"\n",
"plt.plot(fpr[\"macro\"], tpr[\"macro\"],\n",
" label='macro-average ROC curve (area = {0:0.2f})'\n",
" ''.format(roc_auc[\"macro\"]),\n",
" linewidth=2)\n",
"\n",
"#for i in range(model.n_classes):\n",
"# plt.plot(fpr[i], tpr[i], label='ROC curve of class {0} (area = {1:0.2f})'\n",
"# ''.format(i, roc_auc[i]))\n",
"\n",
"plt.plot([0, 1], [0, 1], 'k--')\n",
"plt.xlim([0.0, 1.0])\n",
"plt.ylim([0.0, 1.05])\n",
"plt.xlabel('False Positive Rate')\n",
"plt.ylabel('True Positive Rate')\n",
"plt.title('Some extension of Receiver operating characteristic to multi-class')\n",
"plt.legend(loc=\"lower right\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 0
}