{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Measuring prediction performance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we will discuss how to use **validation sets** to get a better measure of\n", "performance for a classifier." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Using the K-neighbors classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we'll continue to look at the digits data, but we'll switch to the\n", "K-Neighbors classifier. The K-neighbors classifier is an instance-based\n", "classifier. The K-neighbors classifier predicts the label of\n", "an unknown point based on the labels of the *K* nearest points in the\n", "parameter space." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Get the data\n", "from sklearn.datasets import load_digits\n", "digits = load_digits()\n", "X = digits.data\n", "y = digits.target" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 0 }, { "cell_type": "code", "collapsed": false, "input": [ "# Instantiate and train the classifier\n", "from sklearn.neighbors import KNeighborsClassifier\n", "clf = KNeighborsClassifier(n_neighbors=1)\n", "clf.fit(X, y)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 3, "text": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " n_neighbors=1, p=2, weights='uniform')" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "# Check the results using metrics\n", "from sklearn import metrics\n", "y_pred = clf.predict(X)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "print(metrics.confusion_matrix(y_pred, y))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[178 0 0 0 0 0 0 0 0 0]\n", " [ 0 182 0 0 0 0 0 0 0 0]\n", " [ 0 0 177 0 0 0 0 0 0 0]\n", " [ 0 0 0 183 0 0 0 0 0 0]\n", " [ 0 0 0 0 181 0 0 0 0 0]\n", " [ 0 0 0 0 0 182 0 0 0 0]\n", " [ 0 0 0 0 0 0 181 0 0 0]\n", " [ 0 0 0 0 0 0 0 179 0 0]\n", " [ 0 0 0 0 0 0 0 0 174 0]\n", " [ 0 0 0 0 0 0 0 0 0 180]]\n" ] }, { "output_type": "stream", "stream": "stderr", "text": [ "/home/varoquau/dev/numpy/numpy/core/fromnumeric.py:2499: VisibleDeprecationWarning: `rank` is deprecated; use the `ndim` attribute or function instead. To find the rank of a matrix see `numpy.linalg.matrix_rank`.\n", " VisibleDeprecationWarning)\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apparently, we've found a perfect classifier! But this is misleading\n", "for the reasons we saw before: the classifier essentially \"memorizes\"\n", "all the samples it has already seen. To really test how well this\n", "algorithm does, we need to try some samples it *hasn't* yet seen.\n", "\n", "This problem can also occur with regression models. In the following we fit an other instance-based model named \"decision tree\" to the Boston Housing price dataset we introduced previously:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.datasets import load_boston\n", "from sklearn.tree import DecisionTreeRegressor\n", "\n", "data = load_boston()\n", "clf = DecisionTreeRegressor().fit(data.data, data.target)\n", "predicted = clf.predict(data.data)\n", "expected = data.target\n", "\n", "plt.scatter(expected, predicted)\n", "plt.plot([0, 50], [0, 50], '--k')\n", "plt.axis('tight')\n", "plt.xlabel('True price ($1000s)')\n", "plt.ylabel('Predicted price ($1000s)')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 7, "text": [ "" ] }, { "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here again the predictions are seemingly perfect as the model was able to perfectly memorize the training set." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "A Better Approach: Using a validation set" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Learning the parameters of a prediction function and testing it on the\n", "same data is a methodological mistake: a model that would just repeat\n", "the labels of the samples that it has just seen would have a perfect\n", "score but would fail to predict anything useful on yet-unseen data.\n", "\n", "To avoid over-fitting, we have to define two different sets:\n", "\n", "- a training set X_train, y_train which is used for learning the parameters of a predictive model\n", "- a testing set X_test, y_test which is used for evaluating the fitted predictive model\n", "\n", "In scikit-learn such a random split can be quickly computed with the\n", "`train_test_split` helper function. It can be used this way:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn import cross_validation\n", "X = digits.data\n", "y = digits.target\n", "\n", "X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.25, random_state=0)\n", "\n", "print(\"%r, %r, %r\" % (X.shape, X_train.shape, X_test.shape))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1797, 64), (1347, 64), (450, 64)\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we train on the training data, and test on the testing data:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "clf = KNeighborsClassifier(n_neighbors=1).fit(X_train, y_train)\n", "y_pred = clf.predict(X_test)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "print(metrics.confusion_matrix(y_test, y_pred))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[37 0 0 0 0 0 0 0 0 0]\n", " [ 0 43 0 0 0 0 0 0 0 0]\n", " [ 0 0 43 1 0 0 0 0 0 0]\n", " [ 0 0 0 45 0 0 0 0 0 0]\n", " [ 0 0 0 0 38 0 0 0 0 0]\n", " [ 0 0 0 0 0 47 0 0 0 1]\n", " [ 0 0 0 0 0 0 52 0 0 0]\n", " [ 0 0 0 0 0 0 0 48 0 0]\n", " [ 0 0 0 0 0 0 0 0 48 0]\n", " [ 0 0 0 1 0 1 0 0 0 45]]\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "print(metrics.classification_report(y_test, y_pred))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 37\n", " 1 1.00 1.00 1.00 43\n", " 2 1.00 0.98 0.99 44\n", " 3 0.96 1.00 0.98 45\n", " 4 1.00 1.00 1.00 38\n", " 5 0.98 0.98 0.98 48\n", " 6 1.00 1.00 1.00 52\n", " 7 1.00 1.00 1.00 48\n", " 8 1.00 1.00 1.00 48\n", " 9 0.98 0.96 0.97 47\n", "\n", "avg / total 0.99 0.99 0.99 450\n", "\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The averaged f1-score is often used as a convenient measure of the\n", "overall performance of an algorithm. It appears in the bottom row\n", "of the classification report; it can also be accessed directly:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "metrics.f1_score(y_test, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 12, "text": [ "0.99111080660386652" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The over-fitting we saw previously can be quantified by computing the\n", "f1-score on the training data itself:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "metrics.f1_score(y_train, clf.predict(X_train))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 13, "text": [ "1.0" ] } ], "prompt_number": 11 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Validation with a Regression Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These validation metrics also work in the case of regression models. Here we'll use\n", "a Gradient-boosted regression tree, which is a meta-estimator which makes use of the\n", "``DecisionTreeRegressor`` we showed above. We'll start by doing the train-test split\n", "as we did with the classification case:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "data = load_boston()\n", "X = data.data\n", "y = data.target\n", "X_train, X_test, y_train, y_test = cross_validation.train_test_split(\n", " X, y, test_size=0.25, random_state=0)\n", "\n", "print(\"%r, %r, %r\" % (X.shape, X_train.shape, X_test.shape))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(506, 13), (379, 13), (127, 13)\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we'll compute the training and testing error using the Decision Tree that\n", "we saw before:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "est = DecisionTreeRegressor().fit(X_train, y_train)\n", "\n", "validation_score = metrics.explained_variance_score(\n", " y_test, est.predict(X_test))\n", "\n", "print(\"validation: %r\" % validation_score)\n", "\n", "training_score = metrics.explained_variance_score(\n", " y_train, est.predict(X_train))\n", "\n", "print(\"training: %r\" % training_score)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "validation: 0.67547138230266857\n", "training: 1.0\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This large spread between validation and training error is characteristic\n", "of a **high variance** model. Decision trees are not entirely useless,\n", "however: by combining many individual decision trees within ensemble\n", "estimators such as Gradient Boosted Trees or Random Forests, we can get\n", "much better performance:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.ensemble import GradientBoostingRegressor\n", "est = GradientBoostingRegressor().fit(X_train, y_train)\n", "\n", "validation_score = metrics.explained_variance_score(\n", " y_test, est.predict(X_test))\n", "\n", "print(\"validation: %r\" % validation_score)\n", "\n", "training_score = metrics.explained_variance_score(\n", " y_train, est.predict(X_train))\n", "\n", "print(\"training: %r\" % training_score)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "validation: 0.82195524394172881\n", "training: 0.98316591276273924\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This model is still over-fitting the data, but not by as much as the single tree." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Exercise: Model Selection via Validation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the previous notebook, we saw Gaussian Naive Bayes classification of the digits.\n", "Here we saw K-neighbors classification of the digits. We've also seen support vector\n", "machine classification of digits. Now that we have these\n", "validation tools in place, we can ask quantitatively which of the three estimators\n", "works best for the digits dataset.\n", "\n", "Take a moment and determine the answers to these questions for the digits dataset:\n", "\n", "- With the default hyper-parameters for each estimator, which gives the best f1 score\n", " on the **validation set**? Recall that hyperparameters are the parameters set when\n", " you instantiate the classifier: for example, the ``n_neighbors`` in\n", "\n", " clf = KNeighborsClassifier(n_neighbors=1)\n", "\n", " To use the default value, simply leave them unspecified.\n", "- For each classifier, which value for the hyperparameters gives the best results for\n", " the digits data? For ``LinearSVC``, use ``loss='l2'`` and ``loss='l1'``. For\n", " ``KNeighborsClassifier`` use ``n_neighbors`` between 1 and 10. Note that ``GaussianNB``\n", " does not have any adjustable hyperparameters.\n", "- Bonus: do the same exercise on the Iris data rather than the Digits data. Does the\n", " same classifier/hyperparameter combination win out in this case?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.svm import LinearSVC\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.neighbors import KNeighborsClassifier\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Solution" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load solutions/05C_validation_exercise.py" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 } ], "metadata": {} } ] }