{ "metadata": { "name": "", "signature": "sha256:dec3d8c78019801dc33c0f4c7288c472ec5c2ac6b95c679f61c481b4fccf68eb" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# (k-)Nearest Neighbor(s)\n", "**a.k.a. Classifying for Fun and Profit**\n", "\n", "Last class we had some members of the NBA that we'd mapped. They looked something like this" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import matplotlib.pylab as plt\n", "nba_df = pd.read_csv('data/NBA-Census-10.14.2013.csv')\n", "\n", "# Loop through the position, marker and colors\n", "for position, marker, color in zip(['C','G','F'], \">xo\", \"cmy\"):\n", " # Get the players that play that given position\n", " players = nba_df[nba_df[\"POS\"] == position]\n", " # Add their points to the scatterplot\n", " plt.scatter(players[\"Ht (In.)\"], players[\"WT\"], c=color, marker=marker, alpha=0.5)\n", "# Add some labels for readability\n", "plt.xlabel(\"Weight\")\n", "plt.ylabel(\"Height (inches)\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nL1F79szX/AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Wait a second!\n", "\n", "First, what the heck is this `for .. in zip()` thing? \n", "\n", "Last time we mapped everyone, we did it a more verbose way. First we pulled out the centers, forwards and guards, then we graphed the centers, forwards and guards. Lots of repetition, right?\n", "\n", "using a `for` loop with `zip` allows us to loop through more than one thing at a time." ] }, { "cell_type": "code", "collapsed": false, "input": [ "for position, marker, color in zip(['C','G','F'], \">xo\", \"cmy\"):\n", " print \"== Going through the loop!\"\n", " print \"Position is %s\" % position\n", " print \"Position is %s\" % marker\n", " print \"Position is %s\" % color" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "== Going through the loop!\n", "Position is C\n", "Position is >\n", "Position is c\n", "== Going through the loop!\n", "Position is G\n", "Position is x\n", "Position is m\n", "== Going through the loop!\n", "Position is F\n", "Position is o\n", "Position is y\n" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first time through we get the first elements of everything being `zip`ped up (the `'C'`, the `'>'` and the `'c'`). This works because you can loop over the members of `\"cmy\"` the same as you can loop over `['C','G','F']`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "letters = \"cmy\"\n", "print letters[0]\n", "print letters[1]\n", "print letters[2]\n", "\n", "arr = ['C', 'G', 'F']\n", "print arr[0]\n", "print arr[1]\n", "print arr[2]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "c\n", "m\n", "y\n", "C\n", "G\n", "F\n" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And since our `for` loop is asking for three things - `position`, `marker`, and `color`, Python automatically assigns the first element of each `zip`ped element to the appropriate value. Let's take another look!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for letter, number in zip(\"ABC\", \"123\"):\n", " print \"== Going through the loop!\"\n", " print \"Letter is %s\" % letter\n", " print \"Number is %s\" % number" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "== Going through the loop!\n", "Letter is A\n", "Number is 1\n", "== Going through the loop!\n", "Letter is B\n", "Number is 2\n", "== Going through the loop!\n", "Letter is C\n", "Number is 3\n" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The for loop assigns variables based on their relationship to the `zip`ed list. `letter` maps to `\"ABC\"` and `number` to `\"123\"`. You'll run into this pattern often enough that you should probably know about it!\n", "\n", " Oh, and if you want to know what `zip` is actually doing...." ] }, { "cell_type": "code", "collapsed": false, "input": [ "zip(['C','G','F'], \">xo\", \"cmy\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "[('C', '>', 'c'), ('G', 'x', 'm'), ('F', 'o', 'y')]" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hopefully that makes a bit of sense so you can work through it when you see it!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Back to the NBA" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import matplotlib.pylab as plt\n", "nba_df = pd.read_csv('data/NBA-Census-10.14.2013.csv')\n", "\n", "# Loop through the position, marker and colors\n", "for position, marker, color in zip(['C','G','F'], \">xo\", \"cmy\"):\n", " # Get the players that play that given position\n", " players = nba_df[nba_df[\"POS\"] == position]\n", " # Add their points to the scatterplot\n", " plt.scatter(players[\"Ht (In.)\"], players[\"WT\"], c=color, marker=marker, alpha=0.5)\n", "# Add some labels for readability\n", "plt.xlabel(\"Weight\")\n", "plt.ylabel(\"Height (inches)\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nL1F79szX/AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the guards are lighter and shorter, the centers are taller and heavier, and the forwards are somewhere in between. If given someone clearly in those groups, we wouldn't do a terrible job figuring out what position they play. We know it because we can see it, but how can a *computer* figure it out that?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Birds of a feather get analyzed together\n", "\n", "Remember that time in middle school you bought a skateboard and your parents decided you were going to spend the rest of your life shoplifting and smoking pot because That's All Kids With Skateboards Do? And hey, maybe some of them did, but Come On, Mom, You're Different, You Promise?\n", "\n", "Luckily for us, computers are exactly dumb enough to jump to the same sorts of conclusions - we're going to help them get there." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Nearest Neighbor Algorithm\n", "\n", "The **nearest neighbor algorithm** is an incredibly simple algorithm to classify objects. It's an example of **supervised learning**, a type of machine learning where to model requires a bit of initial data (called **training data**) to base its model on.\n", "\n", "Your parents probably based their model on a Fox News special called **Satanic Dope-Fiend Skaters**. As we'll see later, it's important to pick a nice random set of training data to not bias your later results." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# First, let's get a small dose of training data.\n", "# Let's take 20 players of the full 528\n", "nba_training = nba_df[:20]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "# And graph it to see what we've got\n", "for position, marker, color in zip(['C','G','F'], \">xo\", \"cmy\"):\n", " players = nba_training[nba_training[\"POS\"] == position]\n", " plt.scatter(players[\"Ht (In.)\"], players[\"WT\"], c=color, marker=marker)\n", "plt.xlabel(\"Weight\")\n", "plt.ylabel(\"Height (inches)\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEKCAYAAAD5MJl4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtYVXWi//H33rK9pIiFKQoqGF5A5BKK1zE84qWedEzN\nGRhHO3aqySZrcso6zW/SpkSb8XjAk805ncymmtRT8xNPmT91HKzxMmijaOJoqFu5iHegrSbgXr8/\nHPeIC8QNbBbg5/U8PA97sS+fr5f1Ya3vutgMwzAQERG5jt3qACIi0vioHERExETlICIiJioHEREx\nUTmIiIiJykFEREz8rA7grdjYWLKzs62OISLSpMTExLBnz55bfn6T23LIzs7GMIxm+/XKK69YnkFj\n0/g0vub35e0v1U2uHERExPdUDiIiYqJyaGQSExOtjuAzzXlsoPE1dc19fN6yGYbRpK6tZLPZaGKR\nRUQs5+26U1sOIiJionIQERETlYOIiJioHERExETlICIiJioHERExUTmIiIiJykFERExUDiIiYqJy\nEBERE5WDiIiYqBxERMTEZ+WQl5fHyJEj6devH1FRUaSnp3t+tnTpUiIiIoiKimLu3Lme5ampqfTq\n1Yu+ffuyYcMGX0UTEZEa+Ow2oQ6HgyVLlhAbG4vL5SI+Pp7Ro0dTVFTE2rVr2bt3Lw6Hg9OnTwOQ\nk5PDqlWryMnJoaCggKSkJA4dOoTdro0bEZGG5rM1b1BQELGxsQC0a9eOiIgICgoK+O1vf8tLL72E\nw+EA4O677wYgIyOD5ORkHA4HoaGhhIeHk5WV5at4IiJyEw3ya7nT6WT37t0MGjSIQ4cO8cUXXzB4\n8GASExPZtWsXAIWFhYSEhHheExISQkFBQUPEExGRG/hst9I1LpeLKVOmkJaWhr+/PxUVFZw/f54d\nO3awc+dOpk6dypEjR6p8rc1mq3L5vHnzPN8nJibqDk4iIjfIzMwkMzOz1q/3aTmUl5czefJkpk2b\nxsSJE4GrWwSTJk0CYODAgdjtds6cOUNwcDB5eXme1+bn5xMcHFzl+15fDiIiYnbjL87z58/36vU+\n261kGAaPPvookZGRPPvss57lEydOZPPmzQAcOnSIsrIyOnbsyIQJE1i5ciVlZWUcPXqUb775hoSE\nBF/FExGRm/DZlsPWrVv54IMPiI6OJi4uDrh6qOrMmTOZOXMm/fv3p2XLlvzud78DIDIykqlTpxIZ\nGYmfnx/Lli2rdreSiEh9uHTpEm3atLE6RqNkM7y543Qj4O1NskVEqtO1Rw/CevXi16++ytChQ62O\n41Perjt1EoGI3LZcFy+yrWdPRj/8MMOSkti2bZvVkRoNlYOI3N7GjePiihVsCwhg2LBhLF++3OpE\njYLPD2UVEWnUjh7ljnXr8Nu3j3994w1++MMfWp2oUdCcg4jctu7s1Ikrbjcvz53LT2fNom3btlZH\n8hlv150qBxG5bWVlZdGvX79mXQrXqBxERMRERyuJiEidqRxERMRE5SAiIiYqBxERMVE5iIiIicpB\nRERMVA4iImKichAREROVg4iImKgcRETEROUgIiImKgcRETFROYiIiInKQURETFQOIiJionIQERET\nlYOIiJioHERExETlICIiJioHERExUTmIiIiJykFERExUDiIiYqJyEBERE5WDiIiYqBxERMRE5SAi\nIiYqBxERMfGzOoCING4lJSV8/vnnGIbBmDFjCAwMtDqSNACfbTnk5eUxcuRI+vXrR1RUFOnp6ZV+\nvnjxYux2O+fOnfMsS01NpVevXvTt25cNGzb4KpqI3KITJ04QG9uX//iPx3jrrceJienLsWPHrI4l\nDcBmGIbhizcuKiqiqKiI2NhYXC4X8fHxrFmzhoiICPLy8njsscc4ePAgX331FXfddRc5OTmkpKSw\nc+dOCgoKSEpK4tChQ9jtlfvLZrPho8gicoMnn3yU4uLf8cQTFQD87nctuHx5Ih9++LHFycRb3q47\nfbblEBQURGxsLADt2rUjIiKCwsJCAJ577jneeOONSs/PyMggOTkZh8NBaGgo4eHhZGVl+SqeiNyC\ngoJj9OlT4Xncp88VCguPW5hIGkqDTEg7nU52797NoEGDyMjIICQkhOjo6ErPKSwsJCQkxPM4JCSE\ngoKChognItW4774xrFlzBy4XXLwIf/hDG+67b4zVsaQB+HxC2uVyMWXKFNLS0rDb7SxYsICNGzd6\nfn6zzRybzebreCJyE88+O4cjR75h8uR3AUhJmcjLL79icSppCD4th/LyciZPnsy0adOYOHEi+/bt\nw+l0EhMTA0B+fj7x8fH85S9/ITg4mLy8PM9r8/PzCQ4OrvJ9582b5/k+MTGRxMREXw5D5LbVokUL\n3nzzbdLS3sIwDBwOh9WR5BZlZmaSmZlZ69f7bELaMAxmzJhBYGAgS5YsqfI5YWFhpgnprKwsz4R0\n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\nIzY21oiNjTWefPJJCxPWTVXju15YWFiTPlqpqvGVlZUZ06ZNM6Kioox7773X+NOf/mRdwDqqanw7\nd+40EhIcWjPzAAADhklEQVQSjJiYGGPw4MHGX//6VwsT1t6iRYuMyMhIIyoqypg+fbpRVlZmnD17\n1hg1apTRq1cvY/To0cb58+etjllrN47v8uXLzWrdUtXf3/VuZd2iy2eIiIhJo9+tJCIiDU/lICIi\nJioHERExUTmIiIiJykFERExUDiIiYqJyEAF+9rOfkZaW5nk8duxYHnvsMc/jOXPmsGTJkipf+8or\nr/DHP/7xpu8/b948Fi9ebFpeUlLCW2+9VcvUIr6jchABhg8f7rmEgtvt5uzZs+Tk5Hh+vn37doYN\nG1bla+fPn8+oUaNu+v42m63K5efPn2fZsmW1TC3iOyoHEWDIkCFs374dgP379xMVFYW/vz/FxcVc\nvnyZAwcOAJCYmMiAAQMYN26c5zpDjzzyCJ988gkA69atIyIiggEDBjB79mzGjx/v+YycnBxGjhzJ\nPffcw9KlSwF48cUXOXz4MHFxcU32xkfSPPlZHUCkMejatSt+fn7k5eWxfft2hgwZQkFBAdu3b6d9\n+/ZERETws5/9jIyMDDp27MiqVat4+eWXeeedd7DZbNhsNr777jt+8pOf8OWXX9KjRw9SUlI8WwyG\nYfC3v/2NzMxMSktL6dOnD7NmzWLRokXs37+f3bt3W/wnIFKZykHk74YOHcq2bdvYtm0bzz33HAUF\nBWzbto2AgACCg4PZsGEDo0ePBuDKlSt07drV89prK/+ePXvSo0cPAJKTk/mv//ov4OpupQcffBCH\nw0FgYCCdOnXi5MmT6Oo10lipHET+btiwYWzdupV9+/bRv39/unXrxm9+8xsCAgJITEz0lEV1bpxX\nuHHF37JlS8/3LVq0oKKion4HIFKPNOcg8ndDhw7l008/JTAwEJvNxp133klxcTHbt28nOTmZ06dP\ns2PHDgDKy8srTVjbbDb69OnDkSNHOHbsGACrVq2qtFupKv7+/nz77bc+HpmI91QOIn8XFRXF2bNn\nGTx4sGdZdHQ0HTp04O677+bjjz9m7ty5xMbGEhcX55nAvqZ169YsW7aMcePGMWDAANq3b09AQACA\nZ17iRoGBgQwbNoz+/ftrQloaFV2yW6QeXbhwgbZt2wLw1FNP0bt3b5555hmLU4l4T1sOIvXo7bff\nJi4ujn79+lFaWsoTTzxhdSSRWtGWg4iImGjLQURETFQOIiJionIQERETlYOIiJioHERExETlICIi\nJv8fW9mrNvadkpgAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks pretty clear to me! You can still see the centers on the top right, the forwards in the middle and the guards to the bottom left.\n", "\n", "The way **nearest neighbors** works is by finding, well, the nearest neighbor of a new point. Let's say I have a new person who is 220 pounds and 76 inches tall." ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(76,220, marker='*',c='r', ms=10)\n", "pylab.ylim([170,270])\n", "pylab.xlim([72,84])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "(72, 84)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nUZ50dqZaX3Fx8aR9FnJbpltf2G2J+HMNY8zly5fNokWLrnsq//zzz5uysrL5GCGirl7fhx9+aAoK\nCszo6KgxxpiUlBRz7ty5KE84N9d+/7KyssyTTz5pjDHG7/ebpUuXRnO8Obt2fQ8++KD53e9+Z4wx\nZs+ePaa4uDia483KmTNnjNvtNufOnTMTExOmtLTU/OpXvzLx8fGT9rvzzjujNOHcTLW+Xbt2BR9f\n6G2Zan07d+40hYWFYbVlXq7gDxw4oLy8vElP5Xfs2KH9+/fr17/+9XyMEFFXr++f//yn+vr6lJOT\no6VLl2pgYEB5eXn64IMPoj3mrF37/XO5XCorK5Mk5efnKyYmRufPn4/miHNy7fr8fr8effRRSdKa\nNWvk9/ujOd6sHD9+XF/72teUkJCg2NhYlZWV6c0331RSUpKGhoYkSe+//77uueeeKE86O1Ot7y9/\n+YskO9oy1fp27NgRdlvmJfC/+c1vgk9/JengwYN68cUX1draqltvvXU+Roioq9e3bNkyDQ8Pq7e3\nV729vXK5XHr77bcX7B8k6frvX2lpqTo6OiRJPT09Gh8fV0JCQrTGm7Nr15eamqojR45Ikjo6OpSe\nnh6t0WYtIyNDx44d03/+8x8ZY3To0CF5PB498sgj2rlzpyRp586dKi0tjfKkszPd+mxpy1TrKy8v\n19DQUHhtifRTjbGxMZOQkGAuXboU3JaammqWLFlivF6v8Xq95nvf+16kx4iYqdZ3taVLly7on6KZ\nan3j4+Nm7dq1Jisry3zlK18xhw8fjt6AczTV+rq6ukxBQYHJyckxRUVF5u23347ihLO3detW4/F4\nTFZWlnnsscfM+Pi4OX/+vHnwwQdNWlqaKSkpMRcvXoz2mLN27fouX75sVVum+v5dbSZt4b8qAABL\n8S9ZAcBSBB4ALEXgAcBSBB4ALEXgAcBSBB4ALEXgAcBSBB4ALPX/W7FINps1V9cAAAAASUVORK5C\nYII=\n", "text": [ "" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how close he is to all of the other players..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "for index, player in nba_training.iterrows():\n", " plot([76, player[\"Ht (In.)\"]], [220,player[\"WT\"]], 'k', linestyle='dashed', linewidth=1)\n", "plt.scatter(nba_training[\"Ht (In.)\"], nba_training[\"WT\"])\n", "plt.plot(76,220, marker='*',c='r', ms=10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "# Except of course that didn't do anything. Let's actually get lengths.\n", "numpy.sqrt((nba_training[\"Ht (In.)\"] - 76) ** 2 + (nba_training[\"WT\"] - 220) ** 2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "0 2.236068\n", "1 3.000000\n", "2 25.179357\n", "3 7.000000\n", "4 10.440307\n", "5 3.000000\n", "6 3.605551\n", "7 21.377558\n", "8 16.155494\n", "9 25.961510\n", "10 20.024984\n", "11 40.049969\n", "12 37.013511\n", "13 13.152946\n", "14 37.483330\n", "15 35.227830\n", "16 30.413813\n", "17 1.000000\n", "18 10.198039\n", "19 35.128336\n", "dtype: float64" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "# Looks like he's closest to #17\n", "\n", "# Let's plot new guy\n", "plt.plot(76,220, marker='*',c='r', ms=10)\n", "# Let's plot 17\n", "match = nba_training.ix[17]\n", "plt.plot(match[\"Ht (In.)\"], match[\"WT\"], marker='*',c='r', ms=10)\n", "\n", "pylab.ylim([170,270])\n", "pylab.xlim([72,84])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "(72, 84)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n/PPPS5K+853vaPPmzSopKZl+UZ7BA0DYbvoz+JmkpaXp0KFDkqTu7m5lZGRIklavXq329nZNTU2p\nv79fJ0+eVHFx8VwuAQCYp+s+oqmpqdGhQ4d05swZLV26VC+88IJee+01Pf3007pw4YK+9rWv6bXX\nXpMkud1uVVdXy+12KzY2Vq2trbM+ogEARNYNPaK56RflEQ0AhG1BHtEAAL76CDwAWIrAA4ClCDwA\nWIrAA4ClCDwAWIrAA4ClCDwAWIrAA4ClCDwAWIrAA4ClCDwAWIrAA4ClCDwAWIrAR8B8fsXWV53N\na5NY32Jn+/rCReAjwOa/ZDavTWJ9i53t6wsXgQcASxF4ALBUVH5lX35+vo4fP77QlwWARS0vL0/v\nvffeDR8flcADACKPRzQAYCkCDwCWimjg//nPf6qgoCD4dscdd6i5uVkbN25UVlaW8vLyVFlZqYmJ\niUiOETEzra+lpSW4/+WXX1ZMTIzOnTsXxSnnLtT6XnnlFWVlZSknJ0f19fVRnnRuZvv76ff7VVRU\npIKCAhUVFamnpyfao86J1+tVdna2li9frtraWl24cEHnzp1TeXm5MjIytHLlSo2Pj0d7zDmbaX22\ntEWaeX2X3XBbzAK5dOmSSUpKMqdPnzadnZ3m0qVLxhhj6uvrTX19/UKNETFXrs8YY06fPm1WrVpl\nUlJSzNmzZ6M83fxdub7u7m5TVlZmpqamjDHGfPTRR1Gebv4ur++DDz4w3/72t83+/fuNMcbs3bvX\neDyeKE8Xvv7+fpOammo+++wzY4wx1dXVZvv27Wbjxo1m69atxhhjGhsbF+1/e7Otr6ury4q2zLY+\nY8Jry4I9ojlw4IC+/vWva+nSpSovL1dMzJeXLikp0dDQ0EKNETFXrk+SnnnmGW3bti3KU908Bw4c\nUFpampYuXapf/vKX2rRpk5xOpyTp7rvvjvJ083d5fcuWLdO9994bvPMbHx9XcnJylKcL3+233y6n\n06lPPvlEn3/+uT755BPdd9992rNnj+rq6iRJdXV12r17d5QnnZuZ1pecnKyysjIr2jLb+qTw2rJg\ngW9vb1dtbe01219//XU9+uijCzVGxFy5vo6ODrlcLuXm5kZ5qpunvb1dNTU1kqSTJ0/q7bffVmlp\nqTwej44ePRrl6ebvyvU1Njbq2Wef1bJly7Rx40Z5vd4oTxe+u+66K7iG++67T/Hx8SovL9fo6KgS\nExMlSYmJiRodHY3ypHMz0/rKysqmHbOY2zLb+sJuS8RfaxhjLly4YJYsWXLNS/mf//znprKyciFG\niKgr1/fxxx+b4uJiMzExYYwxJiUlxZw5cybKE87P1Z+/nJwc86Mf/cgYY4zf7zepqanRHG/erl7f\nww8/bP7whz8YY4zZtWuXKSsri+Z4c3Lq1CmTlZVlzpw5Yy5evGgqKirMb37zGxMfHz/tuDvvvDNK\nE87PTOtra2sL7l/sbZlpfTt27DAlJSVhtWVB7uD37dunwsLCaS/lt2/frr179+rNN99ciBEi6sr1\n/etf/9LAwIDy8vKUmpqqoaEhFRYW6qOPPor2mHN29efP5XKpsrJSklRUVKSYmBidPXs2miPOy9Xr\n8/v9evzxxyVJa9askd/vj+Z4c3L06FE9+OCDSkhIUGxsrCorK/XOO+8oKSlJIyMjkqQPP/xQ99xz\nT5QnnZuZ1veXv/xFkh1tmWl927dvD7stCxL43/72t8GXv5K0f/9+vfTSS+ro6NCtt966ECNE1JXr\nW758uUZHR9Xf36/+/n65XC69++67i/Y/JOnaz19FRYW6u7slSX19fZqamlJCQkK0xpu3q9eXlpam\nQ4cOSZK6u7uVkZERrdHmLDMzU0eOHNGnn34qY4wOHDggt9utxx57TDt27JAk7dixQxUVFVGedG5m\nW58tbZlpfVVVVRoZGQmvLZF+qTE5OWkSEhLM+fPng9vS0tLMsmXLTH5+vsnPzzdPPvlkpMeImJnW\nd6XU1NRF/VM0M61vamrKrF271uTk5JhvfOMb5uDBg9EbcJ5mWl9PT48pLi42eXl5prS01Lz77rtR\nnHDutm7datxut8nJyTFPPPGEmZqaMmfPnjUPP/ywSU9PN+Xl5WZsbCzaY87Z1eu7cOGCVW2Z6fN3\npRtpC/9UAQBYiv+TFQAsReABwFIEHgAsReABwFIEHgAsReABwFIEHgAsReABwFL/B7lmqJQjkNop\nAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "# Looks pretty close! So who is #17?\n", "nba_training.ix[17]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "Name Harden, James\n", "Age 24\n", "Team Rockets\n", "POS G\n", "# 13\n", "2013 $ $13,701,250\n", "Ht (In.) 77\n", "WT 220\n", "EXP 4\n", "1st Year 2009\n", "DOB 8/26/1989\n", "School Arizona State\n", "City Los Angeles, CA\n", "State (Province, Territory, Etc..) California\n", "Country US\n", "Race Black\n", "HS Only No\n", "Name: 17, dtype: object" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**He's a guard!** And according to the person across the room from me, he is very famous but doesn't play defense at all so people actually hate him. And he has a beard.\n", "\n", "But regardless, since he's the closest person (or **nearest neighbor**) to our new player, we're going to **predict that the new guy is a guard, too.**\n", "\n", "### So, in fewer words and no code\n", "\n", "The nearest neighbor algorithm just finds the **closest known point and classifies the new point to match**. It also works with a lot more than a 2-dimensional graph - it works in big huge *n*-dimensional space, it's just easier to visualize in 2D. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Enter scikit-learn\n", "\n", "Do you want to write a program to compute the minimum length for every single new player? No, of course not. And while we should *probably* actually make you do that, instead we'll introduce you to a brand new friend called **scikit-learn**.\n", "\n", "Scikit-learn comes with a fun little thing called **neighbors**, which - you guessed it - does nearest neighbor analysis. And it'll even work with pandas!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.neighbors import KNeighborsClassifier\n", "\n", "# Let's initialize a classifier\n", "knn = KNeighborsClassifier(n_neighbors=1)\n", "\n", "# knn.fit takes two parameters\n", "# First, the content we want to train on. For us\n", "# it's height and weight.\n", "# Secondly, how we're classifying each element of the\n", "# training data. We're classifying by position!\n", "knn.fit(nba_training[[\"Ht (In.)\", \"WT\"]], nba_training[\"POS\"])\n", "\n", "# Now we need to make a prediction. It's pretty easy\n", "\n", "knn.predict([76, 220])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "array(['G'], dtype=object)" ] } ], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ta-da! It predicted **guard**, just like we 1) guessed and 2) predicted ourselves. This is so easy it should be *illegal*. We can also find some more information about any given point..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's get the first neighbor\n", "distance, neighbors = knn.kneighbors([76,220])\n", "# Why does it return an array of arrays? I honestly\n", "# don't know, but you can grab the first one.\n", "print \"Neighbor is %s \" % neighbors[0]\n", "print \"Distance is %s\" % distance[0]\n", "nba_training.ix[neighbors[0]]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Neighbor is [17] \n", "Distance is [ 1.]\n" ] }, { "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", " \n", " \n", " \n", " \n", " \n", "
NameAgeTeamPOS#2013 $Ht (In.)WTEXP1st YearDOBSchoolCityState (Province, Territory, Etc..)CountryRaceHS Only
17 Harden, James 24 Rockets G 13 $13,701,250 77 220 4 2009 8/26/1989 Arizona State Los Angeles, CA California US Black No
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ " Name Age Team POS # 2013 $ Ht (In.) WT EXP \\\n", "17 Harden, James 24 Rockets G 13 $13,701,250 77 220 4 \n", "\n", " 1st Year DOB School City \\\n", "17 2009 8/26/1989 Arizona State Los Angeles, CA \n", "\n", " State (Province, Territory, Etc..) Country Race HS Only \n", "17 California US Black No " ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's get the closest five neighbors\n", "distance, neighbors = knn.kneighbors([76,220], 3)\n", "# Even though it's returning five neighbors/distances now, you'll\n", "# still use [0] to grab them\n", "print \"Neighbors are %s \" % neighbors[0]\n", "print \"Distances are %s\" % distance[0]\n", "# You should be able to do add in a new distance column\n", "# with that new data, but I don't know how.\n", "nba_training.ix[neighbors[0]]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Neighbors are [17 0 1] \n", "Distances are [ 1. 2.23606798 3. ]\n" ] }, { "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", " \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", " \n", " \n", " \n", " \n", "
NameAgeTeamPOS#2013 $Ht (In.)WTEXP1st YearDOBSchoolCityState (Province, Territory, Etc..)CountryRaceHS Only
17 Harden, James 24 Rockets G 13 $13,701,250 77 220 4 2009 8/26/1989 Arizona State Los Angeles, CA California US Black No
0 Gee, Alonzo 26 Cavaliers F 33 $3,250,000 78 219 4 2009 5/29/1987 Alabama Riviera Beach, FL Florida US Black No
1 Wallace, Gerald 31 Celtics F 45 $10,105,855 79 220 12 2001 7/23/1982 Alabama Sylacauga, AL Alabama US Black No
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ " Name Age Team POS # 2013 $ Ht (In.) WT EXP \\\n", "17 Harden, James 24 Rockets G 13 $13,701,250 77 220 4 \n", "0 Gee, Alonzo 26 Cavaliers F 33 $3,250,000 78 219 4 \n", "1 Wallace, Gerald 31 Celtics F 45 $10,105,855 79 220 12 \n", "\n", " 1st Year DOB School City \\\n", "17 2009 8/26/1989 Arizona State Los Angeles, CA \n", "0 2009 5/29/1987 Alabama Riviera Beach, FL \n", "1 2001 7/23/1982 Alabama Sylacauga, AL \n", "\n", " State (Province, Territory, Etc..) Country Race HS Only \n", "17 California US Black No \n", "0 Florida US Black No \n", "1 Alabama US Black No " ] } ], "prompt_number": 36 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Putting the k- in k-Nearest Neighbors\n", "\n", "Hrm, looks like there are a few forwards nearby, too. Maybe instead of just looking at **one** neighbor, we should look at more? We're in luck!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=3)\n", "\n", "# knn.fit takes two parameters\n", "# First, the content we want to train on. For us\n", "# it's height and weight.\n", "# Secondly, how we're classifying each element of the\n", "# training data. We're classifying by position!\n", "knn.fit(nba_training[[\"Ht (In.)\", \"WT\"]], nba_training[\"POS\"])\n", "knn.predict([76,220])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "array(['F'], dtype=object)" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=5)\n", "\n", "# knn.fit takes two parameters\n", "# First, the content we want to train on. For us\n", "# it's height and weight.\n", "# Secondly, how we're classifying each element of the\n", "# training data. We're classifying by position!\n", "knn.fit(nba_training[[\"Ht (In.)\", \"WT\"]], nba_training[\"POS\"])\n", "knn.predict([76,220])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "array(['F'], dtype=object)" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=20)\n", "\n", "# knn.fit takes two parameters\n", "# First, the content we want to train on. For us\n", "# it's height and weight.\n", "# Secondly, how we're classifying each element of the\n", "# training data. We're classifying by position!\n", "knn.fit(nba_training[[\"Ht (In.)\", \"WT\"]], nba_training[\"POS\"])\n", "knn.predict([76,220])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "array(['F'], dtype=object)" ] } ], "prompt_number": 39 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even though `k = 1` says he's a guard, `k = 3` says he'll be a forward. We then upped it to `k = 20`, which agrees that he'll be a forward, although *there are only twenty data points in our training set*, so that probably just means there are more forwards than anything else." ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn = sk.neighbors.KNeighborsClassifier(n_neighbors=20)\n", "knn.fit(nba_training[[\"Ht (In.)\", \"WT\"]], nba_training[\"POS\"])\n", "knn.predict([90,420])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "array(['F'], dtype=object)" ] } ], "prompt_number": 40 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yeah, someone who is 7'6\" and 420 lbs is probably going to be a center, not a forward. Looks wrong to me.\n", "\n", "**Note to self:** Pick your `n_neighbors` values carefully." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Normalizing your data\n", "\n", "We've actually had a big problem following us around for a while, but since you aren't an expert Problem Tracker you might not have noticed. It deals with how we're **computing distance**.\n", "\n", "Let's say we have Cool Mister Gerald, who is **200lbs and 7'6\"**. Is he more similar to **7'3\", 220lb** Bubbles McSlamdunk or **6'0\", 200lb** Speedy Runsalot? (that's 90 inches, 87 inches and 72 inches, respectively)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "bubbles_distance = numpy.sqrt((90 - 87) ** 2 + (200-220) ** 2)\n", "speedy_distance = numpy.sqrt((90 - 72) ** 2 + (200-200) ** 2)\n", "\n", "print \"%s units from Bubbles\" % bubbles_distance\n", "print \"%s units from Speedy\" % speedy_distance" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "20.2237484162 units from Bubbles\n", "18.0 units from Speedy\n" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So it looks like he should be assigned to the same group as Speedy. **But does that make *any* sense?** It seems like Cool Mister Gerald and Bubbles McSlamdunkwould have a lot more in common since they're both **really tall**, since even though Speedy is the same weight as Cool Mister he's also **really short** (for the NBA!).\n", "\n", "That, my friends, is our Big Problem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Going Unitless\n", "\n", "Right now, both height and weight are on equal footing. An inch of height difference puts you as far away from someone as a pound of weight difference, even though being a foot taller than someone means a **lot** more than being 12 pounds lighter.\n", "\n", "**We need fix this up if anyone is going to take us seriously.**\n", "\n", "The way we're going to do this is by figuring out **how far from average everyone is in standard deviations**. If you're way above-average tall, you'll have a good chance of being grouped with someone else who is way above-average tall, even if you aren't necessarily similar in other ways.\n", "\n", "Let's take a look." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# First, let's subtract the mean from everyone's height\n", "height_distance_from_mean = nba_df[\"Ht (In.)\"] - nba_df[\"Ht (In.)\"].mean()\n", "# ...and look at the first 5\n", "height_distance_from_mean[:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "0 -1.119318\n", "1 -0.119318\n", "2 -6.119318\n", "3 3.880682\n", "4 -0.119318\n", "Name: Ht (In.), dtype: float64" ] } ], "prompt_number": 66 }, { "cell_type": "markdown", "metadata": {}, "source": [ "By subtracting the mean, if you're above zero, you're above average. Below zero, below average. Now we need to divide this value by the standard deviation to see how meaningful each unit of distance actually is.\n", "\n", "**MAKE SURE YOU ARE DOING THIS IN YOUR ORIGINAL `nba_df` DATA. WHEN WE'RE PLAYING AROUND WITH THINGS LATER, WE'LL ADD MORE ELEMENTS INTO OUR TEST DATA AND WE DON'T WANT TO HAVE TO RECALCULATE!**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "adjusted_heights = height_distance_from_mean / nba_df[\"Ht (In.)\"].std()\n", "adjusted_heights[:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "0 -0.326190\n", "1 -0.034772\n", "2 -1.783284\n", "3 1.130904\n", "4 -0.034772\n", "Name: Ht (In.), dtype: float64" ] } ], "prompt_number": 67 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So player 2 is way below average in height, player 3 is above average, and the rest are middling-ish. Let's add this information into the dataframe!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "adjusted_weights = (nba_df[\"WT\"] - nba_df[\"WT\"].mean()) / nba_df[\"WT\"].std()\n", "\n", "# Need to put it into the original dataframe! \n", "nba_df[\"Adj Weight\"] = adjusted_weights\n", "nba_df[\"Adj Height\"] = adjusted_heights" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 84 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's take a look at our new adjusted columns\n", "nba_df[[\"Name\", \"WT\", \"Adj Weight\", \"Ht (In.)\", \"Adj Height\"]][:10]" ], "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameWTAdj WeightHt (In.)Adj Height
0 Gee, Alonzo 219-0.078962 78-0.326190
1 Wallace, Gerald 220-0.043175 79-0.034772
2 Williams, Mo 195-0.937848 73-1.783284
3 Gladness, Mickell 220-0.043175 83 1.130904
4 Jefferson, Richard 230 0.314694 79-0.034772
5 Hill, Solomon 220-0.043175 79-0.034772
6 Budinger, Chase 218-0.114749 79-0.034772
7 Williams, Derrick 241 0.708351 80 0.256647
8 Hill, Jordan 235 0.493629 82 0.839485
9 Frye, Channing 245 0.851498 83 1.130904
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 85, "text": [ " Name WT Adj Weight Ht (In.) Adj Height\n", "0 Gee, Alonzo 219 -0.078962 78 -0.326190\n", "1 Wallace, Gerald 220 -0.043175 79 -0.034772\n", "2 Williams, Mo 195 -0.937848 73 -1.783284\n", "3 Gladness, Mickell 220 -0.043175 83 1.130904\n", "4 Jefferson, Richard 230 0.314694 79 -0.034772\n", "5 Hill, Solomon 220 -0.043175 79 -0.034772\n", "6 Budinger, Chase 218 -0.114749 79 -0.034772\n", "7 Williams, Derrick 241 0.708351 80 0.256647\n", "8 Hill, Jordan 235 0.493629 82 0.839485\n", "9 Frye, Channing 245 0.851498 83 1.130904" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's take 20 and get a new set of training data, then map it\n", "adjusted_training = nba_df[:20]\n", "\n", "for position, marker, color in zip(['C','G','F'], \">xo\", \"cmy\"):\n", " # Get the players that play that given position\n", " players = adjusted_training[adjusted_training[\"POS\"] == position]\n", " # Add their points to the scatterplot\n", " plt.scatter(players[\"Adj Height\"], players[\"Adj Weight\"], c=color, marker=marker, alpha=0.5)\n", "plt.xlabel(\"Weight\")\n", "plt.ylabel(\"Height\")\n", "# Nearly everything is within 3 standard deviations, right? Let's look.\n", "pylab.ylim([-3,3])\n", "pylab.xlim([-3,3])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 251, "text": [ "(-3, 3)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n/gBgof8PV72fXIuvTG0AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 251 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's normalize our friend by subtracting the mean and dividing by the \n", "# standard deviation\n", "adj_height = (76 - nba_df[\"Ht (In.)\"].mean()) / nba_df[\"Ht (In.)\"].std() \n", "adj_weight = (220 - nba_df[\"WT\"].mean()) / nba_df[\"WT\"].std()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 228 }, { "cell_type": "code", "collapsed": false, "input": [ "# And try some predicting\n", "knn = KNeighborsClassifier(n_neighbors=1)\n", "knn.fit(adjusted_training[[\"Adj Height\", \"Adj Weight\"]], adjusted_training[\"POS\"])\n", "print knn.predict([adj_height, adj_weight])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['G']\n" ] } ], "prompt_number": 229 }, { "cell_type": "code", "collapsed": false, "input": [ "# With more neighbors...\n", "knn = KNeighborsClassifier(n_neighbors=3)\n", "knn.fit(adjusted_training[[\"Adj Height\", \"Adj Weight\"]], adjusted_training[\"POS\"])\n", "print knn.predict([adj_height, adj_weight])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['F']\n" ] } ], "prompt_number": 230 }, { "cell_type": "code", "collapsed": false, "input": [ "# And more neighbors...\n", "knn = KNeighborsClassifier(n_neighbors=5)\n", "knn.fit(adjusted_training[[\"Adj Height\", \"Adj Weight\"]], adjusted_training[\"POS\"])\n", "print knn.predict([adj_height, adj_weight])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['G']\n" ] } ], "prompt_number": 231 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Last time **5 neighbors** said he was a forward, so it's definitely changing things up!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Testing your results\n", "\n", "Now that we've got a predictor, how do we know if it's any good? We need some **testing data!**\n", "\n", "Testing data isn't **made-up people** whose positions we can guess about, it's data that we *already know the answers to*, so we can see if our results are right.\n", "\n", "This is why we were only using 20 members of the NBA as our **training data**. Now we can predict what the other members of the NBA should be, and compare our predictions to *what we know they actually are*." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Based on a single nearest neighbor\n", "knn = KNeighborsClassifier(n_neighbors=1)\n", "knn.fit(adjusted_training[[\"Adj Height\", \"Adj Weight\"]], adjusted_training[\"POS\"])\n", "\n", "# Take the training data out of our test data (we're using the first 20 to train)\n", "test_data = nba_df[20:]\n", "\n", "# Now predict for every single one of 'em\n", "predictions = knn.predict(test_data[[\"Adj Height\", \"Adj Weight\"]])\n", "\n", "# View a few of the predictions\n", "predictions[:10]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 232, "text": [ "array(['G', 'F', 'F', 'G', 'F', 'F', 'F/C', 'F/C', 'G', 'F/C'], dtype=object)" ] } ], "prompt_number": 232 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now let's see what predictions match the actual positions\n", "prediction_results = test_data[\"POS\"] == predictions\n", "# The first 10 will obviously match because I wasn't able\n", "# to get it out\n", "prediction_results[:10]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 234, "text": [ "20 True\n", "21 False\n", "22 False\n", "23 True\n", "24 True\n", "25 True\n", "26 False\n", "27 True\n", "28 True\n", "29 True\n", "Name: POS, dtype: bool" ] } ], "prompt_number": 234 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's look at the raw count of matches and non-matches\n", "print \"Number of matches is\"\n", "print len(prediction_results[prediction_results == True])\n", "print \"Number of wrong results is\"\n", "print len(prediction_results[prediction_results == False])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Number of matches is\n", "278\n", "Number of wrong results is\n", "230\n" ] } ], "prompt_number": 235 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Measuring accuracy with numbers\n", "\n", "This gets its own header because I was really excited when I learned about it. Right now we can say, okay, there were **278** matches and **230 non-matches**.\n", "\n", "That's roughly a 50% hit rate, so not terribly good. But what exactly is the hit rate? Well, we could divide **278 / 230**, but typing all of that out is going to make our fingers cramp.\n", "\n", "#### HOTTEST TIP YOU'LL EVER GET\n", "\n", "`False` is `0`. `True` is `1`. That means you can *just take the mean of `prediction_results`*" ] }, { "cell_type": "code", "collapsed": false, "input": [ "prediction_results.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 236, "text": [ "0.547244094488189" ] } ], "prompt_number": 236 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Increasing your k\n", "\n", "A 54% hit rate isn't so great. The higher, the better, so what can we do to improve? Let's start off by trying more neighbors." ] }, { "cell_type": "code", "collapsed": false, "input": [ "for k in [1, 2, 3, 5, 10, 20]:\n", " knn = KNeighborsClassifier(n_neighbors=k)\n", " knn.fit(adjusted_training[[\"Adj Height\", \"Adj Weight\"]], adjusted_training[\"POS\"])\n", "\n", " # Please figure out how to remove the training data from the test data.\n", " test_data = nba_df\n", " predictions = knn.predict(test_data[[\"Adj Height\", \"Adj Weight\"]])\n", " prediction_results = nba_df[\"POS\"] == predictions\n", " print \"With a k of %s we had a score of %s\" % (k, prediction_results.mean())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "With a k of 1 we had a score of 0.564393939394\n", "With a k of 2 we had a score of 0.613636363636\n", "With a k of 3 we had a score of 0.543560606061\n", "With a k of 5 we had a score of 0.560606060606\n", "With a k of 10 we had a score of 0.492424242424\n", "With a k of 20 we had a score of 0.268939393939\n" ] } ], "prompt_number": 237 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**The score actually starts to drop pretty quickly.** Since we have a really small set of training data (only twenty players), as we add more neighbors we're reaching **further and further away**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Increasing your training data set\n", "\n", "With a max of 61%, it's still a pretty rough score. We can increase the amount of training data we have, though, instead of just increasing the number of neighbors. Let's compare twenty to fifty, one hundred and two hundred fifty" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for training_data_size in [20, 50, 100, 250, 450]:\n", " test_data_size = len(nba_df) - training_data_size\n", " print \"== Training data size: %s, Test data size: %s\" % (training_data_size, test_data_size)\n", " larger_training_data = nba_df[:training_data_size]\n", " for k in [1, 2, 3, 5, 10, 20]:\n", " knn = KNeighborsClassifier(n_neighbors=k)\n", " knn.fit(larger_training_data[[\"Adj Height\", \"Adj Weight\"]], larger_training_data[\"POS\"])\n", "\n", " test_data = nba_df[training_data_size:]\n", " predictions = knn.predict(test_data[[\"Adj Height\", \"Adj Weight\"]])\n", " prediction_results = test_data[\"POS\"] == predictions\n", " print \"With a k of %s we had a score of %s\" % (k, prediction_results.mean())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "== Training data size: 20, Test data size: 508\n", "With a k of 1 we had a score of 0.547244094488\n", "With a k of 2 we had a score of 0.600393700787\n", "With a k of 3 we had a score of 0.531496062992\n", "With a k of 5 we had a score of 0.555118110236\n", "With a k of 10 we had a score of 0.490157480315\n", "With a k of 20 we had a score of 0.267716535433\n", "== Training data size: 50, Test data size: 478\n", "With a k of 1 we had a score of 0.627615062762\n", "With a k of 2 we had a score of 0.627615062762\n", "With a k of 3 we had a score of 0.60460251046\n", "With a k of 5 we had a score of 0.673640167364\n", "With a k of 10 we had a score of 0.654811715481" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "With a k of 20 we had a score of 0.558577405858\n", "== Training data size: 100, Test data size: 428\n", "With a k of 1 we had a score of 0.635514018692\n", "With a k of 2 we had a score of 0.668224299065\n", "With a k of 3 we had a score of 0.644859813084\n", "With a k of 5 we had a score of 0.63785046729\n", "With a k of 10 we had a score of 0.651869158879\n", "With a k of 20 we had a score of 0.607476635514\n", "== Training data size: 250, Test data size: 278\n", "With a k of 1 we had a score of 0.654676258993\n", "With a k of 2 we had a score of 0.687050359712\n", "With a k of 3 we had a score of 0.687050359712\n", "With a k of 5 we had a score of 0.679856115108\n", "With a k of 10 we had a score of 0.694244604317" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "With a k of 20 we had a score of 0.697841726619\n", "== Training data size: 450, Test data size: 78\n", "With a k of 1 we had a score of 0.730769230769\n", "With a k of 2 we had a score of 0.74358974359\n", "With a k of 3 we had a score of 0.769230769231\n", "With a k of 5 we had a score of 0.782051282051\n", "With a k of 10 we had a score of 0.807692307692\n", "With a k of 20 we had a score of 0.807692307692\n" ] } ], "prompt_number": 242 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The more training the better, it seems! And once we get a ton of data, having a large value for `k` doesn't seem to be as bad any more." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cross-valiation\n", "\n", "The concept of hiding some of your training data to use as test data is called **cross validation**. The problem we're seeing, though, is that **while more training data is better for your model, you're going to need something to test it against**.\n", "\n", "#### K-Folds Cross Validation\n", "\n", "One way to use your data for training *and* testing is called **k-folds cross-validation.**\n", "\n", "Let's say we have 500 pieces of data, and we want to test using 5 folds. First, you break your data up into **five equal sets**. Then you run your model (nearest neighbors, in this case) five times, each time leaving out one of your sets to later test with\n", "\n", " Run 1: Test with 1, Train with 2, 3, 4, 5\n", " Run 2: Test with 2, Train with 1, 3, 4, 5\n", " Run 3: Test with 3, Train with 1, 2, 4, 5\n", " Run 4: Test with 4, Train with 1, 2, 3, 5\n", " Run 5: Test with 5, Train with 1, 2, 3, 4\n", "\n", "When you're done, average the results and you've got yourself a pretty good idea of how good your model is at predicting!\n", "\n", "http://scikit-learn.org/0.11/modules/neighbors.html" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }