{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "remove_input" ] }, "outputs": [], "source": [ "path_data = '../../data/'\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import math\n", "import scipy.stats as stats\n", "\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D\n", "plt.style.use('fivethirtyeight')\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "remove_input" ] }, "outputs": [], "source": [ "def standard_units(x):\n", " return (x - np.mean(x))/np.std(x)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Rows of Tables\n", "Now that we have a qualitative understanding of nearest neighbor classification, it's time to implement our classifier.\n", "\n", "Until this chapter, we have worked mostly with single columns of tables. But now we have to see whether one *individual* is \"close\" to another. Data for individuals are contained in *rows* of tables.\n", "\n", "So let's start by taking a closer look at rows." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is the original table `ckd` containing data on patients who were tested for chronic kidney disease." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/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", " \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", "
AgeBlood PressureSpecific GravityAlbuminSugarRed Blood CellsPus CellPus Cell clumpsBacteriaGlucose...Packed Cell VolumeWhite Blood Cell CountRed Blood Cell CountHypertensionDiabetes MellitusCoronary Artery DiseaseAppetitePedal EdemaAnemiaClass
048701.00540normalabnormalpresentnotpresent117...3267003.9yesnonopooryesyes1
153901.02020abnormalabnormalpresentnotpresent70...29121003.7yesyesnopoornoyes1
263701.01030abnormalabnormalpresentnotpresent380...3245003.8yesyesnopooryesno1
368801.01032normalabnormalpresentpresent157...16110002.6yesyesyespooryesno1
461801.01520abnormalabnormalnotpresentnotpresent173...2492003.2yesyesyespooryesyes1
\n", "

5 rows × 25 columns

\n", "
" ], "text/plain": [ " Age Blood Pressure Specific Gravity Albumin Sugar Red Blood Cells \\\n", "0 48 70 1.005 4 0 normal \n", "1 53 90 1.020 2 0 abnormal \n", "2 63 70 1.010 3 0 abnormal \n", "3 68 80 1.010 3 2 normal \n", "4 61 80 1.015 2 0 abnormal \n", "\n", " Pus Cell Pus Cell clumps Bacteria Glucose ... Packed Cell Volume \\\n", "0 abnormal present notpresent 117 ... 32 \n", "1 abnormal present notpresent 70 ... 29 \n", "2 abnormal present notpresent 380 ... 32 \n", "3 abnormal present present 157 ... 16 \n", "4 abnormal notpresent notpresent 173 ... 24 \n", "\n", " White Blood Cell Count Red Blood Cell Count Hypertension \\\n", "0 6700 3.9 yes \n", "1 12100 3.7 yes \n", "2 4500 3.8 yes \n", "3 11000 2.6 yes \n", "4 9200 3.2 yes \n", "\n", " Diabetes Mellitus Coronary Artery Disease Appetite Pedal Edema Anemia \\\n", "0 no no poor yes yes \n", "1 yes no poor no yes \n", "2 yes no poor yes no \n", "3 yes yes poor yes no \n", "4 yes yes poor yes yes \n", "\n", " Class \n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "4 1 \n", "\n", "[5 rows x 25 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd = pd.read_csv(path_data + 'ckd.csv').rename(columns={'Blood Glucose Random': 'Glucose'})\n", "ckd.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data corresponding to the first patient is in row 0 of the table, consistent with Python's indexing system. The Table method `row` accesses the row by taking the index of the row as its argument:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Age 48\n", "Blood Pressure 70\n", "Specific Gravity 1.005\n", "Albumin 4\n", "Sugar 0\n", "Red Blood Cells normal\n", "Pus Cell abnormal\n", "Pus Cell clumps present\n", "Bacteria notpresent\n", "Glucose 117\n", "Blood Urea 56\n", "Serum Creatinine 3.8\n", "Sodium 111\n", "Potassium 2.5\n", "Hemoglobin 11.2\n", "Packed Cell Volume 32\n", "White Blood Cell Count 6700\n", "Red Blood Cell Count 3.9\n", "Hypertension yes\n", "Diabetes Mellitus no\n", "Coronary Artery Disease no\n", "Appetite poor\n", "Pedal Edema yes\n", "Anemia yes\n", "Class 1\n", "Name: 0, dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd.iloc[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Or, as an array" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([48, 70, 1.005, 4, 0, 'normal', 'abnormal', 'present', 'notpresent',\n", " 117, 56, 3.8, 111, 2.5, 11.2, 32, 6700, 3.9, 'yes', 'no', 'no',\n", " 'poor', 'yes', 'yes', 1], dtype=object)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(ckd.loc[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rows have their very own data type: they are *row objects*. Notice how when using the pandas `df.loc[row]` the display shows not only the values in the row but also the labels of the corresponding columns.\n", "\n", "Rows are in general **not arrays**, as their elements can be of different types. For example, some of the elements of the row above are strings (like `'abnormal'`) and some are numerical.\n", "\n", "However, rows share some characteristics with arrays. You can use `.iloc[row:column]` to access a particular element of a row. For example, to access the Albumin level of Patient 0, we can look at the labels in the printout of the row above to find that it's the column 'Albumin' is column index 3 i.e. `.iloc[row_number,3:`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd.iloc[0,3]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(ckd['Class'].iloc[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Converting Rows to Arrays (When Possible)\n", "Rows whose elements are all numerical (or all strings) can be converted to arrays. Converting a row to an array gives us access to arithmetic operations and other nice NumPy functions, so it is often useful.\n", "\n", "Recall that in the previous section we tried to classify the patients as 'CKD' or 'not CKD', based on two attributes `Hemoglobin` and `Glucose`, both measured in standard units. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/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", "
HemoglobinGlucoseClassColor
0-0.865744-0.2215491darkblue
1-1.457446-0.9475971darkblue
2-1.0049683.8412311darkblue
3-2.8148790.3963641darkblue
4-2.0839540.6435291darkblue
...............
1530.7005260.1337510gold
1540.978974-0.8703580gold
1550.735332-0.4841620gold
1560.178436-0.2678930gold
1570.735332-0.0052800gold
\n", "

158 rows × 4 columns

\n", "
" ], "text/plain": [ " Hemoglobin Glucose Class Color\n", "0 -0.865744 -0.221549 1 darkblue\n", "1 -1.457446 -0.947597 1 darkblue\n", "2 -1.004968 3.841231 1 darkblue\n", "3 -2.814879 0.396364 1 darkblue\n", "4 -2.083954 0.643529 1 darkblue\n", ".. ... ... ... ...\n", "153 0.700526 0.133751 0 gold\n", "154 0.978974 -0.870358 0 gold\n", "155 0.735332 -0.484162 0 gold\n", "156 0.178436 -0.267893 0 gold\n", "157 0.735332 -0.005280 0 gold\n", "\n", "[158 rows x 4 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd = pd.DataFrame(\n", " {'Hemoglobin':standard_units(ckd['Hemoglobin']),\n", " 'Glucose':standard_units(ckd['Glucose']), \n", " 'Class':ckd['Class']}\n", ")\n", "\n", "color_table = pd.DataFrame(\n", " {'Class':np.array([1, 0]),\n", " 'Color':np.array(['darkblue', 'gold'])}\n", ")\n", "\n", "ckd = pd.merge(ckd, color_table, on='Class')\n", "\n", "ckd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a scatter plot of the two attributes, along with a red point corresponding to Alice, a new patient. Her value of hemoglobin is 0 (that is, at the average) and glucose 1.1 (that is, 1.1 SDs above average)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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dnY2YmJipC5DEq767q763gDf3VXf3R5u3bqFFi1aSF0GuTBTvwfZokZEREQkUwxqRERERDLFoEZEREQkUwxqRERERDLFoEZEREQkUwxqRERERDLFoEZEREQkUwxqRERERDLFoEZEREQkUwxqRERELi41NdXktknOQKVSYffu3SbPFxYWQqVS1bthvBwxqBERETm5a9euYdGiRejRowfuvvtudOrUCRMmTMCXX34pdWnUSO5SF0BEREQNp1ar8eCDD8LPzw/Lli1D165dodPpcPjwYcyfPx9nzpxxSB1VVVXw8PBwyLNcCVvUiIiInNiCBQsgCAIOHjyIcePGISYmBh06dMDMmTNx9OhRAMDly5cxZcoUhIaGIjQ0FFOnTsXVq1fN3vfvf/87evbsiYCAAPTs2RNbt241OK9SqbBx40ZMnToVwcHBWL58eYPqX7t2LWJiYhASEoJZs2Zh1apV6Natm/68TqfDmjVr0KVLF9x9993o378/9u3bZ/aep06dwuDBg9GmTRsMHDgQWVlZDapNDhjUiIiIbEShUcP7ZhJ8r8fD+2YSFBq1XZ938+ZNfPXVV0hKSoKfn5/ReZVKBUEQMGXKFBQUFCA9PR179uxBXl4epkyZAkEQRO+7Z88eLFy4EHPmzMHx48cxe/ZsPP/888jIyDC4bvXq1RgxYgSOHTuGGTNmAABCQkLM/jNhwgT95//1r39h9erVWLp0KQ4fPowOHTpg/fr1Bs9477338Le//Q0vv/wyjh07hlGjRuGxxx7DTz/9JFp7WVkZJk6ciMjISBw8eBAvv/wyli5datX3Kifs+iQiIrIBhUYN3xsJcNPmVB+4A7jdyUJZqzQI7hF2eebFixchCALat29v8ppDhw7hzJkzOH36NCIiquvYtGkTevbsicOHD2PIkCFGn1m3bh0mTZqEmTNnAgDatWuHH374AW+//TZGjhypv27cuHF4/PHHDT5b34B9Ly8v/b+///77ePTRR/X3mD9/Po4cOYLz588b1DJv3jwkJiYCAF588UUcO3YM69atwwcffGB0/x07dqCqqgrvvvsu/Pz80LlzZzz//POYNWuW2brkymla1FauXAmVSmXwj7nfmERERI7kVZLyR0j7nZs2B14lKXZ7pqkWsdrOnTuHoKAgfUgDgMjISAQFBeHs2bMmP9OnTx+DY/369TO6vmfPnkaf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QE5OMQDg++9vISurAGlpIxnWiIiaEKcOavv27ZO6BCJJpKRk6UNajZyc6ha2jRuHSVQVERHZmtOto0ZEQG5uuejxvDzx40RE5JwY1IicUFCQj+jxwEDx40RE5JwY1IicUHJyLKKiDMeiRUX5Izk5VqKKiIjIHhjUiJxQRIQ/0tJGIjExGr16qZCYGM2JBERETZBTTyYgcmUREf7YuHEYV6gnImrC2KJGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFNOE9Q2btyI/v37IywsDGFhYfjTn/6EL774QuqyiIiIiOzGaYJacHAwXnnlFRw+fBgHDx7EoEGDMGXKFJw5c0bq0oiIiIjswl3qAiw1atQog5+XLl2KDz/8ECdPnkTXrl0lqoqIiIjIfpwmqNWm1WqRlpaGsrIy3HfffVKXQ0RERGQXThXU/vOf/2DEiBGoqKiAr68vPv74Y3Tp0kXqsoiIiIjsQlFUVCRIXYSlqqqqcOXKFdy6dQvp6enYunUr9u7di86dO4ten52d7eAKiYjIXmJiYqQugcjhnCqo1TV27FiEhYVh3bp1UpciG9nZ2S77HzNXfXdXfW+A7+6q707kSpxm1qcYnU6HqqoqqcsgIiIisgunGaP28ssvY8SIEQgJCUFpaSl27tyJo0ePYvv27VKXRkRERGQXThPU8vPzMXPmTFy7dg3+/v7o0qULdu7cieHDh0tdGhEREZFdOE1Qe++996QugYiIiMihnHqMGhEREVFTxqBGREREJFMMakREREQyxaBGREREJFMMakREREQyxaBGREREJFMNXp5Dq9Xi1q1b8Pf3h7u706zyQeQU1OpipKRkITe3HEFBPkhOjkVEhL/UZRERkYNZ3aJ26tQpJCQkIDg4GDExMfj2228BAIWFhZg4cSIOHz5s8yKJXIlaXYyEhAzs2HEBR4/mYseOC0hIyIBaXSx1aURE5GBWBbXv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vx8isi1FUVGR+JQhB0hJScEbb7xh9po9e/Zg4MCB+p9Pnz6NoUOHWjSZIDs72+x5Ilu6evU23n8/BwUFVQgI8MDs2VEICfFu8HVkmofiKkI83kczRQHuCAG4WjUbVUKI1GXJRlP9fmJiYqQugcjhJA1qhYWFKCwsNHtNaGgofHz+6BayJqi5ouzsbJf9j5mrvrurvjfAd3fVdydyJZKOUWvdujVat24tZQlEREREsuU0kwny8/ORn5+P8+fPAwDOnTuHW7duISwsDC1btpS4OiIiIiLbc5rJBJs3b8agQYOQlJQEAJg4cSIGDRqE/fv3S1wZERERkX04TYvakiVLsGTJEqnLICIiInIYp2lRIyIiInI1DGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTDGpEREREMsWgRkRERCRTThHUbt68iYULF6J3794IDAxEly5dMH/+fNy4cUPq0oiIiIjsximCWm5uLnJzc/HKK6/g2LFj2LBhA44dO4annnpK6tKIiIiI7MZd6gIs0blzZ3z88cf6n9u2bYvly5dj0qRJKC4uhr+/v4TVEREREdmHU7SoiSkpKYGnpyd8fHykLkVWYmJipC5BMq767q763gDfnYiaPqcMakVFRXj11Vfx+OOPw93dKRoFiYiIiKwmaVBLSUmBSqUy+8+RI0cMPlNWVobJkycjKCgIy5cvl6hyIiIiIvtTFBUVCVI9vLCwEIWFhWavCQ0N1XdvlpaWIjExEQCwY8cO+Pn52b1GIiIiIqlIGtSsUVJSgsTERAiCgJ07d6J58+ZSl0RERERkV04xwKukpAQPP/wwSkpKkJqaivLycpSXlwMAWrZsCQ8PD4krJCIiIrI9p5hM8MMPP+DkyZM4e/YsevXqhQ4dOuj/OXHiRL2fFwQB48ePh0qlwu7dux1QsfT+/Oc/o0eP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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "alice = np.array([0, 1.1])\n", "\n", "ckd_darkblue = ckd[ckd['Color'] == 'darkblue']\n", "ckd_gold = ckd[ckd['Color'] == 'gold']\n", "\n", "\n", "fig, ax = plt.subplots(figsize=(6,6))\n", "\n", "ax.scatter(ckd_darkblue['Hemoglobin'], \n", " ckd_darkblue['Glucose'], \n", " label='Color=darkblue', \n", " color='darkblue')\n", "\n", "ax.scatter(ckd_gold['Hemoglobin'], \n", " ckd_gold['Glucose'], \n", " label='Color=gold', \n", " color='gold')\n", "\n", "ax.scatter(alice[0], \n", " alice[1], \n", " color='red', \n", " s=30)\n", "\n", "x_label = 'White Blood Cell Count'\n", "\n", "y_label = 'Glucose'\n", "\n", "y_vals = ax.get_yticks()\n", "\n", "plt.ylabel(y_label)\n", "\n", "ax.legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", "\n", "plt.xlabel(x_label)\n", "\n", "plt.xlim(-4, 2)\n", "plt.ylim(-2, 6);\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To find the distance between Alice's point and any of the other points, we only need the values of the attributes:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "ckd_attributes = ckd[['Hemoglobin', 'Glucose']]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/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", "
HemoglobinGlucose
0-0.865744-0.221549
1-1.457446-0.947597
2-1.0049683.841231
3-2.8148790.396364
4-2.0839540.643529
.........
1530.7005260.133751
1540.978974-0.870358
1550.735332-0.484162
1560.178436-0.267893
1570.735332-0.005280
\n", "

158 rows × 2 columns

\n", "
" ], "text/plain": [ " Hemoglobin Glucose\n", "0 -0.865744 -0.221549\n", "1 -1.457446 -0.947597\n", "2 -1.004968 3.841231\n", "3 -2.814879 0.396364\n", "4 -2.083954 0.643529\n", ".. ... ...\n", "153 0.700526 0.133751\n", "154 0.978974 -0.870358\n", "155 0.735332 -0.484162\n", "156 0.178436 -0.267893\n", "157 0.735332 -0.005280\n", "\n", "[158 rows x 2 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd_attributes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each row consists of the coordinates of one point in our training sample. **Because the rows now consist only of numerical values**, it is possible to convert them to arrays. For this, we use the function `np.array`, which converts any kind of sequential object, like a row, to an array. (Our old friend `make_array` is for *creating* arrays, not for *converting* other kinds of sequences to arrays.)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hemoglobin -2.814879\n", "Glucose 0.396364\n", "Name: 3, dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd_attributes.iloc[3]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-2.81487943, 0.39636401])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(ckd_attributes.iloc[3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is very handy because we can now use array operations on the data in each row." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Distance Between Points When There are Two Attributes\n", "The main calculation we need to do is to find the distance between Alice's point and any other point. For this, the first thing we need is a way to compute the distance between any pair of points. \n", "\n", "How do we do this? In 2-dimensional space, it's pretty easy. If we have a point at coordinates $(x_0,y_0)$ and another at $(x_1,y_1)$, the distance between them is\n", "\n", "$$\n", "D = \\sqrt{(x_0-x_1)^2 + (y_0-y_1)^2}\n", "$$\n", "\n", "(Where did this come from? It comes from the Pythogorean theorem: we have a right triangle with side lengths $x_0-x_1$ and $y_0-y_1$, and we want to find the length of the hypotenuse.)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next section we'll see that this formula has a straightforward extension when there are more than two attributes. For now, let's use the formula and array operations to find the distance between Alice and the patient in Row 3." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0. , 1.1]), array([-2.81487943, 0.39636401]))" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "patient3 = np.array(ckd_attributes.iloc[3])\n", "alice, patient3" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.9014909651272616" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distance = np.sqrt(np.sum((alice - patient3)**2))\n", "distance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're going to need the distance between Alice and a bunch of points, so let's write a function called `distance` that computes the distance between any pair of points. The function will take two arrays, each containing the $(x, y)$ coordinates of a point. (Remember, those are really the Hemoglobin and Glucose levels of a patient.)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def distance(point1, point2):\n", " \"\"\"Returns the Euclidean distance between point1 and point2.\n", " \n", " Each argument is an array containing the coordinates of a point.\"\"\"\n", " return np.sqrt(np.sum((point1 - point2)**2))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.9014909651272616" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distance(alice, patient3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have begun to build our classifier: the `distance` function is the first building block. Now let's work on the next piece." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Using `apply` on an Entire Row\n", "Recall that if you want to apply a function to each element of a column of a table, one way to do that is by the call `table_name.apply(function_name, column_label)`. This evaluates to an array consisting of the values of the function when we call it on each element of the column. So each entry of the array is based on the corresponding row of the table.\n", "\n", "If you use `apply` without specifying a column label, then the entire row is passed to the function. Let's see how this works on a very small table `t` containing the information about the first five patients in the training sample." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/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", "
HemoglobinGlucose
0-0.865744-0.221549
1-1.457446-0.947597
2-1.0049683.841231
3-2.8148790.396364
4-2.0839540.643529
\n", "
" ], "text/plain": [ " Hemoglobin Glucose\n", "0 -0.865744 -0.221549\n", "1 -1.457446 -0.947597\n", "2 -1.004968 3.841231\n", "3 -2.814879 0.396364\n", "4 -2.083954 0.643529" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = ckd_attributes.take(np.arange(5))\n", "t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just as an example, suppose that for each patient we want to know how unusual their most unusual attribute is. Concretely, if a patient's hemoglobin level is further from the average than her glucose level, we want to know how far it is from the average. If her glucose level is further from the average than her hemoglobin level, we want to know how far that is from the average instead.\n", "\n", "That's the same as taking the maximum of the absolute values of the two quantities. To do this for a particular row, we can convert the row to an array and use array operations." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def max_abs(row):\n", " return np.max(np.abs(np.array(row)))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8657439478031919" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max_abs(t.iloc[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we can apply `max_abs` to each row of the table `t`:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.865744\n", "1 1.457446\n", "2 3.841231\n", "3 2.814879\n", "4 2.083954\n", "dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.apply(max_abs, axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This way of using `apply` will help us create the next building block of our classifier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Alice's $k$ Nearest Neighbors\n", "If we want to classify Alice using a k-nearest neighbor classifier, we have to identify her $k$ nearest neighbors. What are the steps in this process? Suppose $k = 5$. Then the steps are:\n", "- **Step 1.** Find the distance between Alice and each point in the training sample.\n", "- **Step 2.** Sort the data table in increasing order of the distances.\n", "- **Step 3.** Take the top 5 rows of the sorted table.\n", "\n", "Steps 2 and 3 seem straightforward, provided we have the distances. So let's focus on Step 1.\n", "\n", "Here's Alice:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0. , 1.1])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What we need is a function that finds the distance between Alice and another point whose coordinates are contained in a row. The function `distance` returns the distance between any two points whose coordinates are in arrays. We can use that to define `distance_from_alice`, which takes a row as its argument and returns the distance between that row and Alice." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def distance_from_alice(row):\n", " \"\"\"Returns distance between Alice and a row of the attributes table\"\"\"\n", " return distance(alice, np.array([row]))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.9014909651272616" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distance_from_alice(ckd_attributes.iloc[3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can `apply` the function `distance_from_alice` to each row of `ckd_attributes`, and augment the table `ckd` with the distances. Step 1 is complete!" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "distances = ckd_attributes.apply(distance_from_alice, axis=1)\n", "ckd_with_distances = ckd.copy()\n", "ckd_with_distances['Distance from Alice'] = distances" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
HemoglobinGlucoseClassColorDistance from Alice
0-0.865744-0.2215491darkblue1.579875
1-1.457446-0.9475971darkblue2.513325
2-1.0049683.8412311darkblue2.919641
3-2.8148790.3963641darkblue2.901491
4-2.0839540.6435291darkblue2.133361
..................
1530.7005260.1337510gold1.193471
1540.978974-0.8703580gold2.200159
1550.735332-0.4841620gold1.746506
1560.178436-0.2678930gold1.379482
1570.735332-0.0052800gold1.327537
\n", "

158 rows × 5 columns

\n", "
" ], "text/plain": [ " Hemoglobin Glucose Class Color Distance from Alice\n", "0 -0.865744 -0.221549 1 darkblue 1.579875\n", "1 -1.457446 -0.947597 1 darkblue 2.513325\n", "2 -1.004968 3.841231 1 darkblue 2.919641\n", "3 -2.814879 0.396364 1 darkblue 2.901491\n", "4 -2.083954 0.643529 1 darkblue 2.133361\n", ".. ... ... ... ... ...\n", "153 0.700526 0.133751 0 gold 1.193471\n", "154 0.978974 -0.870358 0 gold 2.200159\n", "155 0.735332 -0.484162 0 gold 1.746506\n", "156 0.178436 -0.267893 0 gold 1.379482\n", "157 0.735332 -0.005280 0 gold 1.327537\n", "\n", "[158 rows x 5 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ckd_with_distances" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For Step 2, let's sort the table in increasing order of distance:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
HemoglobinGlucoseClassColorDistance from Alice
140.8397501.2150991darkblue0.847601
35-0.9701621.2768901darkblue0.986156
84-0.0304000.0874070gold1.013049
1520.1436300.0874070gold1.022728
6-0.4132662.0492821darkblue1.035338
..................
2-1.0049683.8412311darkblue2.919641
12-2.292790-0.8549101darkblue3.013065
41-0.3784604.5209351darkblue3.441806
42-3.6850290.6898731darkblue3.707782
36-0.7613265.5404921darkblue4.505285
\n", "

158 rows × 5 columns

\n", "
" ], "text/plain": [ " Hemoglobin Glucose Class Color Distance from Alice\n", "14 0.839750 1.215099 1 darkblue 0.847601\n", "35 -0.970162 1.276890 1 darkblue 0.986156\n", "84 -0.030400 0.087407 0 gold 1.013049\n", "152 0.143630 0.087407 0 gold 1.022728\n", "6 -0.413266 2.049282 1 darkblue 1.035338\n", ".. ... ... ... ... ...\n", "2 -1.004968 3.841231 1 darkblue 2.919641\n", "12 -2.292790 -0.854910 1 darkblue 3.013065\n", "41 -0.378460 4.520935 1 darkblue 3.441806\n", "42 -3.685029 0.689873 1 darkblue 3.707782\n", "36 -0.761326 5.540492 1 darkblue 4.505285\n", "\n", "[158 rows x 5 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted_by_distance = ckd_with_distances.sort_values(by=['Distance from Alice'])\n", "sorted_by_distance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Step 3: The top 5 rows correspond to Alice's 5 nearest neighbors; you can replace 5 by any other positive integer." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/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", "
HemoglobinGlucoseClassColorDistance from Alice
140.8397501.2150991darkblue0.847601
35-0.9701621.2768901darkblue0.986156
84-0.0304000.0874070gold1.013049
1520.1436300.0874070gold1.022728
6-0.4132662.0492821darkblue1.035338
\n", "
" ], "text/plain": [ " Hemoglobin Glucose Class Color Distance from Alice\n", "14 0.839750 1.215099 1 darkblue 0.847601\n", "35 -0.970162 1.276890 1 darkblue 0.986156\n", "84 -0.030400 0.087407 0 gold 1.013049\n", "152 0.143630 0.087407 0 gold 1.022728\n", "6 -0.413266 2.049282 1 darkblue 1.035338" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alice_5_nearest_neighbors = sorted_by_distance.take(np.arange(5))\n", "alice_5_nearest_neighbors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Three of Alice's five nearest neighbors are blue points and two are gold. So a 5-nearest neighbor classifier would classify Alice as blue: it would predict that Alice has chronic kidney disease.\n", "\n", "The graph below zooms in on Alice and her five nearest neighbors. The two gold ones just inside the circle directly below the red point. The classifier says Alice is more like the three blue ones around her." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "radius = sorted_by_distance['Distance from Alice'].iloc[4]+0.014\n", "theta = np.arange(0, 2*np.pi+1, 2*np.pi/200)\n", "\n", "alice = np.array([0, 1.1])\n", "\n", "ckd_darkblue = ckd[ckd['Color'] == 'darkblue']\n", "ckd_gold = ckd[ckd['Color'] == 'gold']\n", "\n", "fig, ax = plt.subplots(figsize=(8,8))\n", "\n", "ax.scatter(ckd_darkblue['Hemoglobin'], \n", " ckd_darkblue['Glucose'], \n", " color='darkblue')\n", "\n", "ax.scatter(ckd_gold['Hemoglobin'], \n", " ckd_gold['Glucose'], \n", " color='gold')\n", "\n", "ax.scatter(alice[0], \n", " alice[1], \n", " color='red', \n", " s=30)\n", "\n", "ax.plot(radius*np.cos(theta)+alice.item(0), radius*np.sin(theta)+alice.item(1), color='g', lw=1.5, zorder=10);\n", "\n", "plt.xlim(-2, 2.5)\n", "plt.ylim(-2, 2.5);\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are well on our way to implementing our k-nearest neighbor classifier. In the next two sections we will put it together and assess its accuracy." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }