{ "metadata": { "name": "", "signature": "sha256:6e8bfe9e9408e3fc5e719a79c18d5e151e2db3b066a51839ecc4ca8aa4c29832" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine learning with scikit-learn" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from IPython.display import Image, HTML" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext load_style" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%load_style ./styles/talk.css" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is Machine Learning?\n", "\n", "Broadly speaking, Machine Learning is a field, related to Artificial Intelligence (AI), concerned about developping algorithms that 'learn from data', i.e. automatically adjust their performance from exposure to information encoded in data. This learning is achieved via **tunable parameters** that are automatically adjusted according to performance criteria.\n", "\n", "There are two major classes of ML (actually 3 with [**reinforcement learning**](http://en.wikipedia.org/wiki/Reinforcement_learning)): \n", "\n", "[**Supervised learning**](http://en.wikipedia.org/wiki/Supervised_learning)\n", ": Algorithms which learn from a training set of *labeled* examples to generalize to the set of all possible inputs. \n", "\n", "There are two classes of supervised learning algorithms: \n", "\n", "1. [**classification**](http://en.wikipedia.org/wiki/Classification_(machine_learning): when the label is encoded into a discrete, categorical variable (a *class*, a *label*). Example of a classification algorithm is the [Support Vector Machine](http://en.wikipedia.org/wiki/Support_vector_machine)\n", "\n", "2. [**regression**](http://en.wikipedia.org/wiki/Regression_analysis): when the label is encoded into a continuous variable. Example of a regression is the simple [linear regression](http://en.wikipedia.org/wiki/Linear_regression_model). \n", "\n", "[**Unsupervised learning**](http://en.wikipedia.org/wiki/Unsupervised_learning)\n", ": Algorithms which learn from a training set of *unlabeled* examples, using the features of the inputs to categorize inputs together according to some statistical criteria. \n", "\n", "One can also divide Unsupervised learning algorithms into: \n", "\n", "1. [**Dimensionality reduction**](http://en.wikipedia.org/wiki/Dimensionality_reduction): learning a more compact representation (i.e. reducing the dimensions) of the data. One example is [Principal Component Analysis](http://en.wikipedia.org/wiki/Principal_component_analysis) (or Empirical Orthogonal Functions decomposition) \n", "2. [**Clustering**](http://en.wikipedia.org/wiki/Cluster_analysis): separating the data into clusters. One example of widely used algorithm is the [k-means](http://en.wikipedia.org/wiki/K-means) clustering method." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some vocabulary \n", "\n", "+ ** Instance **: sample, observation\n", "+ ** Feature **: explanatory variable, independent variable, predictor\n", "+ ** target **: dependent variable, predictand, can be categorical (*label*, *class*) or continuous." ] }, { "cell_type": "code", "collapsed": false, "input": [ "Image(url='http://scikit-learn.org/stable/_static/ml_map.png', width=900)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scikit-learn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [scikit-learn](http://scikit-learn.org/stable/) package is an open-source library that provides a robust set of machine learning algorithms for Python. It is built upon the core Python scientific stack (*i.e.* NumPy, SciPy, Cython), and has a simple, consistent API, making it useful for a wide range of statistical learning applications." ] }, { "cell_type": "code", "collapsed": false, "input": [ "HTML('')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Representing Data in `scikit-learn`\n", "\n", "Most machine learning algorithms implemented in scikit-learn expect data to be stored in a\n", "**two-dimensional array or matrix**. The arrays can be\n", "either ``numpy`` arrays, or in some cases ``scipy.sparse`` matrices.\n", "The size of the array is expected to be `[n_samples, n_features]`\n", "\n", "- **n_samples:** The number of samples: each sample is an item to process (e.g. classify).\n", " A sample can be a document, a picture, a sound, a video, an astronomical object,\n", " a row in database or CSV file,\n", " or whatever you can describe with a fixed set of quantitative traits.\n", "- **n_features:** The number of features or distinct traits that can be used to describe each\n", " item in a quantitative manner. Features are generally real-valued, but may be boolean or\n", " discrete-valued in some cases.\n", "\n", "The number of features must be fixed in advance. However it can be very high dimensional\n", "(e.g. millions of features) with most of them being zeros for a given sample. This is a case\n", "where `scipy.sparse` matrices can be useful, in that they are\n", "much more memory-efficient than numpy arrays." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "{\\rm feature~matrix:~~~} {\\bf X}~=~\\left[\n", "\\begin{matrix}\n", "x_{11} & x_{12} & \\cdots & x_{1D}\\\\\n", "x_{21} & x_{22} & \\cdots & x_{2D}\\\\\n", "x_{31} & x_{32} & \\cdots & x_{3D}\\\\\n", "\\vdots & \\vdots & \\ddots & \\vdots\\\\\n", "\\vdots & \\vdots & \\ddots & \\vdots\\\\\n", "x_{N1} & x_{N2} & \\cdots & x_{ND}\\\\\n", "\\end{matrix}\n", "\\right]\n", "$$\n", "\n", "$$\n", "{\\rm label~vector:~~~} {\\bf y}~=~ [y_1, y_2, y_3, \\cdots y_N]\n", "$$\n", "\n", "Here there are $N$ samples and $D$ features.\n", "Several example datasets are available in the ``sklearn.datasets`` module" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The `scikit-learn` interface\n", "\n", "A great feature about scikit-learn is the consistant API (Application Programmer Interface) which means that once you have learned how one particular algorithm is implemented in scikit-learn, using another algorithm will look very familiar. \n", "\n", "All objects within scikit-learn share a uniform common basic API consisting of three complementary interfaces: an **estimator** interface for building and \ufb01tting models, a **predictor** interface for making predictions and a **transformer** interface for converting data.\n", "\n", "The **estimator** interface is at the core of the library. It de\ufb01nes instantiation mechanisms of objects and exposes a fit method for learning a model from training data. All supervised and unsupervised learning algorithms (*e.g.*, for classi\ufb01cation, regression or clustering) are o\ufb00ered as objects implementing this interface. Machine learning tasks like feature extraction, feature selection or dimensionality reduction are also provided as estimators.\n", "\n", "Scikit-learn strives to have a uniform interface across all methods; given a scikit-learn *estimator*\n", "object named `model`, the following methods are available:\n", "\n", "- Available in **all Estimators**\n", " + `model.fit()` : fit training data. For supervised learning applications,\n", " this accepts two arguments: the data `X` and the labels `y` (e.g. `model.fit(X, y)`).\n", " For unsupervised learning applications, this accepts only a single argument,\n", " the data `X` (e.g. `model.fit(X)`).\n", "- Available in **supervised estimators**\n", " + `model.predict()` : given a trained model, predict the label of a new set of data.\n", " This method accepts one argument, the new data `X_new` (e.g. `model.predict(X_new)`),\n", " and returns the learned label for each object in the array.\n", " + `model.predict_proba()` : For classification problems, some estimators also provide\n", " this method, which returns the probability that a new observation has each categorical label.\n", " In this case, the label with the highest probability is returned by `model.predict()`.\n", " + `model.score()` : for classification or regression problems, most (all?) estimators implement\n", " a score method. Scores are between 0 and 1, with a larger score indicating a better fit.\n", "- Available in **unsupervised estimators**\n", " + `model.transform()` : given an unsupervised model, transform new data into the new basis.\n", " This also accepts one argument `X_new`, and returns the new representation of the data based\n", " on the unsupervised model.\n", " + `model.fit_transform()` : some estimators implement this method,\n", " which more efficiently performs a fit and a transform on the same input data.\n", " \n", "The **predictor** interface extends the notion of an estimator by adding a `predict` method that takes an array `X_test` and produces predictions based on the learned parameters of the estimator. In the case of supervised learning estimators, this method typically returns the predicted labels (for *classification*) or values (*regression) computed by the model. Some unsupervised learning estimators may also implement the predict interface, such as k-means, where the predicted values are the cluster labels.\n", "\n", "Since it is common to modify or \ufb01lter data before feeding it to a learning algorithm, some estimators in the library implement a **transformer** interface which de\ufb01nes a transform method. It takes as input some new data `X_test` and yields as output a transformed version. Preprocessing, feature selection, feature extraction and dimensionality reduction algorithms are all provided as transformers within the library." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What we're going to do during this session is give an example of **supervised** learning, and more specifically we're going to see how to solve a **classification** problem in scikit-learn, with a focus on how one evaluates the performance of a model. \n", "\n", "We're going to use a dataset that comes with scikit-learn, which consists in representation of hand-written digits (8 x 8 pixels normalized images) with the associated label (the correct digit)\n", "\n", "This example is treated in a more comprehensive manner by [Olivier Grisel](http://ogrisel.com/) (see his notebooks [here](https://github.com/ogrisel/parallel_ml_tutorial))" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.datasets import load_digits\n", "digits = load_digits()\n", "print(digits.DESCR)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " Optical Recognition of Handwritten Digits Data Set\n", "\n", "Notes\n", "-----\n", "Data Set Characteristics:\n", " :Number of Instances: 5620\n", " :Number of Attributes: 64\n", " :Attribute Information: 8x8 image of integer pixels in the range 0..16.\n", " :Missing Attribute Values: None\n", " :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\n", " :Date: July; 1998\n", "\n", "This is a copy of the test set of the UCI ML hand-written digits datasets\n", "http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits\n", "\n", "The data set contains images of hand-written digits: 10 classes where\n", "each class refers to a digit.\n", "\n", "Preprocessing programs made available by NIST were used to extract\n", "normalized bitmaps of handwritten digits from a preprinted form. From a\n", "total of 43 people, 30 contributed to the training set and different 13\n", "to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of\n", "4x4 and the number of on pixels are counted in each block. This generates\n", "an input matrix of 8x8 where each element is an integer in the range\n", "0..16. This reduces dimensionality and gives invariance to small\n", "distortions.\n", "\n", "For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.\n", "T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.\n", "L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,\n", "1994.\n", "\n", "References\n", "----------\n", " - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their\n", " Applications to Handwritten Digit Recognition, MSc Thesis, Institute of\n", " Graduate Studies in Science and Engineering, Bogazici University.\n", " - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.\n", " - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.\n", " Linear dimensionalityreduction using relevance weighted LDA. School of\n", " Electrical and Electronic Engineering Nanyang Technological University.\n", " 2005.\n", " - Claudio Gentile. A New Approximate Maximal Margin Classification\n", " Algorithm. NIPS. 2000.\n", "\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "X, y = digits.data, digits.target\n", "\n", "print(\"data shape: %r, target shape: %r\" % (X.shape, y.shape))\n", "print(\"labels: %r\" % list(np.unique(y)))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "data shape: (1797, 64), target shape: (1797,)\n", "labels: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "def plot_gallery(data, labels, shape, interpolation='nearest'):\n", " f,ax = plt.subplots(1,5,figsize=(16,5))\n", " for i in range(data.shape[0]):\n", " ax[i].imshow(data[i].reshape(shape), interpolation=interpolation, cmap=plt.cm.gray_r)\n", " ax[i].set_title(labels[i])\n", " ax[i].set_xticks(()), ax[i].set_yticks(())" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "subsample = np.random.permutation(X.shape[0])[:5]\n", "images = X[subsample]\n", "labels = ['True label: %d' % l for l in y[subsample]]\n", "plot_gallery(images, labels, shape=(8, 8))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAA4sAAAC4CAYAAABKFXn9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEHRJREFUeJzt3W1oneX9B/Dfidl8qKFx4oaz0qidtBUxs2pZ19GM2m0F\nXaOCiIiJKEwdaKL4zs5km90Q5lJ942Q0B0eZ+MZU3ANiNS0q2hrMfGh9miaDgvqmp27zoWru/4s/\npo3XEht7JTnn9POB0Obk5HtfJ/mdO9c3JycpFUVRBAAAABykYa4XAAAAQPVRFgEAAEgoiwAAACSU\nRQAAABLKIgAAAAllEQAAgISyOE3lcjm+9rWvTet9Ojs7Y82aNYd97Fw5MBUzTr0z49Qz8029M+Oz\nq+rLYkNDw5Qvp59++lwv8UuVSqUolUpzlvP888/Hj370ozjxxBNj/vz5sXLlynj88ccPez3kYcbz\n5YyNjcXq1aujoaEhNm/efNjrIQ8zni/HjFcf850vx3xXJzN++Dm1vBdvnOsFfJl33nln/P9PP/10\nXHbZZfHCCy/EySefHBH/P8AH279/f3z961+f1TV+maIosuVMN+u///1v/PjHP441a9bEU089FY2N\njbFx48a4+OKL49VXX42FCxdmWRtfnRmfmHM4Wb/85S/j+OOPj4jI8kWBPMz4xBwzXl/M98Qc811/\nzPjEnCNtL171jyx+85vfHH854YQTIiLipJNOmnD5vffeG1deeWU0NzdHR0dHjI6ORkNDQzzzzDMT\nshYtWhS9vb3jr//nP/+Jm2++ORYsWBDz5s2Lc889Nx5++OFpra9SqcRVV10VCxcujOOOOy4WL14c\nd999d3K9oiji97//fZxyyikxb968uPzyy2Pv3r0TrvPggw9Ga2trHHvssXHaaafFrbfeGh988MG0\n1vNFb7zxRuzduzfWr18fS5Ysie985zvxm9/8Jj7++ON48cUXDyubPMz44c3455544okol8vR39+f\nJY98zLgZr2fm23zXOzN+ZO/Fq74sHore3t5YuXJlvPDCC/HrX/960sZ/8EPHRVHExRdfHC+99FI8\n9NBD8corr8QNN9wQV1xxRTzxxBOHfOyPP/44zj777NiyZUvs3r071q9fH3fccUeUy+UJ19uxY0ds\n27YtHnvssfjrX/8aw8PDce21146/vVwux4033hi33XZb7N69Ox544IF4/PHH4/rrr5/02IODg9HQ\n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\nAEgoiwAAACSURQAAABLKIgAAAAllEQAAgISyCAAAQEJZBAAAIKEsAgAAkFAWAQAASCiLAAAAJJRF\nAAAAEsoiAAAACWURAACARONsHWhkZCRr3ujoaLas4eHhbFnNzc3ZsmYij9rR1dWVLau9vT1bVm59\nfX3ZsjZu3JgtKyLfx+2zzz7LkjPXKpVK1rze3t5sWf39/dmycn+96u7uzpbV1taWLSsiorW1NWse\nB5TL5WxZOWcy93xTO1paWrLmdXR0ZMvKeX/JfZ4cHBzMlpX7c5D7tv4vHlkEAAAgoSwCAACQUBYB\nAABIKIsAAAAklEUAAAASyiIAAAAJZREAAICEsggAAEBCWQQAACChLAIAAJBQFgEAAEgoiwAAACSU\nRQAAABLKIgAAAAllEQAAgISyCAAAQEJZBAAAIKEsAgAAkGicrQO1tLRkzTvnnHOyZbW3t1dlVkT+\njxszZ2BgIGve6OhotqzW1tZsWblvZ3d3d7as/v7+bFkREW1tbVlytm7dmiVnrpXL5ax5Oc/jnZ2d\n2bJyn3fXrVuXNY+ZUalUsub19PRky+rr68uWBbnknMuc++dt27Zly4qIGBwczJZVi/dljywCAACQ\nUBYBAABIKIsAAAAklEUAAAASyiIAAAAJZREAAICEsggAAEBCWQQAACChLAIAAJBQFgEAAEgoiwAA\nACSURQAAABLKIgAAAAllEQAAgISyCAAAQEJZBAAAIKEsAgAAkFAWAQAASCiLAAAAJBpn60AtLS1Z\n8wYHB7Nl9fX1Zcvq7u7OlhURsWrVqqx5zJxyuTzXS5hU7rnMaeHChdmyOjs7s2WRGhgYmOslTCrn\n2kZHR7Nl5c7L/bU059e/WtfT05M1L+fnqr29PVtWW1tbtqyIvGvr6urKlsXMGxkZqcqs3HLu73Lf\n/2aDRxYBAABIKIsAAAAklEUAAAASyiIAAAAJZREAAICEsggAAEBCWQQAACChLAIAAJBQFgEAAEgo\niwAAACSURQAAABLKIgAAAAllEQAAgISyCAAAQEJZBAAAIKEsAgAAkFAWAQAASCiLAAAAJBrnegFf\nVXNzc7astra2bFnlcjlbVkTE8PBwtqzBwcFsWRF5P271oKenJ2teV1dXtqy+vr5sWVu2bMmWFRHR\n2dmZNY+ZU6lUsub94x//yJZ1ySWXZMuaP39+tqyIvPc/95eZk/PrbUTEyMhItqyce4tt27Zly4rI\neztzz3fOvWI9yH0Or9b9c+7bmXN/l3svPhs8sggAAEBCWQQAACChLAIAAJBQFgEAAEgoiwAAACSU\nRQAAABLKIgAAAAllEQAAgISyCAAAQEJZBAAAIKEsAgAAkFAWAQAASCiLAAAAJJRFAAAAEsoiAAAA\nCWURAACAhLIIAABAQlkEAAAg0TjXC6gGXV1dVZkVEdHX15c1j5nT2to610uY1PDwcLasLVu2ZMuK\niOjs7Myax8zJOUe583Kee0dGRrJlRZjxWpH783TNNddUZVZuOfcpzc3N2bJI5T6Ht7e3V2VWpVLJ\nlhWRf29fazyyCAAAQEJZBAAAIKEsAgAAkFAWAQAASCiLAAAAJJRFAAAAEsoiAAAACWURAACAhLII\nAABAQlkEAAAgoSwCAACQUBYBAABIKIsAAAAklEUAAAASyiIAAAAJZREAAICEsggAAEBCWQQAACCh\nLAIAAJBonOsFVINKpZItq6enJ1tWRER7e3u2rLa2tmxZ1JaBgYFsWatWrcqWFRHR0tKSNY/a0dra\nmi1reHg4W1bO8y61o7Ozs2rzqnm+3V9qR85zbkTEyMhItqxq3qOWy+W5XsKc8sgiAAAACWURAACA\nhLIIAABAQlkEAAAgoSwCAACQUBYBAABIKIsAAAAklEUAAAASyiIAAAAJZREAAICEsggAAEBCWQQA\nACChLAIAAJBQFgEAAEgoiwAAACSURQAAABLKIgAAAAllEQAAgESpKIpisjcODQ1FpVKZzfVwBGpu\nbo5ly5bNybHNOLPBjFPv5mrGzTezwTmcejfVjE9ZFgEAADgy+TFUAAAAEsoiAAAACWURAACAhLII\nAABAQlkEAAAg8X+LW7qgipNezAAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### We are importing the svm (Support Vector Machine) class from scikit-learn" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.svm import SVC" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### We are instanciating the Support Vector Classifier (SVC)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "svc = SVC()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Next step is to FIT the model on the data: X = features, y = target" ] }, { "cell_type": "code", "collapsed": false, "input": [ "svc.fit(X, y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,\n", " kernel='rbf', max_iter=-1, probability=False, random_state=None,\n", " shrinking=True, tol=0.001, verbose=False)" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "svc.score(X,y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "1.0" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "y_hat = svc.predict(X)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "np.alltrue(y_hat == y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "True" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Have we got a perfect model ???" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Image(filename='Images/www.png')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "png": "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\nImh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRm\nOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8v\nbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4y\nMDc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+\nNTE8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9y\nZGY6UkRGPgo8L3g6eG1wbWV0YT4KjqVdbwAACY1JREFUeAHtXH1sU9cVP+wFx4lnnA87EOLQRz3H\nTmrFWTIchlMShQLtOjqlzShbVTI6wSj8QVm3VSsCbUxK0ZDWCXXdVpUhGIWtZEJlAzImIsJI1BBR\nYlRC0pDUAYcQxwEcx86H/aSd+/wR2zwnceNnadK9iux7z73n4/7u7517npFYsGxZAdBGEUgKAl9L\nihfqhCJAEKBsozxIHgKUbcnDmnqibKMcSB4ClG3Jw5p6omyjHEgeApRtycOaeqJsoxxIHgKUbcnD\nmnqibKMcSB4ClG3Jw5p6omyjHEgeApRtycOaeqJsoxxIHgKUbcnDmnqibKMcSB4CKRkZGcnzRj39\nXyFQt/kyxnv02OpERU1zW6KQpHZmRyBl9iXxr9CXaBe57Fd7nWyhVuG6a7FNLNZonwD71fsSU5Gs\nv9065LepzDMtXzg9BNAXahdNEUX/PKrnpEa7n3TZLcEFUXMx/fKRhJsKGJGpIuIJDtMS5heMJUG3\nk57+WwOBjfNx682V6wyqFN9kZ+t/Gm9NEFkwgMCyqCGAsarSrMlClYHbPRdaelxR+w8bypVs1aqC\nfJUsBSa/vNb+z45h/2S88jCTCeiKwTbVxi21GtvlqwcHXt9eu2Ssq27PadOLtbVyi/3T7J3r1ecH\n3/mbjYTOmtbuXJ8bGoK68qfbV6WCfXLXYQuZV23eXqshncg22Fp3oDlS5B/F9Ht1X/vmrbUaJkzJ\n1lp3sJmtfBbjcRR98ubRTpzzD88PfliQKL8fuHduwR2Fmvfa6aOHLpGDr3jlR1tNuQAcAGMsLiw4\nfQTlMeLxw8W+tX9jkQL3wHHAlJUa0/vf+SsPY8h6WEe1e+8PCHRkLVNWbKz47JO3yB7jlYeZTERX\nDLaBbwo4nw9keYswxDSFHkCZDpzLCV6sEb3eUNzeqfChsXw5fzDZ5hKppQOf9eE/H/wwMxUeTqp+\nsut7rP3a/iPXpQrJhHMkZCCqE9MvgI8DbrB118G2dCVx4hnn06cXDxuUpdXPNnQ2ujEWHGJ4ifM7\nQdjUf/HkvjMP9SsMWzauLnt+LXvphFWz5jVT7uSgZe+Bc0OgfftAbVlNTcWlD2zC8WCMim17CNW6\nLzbUn+nBMVvIjsekGs67Gk+fHW2/0YWbgry3D27WGUpY6LTGKUflxDYx6rbh7nteZilrKslJx2CZ\nTK1SlfN1GLU/DITOXxrYH4/YirTckMMLmILyp/wzQ7bhrt5h/PQhXXxuqwOHA1ZHUD9CHQez+PX5\nfC6YGHI48c9FjgEbYRuA/Lt15Xwn8JFAv5iLfD58vpxd7S3X7STTSAGqnylkwNt0HKmGrefwxX6A\nbPNaVax4QF3yrRzGY231Uw11rLeC1Ugg5KiviauX/FQDturbOgl47vZayZJ45VFm5zsUg218TBzk\nfyOLm3JzIC0yPSmTwOhwoHTINmiNJVpTYd43s9Kmw5c9VZTFOD67fM0Jmct17PREnL3YflNSpKxM\nwapV+CcPWEUyTPQPuuW6VZuUEDNnziWE2H7BO4YGFps3PKdmPLe/6MLyLFUK3FBHMDkNXe/3AKQu\nxFXC8bCFeZiQ735Orvv4mqbyZzVa4OynTrRFKMYrj1D+6gNRbtLbdxzALjVpGM/dbvtSQ76OlEy3\nhqeA/Niy0FxTa54OOJCo2FW6TICWKy0dUFxWuvRpDVh7pxfNsRfTL0hIAaM2/bre5DfV/+9j+84N\n8H3O0ti2aEv1ui3mT1v9qW6O3qaXxfZLkqdm3Wu/f5rLVMhgrO9P74dOnYtK0QqVCu6hzZjxpKRJ\ncJpdYV5XoABwX/6oGYk7Y9PW71wlh5GT9YebHOEL45WH686rLwrbnKNYkEmXKKD7v12D8kINq8YU\nMjDo5NnmbTl+8sIDkMKUsuT5rauV/vBXlqiBs13oBSt8sb3UZFiphV5SoMTVYvoFFcPgE/75X872\nwsIUicTX1+GnGpqXTPW0nekur9OZXtYH7/q4vOI1GWu/vJ3JsVEuLRu7vZcaLSHLEcTGSgGcw05+\nUigekvbAN46ogn5FmVknw/pytLm5K5gdecXoj4q6Z/IYruXIscYIqkG88mi78xiLcpOODD+a5GNy\n2Hp67uMtganN/TB4lCODA9beASzIesgh+Zu2OJcBZvG23a/u/z7WNLBEZ1gcnJv798x+fZ4HVzo6\nr7TfaGrptAbqNmJbkglNH7e58MYvxpfEUEhzdwsz+MW9WJsPv/mbFkRB81yNP7VKMOVJsvTIGb7J\n1XyBG3T4eDzWe4+QnNnLsLCDxvcPNfRiWuSwGJy5Lc6SkweYvG9FtHjlEcrzG4jCNpfNyT+67pE7\n0HPnAYlwfKwv7ID9MYeqNrnZkMeAZ2wiPTNzUTp48MQV+RWBrBfH/mbxy5EUItwcbf/qnuHXK2Gl\nkHRmvynpeeBuOXXjETC5P/xxMWrdvI3ZRl5aSdiDbUX5E8ieu1+G0i1AVDw9NnxUldoyo19hbp//\nePfQL/aesD62OF75Ywa+ukAUtsG4axRDmnp40w1DNgfJc1PjkW+gERFXGfPxpf3Unvfe2HfojX3v\n/epsH1bSxko2YtFcBjP6TVUWbHvlOzvqNuyoq9n2UnHwRSFgt/Hjdp5uDH9rzcVZ2JoZ/frXNR0+\n3z8FmcVrNmmg69y1+wC69bUvFSr0VTWbiuRY0p27FWYQc1h4PO4bx1rtkKbetf9lk0xKyrfZm/TV\nn2/7bf3rG7CKiWjxyiOU5zkQh23uwQdIrrFH5PK8cx9P0eO4NxSINKJg4d/5VUXLZGDvaw9uZaid\nPPtLluETL6wTFD/2HdsvR/Kl2mwylpcaykv15pUGUkmRFowH00kn4Vv4DRWc4xfO8DGDX6Llv52t\nfziLlai0+sU1AJ2/O27xQMYL23f8skafyo00/LEhGp/IeCx//+hM5wijeHJn/e4XNPgrCsz2VMjz\nc/CqzsjPJYvDWrzyMNV5dxcUFwde0+ZtihqIEwFlXrUOOe+72dIZpNpsFpR5FbpsCfhG+gcsNv9b\nRUwVuZo1Kr1Xpt+HAivnLk/4v8pTtsU8LTqRcLaJc5PSg6IICCFA2SaECpWJg8AC+n9TigMstSqA\nAM1tAqBQkUgIULaJBCw1K4AAZZsAKFQkEgKUbSIBS80KIEDZJgAKFYmEAGWbSMBSswIIULYJgEJF\nIiFA2SYSsNSsAAKUbQKgUJFICFC2iQQsNSuAAGWbAChUJBIClG0iAUvNCiBA2SYAChWJhABlm0jA\nUrMCCFC2CYBCRSIhQNkmErDUrAAC/wMUU9QZOgBNfQAAAABJRU5ErkJggg==\n", "prompt_number": 17, "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we are making an important methodological mistake: we are using **all the instances available** to **train** the model, and using the **same** instances to **evaluate** the model in terms of accuracy. It tell us (almost) nothing about the actual performance in production of the model, just how well it can reproduce the data it's been exposed too ...\n", "\n", "A way to work around that is to train the model over a **subset** of the available instances (the **training set**), calculate the train score, and test the model (i.e. calculate the test score) over the remaining of the instances (the **test set**).\n", "\n", "**Cross-validation** consists into repeating this operation several times using successive splits of the original dataset into training and test sets, and calculating a summary statistic of the train and test scores over the iterations (usually average).\n", "\n", "\n", "Several splits can be used: \n", "\n", "+ **Random split**: a given percentage of the data is selected at random (with replacement) \t\n", "+ **K-folds**: the dataset is divided into K exhaustive splits, each split is used as the test set, while the K-1 splits are using as the training set\n", "+ **Stratified K-folds**: for classification mainly. The folds are constructed so that the class distribution is approximately the same in each fold (e.g. the relative frequency of each class is preserved)\n", "+ **Leave One Out**: like K-fold with K = 1. One instance is left out, the model is built on the N-1 remaining instances, this procedure is repeated until all the instances have been used.\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cross_validation import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, \\\n", " test_size=0.25, random_state=1)\n", "\n", "print(\"train data shape: %r, train target shape: %r\"\n", " % (X_train.shape, y_train.shape))\n", "print(\"test data shape: %r, test target shape: %r\"\n", " % (X_test.shape, y_test.shape))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "train data shape: (1347, 64), train target shape: (1347,)\n", "test data shape: (450, 64), test target shape: (450,)\n" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "svc = SVC().fit(X_train, y_train)\n", "train_score = svc.score(X_train, y_train) \n", "train_score" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "1.0" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "test_score = svc.score(X_test, y_test)\n", "test_score" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "0.40888888888888891" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ok that seems more like a 'normal' result ...\n", "\n", "- if the **test** data score is **not as good as** the **train** score the model is **overfitting**\n", "\n", "- if the **train score is not close to 100%** accuracy the model is **underfitting**\n", "\n", "Ideally **we want to neither overfit nor underfit**: `test_score ~= train_score ~= 1.0`. \n", "\n", "When setting up a Support Vector Machine classifier, one needs to set up 2 parameters (hyper-parameters) which are NOT tuned at the fitting stage (they are NOT learned). These are **C** and **$\\gamma$** (see the [relevant section](http://en.wikipedia.org/wiki/Support_vector_machine#Parameter_selection) in the wikipedia article). What we did before is to instanciate the SVC class without specifying these parameters, which means that the default are used. Let's try something else. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "svc_2 = SVC(C=100, gamma=0.001).fit(X_train, y_train)\n", "svc_2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "SVC(C=100, cache_size=200, class_weight=None, coef0=0.0, degree=3,\n", " gamma=0.001, kernel='rbf', max_iter=-1, probability=False,\n", " random_state=None, shrinking=True, tol=0.001, verbose=False)" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "svc_2.score(X_train, y_train)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "1.0" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "svc_2.score(X_test, y_test)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "0.99111111111111116" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "sum(svc_2.predict(X_test) == y_test) / float(len(y_test))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "0.99111111111111116" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Could be luck (we only used one train / test split here): Now we're going to use **cross validation** to repeat the train / test split several times to as to get a more accurate estimate of the real test score by averaging the values found of the individual runs\n", "\n", "scikit-learn provides a very convenient interface to do that: ```sklearn.cross_validation```" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn import cross_validation" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "cross_validation." ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "cross_validation.ShuffleSplit?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "cv = cross_validation.ShuffleSplit(len(X), n_iter=3, test_size=0.2,\n", " random_state=0)\n", "\n", "for cv_index, (train, test) in enumerate(cv):\n", " print(\"# Cross Validation Iteration #%d\" % cv_index)\n", " print(\"train indices: {0}...\".format(train[:10]))\n", " print(\"test indices: {0}...\".format(test[:10]))\n", " \n", " svc = SVC(C=100, gamma=0.001).fit(X[train], y[train])\n", " print(\"train score: {0:.3f}, test score: {1:.3f}\\n\".format(\n", " svc.score(X[train], y[train]), svc.score(X[test], y[test])))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "# Cross Validation Iteration #0\n", "train indices: [1109 940 192 260 1148 966 1720 554 308 512]...\n", "test indices: [1081 1707 927 713 262 182 303 895 933 1266]...\n", "train score: 1.000, test score: 0.992\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "# Cross Validation Iteration #1\n", "train indices: [1642 586 142 15 701 472 380 1405 1551 450]...\n", "test indices: [1014 755 1633 117 181 501 948 1076 45 659]...\n", "train score: 1.000, test score: 0.997\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "# Cross Validation Iteration #2\n", "train indices: [ 396 1083 1184 1569 560 1502 1722 1162 1316 1685]...\n", "test indices: [ 795 697 655 573 412 743 635 851 1466 1383]...\n", "train score: 1.000, test score: 0.989\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's a wrapper for estimating cross validated scores directly, you just have to pass the cross validation method instanciated before" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cross_validation import cross_val_score\n", "\n", "svc = SVC(C=100, gamma=0.001)\n", "\n", "cv = cross_validation.ShuffleSplit(len(X), n_iter=10, test_size=0.2,\n", " random_state=0)\n", "\n", "test_scores = cross_val_score(svc, X, y, cv=cv, n_jobs=4) # n_jobs = 4 if you have a quad-core machine ...\n", "test_scores" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "array([ 0.99166667, 0.99722222, 0.98888889, 0.99722222, 0.98611111,\n", " 0.99722222, 0.98611111, 0.99444444, 0.98611111, 0.99166667])" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cross validation can be used to estimate the best hyperparameters for a model\n", "\n", "Let's see what happens when we fix C but vary $\\gamma$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "n_iter = 5 # the number of iterations should be more than that ... \n", "\n", "gammas = np.logspace(-7, -1, 10) # should be more fine grained ... \n", "\n", "cv = cross_validation.ShuffleSplit(len(X), n_iter=n_iter, test_size=0.2)\n", "\n", "train_scores = np.zeros((len(gammas), n_iter))\n", "test_scores = np.zeros((len(gammas), n_iter))\n", "\n", "for i, gamma in enumerate(gammas):\n", " for j, (train, test) in enumerate(cv):\n", " C = 1\n", " clf = SVC(C=C, gamma=gamma).fit(X[train], y[train])\n", " train_scores[i, j] = clf.score(X[train], y[train])\n", " test_scores[i, j] = clf.score(X[test], y[test])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "f, ax = plt.subplots(figsize=(12,8))\n", "#for i in range(n_iter):\n", "# ax.semilogx(gammas, train_scores[:, i], alpha=0.2, lw=2, c='b')\n", "# ax.semilogx(gammas, test_scores[:, i], alpha=0.2, lw=2, c='g')\n", "ax.semilogx(gammas, test_scores.mean(1), lw=4, c='g', label='test score')\n", "ax.semilogx(gammas, train_scores.mean(1), lw=4, c='b', label='train score')\n", "\n", "\n", "ax.fill_between(gammas, train_scores.min(1), train_scores.max(1), color = 'b', alpha=0.2)\n", "ax.fill_between(gammas, test_scores.min(1), test_scores.max(1), color = 'g', alpha=0.2)\n", "\n", "ax.set_ylabel(\"score for SVC(C=%4.2f, $\\gamma=\\gamma$)\" % ( C ),fontsize=16)\n", "ax.set_xlabel(r\"$\\gamma$\",fontsize=16)\n", "best_gamma = gammas[np.argmax(test_scores.mean(1))]\n", "best_score = test_scores.mean(1).max()\n", "ax.text(best_gamma, best_score+0.05, \"$\\gamma$ = %6.4f | score=%6.4f\" % (best_gamma, best_score),\\\n", " fontsize=15, bbox=dict(facecolor='w',alpha=0.5))\n", "[x.set_fontsize(16) for x in ax.xaxis.get_ticklabels()]\n", "[x.set_fontsize(16) for x in ax.yaxis.get_ticklabels()]\n", "ax.legend(fontsize=16, loc=0)\n", "ax.set_ylim(0, 1.1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "(0, 1.1)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can search the (hyper) parameter space and find the best hyperparameters using grid search in scikit-learn" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.grid_search import GridSearchCV" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "svc_params = {\n", " 'C': np.logspace(-1, 2, 4),\n", " 'gamma': np.logspace(-4, 0, 5),\n", "}" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "gs_svc = GridSearchCV(SVC(), svc_params, cv=3, n_jobs=4)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "gs_svc.fit(X, y)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "gs_svc.best_params_, gs_svc.best_score_" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }