{ "metadata": { "name": "", "signature": "sha256:da5ea2e6d102f8388dd3bd88ea4265563380195017f4dda93752a12de414f2df" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Model Evaluation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Review of last class\n", "\n", "- Goal was to predict the species of an **unknown iris**\n", "- Made predictions using KNN models with **different values of K**\n", "- Need a way to choose the **\"best\" model**: the one that \"generalizes\" to \"out-of-sample\" data\n", "\n", "**Solution:** Create a procedure that **estimates** how well a model is likely to perform on out-of-sample data and use that to choose between models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluation procedure #1: Train and test on the entire dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Train the model on the **entire dataset**.\n", "2. Test the model on the **same dataset**, and evaluate how well we did by comparing the **predicted** response values with the **true** response values." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# read the iris data into a DataFrame\n", "import pandas as pd\n", "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'\n", "col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']\n", "iris = pd.read_csv(url, header=None, names=col_names)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "# map each iris species to a number\n", "iris['species_num'] = iris.species.map({'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2})" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# store feature matrix in \"X\"\n", "feature_cols = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']\n", "X = iris[feature_cols]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# store response vector in \"y\"\n", "y = iris.species_num" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN (K=50)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# import the class\n", "from sklearn.neighbors import KNeighborsClassifier\n", "\n", "# instantiate the model\n", "knn = KNeighborsClassifier(n_neighbors=50)\n", "\n", "# train the model on the entire dataset\n", "knn.fit(X, y)\n", "\n", "# predict the response values for the observations in X (\"test the model\")\n", "knn.predict(X)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2,\n", " 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int64)" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# store the predicted response values\n", "y_pred = knn.predict(X)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "To evaluate a model, we also need an **evaluation metric:**\n", "\n", "- Numeric calculation used to **quantify** the performance of a model\n", "- Appropriate metric depends on the **goals** of your problem\n", "\n", "Most common choices for classification problems:\n", "\n", "- **Classification accuracy**: percentage of correct predictions (reward function)\n", "- **Classification error**: percentage of incorrect predictions (loss function)\n", "\n", "In this case, we'll use classification accuracy." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# compute classification accuracy\n", "from sklearn import metrics\n", "print metrics.accuracy_score(y, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.94\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is known as **training accuracy** because we are testing the model on the same data we used to train the model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![50NN classification map](images/iris_50nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN (K=1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=1)\n", "knn.fit(X, y)\n", "y_pred = knn.predict(X)\n", "print metrics.accuracy_score(y, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.0\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Does that mean that K=1 is the best value for K?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![1NN classification map](images/iris_01nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Problems with training and testing on the same data\n", "\n", "- Goal is to estimate likely performance of a model on **out-of-sample data**\n", "- But, maximizing training accuracy rewards **overly complex models** that won't necessarily generalize\n", "- Unnecessarily complex models **overfit** the training data:\n", " - Will do well when tested using the in-sample data\n", " - May do poorly on out-of-sample data\n", " - Learns the \"noise\" in the data rather than the \"signal\"\n", " - From Quora: [What is an intuitive explanation of overfitting?](http://www.quora.com/What-is-an-intuitive-explanation-of-overfitting/answer/Jessica-Su)\n", "\n", "**Thus, training accuracy is not a good estimate of out-of-sample accuracy.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluation procedure #2: Train/test split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Split the dataset into two pieces: a **training set** and a **testing set**.\n", "2. Train the model on the **training set**.\n", "3. Test the model on the **testing set**, and evaluate how well we did.\n", "\n", "What does this accomplish?\n", "\n", "- Model can be trained and tested on **different data** (we treat testing data like out-of-sample data).\n", "- Response values are **known** for the testing set, and thus **predictions can be evaluated**.\n", "- **Testing accuracy** is a better estimate than training accuracy of out-of-sample performance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Side note on \"unpacking\"" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def min_max(nums):\n", " smallest = min(nums)\n", " largest = max(nums)\n", " return [smallest, largest]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "min_and_max = min_max([1, 2, 3])\n", "print min_and_max\n", "print type(min_and_max)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[1, 3]\n", "\n" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "the_min, the_max = min_max([1, 2, 3])\n", "print the_min\n", "print type(the_min)\n", "print the_max\n", "print type(the_max)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "\n", "3\n", "\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Understanding the `train_test_split` function" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cross_validation import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# before splitting\n", "print X.shape\n", "\n", "# after splitting\n", "print X_train.shape\n", "print X_test.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(150, 4)\n", "(90L, 4L)\n", "(60L, 4L)\n" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "# before splitting\n", "print y.shape\n", "\n", "# after splitting\n", "print y_train.shape\n", "print y_test.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(150L,)\n", "(90L,)\n", "(60L,)\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "![train_test_split](images/train_test_split.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Understanding the `random_state` parameter" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# WITHOUT a random_state parameter\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)\n", "\n", "# print the first element of each object\n", "print X_train[0]\n", "print X_test[0]\n", "print y_train[0]\n", "print y_test[0]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 6.1 3. 4.6 1.4]\n", "[ 6.2 2.9 4.3 1.3]\n", "1\n", "1\n" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "# WITH a random_state parameter\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=4)\n", "\n", "# print the first element of each object\n", "print X_train[0]\n", "print X_test[0]\n", "print y_train[0]\n", "print y_test[0]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 4.6 3.4 1.4 0.3]\n", "[ 6.4 2.8 5.6 2.1]\n", "0\n", "2\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using the train/test split procedure (K=1)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# STEP 1: split X and y into training and testing sets (using random_state for reproducibility)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# STEP 2: train the model on the training set (using K=1)\n", "knn = KNeighborsClassifier(n_neighbors=1)\n", "knn.fit(X_train, y_train)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_neighbors=1, p=2, weights='uniform')" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# STEP 3: test the model on the testing set, and check the accuracy\n", "y_pred = knn.predict(X_test)\n", "print metrics.accuracy_score(y_test, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.95\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Repeat for K=50" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=50)\n", "knn.fit(X_train, y_train)\n", "y_pred = knn.predict(X_test)\n", "print metrics.accuracy_score(y_test, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.933333333333\n" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Bias-variance tradeoff](images/bias_variance.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Search for the \"best\" value of K" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# calculate TRAINING ERROR and TESTING ERROR for K=1 through 50\n", "k_range = range(1, 51)\n", "training_error = []\n", "testing_error = []\n", "for k in k_range:\n", " knn = KNeighborsClassifier(n_neighbors=k)\n", " # training error\n", " knn.fit(X, y)\n", " y_pred = knn.predict(X)\n", " training_error.append(1 - metrics.accuracy_score(y, y_pred))\n", " # testing error\n", " knn.fit(X_train, y_train)\n", " y_pred = knn.predict(X_test)\n", " testing_error.append(1 - metrics.accuracy_score(y_test, y_pred))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "# plot the relationship between K (HIGH TO LOW) and TESTING ERROR\n", "plt.plot(k_range, testing_error)\n", "plt.gca().invert_xaxis()\n", "plt.xlabel('Value of K for KNN')\n", "plt.ylabel('Testing Error')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "What can we conclude?\n", "\n", "- A value of K around 11 is likely the **best value for K** when using KNN on the iris dataset.\n", "- When given the measurements of an **unknown iris**, we estimate that we would be able to correctly predict its species 98% of the time." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training error versus testing error" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# create a DataFrame of K, training error, and testing error\n", "df = pd.DataFrame({'K': k_range, 'train':training_error, 'test':testing_error}).set_index('K').sort_index(ascending=False)\n", "df.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
testtrain
K
500.0666670.060000
490.0833330.040000
480.0666670.053333
470.0500000.046667
460.0500000.053333
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ " test train\n", "K \n", "50 0.066667 0.060000\n", "49 0.083333 0.040000\n", "48 0.066667 0.053333\n", "47 0.050000 0.046667\n", "46 0.050000 0.053333" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "# plot the relationship between K (HIGH TO LOW) and both TRAINING ERROR and TESTING ERROR\n", "df.plot()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\na1X9E0hELwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Roughly speaking:\n", "\n", "- **Training error** decreases as model complexity increases (lower value of K)\n", "- **Testing error** is minimized at the optimum model complexity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Bias-variance tradeoff](images/training_testing_error.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making predictions on out-of-sample data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given the measurements of a (truly) unknown iris, how do we predict its species?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# instantiate the model with the best known parameters\n", "knn = KNeighborsClassifier(n_neighbors=11)\n", "\n", "# re-train the model with X and y (not X_train and y_train) - why?\n", "knn.fit(X, y)\n", "\n", "# make a prediction for an out-of-sample observation\n", "knn.predict([3, 5, 4, 2])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "array([1], dtype=int64)" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Disadvantages of train/test split?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What would happen if the `train_test_split` function had split the data differently? Would we get the same exact results as before?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# try different values for random_state\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=4)\n", "knn = KNeighborsClassifier(n_neighbors=50)\n", "knn.fit(X_train, y_train)\n", "y_pred = knn.predict(X_test)\n", "print metrics.accuracy_score(y_test, y_pred)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.933333333333\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Testing accuracy is a **high-variance estimate** of out-of-sample accuracy\n", "- **K-fold cross-validation** overcomes this limitation and provides more reliable estimates\n", "- But, train/test split is still useful because of its **flexibility and speed**" ] } ], "metadata": {} } ] }