{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Machine Learning: recognizing hand-written digits\n", "\n", "## An experiment with the MNIST dataset\n", "\n", "\n", "The Mnist dataset provides a (somewhat old but) very classical example of Machine Learning. The goal is simple and useful: recognize hand-written digits. This was an important challenge for the postal companies in the 1980s. \n", "\n", "It is available on the webpage of Yann LeCun, a very famous researcher in Machine Learning in general and neural networks in particular. \n", "\n", "

" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/aurelien/anaconda3/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['clf', 'f']\n", "`%matplotlib` prevents importing * from pylab and numpy\n", " \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n" ] } ], "source": [ "# loading a lot of facilities for numerical computations and graphs\n", "%pylab inline \n", "pylab.rcParams['figure.figsize'] = (20, 6) # to have larger plot\n", "seed(240979) #initialize random number generator\n", "\n", "# set working directory\n", "workingdir = './'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Loading the data set\n", "\n", "### 1.1 Description of the data set\n", "The MNIST data contains $n\\_tot=70000$ images of size $dimX\\times dimY=28\\times28$, and their *labels* (a digit between $0$ and $9$). \n", "The images are stored as lines of the matrix *mnist.data*. \n", "Each image can be reshaped as a matrix $im \\in \\mathcal{M}_{dimX, dimY}(\\mathbb{R})$, where $im[i,j]$ is the intensity level of pixel (i,j): 0 means 'white', 255 means 'black'.\n", "\n", "The labels, stored in *mnist.target*, are numbers (here, we cast them to integers) between $0$ and $9$. " ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 70000 images of size 28x28\n", "Number of classes: 10\n", "Classes:\n", "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/aurelien/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:77: DeprecationWarning: Function fetch_mldata is deprecated; fetch_mldata was deprecated in version 0.20 and will be removed in version 0.22\n", " warnings.warn(msg, category=DeprecationWarning)\n", "/home/aurelien/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:77: DeprecationWarning: Function mldata_filename is deprecated; mldata_filename was deprecated in version 0.20 and will be removed in version 0.22\n", " warnings.warn(msg, category=DeprecationWarning)\n" ] } ], "source": [ "from sklearn.datasets import fetch_mldata # si besoin: sudo pip install -U scikit-learn ou (pour une install locale) pip install --user --install-option=\"--prefix=\" -U scikit-learn\n", "\n", "mnist = fetch_mldata('MNIST original', data_home='./')\n", "mnist.target = mnist.target.astype(int) # by default the digits are floating numbers: convert to integers\n", "\n", "# defining general variables for use throuhout the notebook \n", "n_tot = len(mnist.data)\n", "dimX = int(sqrt(len(mnist.data[0]))); dimY = dimX # nb of pixels in each dimension\n", "nc = len(unique(mnist.target)) # number of classes\n", "\n", "print(\"Loaded %d images of size %dx%d\"%(n_tot, dimX, dimY))\n", "print(\"Number of classes: %d\"%(nc))\n", "print(\"Classes:\")\n", "print(sorted(unique(mnist.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 What does the data look like?" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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yjm33nprjZodGZ06uQgznxkzYL31cn6J77//Ptg+44wzgMzzQjFhwgQApk2bFuzbcsstc36/WKimT5g4cSIA7733XrAvn35Q/UXfvn2DYzvssAMQzpGOj/uBOKYxMhNvvfUWED5fPPfcc8Ex34uezrnnnguEERtnnnlmNA0q936xkugezvv3d/Xo1l3X5U488IDrdMupZqHZwLFkCdx5p7u5Vlop6dYkw6JFLt8aXAf71VcuVKlxY2jWLNm2xUGjRu7HZ8UV3eevQQhrSVPu90OXLnDlla526+abw7RpcN115VVi0MYGs4FPufcJp53mtEjGjXMicPPmuf0NGrifcqBPHyd8NmiQE4WbNg1uugkqU1TKAusTHDZGOsq9X/SI7uF83jynrDdvniuJ0bo1PPssePlA3bt3D7bffPNNIPSgK6cBoFnlw0umFT2tej1VWV7AL51x0EEHATB//nygMLlkWcnBBj7y2ClfBmCzyjCnr776CkhdwdMK8X333QdAhw4dgmNa4fr555+BqiVFYmXiRJg5EyrbWZZMmQKV+V0AXHSR++nRw60Mxki/fv0AePzxx4HU/Co/MqMc+Mero3nbbbcBmT3m//vf/6J703K/H4YOdbVaTz3Vhaw1bQonnuhqG+fIggULgDBPGMK8UvG6l7up/nO9Si/U9OnTg2PyLGl88ftKedyVuxiZ5zzPscFH7ZS3Sx5DCKPEdtttNwA22mij4JhysaVDorEW4KabbgLgsssuq/FHypta2OC1ynJTDzzwQJVjBx98MADDhg0L9qlclkqK+tERypscNWoUkHr/r7jiinl9pBpT7n2Cvqtddkndf9FFcPHFVU7ff//983p5fe83eiHi8o6qDznnnHOCY/49FRsdOrjFiQED4LLL3KL9ZZflJAKm/tDXFnrooYdSzlFZXoDDDz8cgIsrbet73BOlBn2C9Kp87Q1dH+rbpVHgR8wI2c73vMsbL40CPZ9AaOOVV145v8+WDxGMkdlYXOmBV0SYnzs+e/ZsADaoTCvp379/cOzEE08EwmhLP8//u+++A2Dq1KmRtBGwftEjuofzmB84ihKzgWOnncq3HIjo3NlskE7lAFh2lPv9sNJKcMMN7qdcsbHBbOBT7n1COX92n332cT/livUJDhsjHeXeL3oUps65YRiGYRiGYRiGYRg5E20ptRqgcAu/9IlC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ygB06NABgBkzZoRtsoaUzZps18BFjSdPngzA8OHDw7akBDG33HJLAO64447wmCJgAwYMAODII48M25TxdPTRRy/0tX3LzkwBJH8eleXmFltsAVT2eT527Nhax9q3bw9AmzZtyt2diuC9994DotG2Jk2aAE4ssFL44osvwsebb7555JgfGX722WeByo6YC30ufy23db36SJN4WymwyLlhGIZhGIZhGIZhJExFRM59VHsm24CGjl8nce211wIumqDIiI+eIzszo7I57LDDwseVaImTBFtvvXX4eKONNgJg+vTpCfWmMvAzdLbZZpsEe2JkorlcEfBVV101bFOt8TrrrANk1+eQbdqwYcNK39k88a3c9PiJJ54AsltcCb+uPJcFmrIMDjroIAD69+8ftq2wwgr16HE6+emnn2odU3aCEeWZZ54BnF2pnzFx//33A5VTaz5nzhwgan8le8Kdd94ZgFtuuSVsy2YjZRhGerHIuWEYhmEYhmEYhmEkjH05NwzDMAzDMAzDMIyEaeSnwS30yY0a/V3I8xsijRo1wsbAxsDGICDt4zBmzBgABg0aBDhxLXDCQMUKQqV9DMTnn38ePpatlspmfLtKWRkWQqWMQSmxMQiwcSjfGGy88cYAvPrqq+GxK664AshPRK+UpOE88MsgJBSssZIAITiLsbgp1Rist956ABx66KHhMYm97b333kB6BLPScB6kARsHGwMIrOCmTZu2UI9fi5wbhmEYhmEYhmEYRsJY5LxAbOfHxgBsDETax0HRYtkK+ZHzd999F6ieyHkpsTGwMRA2DjYGkI4x+Ouvv8LHEkiTSKhEA0tJGsYgaWwMAmwcbAzAIueGYRiGYRiGYRiGUTFUnJWaYRhGvrRq1QqABQsWJNwTwzAMo5z4VrQHHnhggj0xDMPIH4ucG4ZhGIZhGIZhGEbC2JdzwzAMwzAMwzAMw0iYhaa1N2rU6AjgCO//Je1QJWBjYGMANgbCxsHGAGwMwMZA2DjYGICNAdgYgI2BsHGwMejSpUtezzO19gIxtUEbA7AxEDYONgZgYwA2BsLGwcYAbAzAxgBsDISNg40BmFq7YRiGYRiGYRiGYVQM8X05HzECGjWK/mvePLaXrxi++gr69YNmzWDJJWG99eDpp5PuVfm44grYYANYbrng32abwYMPJt2r8mJjEGBzgp0LAFOnQu/esNpq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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Showing one image \n", "figure(figsize = (7,7))\n", "ii = random.randint(0, n_tot-1)\n", "plt.imshow(reshape(mnist.data[ii], [dimX, dimY], order='C'), cmap=\"Greys\", interpolation=\"none\") # or \"nearest\"\n", "ax = plt.gca()\n", "ax.set_xticks(arange(-0.5, dimX, 1))\n", "ax.set_yticks(arange(-0.5, dimY, 1))\n", "ax.set_xticklabels(arange(0, dimX+1, 1))\n", "ax.set_yticklabels(arange(0, dimY+1, 1))\n", "ax.grid(color='r', linestyle='--', linewidth=1)\n", "plt.show()\n", "\n", "# Showing a few images in the dataset with their labels\n", "nbRows = 5\n", "nbCols = 15\n", "I = [[0 for k in range(nbCols)] for j in range(nbRows)]\n", "I[0] = [random.randint(0, n_tot-1) for k in range(nbCols)]\n", "I[0][0] = ii\n", "M = np.concatenate([reshape(mnist.data[i], [dimX,dimY], order='C') for i in I[0]], axis=1)\n", "\n", "for j in range(1, nbRows):\n", " I[j] = [random.randint(0, n_tot-1) for k in range(nbCols)]\n", " M = concatenate([M, np.concatenate([np.reshape(mnist.data[i], [dimX, dimY], order='C') for i in I[j]], axis=1)], axis=0)\n", "plt.imshow(M, cmap=\"Greys\", interpolation=\"none\")\n", "for j in range(nbRows):\n", " for k in range(nbCols):\n", " plt.text(dimX*k+2, dimX*j+5, mnist.target[I[j][k]], fontsize=14, color=\"red\")\n", "ax = plt.gca()\n", "ax.set_xticks(np.arange(-0.5, dimX*nbCols, dimX))\n", "ax.set_yticks(np.arange(-0.5, dimY*nbRows, dimY))\n", "ax.set_xticklabels([])\n", "ax.set_yticklabels([])\n", "ax.grid(color='k', linestyle='-', linewidth=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. What is the goal?\n", "\n", "\n", "### 2.1 Classifiers\n", "We must construct a *classifier* $\\mathcal{M}_{dimX, dimY}(\\mathbb{R})\\to \\{0,\\dots,9\\}$ which maps every possible data $X$ (an image) to a label $d$ (a digit).\n", "This is a **classification problem** with $n_c = 10$ classes.\n", "\n", "Classically, this classifiers is assumed to take as input:\n", " * a matrix (table) $X\\in\\mathcal{M}_{n, p}(\\mathbb{R})$, where $X_{i,.}$ contains the relevant information on the $i^{th}$ example (here, image);\n", " * a vector (list) $y\\in\\mathcal{Y}^n$ of *labels* (here, for each image, the corresponding digit)." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "class Classifier: # abstract base class, just providing a template for the classifiers\n", " def __init__(self):\n", " pass\n", " \n", " def fit(self, X, y): \n", " pass\n", " \n", " def predict(self, X): # returns a digit (0,1,...,9) for each line of X\n", " return(apply_along_axis(self.predictOne, axis=1, arr=X))\n", " \n", " def predictOne(self, x):\n", " #return(nc) # nc=10 means \"I don't know\"\n", " return(random.choice(range(nc))) # random choice\n", "\n", "randomClassifier = Classifier()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 Dividing the data into a training and a testing set\n", "\n", "\n", "We will separate the data into two sets: the *training set* and the *testing set.\n", "We will use the *training set* only to teach the machine recognize the digits. \n", "The *testing set*, on the other hand, will be used to evaluate the performance of our classifier. It should *not* be used in the construction of the classifier! In usual challenges, it is hidden to the participants." ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "class DataSet:\n", " def __init__(self, data, target): \n", " self.data = data # input : images\n", " self.X = data # default: features = data itself\n", " self.target = target # output: labels\n", " self.n = len(data)\n", " \n", "# defining the dataSets\n", "# training set: the images we may use to construct the classifier\n", "\n", "n_train = 10000\n", "I = random.choice(range(n_tot), n_train, replace=False)\n", "trainingSet = DataSet(mnist.data[I, :], mnist.target[I]) \n", "\n", "# testing set: we may not use them, except at the end to assert the quality of the classifier\n", "mask = np.ones(n_tot, dtype=bool) #np.ones_like(a,dtype=bool)\n", "mask[I] = False\n", "testingSet = DataSet(mnist.data[mask, :], mnist.target[mask])" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training set of size 10000\n", "Testing set of size 60000\n", "Histogram of the labels in the training set:\n", "[ 976 1135 1034 1031 944 894 963 1058 963 1002]\n", "Histogram of the labels in the testing set:\n", "[5927 6742 5956 6110 5880 5419 5913 6235 5862 5956]\n" ] } ], "source": [ "print(\"Training set of size %d\"%(trainingSet.n))\n", "print(\"Testing set of size %d\"%(testingSet.n))\n", "print(\"Histogram of the labels in the training set:\")\n", "print(np.histogram(trainingSet.target, [-0.5+k for k in range(11)])[0])\n", "print(\"Histogram of the labels in the testing set:\")\n", "print(np.histogram(testingSet.target, [-0.5+k for k in range(11)])[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluating a classifier\n", "The most natural performance measure is the *proportion of misclassified images*. \n", "One may compute the *training error* \n", "$$ L_{mis}^{train}(classifier) = \\frac{1}{n} \\sum_{i=1}^n \\mathbb{1}\\{classifier\\big(train\\_images[i]\\big) \\neq train\\_labels[i]\\big)\\}$$ \n", "and the *testing error*\n", "$$ L_{mis}^{test}(classifier) = \\frac{1}{n_{test}} \\sum_{i=1}^{n_{test}} \\mathbb{1}\\{classifier\\big(test\\_images[i]\\big) \\neq test\\_labels[i]\\big)\\}\\;.$$ \n", "The testing error is the only correct estimator of the performance of the classifier on future data, because the training sample is used to train the classifier (after all, it may just store them and learn the answers by heart).\n", "\n", "Of course, for the purely random classifier, the results are predictible! (guess the results before running the next cell)." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random classifier: misclassification on the training set=0.9047\n", "Random classifier: misclassification on the testing set=0.900883\n" ] } ], "source": [ "def evaluate(classifier, X, y): # (X,y) is a testing set\n", " return(mean(classifier.predict(X) != y))\n", "\n", "print(\"Random classifier: misclassification on the training set=%g\"%(evaluate(randomClassifier, trainingSet.X, trainingSet.target)))\n", "print(\"Random classifier: misclassification on the testing set=%g\"%(evaluate(randomClassifier, testingSet.X, testingSet.target)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Without Machine Learning: designing a classifier by hand\n", "\n", "\n", "### 3.1 An expert system\n", "The first, most natural approach, is to try to recognize the features from a few characteristics. For example:\n", " - the contour of a '0' is black, while its center is white,\n", " - a '1' has a more or less vertical bar in the middle, and nothing else,\n", " - the top, bottom, and second diagonal of a '2' are black,\n", " - ...\n", " \n", "Thus, it seems natural to build simple \"detectors\" that sense the presence or absence of writing in the top, bottom, left, right, center, outer part, and diagonals of the image. Then, we can cook a classifier based on these characteristics of the image. " ] }, { "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": [ "from scipy.linalg import toeplitz # for trigonal matrices\n", "\n", "# hand-made masks to detect some characteristics of the images\n", "\n", "top = 0; Mtop = np.concatenate((np.ones(28*8), np.zeros(28*20)))\n", "bottom = 1 ; Mbottom = np.concatenate((np.zeros(28*20), np.ones(28*8)))\n", "left = 2; Mleft = np.tile(np.concatenate((np.ones(8), np.zeros(20))), 28)\n", "right = 3; Mright = np.tile(np.concatenate((np.zeros(20), np.ones(8))), 28)\n", "center = 4; Mcenter = np.concatenate((np.zeros(28*10), np.tile(np.concatenate((np.zeros(10), np.ones(8), np.zeros(10))), 8), np.zeros(28*10)))\n", "outside = 5; Moutside = np.concatenate((np.ones(28*8), np.tile(np.concatenate((np.ones(8), np.zeros(12), np.ones(8))), 12), np.ones(28*8)))\n", "diag1 = 6; Mdiag1 = np.reshape(toeplitz(np.concatenate((np.ones(8), np.zeros(20)))), [28*28])\n", "diag2 = 7; Mdiag2 = np.reshape(np.flipud(toeplitz(np.concatenate((np.ones(8), np.zeros(20))))), [28*28])\n", "\n", "masks = [Mtop, Mbottom, Mleft, Mright, Mcenter, Moutside, Mdiag1, Mdiag2]\n", "p = len(masks)\n", "\n", "# Show the masks\n", "\n", "M = np.concatenate([np.reshape(masks[i], [dimX,dimY], order='C') for i in range(p)], axis=1)\n", "plt.imshow(M, cmap=\"Greys\", interpolation=\"none\")\n", "for j in range(p):\n", " plt.text(dimX*j+12, 15, j, fontsize=14, color=\"red\")\n", "ax = plt.gca()\n", "ax.set_xticks(np.arange(-0.5, dimX*p, dimX))\n", "ax.set_yticks(np.arange(-0.5, dimY, dimY))\n", "ax.set_xticklabels([])\n", "ax.set_yticklabels([])\n", "ax.grid(color='m', linestyle='-', linewidth=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The masks will be used to sum the \"total amount of writing\" in each of the chosen areas of the images. \n", "Each image will be represented by a tuple of values called *features*.\n", "The first job is thus to build, for each image, its feature vector. \n", "Here, the feature vector is made of $p=8$ boolean features, which indicate whether each zone is \"written\" or not.\n", "\n", "We must choose a *threshold* for each mask to decide whether the zone is \"written\" or not. \n", "We could hand-tune these thresholds; for simplicity, here, we chose that a zone is \"written\" if less than $\\alpha = 45\\%$ of the images in the training set are \"more written\" in that zone.\n", "\n", "Doing so, we introduce an important intermediate step: for every image we compute a *feature vector* $x$=featureVector(image), and then the goal is to construction a mapping $\\psi:x\\mapsto \\{0,\\dots,d\\}$. The classifier is of the form: $image \\mapsto \\psi\\big(featureVector(image)\\big)$." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "class FeatureMaker: # abstract class, serves as a template for all feature making classes\n", " def __init__(self):\n", " self.p = dimX*dimY # number of features\n", " \n", " def computeFeatures(self, image):\n", " return(np.array(image)/255) # by default, the feature is the input itself\n", " \n", " def computeAllFeatures(self, dataSet): # stores the features in vector X of the dataSet\n", " dataSet.X = np.array([self.computeFeatures(im) for im in dataSet.data]) \n" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Features: \n", "[False, False, False, True, True, False, True, True]\n" ] }, { "data": { "image/png": "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Oeqoo5qeveCCCyrcBANxZg0ACRBrAEiAWANAAsQaABIg1gCQALEGgASINQAkQKwBIAFiDQAJEGsASIBYA0ACXBuky61atapoft++fRVtIr3++utF8xMmVHcu8cQTTxTNr1u3rmj+zjvvbHr2rrvuKjr2li1biuZLXXXVVU3PHnvssdUtgoNwZg0ACRBrAEiAWANAAsQaABIg1gCQALEGgASINQAkQKwBIAFiDQAJEGsASIC3m3e5tWvXVnr8iy++uOnZY445psJNylx66aVF81dffXXR/GOPPVY0X6WJEycWzS9evLiiTdAKzqwBIAFiDQAJEGsASIBYA0ACxBoAEiDWAJAAsQaABIg1ACRArAEgAWINAAkQawBIgGuDdLlt27ZVevyenp6mZ21XuEmZyZMnF80//vjjRfMLFiwomq/SjTfeWDQ/c+bMijZBKzizBoAEho217RW2d9neOOC2pbY/s/1O469Lql0TAMa3Zs6sfy9p7iC3/y4iZjb+eqG9awEABho21hGxTtKeUdgFADCEVp6zvs72e42nSY5r20YAgB8ZaawfknSypJmSdkhaNtSg7SW267brvb29I/xxADC+jSjWEbEzIg5ERJ+kRyTNOsTs8oioRUSt5GVeAIDvjSjWtqcM+PIKSRuHmgUAtG7YN8XYflLSHEnH294m6Q5Jc2zPlBSStkq6psIdAWDcGzbWETHYW7HGzh/dDADjAO9gBIAEuDYIWrJhw4amZ/v6+oqOPWFC2bnEV1991fRsvV4vOvYzzzxTNF+lww47rGj+lltuqWgTjCbOrAEgAWINAAkQawBIgFgDQALEGgASINYAkACxBoAEiDUAJECsASABYg0ACRBrAEiAa4N0uWuvvbZo/s033yya37x5c9OzM2bMKDr2lVdeWTT/4IMPNj27Z0/eP1b0pptuKpqfPHlyRZtgNHFmDQAJEGsASIBYA0ACxBoAEiDWAJAAsQaABIg1ACRArAEgAWINAAkQawBIwBExaj+sVqtFvV4ftZ8Hqa+vr2h+7ty5RfMvv/xy0Tx+7Nxzzy2af/XVV4vmJ03iqhJjWa1WU71e93BznFkDQALEGgASINYAkACxBoAEiDUAJECsASABYg0ACRBrAEiAWANAAsQaABIg1gCQABcN6HITJpT993jNmjVF8+vXr296dtWqVUXHPnDgQNH82Wef3fTs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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "class LogicalFeatureMaker(FeatureMaker): \n", " def __init__(self, masks, thresholds=[]):\n", " self.masks = masks\n", " self.p = len(masks)\n", " self.thresholds = thresholds\n", "\n", " def computeFeatures(self, image):\n", " return([self.isWritten(image, self.masks[k], self.thresholds[k]) for k in range(self.p)])\n", " \n", " def isWritten(self, image, mask, threshold): \n", " return(sum(image*mask) > threshold)\n", "\n", " def computeThresholds(self, dataSet):\n", " self.trainingSet = dataSet\n", " self.thresholds = [self.computeThreshold(mask) for mask in masks]\n", " \n", " def computeThreshold(self, mask):\n", " alpha = 0.45 # value obtained after some hand tuning...\n", " return(sorted([sum(im*mask) for im in trainingSet.data])[int(alpha*len(trainingSet.data))])\n", "\n", "logicalFeatureMaker = LogicalFeatureMaker(masks, 8000 * np.array([0.5, 0.7, 0.1, 0.2, 0.7, 1.3, 2, 2]))\n", "logicalFeatureMaker.computeThresholds(trainingSet) # overwrite arbitrary features \n", "\n", "plt.imshow(np.reshape(mnist.data[ii], [dimX, dimY], order='C'), cmap=\"Greys\", interpolation=\"none\")\n", "print(\"Features: \")\n", "print(logicalFeatureMaker.computeFeatures(mnist.data[ii]))\n", "\n", "logicalFeatureMaker.computeAllFeatures(trainingSet) # updates trainingSet.X\n", "logicalFeatureMaker.computeAllFeatures(testingSet) # updates testingSet.X" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "class HandMadeClassifier(Classifier):\n", " def __init__(self):\n", " self.featureMaker = logicalFeatureMaker\n", " self.p = logicalFeatureMaker.p\n", " \n", " def fit(self, X, y): # no data fitting!\n", " pass\n", " \n", " def predict(self, X):\n", " return([self.predictOne(x) for x in X])\n", "\n", " def predictOne(self, x):\n", " if x[outside] and not x[center]:\n", " return(0)\n", " elif not x[left] and not x[right] and x[center] and not x[outside]:\n", " return(1)\n", " elif x[top] and x[diag2] and x[bottom] and not x[center]:\n", " return(2)\n", " elif x[top] and x[bottom] and x[center] and x[right]:\n", " return(3)\n", " elif x[diag2] and x[bottom] and not x[top] and not x[outside]:\n", " return(4)\n", " elif x[top] and x[bottom] and x[diag1] and not x[diag2]:\n", " return(5)\n", " elif x[top] and x[center] and x[bottom] and x[diag1] and not x[right]:\n", " return(6)\n", " elif x[top] and x[diag2] and not x[bottom] and not x[left]:\n", " return(7)\n", " elif x[top] and x[center] and x[bottom] and x[left]:\n", " return(8)\n", " elif x[top] and x[center] and x[bottom] and x[right] and not x[left]:\n", " return(9)\n", " else:\n", " # return(10) # 10 means: I don't know\n", " return(random.randint(0, 10)) # random guessing" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "training error: 0.8057\n", "testing error: 0.804783\n" ] } ], "source": [ "handMadeClassifier = HandMadeClassifier()\n", "\n", "trainingError = evaluate(handMadeClassifier, trainingSet.X, trainingSet.target)\n", "print(\"training error: %g\" % (trainingError))\n", "\n", "testingError = evaluate(handMadeClassifier, testingSet.X, testingSet.target)\n", "print(\"testing error: %g\" % (testingError))" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "* -> Training and testing error are slightly better than random classification (90%), but not by far! They are really not satisfactory. It would require a huge effort to obtain decent performance. \n", "\n", "* One can observe here, as expected, that training and testing errors coincide statistically.\n", "\n", "### 3.2 Questions\n", "* Try improving the decision rule coded in the function HandMadeClassifier.predictOne\n", "* Try adding new, relevant features. What is the best score you can reach?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. A first flavour of Machine Learning: optimizing the decision rule given the logical features\n", "\n", "\n", "### 4.1 The Machine can know better than us what a digit looks like\n", "Instead of guessing the rule which maps the logical features (giving which zone is written or not in the image) to the digits, one can have the idea to use the dataset to find the best rule!\n", "\n", "-> We abandon what *we know* about the shape of the digit images, and leave it up to *the computer to learn* it from the training data." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "# design change: introduce here class FeatureMaker, puis LogicalFeatureMaker\n", "# extract the relevant code from the HandMadeClassifierLDC\n", "\n", "class HandMadeClassifierLDC(HandMadeClassifier): # hand-made classifier with learned decision rule\n", " \n", " def __init__(self):\n", " super(HandMadeClassifierLDC, self).__init__()\n", " \n", " def fit(self, X, y): # the training set is used not only for choosing the thresholds, but also to optimize the decision rule\n", " nfv = 2**self.p # number of different possible feature vectors\n", " self.counts = np.zeros((nfv, nc), dtype=np.int)\n", " self.n = len(X)\n", " for k in range(len(X)):\n", " self.counts[self.featureNumber(X[k]), y[k]] += 1\n", " self.mostFrequentLabel = [nc for k in range(nfv)] \n", " nbErrors = [0 for k in range(nfv)]\n", " for k in range(nfv):\n", " dmax = nc # combinations of features which have never been seen predict nc=10 (could be -1, 0 or random digit)\n", " ndmax = 0\n", " for d in range(nc):\n", " if self.counts[k,d] > ndmax:\n", " dmax = d\n", " ndmax = self.counts[k,d]\n", " self.mostFrequentLabel[k] = dmax\n", " \n", " def predictOne(self, x):\n", " return(self.mostFrequentLabel[self.featureNumber(x)])\n", " \n", " def trainError(self):\n", " res = 0\n", " for k in range(2**self.p):\n", " if self.mostFrequentLabel[k] We need another way to build the classifier from the features!\n", "The solution is to use *continuous* optimization instead of discrete optimization." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. The classifier as a continuous optimization program\n", "\n", "There are well-documented and efficient methods to minimize continuous functions.\n", "The most simple and natural approach is *gradient descent*. \n", "\n", "\n", "Src: http://ludovicarnold.altervista.org/\n", "\n", "\n", "The version given here is very rough: it requires to tune the parameter stepSize correctly, and if the step size is chosen constant it requires the function to optimize to be smooth. " ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iteration 0: value=1.44\n", "iteration 1: value=0.2304\n", "iteration 2: value=0.036864\n", "iteration 3: value=0.00589824\n", "iteration 4: value=0.000943718\n", "iteration 5: value=0.000150995\n", "iteration 6: value=2.41592e-05\n", "iteration 7: value=3.86547e-06\n", "iteration 8: value=6.18475e-07\n", "iteration 9: value=9.8956e-08\n" ] }, { "data": { "image/png": "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ioBCmYiIiEgRUCgTERERKQIKZSIiIiJFQKFMREREpAgolImIiIgUAYUyERERkSKgUCYiIiJSBBTKRERERIqAQpmIiIhIEVAoExERESkCCmUiIiIiRUChTERERKQIKJSJiIiIFAGFMhEREZEioFAmIiIiUgQUykRERESKgEKZiIiISBFQKBMREREpAgplIiIiIkVAoUxERESkCCiUiYiIiBQBhTIRERGRIqBQJiIiIlIEFMpEREREioBCmYiIiEgRUCgTERERKQIKZSIiIiJFYEqhzMxqzOwRM9vqj6sn2GatmT1rZm+Y2QYzuyln3TfMbIeZveIPa6dSHhEREZHZaqo1ZZ8CHnPOrQAe8+ePNQx82Dl3OnA98I9mVpWz/r8759b6wytTLI+IiIjIrDTVUHYjcI8/fQ/w3mM3cM5tcc5t9af3A4eBuin+XBEREZE5ZaqhbKFz7gCAP64/0cZmdgEQAbblLL7Lv6z5eTOLnmDfO8xsvZmt7+jomGKxRURERIrLSUOZmT1qZq9PMNx4Kj/IzBqBbwF/4JzL+os/DZwGnA/UAP/jePs75+52zq1zzq2rq1NFm4iIiMwtoZNt4Jx71/HWmdkhM2t0zh3wQ9fh42xXAfwM+J/OuedyXvuAP5kws68D/9cplV5ERERkjpjq5csHgNv86duA+4/dwMwiwI+Abzrnvn/MukZ/bHjt0V6fYnlEREREZqWphrLPAteY2VbgGn8eM1tnZl/1t/k94DLg9gm6vrjXzF4DXgMWAH8zxfKIiIiIzErmnCt0GU7ZunXr3Pr16wtdDBEREZGTMrOXnHPrTradevQXERERKQIKZSIiIiJFQKFMREREpAgolImIiIgUAYUyERERkSKgUCYiIiJSBBTKRERERIqAQpmIiIhIEVAoExERESkCCmUiIiIiRUChTERERKQIKJSJiIiIFAGFMhEREZEioFAmIiIiUgQUykRERESKgEKZiIiISBFQKBMREREpAgplIiIiIkVAoUxERESkCCiUiYiIiBQBhTIRERGRIqBQJiIiIlIEFMpEREREioBCmYiIiEgRUCgTERERKQIKZSIiIiJFQKFMREREpAgolImIiIgUAYUyERERkSKgUCYiIiJSBBTKRERERIqAQpmIiIhIEVAoExERESkCCmUiIiIiRUChTERERKQIKJSJiIiIFAGFMhEREZEi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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "class Optimizer: # abstract class = template for the optimizer classes\n", " def minimize(f, theta0):\n", " return(theta0) # does not do any work\n", " def __init__(self):\n", " pass\n", "\n", "class GradientDescent(Optimizer): #the most simple optimizer\n", " def minimize(self, df, theta0, stepSize=lambda k:0.1, verbose = False, f=lambda x:0, nbSteps=10):\n", " theta = theta0\n", " for k in range(nbSteps):\n", " theta -= stepSize(k) * df(theta)\n", " if (verbose):\n", " print(\"iteration %d: value=%g\"%(k, f(theta)))\n", " return(theta)\n", " \n", " def __init__(self):\n", " pass\n", "\n", "# 1-D example:\n", "gradientDescent = GradientDescent()\n", "gradientDescent.minimize(lambda x: 2*x, 3, lambda k:0.3, verbose = True, f=lambda x:x*x, nbSteps=10)\n", "\n", "# 2-D example with plot:\n", "def f(x):\n", " return((x[0]-1)**2 + 5*(x[1]-1)**2)\n", "def df(x):\n", " return(array([2*(x[0]-1), 10*(x[1]-1)]))\n", "delta = 0.005\n", "x = arange(-0.5, 1.5, delta)\n", "y = arange(-0.5, 1.5, delta)\n", "X, Y = meshgrid(x, y)\n", "Z = array([[f([x,y]) for x in x] for y in y])\n", "levels = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.5, 1, 3, 6]\n", "x = [0, 0]\n", "xv = array([x])\n", "nbSteps = 50\n", "stepSize = 0.15 # 0.01 0.05 0.01 0.15 0.2 \n", "for j in range(nbSteps):\n", " g = df(x)\n", " x -= stepSize * g\n", " xv = vstack([xv, x])\n", "fig=figure(figsize = (10,10))\n", "ax = fig.add_subplot(111)\n", "\n", "ax.contour(X, Y, Z, levels)\n", "ax.axis('equal')\n", "ax.plot(xv[:,0], xv[:,1], 'or')\n", "\n", "for i in range(len(xv)-1):\n", " a = xv[i,:]\n", " dx = 0.3*(xv[i+1,:]-xv[i,:])\n", " ax.arrow(a[0], a[1], dx[0], dx[1], head_width=0.02, head_length=0.02)\n", " " ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 5.1 Preparing the dataset: vectorial binary outcome\n", "\n", "Instead of a categorial label space $\\mathcal{Y}=\\{0,\\dots,9\\}$, it will appear to be more convenient to be able to measure errors as a norm on the output space. Hence, we change the coding of the label: we replace the digit $d$ by a vector with a $1$ in position $d$, and $-1$ everwhere else." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "def indic(d): # helper function: returns the vector of size nc with -1 everywhere, except a +1 at position d\n", " y = -np.ones(nc)/9 # y = -np.ones(nc)/9 #is this alternative suggestion worth anything?\n", " y[d] = +1\n", " return(y)\n", "\n", "# trainingSet.Y = [indic(l) for l in trainingSet.target]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we shall consider classifiers that compute a matching score $\\phi(x) = \\big(\\phi^d(x)\\big)_{0\\leq d\\leq 9}$ for each possible digit, and selects the best fitting digit: \n", "$$\\text{classifier}\\big(X[k]\\big) = \\arg\\max_d \\phi^d(x_k)\\;.$$\n", "\n", "For example, for a linear predictor with $\\phi^d(x) = \\big(\\phi(x)\\cdot\\theta_d\\big)_{0\\leq d\\leq 9}$\n", "$$\\text{classifier}\\big(X[k]\\big) = \\arg\\max_d \\phi(x_k)\\cdot\\theta_d\\;.$$\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 Empirical Risk Minimization: Using continuous optimization for Machine Learning\n", "\n", "Of course, finding the good function $\\phi$ is all the job. In this section, we assume that we have at hand a family of candidate functions $(\\phi_\\theta)_{\\theta\\in\\Theta}$, where $\\Theta$ is some parameter space, and that the training set will be used to select the best working parameter $\\theta$.\n", "\n", "An *empirical risk minimizer* (ERM) is a classification algorithm which optimizes some parameter $\\theta$ on the training set so as to minimize the training error. The resulting optimal parameter $\\theta$ is then used for future predictions.\n", "\n", "In order to be able to use a continous optimization procedure, we need to smoothen the loss. The natural choice would be the misclassification error\n", "$$ L_{mis}(\\theta) = \\sum_{k=1}^n \\mathbb{1}\\Big\\{\\text{classifier}\\big(X[k]\\big) \\neq label[k]\\Big\\} = \\sum_{k=1}^n \\mathbb{1}\\Big\\{\\big(\\phi_\\theta(x_k)y_k\\big)_{label[k]}<0\\Big\\} \\;.$$\n", "\n", "But there is a problem with this choice: $ L_{mis}(\\theta)$ is generically NP-hard to optimise in $\\theta$, we want to use a continuous proxy so as to use the continuous optimization methods.\n", "Many choices are possible for this continuous proxy. We choose a *loss function* $\\ell:\\mathbb{R}\\to\\mathbb{R}^+$ which approximates $\\mathbb{1}\\{u<0\\}$, and let the smoothened loss function be defined by \n", "$$ L^{train}_{\\ell}(\\theta) = \\sum_{k=1}^n \\sum_{d=0}^9 \\ell\\Big(\\theta \\, (\\phi_\\theta(X_k). Y_k)_d \\Big)$$\n", "\n", "One typically ensures that $\\lim_{u\\to\\infty}L(u) = 0$, that $\\ell(u)\\geq \\ell_{mis}(u) = \\mathbb{1}\\{u<0\\}$.\n", "A reasonnable choice might thus be, for example, \n", "$$\\ell(u) = \\frac{1}{1+\\exp(x)}$$\n", "for some smoothness parameter $h$.\n", "\n", "But we know that optimization is in general simpler in the presence of **convexity**. It is thus convenient to make the loss a **convex** function of $\\theta$, for which guarantees can be proved that the ERM can be approximated with arbitrary precision in reasonnable time.\n", "\n", "A first step is to choose a *convex loss function* $\\ell:\\mathbb{R}\\to\\mathbb{R}^+$.\n", "One typically ensures that $\\lim_{u\\to\\infty}L(u) = 0$, that $\\ell(u)\\geq \\ell_{mis}(u) = \\mathbb{1}\\{u<0\\}$, and possibly that $\\ell$ has some smoothness (which is often convenient for optimization, but there are famous counter-examples). \n", "\n", "src:https://i.stack.imgur.com\n", "\n", "For example, one may pick the *square loss*\n", "$$\\ell_2(u) = (u-1)^2\\;,$$\n", "the *exponential loss* (used in boosting)\n", "$$\\ell_{\\exp}(u) = \\exp(-u) $$\n", "the *logistic* (also called *binomial*) loss\n", "$$\\ell_{\\log}(u) = \\log\\big(1+\\exp(-u)\\big)$$ or the *hinge* loss (used by Support Vector Machines)\n", "$$\\ell_{\\text{hindge}}(u) = \\max\\big(0, 1-u\\big)\\;.$$\n", "Observe that for each of these choices, and for all $\\theta$, $L^{train}_{\\ell}(\\theta) \\geq L^{train}_{mis}(\\theta)$." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "class ERM(Classifier): # abstract ERM: requires predictOneVector and dloss \n", " def __init__(self, optimizer):\n", " self.optimizer = optimizer\n", " self.h = 100\n", " self.theta = [] # abstract here\n", " \n", " def setTheta(self, theta):\n", " self.theta = theta\n", "\n", " def getTheta(self):\n", " return(self.theta) \n", " \n", " def fit(self, X, y, nbSteps=30, stepSize = 0, verbose=True):\n", " if stepSize == 0:\n", " stepSize = lambda k: 250*sqrt(len(y))\n", " self.X = X\n", " self.Y = [indic(l) for l in y] # array? by homogeneity?\n", " self.setTheta(self.optimizer.minimize(self.dEmpiricalLoss, self.getTheta(), stepSize, verbose=verbose, f=self.empiricalLoss, nbSteps=nbSteps))\n", "\n", " def ell(self, u):\n", " return(sum(exp(-u / self.h)))\n", " # return(sum(1/(1+exp(u/self.h))))\n", " # return(sum(log(1+exp(-u/self.h))))\n", " # return(sum((1-u/self.h)*(u0:\n", " self.setTheta(theta)\n", " if len(batch)==0:\n", " batch = range(len(self.Y))\n", " return(mean([self.loss(self.X[k], self.Y[k]) for k in batch]))\n", "\n", " def dEmpiricalLoss(self, theta=[], batch=[]):\n", " if len(theta)>0:\n", " self.setTheta(theta)\n", " if len(batch)==0:\n", " batch = range(len(self.Y))\n", " res = mean([self.dloss(self.X[k], self.Y[k]) for k in batch], 0) # \",0\" to make the mean over the samples, not over the dimensions of theta\n", " return(res) \n", " \n", " def indexMax(self, v): # helper function: returns the index of the maximum of a list or array\n", " im = 0\n", " vm = v[0]\n", " for i in range(1, len(v)):\n", " if v[i]>vm:\n", " im = i\n", " vm = v[i]\n", " return(im) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 Linear classifier\n", "\n", "To begin, we shall take the following form for the classfier (called *linear classifier*): if the image has feature vector $x$ then we compute a *score* $\\phi_\\theta(x)=\\theta x$ for each digit by matrix-multiplying a coefficient matrix $\\theta \\in \\mathcal{M}_{nc, p}(\\mathbb{R})$ by $x$. Thus, the predicted value is\n", "$$ \\psi(x) = \\arg\\max_k (\\theta \\, x)_d\\;.$$\n", "The parameter is the matrix $\\theta$, and we will search for the value of $\\theta$ which gives the best predictions.\n", "\n", "The linearity ensures that, with a convex loss function $\\ell$, the empirical risk $L^{train}_{\\ell}$ is a $convex$ function of $\\theta$." ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "class LinearERM(ERM): # abstract Empirical Risk Minimizer (default: linear)\n", " def __init__(self, featureNb, optimizer):\n", " super(LinearERM, self).__init__(optimizer)\n", " self.theta = zeros((featureNb, nc))\n", " \n", " def predictOneVector(self, x): # default is linear predictor\n", " return(np.dot(x, self.theta)) # nc = I don't know \n", " \n", " def predict(self, X): # advantadge: uses matrix mutliplication\n", " return([self.indexMax(z) for z in dot(X, self.theta)])\n", " \n", " def dloss(self, x, y): # default for linear predictor\n", " return(outer(x, self.dell(dot(x, self.theta) * y) * y ))" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iteration 0: value=9.87612\n", "iteration 1: value=9.79511\n", "iteration 2: value=9.73056\n", "iteration 3: value=9.67722\n", "iteration 4: value=9.63186\n", "iteration 5: value=9.59264\n", "iteration 6: value=9.55843\n", "iteration 7: value=9.5284\n", "iteration 8: value=9.50191\n", "iteration 9: value=9.47844\n", "iteration 10: value=9.45754\n", "iteration 11: value=9.43885\n", "iteration 12: value=9.42207\n", "iteration 13: value=9.40694\n", "iteration 14: value=9.39325\n", "iteration 15: value=9.38082\n", "iteration 16: value=9.36949\n", "iteration 17: value=9.35914\n", "iteration 18: value=9.34965\n", "iteration 19: value=9.34093\n", "iteration 20: value=9.33289\n", "iteration 21: value=9.32546\n", "iteration 22: value=9.31858\n", "iteration 23: value=9.31219\n", "iteration 24: value=9.30625\n", "iteration 25: value=9.30071\n", "iteration 26: value=9.29554\n", "iteration 27: value=9.29071\n", "iteration 28: value=9.28617\n", "iteration 29: value=9.28192\n", "Proportion of misclassified images in training set: 0.6223\n", "Proportion of misclassified images in testing set: 0.6185\n" ] } ], "source": [ "linearERM = LinearERM(logicalFeatureMaker.p, gradientDescent)\n", "linearERM.fit(trainingSet.X, trainingSet.target)\n", "\n", "print(\"Proportion of misclassified images in training set: %g\" %(evaluate(linearERM, trainingSet.X, trainingSet.target)))\n", "print(\"Proportion of misclassified images in testing set: %g\" %(evaluate(linearERM, testingSet.X, testingSet.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 Questions: \n", "* Try the different loss functions $\\ell$ sugggested above, and comment on the results obtained\n", "* Suggest a smarter initialization (hint: theta[d,:] = sum([F[k] if train_labels[k] == d)\n", "* What does the *first* iteration do in each case? Relation to previous questions?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.5 Comments\n", "\n", "* One seomtimes gets slightly better results with a symmetric y: y[d]=-1 except y[label]==+1\n", "\n", "* Of course, we do not find as good a classifier as with a systematic search of the best mapping from the (logical) features to the labels (50-52% errors), but we are indeed quite close! \n", "\n", "* Again, training and testing errors are not statistically different\n", "\n", "* And now, we can handle a lot more features!\n", "\n", "* Evaluating the gradient is costly!\n", "\n", "* -> better approach: *stochastic* gradient descent" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Improving the features: the neural network\n", "\n", "### 6.1 Improving the features\n", "Now that we can optimize, why not use this possibility to improve the *masks* themselves? \n", "We can consider the mask coefficients as part of the parameters as well, and propagate the gradient descent up to them.\n", "\n", "\n", "Src:http://engineeronadisk.com/book_modeling/neural.html\n", "\n", "### 6.2 Neural Networks\n", "Doing so, instead of a single linear pass over the features, we start *imitating the functionning of brain* by producing a **neural network** alternating several linear and non-linear steps.\n", "\\tiny\n", "\n", "Fortunately, there exists a fast algortihm for the computation of the gradient called *backpropagation*. It is an old idea: the basics of continuous backpropagation were derived in the context of control theory by Henry J. Kelley in 1960 and by Arthur E. Bryson in 1961 (see wikipedia)." ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "class Layer:\n", " def __init__(self, nbNeurons):\n", " self.h = 100\n", " self.nbNeurons = nbNeurons\n", " self.input = zeros(nbNeurons)\n", " self.output = self.sigma(self.input)\n", " self.delta = zeros(nbNeurons)\n", " \n", " def sigma(self, u): # activation function\n", " return(tanh(u / self.h))\n", "\n", " def dsigma(self, u): \n", " return(1/self.h * 1/(1+(u/self.h)**2))\n", " \n", " def forward(self, x):\n", " self.input = x\n", " self.output = self.sigma(x)\n", " \n", " def backward(self, d):\n", " self.delta = d * self.dsigma(self.input)\n", "\n", "class InputLayer(Layer):\n", " def sigma(self, u):\n", " return(u)\n", " def dsigma(self, u):\n", " return(ones(self.nbNeurons))\n", " def backward(self, d):\n", " pass\n", "\n", "class OutputLayer(Layer):\n", " def sigma(self, u):\n", " return(u)\n", " def dsigma(self, u):\n", " return(ones(self.nbNeurons))\n", " def backward(self, d):\n", " pass\n", " \n", "class NeuralNetworkClassifier(ERM):\n", " def __init__(self, optimizer, architecture):\n", " super(NeuralNetworkClassifier, self).__init__(optimizer)\n", " self.architecture = architecture\n", " self.L = len(architecture) \n", " self.p = sum([architecture[l]*architecture[l+1] for l in range(self.L-1)]) # number of connexions\n", " self.layers = [InputLayer(self.architecture[0])]\n", " if self.L>2:\n", " self.layers += [Layer(self.architecture[l]) for l in range(1, self.L-1)]\n", " self.layers.append(OutputLayer(self.architecture[self.L-1]))\n", " self.theta = [zeros((self.architecture[l], self.architecture[l+1])) for l in range(self.L-1)]\n", "\n", " def randomTheta(self):\n", " for l in range(self.L-1):\n", " self.theta[l] = random.rand(self.architecture[l], self.architecture[l+1])\n", " \n", " def setTheta(self, theta):\n", " self.theta = self.vec2theta(theta)\n", " \n", " def getTheta(self):\n", " return(self.theta2vec(self.theta))\n", "\n", " def predictOneVector(self, x): # TO BE REMOVED?\n", " self.layers[0].output = x\n", " for l in range(self.L-1):\n", " self.layers[l+1].forward(dot(self.layers[l].output, self.theta[l]))\n", " return(self.layers[self.L-1].output)\n", " \n", " def predict(self, X): # directly vectorial: expects matrix input! (not a vector)\n", " self.layers[0].output = X\n", " for l in range(self.L-1):\n", " self.layers[l+1].forward(dot(self.layers[l].output, self.theta[l]))\n", " return(apply_along_axis(self.indexMax, axis=1, arr=self.layers[self.L-1].output))\n", " \n", " def dloss(self, x, y): # deprecated and useless now: has been see dlossVec\n", " self.predictOneVector(x)\n", " self.layers[self.L-1].delta = self.dell(self.layers[self.L-1].output*y)*y\n", " for l in range(self.L-2, 0, -1):\n", " self.layers[l].delta = dot(self.theta[l], self.layers[l+1].delta) * self.layers[l].dsigma(self.layers[l].input)\n", " dtheta = [] \n", " for l in range(self.L-1):\n", " dtheta.append(outer(self.layers[l].output, self.layers[l+1].delta))\n", " return(self.theta2vec(dtheta))\n", " \n", " def dlossVec(self, X, Y): # expects both X and Y to be matrices!\n", " self.predict(X)\n", " self.layers[self.L-1].delta = self.dell(self.layers[self.L-1].output*Y)*Y\n", " for l in range(self.L-2, 0, -1):\n", " self.layers[l].delta = dot(self.layers[l+1].delta, transpose(self.theta[l])) * self.layers[l].dsigma(self.layers[l].input)\n", " dtheta = [] \n", " for l in range(self.L-1):\n", " # dtheta.append(array([[dot(self.layers[l].output[:, i], self.layers[l+1].delta[:, j]) for j in range(self.layers[l+1].delta.shape[1])] for i in range(self.layers[l].output.shape[1])]))\n", " dtheta.append(dot(transpose(self.layers[l].output), self.layers[l+1].delta))\n", " return(self.theta2vec(dtheta)) \n", " \n", " def theta2vec(self, theta):\n", " coeffs = zeros(self.p)\n", " ind=0\n", " indEnd = 0\n", " for l in range(self.L-1):\n", " indEnd += self.architecture[l]*self.architecture[l+1] \n", " coeffs[ind:indEnd] = reshape(theta[l], [self.architecture[l]*self.architecture[l+1]])\n", " ind = indEnd\n", " return(coeffs)\n", " \n", " def vec2theta(self, v):\n", " theta = []\n", " ind = 0\n", " indEnd = 0\n", " for l in range(self.L-1):\n", " indEnd += self.architecture[l]*self.architecture[l+1]\n", " theta.append(reshape(v[ind:indEnd], [self.architecture[l], self.architecture[l+1]]))\n", " ind = indEnd\n", " return(theta)\n", " \n", " def dEmpiricalLoss(self, theta=[]): # matrix version! overrides the one of ERM which works line by line on X\n", " if len(theta)>0:\n", " self.setTheta(theta)\n", " res = self.dlossVec(self.X, array(self.Y))/self.X.shape[0]\n", " return(res) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.3 Sanity check: one-layer network = perceptron\n", "First, we remark that 1-layer neural networks are just linear ERM: " ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iteration 0: value=9.87612\n", "iteration 1: value=9.79511\n", "iteration 2: value=9.73056\n", "iteration 3: value=9.67722\n", "iteration 4: value=9.63186\n", "iteration 5: value=9.59264\n", "iteration 6: value=9.55843\n", "iteration 7: value=9.5284\n", "iteration 8: value=9.50191\n", "iteration 9: value=9.47844\n", "iteration 10: value=9.45754\n", "iteration 11: value=9.43885\n", "iteration 12: value=9.42207\n", "iteration 13: value=9.40694\n", "iteration 14: value=9.39325\n", "iteration 15: value=9.38082\n", "iteration 16: value=9.36949\n", "iteration 17: value=9.35914\n", "iteration 18: value=9.34965\n", "iteration 19: value=9.34093\n", "iteration 20: value=9.33289\n", "iteration 21: value=9.32546\n", "iteration 22: value=9.31858\n", "iteration 23: value=9.31219\n", "iteration 24: value=9.30625\n", "iteration 25: value=9.30071\n", "iteration 26: value=9.29554\n", "iteration 27: value=9.29071\n", "iteration 28: value=9.28617\n", "iteration 29: value=9.28192\n", "Proportion of misclassified images in training set: 0.6223\n", "Proportion of misclassified images in testing set: 0.6185\n" ] } ], "source": [ "neuralNetworkClassifier1 = NeuralNetworkClassifier(gradientDescent, [logicalFeatureMaker.p, nc])\n", "neuralNetworkClassifier1.fit(trainingSet.X, trainingSet.target)# , nbSteps=100, verbose=True)\n", "\n", "print(\"Proportion of misclassified images in training set: %g\" %(evaluate(neuralNetworkClassifier1, trainingSet.X, trainingSet.target)))\n", "print(\"Proportion of misclassified images in testing set: %g\" %(evaluate(neuralNetworkClassifier1, testingSet.X, testingSet.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.4 Adding hidden layers\n", "But the real power of neural networks comes when we use several layers and a not-too-degradated input. \n", "First, let us try the \"fully blind\" method, with as features the bare pixel intensities." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iteration 0: value=9.99035\n", "iteration 1: value=9.98415\n", "iteration 2: value=9.9741\n", "iteration 3: value=9.95331\n", "iteration 4: value=9.91072\n", "iteration 5: value=9.84281\n", "iteration 6: value=9.76692\n", "iteration 7: value=9.69302\n", "iteration 8: value=9.61941\n", "iteration 9: value=9.53886\n", "iteration 10: value=9.50049\n", "iteration 11: value=9.45824\n", "iteration 12: value=9.41203\n", "iteration 13: value=9.3619\n", "iteration 14: value=9.30809\n", "iteration 15: value=9.25094\n", "iteration 16: value=9.19092\n", "iteration 17: value=9.12848\n", "iteration 18: value=9.06412\n", "iteration 19: value=8.99832\n", "iteration 20: value=8.93158\n", "iteration 21: value=8.86431\n", "iteration 22: value=8.79692\n", "iteration 23: value=8.7297\n", "iteration 24: value=8.66289\n", "iteration 25: value=8.5967\n", "iteration 26: value=8.53127\n", "iteration 27: value=8.46673\n", "iteration 28: value=8.40317\n", "iteration 29: value=8.34067\n", "iteration 30: value=8.27926\n", "iteration 31: value=8.21896\n", "iteration 32: value=8.15975\n", "iteration 33: value=8.1016\n", "iteration 34: value=8.04451\n", "iteration 35: value=7.98846\n", "iteration 36: value=7.93343\n", "iteration 37: value=7.87944\n", "iteration 38: value=7.82649\n", "iteration 39: value=7.77461\n", "iteration 40: value=7.72382\n", "iteration 41: value=7.67413\n", "iteration 42: value=7.62556\n", "iteration 43: value=7.57812\n", "iteration 44: value=7.5318\n", "iteration 45: value=7.48659\n", "iteration 46: value=7.44247\n", "iteration 47: value=7.39939\n" ] } ], "source": [ "class IdentityFeatureMaker(FeatureMaker): #just like FeatureMaker, except that it adds a constant entry =1\n", " def __init__(self):\n", " self.p = dimX*dimY+1 # number of features\n", " \n", " def computeFeatures(self, image):\n", " return(np.concatenate([np.array(image)/255, [1]])) # the feature is the normalized input itself plus a constant \n", "\n", "identityFeatureMaker = IdentityFeatureMaker()\n", "identityFeatureMaker.computeAllFeatures(trainingSet)\n", "identityFeatureMaker.computeAllFeatures(testingSet)\n", "\n", "neuralNetworkClassifier2 = NeuralNetworkClassifier(gradientDescent, [identityFeatureMaker.p, 30, nc])\n", "neuralNetworkClassifier2.randomTheta()\n", "\n", "import time # to see the execution time\n", "start_time=time.time()\n", "neuralNetworkClassifier2.fit(trainingSet.X, trainingSet.target, nbSteps=250, verbose=True, stepSize = lambda k:10000 if k<10 else (4000 if k<50 else 1500))\n", "print(\"elapsed: %g s\"%(time.time()-start_time))\n", "\n", "print(\"Learning phase is finished: final empirical loss is %g\"%(neuralNetworkClassifier2.empiricalLoss()))\n", "print(\"Proportion of misclassified images in training set: %g\" %(evaluate(neuralNetworkClassifier2, trainingSet.X, trainingSet.target)))\n", "print(\"Proportion of misclassified images in testing set: %g\" %(evaluate(neuralNetworkClassifier2, testingSet.X, testingSet.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time, the function is not convex, and it is difficult to tune the stepsize correctly. On some runs, the gradient descent diverges: we should be more careful with the optimization (hence the somewhat strange code above).\n", "\n", "With 30 hidden neurons, correctly tuned and with a little luck, the Neural Network with one hidden layer learns very well by itself! With a lot of iterations it may reach a performance of below 0.5% training error and 9% testing error (with an empirical loss below 0.2), which is much better. \n", "\n", "But we need a lot of iterations -> the computation time is high again. This comes from the fact that gradient descent is not converging fast when the variables have very different impacts on the functions.\n", "\n", "\n", "Src: http://trond.hjorteland.com\n", "\n", "Besides, the results can be somewhat different from a run to the other.\n", "Here we load the result after 20000 iterations of a good (lucky) run:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# save learnt coefficients:\n", "import pickle # to save and load the variables\n", "\n", "fileName = \"theta_30.pickle\"\n", "if True:\n", " with open(workingdir+fileName, 'wb') as f:\n", " pickle.dump(neuralNetworkClassifier2.theta, f) \n", " \n", "# load saved coefficients \n", "if True:\n", " with open(workingdir+fileName, 'rb') as f:\n", " neuralNetworkClassifier2.theta = pickle.load(f)\n", " print(\"Proportion of misclassified images in training set: %g\" %(evaluate(neuralNetworkClassifier2, trainingSet.X, trainingSet.target)))\n", " print(\"Proportion of misclassified images in testing set: %g\" %(evaluate(neuralNetworkClassifier2, testingSet.X, testingSet.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.6 Questions\n", "* Try augmenting the number of iterations in the gradient descent.\n", "* Try accelerating the converge by playing with the step sizes.\n", "* Try augmenting the number of hidden neurons. What is the optimal size for the hidden layer?\n", "* Try other loss functions in the ERM. Which one performs best?\n", "* Think of a strategy to avoid poor local minima of the loss.\n", "* Think of a strategy to avoid \"crash\" when the gradient step is too big.\n", "* Can it be that the training error goes much below the testing error?\n", "\n", "\n", "### 6.7 How does the resulting network work?\n", "\n", "Let us look a little what are the scores in a well-classified, and in a misclassified example." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for rep in range(2):\n", " mistake = not(rep==1)\n", " while mistake != (rep==1):\n", " ii = random.randint(0, testingSet.data.shape[0])\n", " predicted = neuralNetworkClassifier2.predict(testingSet.X[ii:(ii+1),:])\n", " trueLabel = testingSet.target[ii]\n", " mistake = (predicted != trueLabel)\n", "\n", " print(\"Example %g: True label is %g, classified as %g\"%(rep, trueLabel, predicted))\n", "\n", " f, (ax1, ax2) = plt.subplots(1, 2)\n", " ax1.imshow(reshape(testingSet.data[ii,:], [dimX, dimY], order='C'), cmap=\"Greys\", interpolation=\"none\")\n", "\n", " scores = neuralNetworkClassifier2.layers[len(neuralNetworkClassifier2.layers)-1].output[0]\n", " scores = scores / max(abs(scores))\n", "\n", " ax2.bar(range(10), scores, 1)\n", " ax2.set_xticks(np.arange(-0.5, 10, 1))\n", " ax2.set_yticks(np.arange(-0, 1,1))\n", " ax2.set_xticklabels([])\n", " ax2.set_yticklabels([])\n", " ax2.axis('off')\n", " for k in range(10):\n", " plt.text(k, 0.0, k, fontsize=24, color=('g' if k==trueLabel else 'r'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.8 What are the features created by the Neural Network\n", "Let us look what \"masks\" the Neural Network gives:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "NNmasks = [np.reshape(neuralNetworkClassifier2.theta[0][0:(dimX*dimY), j], [dimX, dimY]) for j in range(neuralNetworkClassifier2.architecture[1])]\n", "nbRows = 5\n", "nbCols = 6\n", "M = np.concatenate([np.reshape(NNmasks[i], [dimX,dimY], order='C') for i in range(nbCols)], axis=1)\n", "for j in range(1, nbRows):\n", " M = np.concatenate([M, np.concatenate([np.reshape(NNmasks[i], [dimX,dimY], order='C') for i in range(j*nbCols,(j+1)*nbCols)], axis=1)], axis=0)\n", "figure(figsize = (20,20))\n", "plt.imshow(M, cmap=\"PiYG\", interpolation=\"none\") # colormap guide: https://matplotlib.org/examples/color/colormaps_reference.html\n", "ax = plt.gca()\n", "ax.set_xticks(np.arange(-0.5, dimX*nbCols, dimX))\n", "ax.set_yticks(np.arange(-0.5, dimY*nbRows, dimY))\n", "ax.set_xticklabels([])\n", "ax.set_yticklabels([])\n", "ax.grid(color='m', linestyle='-', linewidth=10)\n", "plt.show() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the link between the features created by the network and the images ?\n", "We plot the intensities of the links." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "layer2 = transpose(neuralNetworkClassifier2.theta[1])\n", "vmax = abs(layer2[:]).max()\n", "imgplot = imshow(layer2, vmin=-vmax, vmax=vmax, cmap=\"PiYG\", interpolation=\"none\") \n", "ax = gca()\n", "ax.set_xticks(arange(-0.5, layer2.shape[1], 1))\n", "ax.set_yticks(arange(-0.5, layer2.shape[0], 1))\n", "ax.set_xticklabels(arange(0, layer2.shape[1]+1, 1))\n", "ax.set_yticklabels(arange(0, layer2.shape[0]+1, 1))\n", "\n", "# for each feature, a measure of dispertion of the coefficients among digits:\n", "figure()\n", "imshow([apply_along_axis(std, axis=0, arr=layer2)], cmap=\"gray_r\", interpolation=\"none\")\n", "ax = gca()\n", "ax.set_xticks(arange(-0.5, layer2.shape[1], 1))\n", "ax.set_yticks(arange(-0.5, 1, 1))\n", "ax.set_xticklabels(arange(0, layer2.shape[1]+1, 1))\n", "ax.set_yticklabels(arange(0, 1, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At first it looks quite obscure: it is not easy to understand how the neural networks works, and one may wonder whether there is a real intelligence here. \n", "But after a more careful observation, one can see several things:\n", "* some features (the blurry ones) are not used: they have the same coefficients on all digits.\n", "* Some, on the contrary, are very discriminative, and seem to have a more clear interpretation.\n", "* Some features seem to be quasi-identical, which is not quite anormal when you think about the iterations. More generally, observe that the model is far from identifiable: many parameter vectors lead to the same classifier (in other words, there are lots of symmetries).\n", "\n", "Maybe the masks would be more clear with a sparsity- and regularity-inducing penalty?\n", "Maybe some sparsity also improve prediction performance?\n", "\n", "### 6.9 Questions\n", "* Try to understand some of the patterns of the emerging network.\n", "* Try starting from the logical features as the first layer, and improve them by gradient descent. Do you see something?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.10 Using scikitlearn \n", "\n", "As you could see, the computation time to fit the network can be substantial. \n", "A lot of ideas have been used to improve on this: smart coding of the network, a better activation function, and above all more efficient optimization procedures (using, in particular, *stochastic gradient descent*).\n", "We do not have the time to go into details here, but these improvements are included in scikitlearn, the python toolbox which makes Machine Learning easy." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.neural_network import MLPClassifier\n", "clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(30), activation='relu') \n", "clf.fit(trainingSet.X, trainingSet.target) \n", "print(\"Proportion of misclassified images in training set: %g\" %(evaluate(clf, trainingSet.X, trainingSet.target)))\n", "print(\"Proportion of misclassified images in testing set: %g\" %(evaluate(clf, testingSet.X, testingSet.target)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The neural network reaches a fantastic score on the training set! But the performance on the testing set is not as good, and significantly different.\n", "\n", "### 6.11 Questions\n", "* Can you understand what happens?\n", "* Try the same experiment with a larger training sample; what can we say about the performance?\n", "* Try other architectures, and find which one is best.\n", "\n", "Just as above, one can try to plot the resulting network coefficients so as to understand its functioning." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "clf.coefs_[0]\n", "\n", "NNmasks = [np.reshape(clf.coefs_[0][0:(dimX*dimY), j], [dimX, dimY]) for j in range(clf.coefs_[0].shape[1])]\n", "nbRows = int(sqrt(clf.coefs_[0].shape[1]))\n", "nbCols = int(floor(clf.coefs_[0].shape[1]/nbRows))\n", "\n", "M = np.concatenate([np.reshape(NNmasks[i], [dimX,dimY], order='C') for i in range(nbCols)], axis=1)\n", "for j in range(1, nbRows):\n", " M = np.concatenate([M, np.concatenate([np.reshape(NNmasks[i], [dimX,dimY], order='C') for i in range(j*nbCols,(j+1)*nbCols)], axis=1)], axis=0)\n", "figure(figsize = (20,20))\n", "plt.imshow(M, cmap=\"PiYG\", interpolation=\"none\") # colormap guide: https://matplotlib.org/examples/color/colormaps_reference.html\n", "ax = plt.gca()\n", "ax.set_xticks(np.arange(-0.5, dimX*nbCols, dimX))\n", "ax.set_yticks(np.arange(-0.5, dimY*nbRows, dimY))\n", "ax.set_xticklabels([])\n", "ax.set_yticklabels([])\n", "ax.grid(color='m', linestyle='-', linewidth=10)\n", "plt.show() \n", "\n", "layer2 = transpose(clf.coefs_[1])\n", "vmax = abs(layer2[:]).max()\n", "figure(figsize = (20,10))\n", "imgplot = imshow(layer2, vmin=-vmax, vmax=vmax, cmap=\"PiYG\", interpolation=\"none\") \n", "ax = gca()\n", "ax.set_xticks(arange(-0.5, layer2.shape[1], 1))\n", "ax.set_yticks(arange(-0.5, layer2.shape[0], 1))\n", "ax.set_xticklabels(arange(0, layer2.shape[1]+1, 1))\n", "ax.set_yticklabels(arange(0, layer2.shape[0]+1, 1))\n", "\n", "# for each feature, a measure of dispertion of the coefficients among digits:\n", "figure(figsize = (20,10))\n", "imshow([apply_along_axis(std, axis=0, arr=layer2)], cmap=\"gray_r\", interpolation=\"none\")\n", "ax = gca()\n", "ax.set_xticks(arange(-0.5, layer2.shape[1], 1))\n", "ax.set_yticks(arange(-0.5, 1, 1))\n", "ax.set_xticklabels(arange(0, layer2.shape[1]+1, 1))\n", "ax.set_yticklabels(arange(0, 1, 1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "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.6" } }, "nbformat": 4, "nbformat_minor": 2 }