{ "cells": [ { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "from random import randint\n", "\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import numpy as np\n", "from sklearn.base import BaseEstimator\n", "from sklearn.datasets import fetch_mldata\n", "from sklearn.linear_model import SGDClassifier\n", "from sklearn.model_selection import cross_val_score, cross_val_predict\n", "from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, precision_recall_curve\n", "import tensorflow as tf\n", "from tensorflow.contrib.layers import fully_connected\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "\n", "sns.set(font_scale=1.5, palette='colorblind')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# MNIST classification" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "mnist = fetch_mldata('MNIST original', data_home='~/workspace/ds/MNIST')" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "X, y = mnist['data'], mnist['target']" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(70000, 784)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "digit = X[36000]\n", "digit_image = digit.reshape(28, 28)\n", "y[36000]" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 27.5, 27.5, -0.5)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAD3CAYAAADfRfLgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAABgtJREFUeJzt3a9rVX8cx/E7EYMsDF0awsbAWQzivzHEpha1mRRhGkyWFUG0WQXFpEFENC6IQWxjpiHzJw6EK8gtC+r95vHlvA+7d9fN1x6P+uLs3uCTT/hwrmP9fr/fAWLt2+kvAIyWyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCGcyCHc/p3+ArBVjx8/LveVlZXG7eHDh9v9dTb59OnTSP/+IJzkEE7kEE7kEE7kEE7kEE7kEE7kEM49OSPR6/Uat9evX5fPLi4ulvubN2/KfWxsrNz3Gic5hBM5hBM5hBM5hBM5hBM5hHOFFurXr1/lvr6+PtTfb7vm+vDhQ+O2tLQ01GeP0uTkZLmfO3fuL32T7eMkh3Aih3Aih3Aih3Aih3Aih3Aih3DuyUO13YPPzMyUe7/fL/fd/DrniRMnGrfz58+Xz87Pz5f70aNHB/pOO8lJDuFEDuFEDuFEDuFEDuFEDuFEDuHck4e6fv16ubfdg7ftbaamphq3S5culc/evHlzqM9mMyc5hBM5hBM5hBM5hBM5hBM5hBM5hHNP/g+7f/9+4/by5cvy2WHfB297vtvtNm5tvwm/urpa7nNzc+XOZk5yCCdyCCdyCCdyCCdyCCdyCCdyCDfWH/bFYUamugfvdDqdhYWFxq3X6w312Tv5u+vT09Plvra2NrLPTuQkh3Aih3Aih3Aih3Aih3Aih3Cu0Haxtqukr1+/Dvy3JyYmyn18fLzc9+2rz4eNjY3G7fv37+WzbX7//j3U83uNkxzCiRzCiRzCiRzCiRzCiRzCiRzC+UnmXez06dPlfu/evcbt4sWL5bOXL18u95MnT5Z7m/X19cZtfn6+fHZ5eXmoz2YzJzmEEzmEEzmEEzmEEzmEEzmEEzmE8z45I/Ht27fGbdh78j9//gz0nfYqJzmEEzmEEzmEEzmEEzmEEzmEEzmE2/Pvk3/58qXcDx482LgdPnx4u79OjOquu+2/PW7bnz17Vu5t7+HvNU5yCCdyCCdyCCdyCCdyCCdyCCdyCBd/T37r1q1yf/DgQbkfOHCgcZudnS2fffr0abn/y7rdbrnfuHGjcXv37l357MzMzCBfiQZOcggncggncggncggncggncggXf4X29u3bcl9dXR34b3/+/Lncr127Vu537twZ+LNHre0V3BcvXpR7dU22f3/9z+748ePl7lXSrXGSQziRQziRQziRQziRQziRQziRQ7j4e/JRmpiYKPfdfA/e5urVq+Xe9rPIlampqZH9bf7PSQ7hRA7hRA7hRA7hRA7hRA7hRA7h4u/J237ed3x8vNx7vV7jdurUqUG+0l9x9uzZcn/y5Em59/v9cm/774Urt2/fHvhZts5JDuFEDuFEDuFEDuFEDuFEDuFEDuHi78nv3r1b7u/fvy/36vfFNzY2ymfb7qLbLC4ulvvPnz8btx8/fpTPtt1zHzt2rNwvXLgw8H7o0KHyWbaXkxzCiRzCiRzCiRzCiRzCiRzCjfXb3ikMt7S0VO4LCwuNW/UaaqfT6Xz8+LHcR/k659zcXLlPTk6W+6NHj8p9enp6y9+JneEkh3Aih3Aih3Aih3Aih3Aih3Aih3B7/p68TbfbbdzaXudcXl4u91evXpX78+fPy/3KlSuN25kzZ8pnjxw5Uu7kcJJDOJFDOJFDOJFDOJFDOJFDOJFDOPfkEM5JDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuFEDuH+A7up+am9jbSbAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(digit_image, cmap=matplotlib.cm.binary, interpolation='nearest')\n", "plt.axis('off')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "shuffle_index = np.random.permutation(60000)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 7837, 33903, 24440, ..., 12235, 14155, 56369])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shuffle_index" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Binary classifier: 5 or not 5?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "y_train_5 = (y_train == 5)\n", "y_test_5 = (y_test == 5)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "sgd_clf = SGDClassifier(loss='log', random_state=42)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n" ] }, { "data": { "text/plain": [ "array([0.95825, 0.9601 , 0.95145])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "class Never5Classifier(BaseEstimator):\n", " \n", " def fit(self, X, y=None):\n", " pass\n", " \n", " def predict(self, X):\n", " return np.zeros((len(X), 1), dtype=bool)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.91065, 0.9101 , 0.9082 ])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "never_5 = Never5Classifier()\n", "cross_val_score(never_5, X_train, y_train_5, cv=3, scoring=\"accuracy\")" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n" ] } ], "source": [ "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[53996, 583],\n", " [ 2021, 3400]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "confusion_matrix(y_train_5, y_train_pred)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[54579, 0],\n", " [ 5421, 0]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "confusion_matrix(y_train_5, cross_val_predict(never_5, X_train, y_train_5, cv=3))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Precision: 0.8536279186542807\n", "Recall: 0.6271905552481092\n" ] } ], "source": [ "precision = precision_score(y_train_5, y_train_pred)\n", "recall = recall_score(y_train_5, y_train_pred)\n", "\n", "print('Precision:', precision)\n", "print('Recall:', recall)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7230965546575924" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1_score(y_train_5, y_train_pred)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n", "/Users/srom/workspace/ds/env/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n", " \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n" ] } ], "source": [ "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method='decision_function')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0,0.5,'recall')" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots(1, figsize=(10, 6))\n", "ax.plot(precisions, recalls)\n", "ax.set_xlabel('precision')\n", "ax.set_ylabel('recall')" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ8AAAHuCAYAAAAxy62yAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XmcjXX/x/HXWWc3C2Yw1uz7voRKtqiUsiRFJZU2Svtyy13JTZKQuzuthBZRqB8iLVL2RHZjHcaMZZj9bNfvj8mIEYMzc83yfj4e85hzrvM91/W5xtc5c97z/X4vi2EYBiIiIiIiIiIiIvnAanYBIiIiIiIiIiJSfCl8EhERERERERGRfKPwSURERERERERE8o3CJxERERERERERyTcKn0REREREREREJN8ofBIRERERERERkXxz0eHTiBEjeOGFF87bZuPGjfTr14/GjRvTtWtXvvrqq0suUEREREREREREiq48h0+GYfDWW2/x2WefnbfdsWPHGDx4MPXr12fOnDkMGDCAF154geXLl192sSIiIiIiIiIiUrTY89Jo//79PP/88+zYsYMKFSqct+0XX3xBaGgoL7zwAlarlerVq7N582Y++OAD2rdv75eiRURERERERESkaMjTyKd169ZRvnx55s+fT8WKFc/bds2aNbRs2RKr9fSuW7Vqxbp16zAM4/KqFRERERERERGRIiVPI59uvvlmbr755jztMCEhgXr16p2xLTo6moyMDI4fP05UVNTFVykiIiIiIiIiIkVSnsKni5GZmYnT6Txj26n7LpfrvM/1eLzY7TZ/l1SgDMPgttm3sSp+1fnbceFRYBcaKVZY9pGX/RSWfeRlP4VlH3nZT0HtI8ubhcfnuWA7MZ/T5iQyMBKrxXrOL4vFknM71BlKiCMEi8WCBctlf7darEQGRhLsCMZuted8RQVF4bQ5/XKcYEcwpQJKnT4fLOc8t1PbgxxBRIdEE2ALINQZisViMfufSERERPLBJ5/AgAFw550wfXr2tttug127cre97joYNSr79ptvwowZuduEh8PSpdm3f/sNHnnk3MedPh3q1s2+3aLFuds89BAMGpR9++GHYeXK3G2aN4f//e/0uUyYcO59/forOBywcyf063fuNuPHw9VXZ9/u1g2OHMndpm9fePrp7NsjR8KCBbnb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+OGHRXBwsHjkkUfEmTNnZOtXVFSIxMREERYWJsaNGyc2b94szGazrE53nAeI7iQhIUEsX75cVmYted3R9c2d2AjR4p4rIiIiIiIiIiKie4hzPhERERERERERUZfh4BMREREREREREXUZDj4REREREREREVGX4eATERERERERERF1GQ4+ERERERERERFRl+HgExERERERERERdRnbH3sHiIiIiDpj6dKlyMjIaLeORqMBACiVSuzevbsb9qq1AwcOYNmyZTh58iR8fHy+dzvFxcWIj4/Hhg0bMH369DvWi4uLw9ixY7Fu3brvvS0iIiKirsTBJyIiIrIKiYmJmD17trScmpoKpVKJlJQUqczZ2Rmpqak/xu4RERER0R1w8ImIiIisgr+/P/z9/aVlZ2dnKJVKhIeH/4h7RUREREQd4ZxPRERE1OsIIfD6669j8uTJCA0NxezZs5GbmyvF09PT8dOf/hTbtm1DdHQ0Jk6ciIaGBgDAO++8g4cffhjBwcGIi4vDX/7yFwghpHWrq6vxhz/8AePHj0doaCimT5+OgwcPttqHnJwczJo1CyEhIZgyZQp27doli9+4cQMvvfQS4uLiEBISgl/+8pf44IMP2v1c+fn5mDdvHiIiIjBlyhQcOnTohxwmIiIiom7BO5+IiIio1zl37hz0ej1WrlyJxsZGrF+/Hs899xw++eQTKJVKAEBRURHOnDmDrVu3oq6uDk5OTnj99deRlpaGp556ChMmTMDFixexbds2VFdXY+nSpQCAxYsXo6qqCqmpqXB2dsb777+PJUuWwNfXFzExMdI+rF69GklJSfj973+Pffv24ZVXXsHQoUMxceJE6HQ6zJkzB3V1dUhKSoKXlxcOHz6MhQsXYv369ZgxY0arz1ReXo6EhAQMGjQIGzduRH19PTZt2oSqqqruOahERERE3xMHn4iIiKjXcXBwwM6dO+Hq6goA0Gq1SElJwZUrVzBs2DAAgMlkwrJly6TH9rRaLbZv344nnngCy5YtAwDExsZCrVZj/fr1mDt3Lvr164dz587hd7/7HR588EEATZOcu7m5wc7OTrYPL7zwAh577DEAQHh4OP7zn//g7NmzmDhxIg4cOIDLly9j//79CA0NBQBMmjQJtbW12LhxI6ZNm9bqM+3evRtmsxk7d+6Eu7s7AGDw4MGYOXPmvT58RERERPcUH7sjIiKiXicwMFAaeAKA/v37AwDq6upk9UaMGCG9v3DhAvR6PeLi4mAymaSfuLg4mM1mnD17FgAQExOD9PR0LFq0CPv378f169exZMkSREZGytqOioqS3js6OsLT0xNarRYAkJWVhYEDB0oDT82mTZuG69ev4+uvv271mc6fP4/IyEhp4AkAwsLC0K9fv7s6NkRERETdjXc+ERERUa/j6OgoW1Yomv6/zWKxSGVKpRL29vbS8o0bNwAA8+fPb7PNiooKAEBaWhp27NiB48eP48SJE1AoFBg3bhzWrFkDPz8/qb5arW61D83br62thaenZ6ttNJdptdpWn6G2thYDBw5stU7fvn3b3F8iIiKinoKDT0REREQAXFxcADQNLg0YMKBV3MvLS6q3ePFiLF68GF9//TU+/PBDbN++HS+99BJ27NjRqW25uroiLy+vVXnzAFfLu5uaubu7tzm/U/OgGREREVFPxcfuiIiIiND0CJudnR0qKioQEhIi/ZhMJqSlpaGyshJlZWWYNGkS/vWvfwEAhgwZgmeeeQbjxo1DaWlpp7el0WjwzTff4PPPP5eVHz16FH379m3zDqcxY8bg/PnzqKyslMoKCwtRVFT0PT8xERERUffgnU9EREREADw8PDB//nykpaWhvr4eUVFR+Pbbb5GWlgYXFxcEBATA3t4efn5+WLt2Lerr6+Hv74/c3FycPHkSiYmJnd7Wo48+ir179yIxMRFJSUnw9vbGkSNHcOrUKaxdu1Z6TLClp556Cu+++y7mz5+PhQsXSoNit090TkRERNTTcPCJiIiI6Jbnn38effv2xZtvvokdO3bAzc0NEyZMQHJysjQ/VHp6OjZt2oRXX30VNTU18PX1xcKFC/HMM890ejtqtRpvvPEGNm/ejE2bNkGn0yEwMBDp6emYOnVqm+u4u7vjrbfewrp167BkyRI4OTlhwYIFOHbs2D357ERERERdxUYIIX7snSAiIiIiIiIiot6Jcz4REREREREREVGX4eATERERERERERF1GQ4+ERERERERERFRl+HgExERERERERERdRkOPhERERERERERUZfh4BMREREREREREXUZDj4REREREREREVGX4eATERERERERERF1mf8HMFgM9/I3dOQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots(1, figsize=(20, 8))\n", "ax.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\")\n", "ax.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\")\n", "ax.set_xlabel(\"Threshold\")\n", "ax.legend(loc=\"upper left\")\n", "ax.set_ylim([0, 1])\n", "ax.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiclass classifier" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "n_inputs = 28*28\n", "n_hidden1 = 300\n", "n_hidden2 = 100\n", "n_outputs = 10" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "X = tf.placeholder(tf.float32, shape=(None, n_inputs), name=\"X\")\n", "y = tf.placeholder(tf.int64, shape=(None), name=\"y\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "with tf.name_scope(\"dnn\"):\n", " hidden1 = fully_connected(X, n_hidden1)\n", " hidden_2 = fully_connected(hidden1, n_hidden2)\n", " logits = fully_connected(hidden1, n_hidden2, activation_fn=None)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "with tf.name_scope(\"loss\"):\n", " xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)\n", " loss = tf.reduce_mean(xentropy, name=\"loss\") " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "learning_rate = 0.01\n", "\n", "with tf.name_scope(\"train\"):\n", " optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n", " training_op = optimizer.minimize(loss)\n", "\n", "with tf.name_scope(\"eval\"):\n", " correct = tf.nn.in_top_k(logits, y, 1)\n", " accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "init = tf.global_variables_initializer()\n", "saver = tf.train.Saver()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From :1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n", "WARNING:tensorflow:From /Users/srom/workspace/ds/env/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please write your own downloading logic.\n", "WARNING:tensorflow:From /Users/srom/workspace/ds/env/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use tf.data to implement this functionality.\n", "Extracting /tmp/data/train-images-idx3-ubyte.gz\n", "WARNING:tensorflow:From /Users/srom/workspace/ds/env/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use tf.data to implement this functionality.\n", "Extracting /tmp/data/train-labels-idx1-ubyte.gz\n", "Extracting /tmp/data/t10k-images-idx3-ubyte.gz\n", "Extracting /tmp/data/t10k-labels-idx1-ubyte.gz\n", "WARNING:tensorflow:From /Users/srom/workspace/ds/env/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n" ] } ], "source": [ "mnist = input_data.read_data_sets(\"/tmp/data/\")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "n_epochs = 50\n", "batch_size = 50" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 Train accuracy: 0.96 Test accuracy: 0.8897\n", "1 Train accuracy: 0.92 Test accuracy: 0.91\n", "2 Train accuracy: 0.86 Test accuracy: 0.9157\n", "3 Train accuracy: 0.88 Test accuracy: 0.9242\n", "4 Train accuracy: 0.96 Test accuracy: 0.926\n", "5 Train accuracy: 0.94 Test accuracy: 0.929\n", "6 Train accuracy: 0.9 Test accuracy: 0.9317\n", "7 Train accuracy: 0.94 Test accuracy: 0.9359\n", "8 Train accuracy: 0.96 Test accuracy: 0.9381\n", "9 Train accuracy: 0.9 Test accuracy: 0.9403\n", "10 Train accuracy: 0.94 Test accuracy: 0.9427\n", "11 Train accuracy: 0.96 Test accuracy: 0.9424\n", "12 Train accuracy: 0.94 Test accuracy: 0.946\n", "13 Train accuracy: 0.98 Test accuracy: 0.9484\n", "14 Train accuracy: 0.92 Test accuracy: 0.9494\n", "15 Train accuracy: 0.98 Test accuracy: 0.9513\n", "16 Train accuracy: 0.96 Test accuracy: 0.9529\n", "17 Train accuracy: 0.88 Test accuracy: 0.953\n", "18 Train accuracy: 0.98 Test accuracy: 0.9547\n", "19 Train accuracy: 0.98 Test accuracy: 0.9562\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mepoch\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_epochs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0miteration\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_examples\u001b[0m \u001b[0;34m//\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mX_batch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_batch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0msess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtraining_op\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mX_batch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0my_batch\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[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/workspace/ds/env/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py\u001b[0m in \u001b[0;36mnext_batch\u001b[0;34m(self, batch_size, fake_data, shuffle)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[0mperm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_examples\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mperm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 213\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_images\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mperm\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 214\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mperm\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;31m# Start next epoch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "with tf.Session() as sess:\n", " init.run()\n", " for epoch in range(n_epochs):\n", " for iteration in range(mnist.train.num_examples // batch_size):\n", " X_batch, _, y_batch, _ = train_test_split(\n", " X_train, y_train, train_size=batch_size, random_state=int(time.time()))\n", " \n", " sess.run(training_op, feed_dict={X_p: X_batch, y_p: y_batch})\n", "\n", " acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n", " acc_test = accuracy.eval(feed_dict={X: mnist.test.images, y: mnist.test.labels})\n", "\n", " print(epoch, 'Train accuracy:', acc_train, 'Test accuracy:', acc_test)\n", "\n", " save_path = saver.save(sess, \"./my_model_final.ckpt\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "test_instance_nb = randint(0, mnist.test.num_examples)\n", "\n", "with tf.Session() as sess:\n", " saver.restore(sess, \"./my_model_final.ckpt\")\n", " X_new_scaled = [mnist.test.images[test_instance_nb]]\n", " Z = logits.eval(feed_dict={X: X_new_scaled})\n", " y_pred = np.argmax(Z, axis=1)\n", "\n", "label = mnist.test.labels[test_instance_nb]\n", "\n", "print\n", "print('Prediction:', y_pred[0], '\\nExpected:', label, '\\n{}'.format('Yaaay' if label == y_pred[0] else 'Noooes'))\n", "\n", "x = mnist.test.images[test_instance_nb].reshape([28, 28])\n", "plt.gray()\n", "plt.axis('off')\n", "_ = plt.imshow(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with tf.Session() as sess:\n", " saver.restore(sess, \"./my_model_final.ckpt\")\n", " all_X_test = mnist.test.images\n", " Z = logits.eval(feed_dict={X: all_X_test})\n", " y_pred = np.argmax(Z, axis=1)\n", " \n", " y_nope = [i for i, y_hat in enumerate(y_pred) if y_hat != mnist.test.labels[i]]\n", " \n", "len(y_nope)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "test_instance_nb = randint(0, len(y_nope))\n", "idx = y_nope[test_instance_nb]\n", "\n", "with tf.Session() as sess:\n", " saver.restore(sess, \"./my_model_final.ckpt\")\n", " X_new_scaled = [mnist.test.images[idx]]\n", " Z = logits.eval(feed_dict={X: X_new_scaled})\n", " y_pred = np.argmax(Z, axis=1)\n", "\n", "label = mnist.test.labels[idx]\n", "\n", "print\n", "print('Prediction:', y_pred[0], '\\nExpected:', label, '\\n{}'.format('Yaaay' if label == y_pred[0] else 'Noooes'))\n", "\n", "x = X_new_scaled[0].reshape([28, 28])\n", "plt.gray()\n", "plt.axis('off')\n", "_ = plt.imshow(x)" ] }, { "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }