{ "metadata": { "name": "", "signature": "sha256:c61313eece6d4d7d38eceb6c6d68968ed8093cdcd6168a64c5d5e7b379b6dd7c" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# K-nearest neighbors and scikit-learn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Agenda\n", "\n", "- **K-nearest neighbors (KNN)**\n", " - Review of the iris dataset\n", " - Human learning on the iris dataset\n", " - KNN classification\n", " - Review of supervised learning\n", "- **scikit-learn**\n", " - Requirements for working with data in scikit-learn\n", " - scikit-learn's 4-step modeling pattern\n", " - Tuning a KNN model\n", " - Comparing KNN with other models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Review of the iris dataset" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# read the iris data into a DataFrame\n", "import pandas as pd\n", "col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']\n", "iris = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None, names=col_names)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "iris.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ " sepal_length sepal_width petal_length petal_width species\n", "0 5.1 3.5 1.4 0.2 Iris-setosa\n", "1 4.9 3.0 1.4 0.2 Iris-setosa\n", "2 4.7 3.2 1.3 0.2 Iris-setosa\n", "3 4.6 3.1 1.5 0.2 Iris-setosa\n", "4 5.0 3.6 1.4 0.2 Iris-setosa" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Terminology\n", "\n", "- **150 observations** (n=150): each observation is one iris flower\n", "- **4 features** (p=4): sepal length, sepal width, petal length, and petal width\n", "- **Response**: iris species\n", "- **Classification problem** since response is categorical" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Human learning on the iris dataset\n", "\n", "How did we (as humans) predict the species for iris flowers?\n", "\n", "1. We looked for features that seemed to correlate with the response.\n", "2. We created a set of rules (using those features) to predict the species of an unknown iris.\n", "\n", "More generally:\n", "\n", "1. We observed that the different species had (somewhat) dissimilar measurements.\n", "2. We predicted the species for an unknown iris by:\n", " - Looking for irises in the data with similar measurements\n", " - Assuming that our unknown iris is the same species as those similar irises" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# allow plots to appear in the notebook\n", "%matplotlib inline\n", "\n", "# create a custom colormap\n", "from matplotlib.colors import ListedColormap\n", "cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])\n", "\n", "# 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": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# create a scatter plot of PETAL LENGTH versus PETAL WIDTH and color by SPECIES\n", "iris.plot(kind='scatter', x='petal_length', y='petal_width', c='species_num', colormap=cmap_bold)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nkbQZ+CawcQaRpsXNwMysirqyjwl7bi0ZApaVHC+j+O7gJtmk8QtAd0T8u4oRK/IwkZlZfd12sa2k\nB4CXga9GxEA9QvmdgZlZHU1nsS3wQ2A+8LwkgLGIWFfLXF50ZmazihedVeZhIjMzczMwMzM3AzMz\nw83AzMxwMzAzM9wMzMwMNwMzM8PNwMzMcDMwMzPcDMzMDDcDMzPDzcDMzHAzMDMzcmwGkj4iqU/S\nWUmvSmqepG5Q0puSXpd0vN45zcyqTVK3pDOSzknaMUnNs9n5NyQ9VOtMeb4z+D7QFxEPAn/OjisJ\noCsiHqr1ft4zVSgU8o6QRAZII0cKGSCNHClkgHRy5ElSA/Ac0A10AtskdZTV9ADLI6Id+A7wfK1z\n5dkMHgFeyh6/BGyZojb5vcAhjR/0FDJAGjlSyABp5EghA6STI2frgIGIGIyIMeAg8GhZzY3fjxFx\nDGiWtLCWofJsBgsj4lL2+BIw2QsN4E+STkj6dn2i3ZnBwcG8IySRAdLIkUIGSCNHChkgnRw5WwL8\ns+T4Qva129UsrWWomt72UlIf0FLh1DOlBxERkia7cdDGiLgo6aNAn6QzEfFatbNWQwo/6ClkgDRy\npJAB0siRQgZIJ0fOPshN0u7keXekps0gIh6e7JykS5JaImJY0iJgZJLvcTH7fFnSIYpvsW5pBtl9\nQnOXQo4UMkAaOVLIAGnkSCEDpJNjpmbwKoaAZSXHyyj+5T9VzdLsazVT02ZwG73AN4CfZp9/X14g\n6UNAQ0T8V9L9wGeBPeV1d8P9Rc3s3jHD3zkngHZJrcC/gMeAbWU1vcB24KCkDcDbJcPqNZFnM/gJ\n8DtJTwKDwJcAJC0GXoiIz1McYno5+0tiDvCbiHg1n7hmZjMXEeOStgN/BBqAFyOiX9J3s/O/iojD\nknokDQDXgCdqnUsRNR2GMjOzu4BXIJuZmZuBmZm5GZiZGW4GZmaGm4GZmeFmYGZmuBmYmRluBmZm\nBvwfGNW+33k0EwEAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# create a scatter plot of SEPAL LENGTH versus SEPAL WIDTH and color by SPECIES\n", "iris.plot(kind='scatter', x='sepal_length', y='sepal_width', c='species_num', colormap=cmap_bold)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nWPnExES25OUVJsfIAtbl5dG2bVs24ZY1BNiBG79RVuERS/mIi0sElgbXRHT00nK/L2jRogXumV4f\nbMmDgtU0adKkWPm2bdviFpPce9YzgY129qvloJA0NPh/C0mp+y/l6SiUx4ifgv/P37+tqhZqgM/+\nsUceUQvH0S2RkTra79ew444rdcbt3//2N3X0+/V3j0fd/H5dcYE7W7NxXJzagG4CtQSlJCZW4V7U\nDsaPnyCfr74iI2+S45ysdu26Kysrq9z9tOnQQVBfmOtFRBdFeuNLLXtYt15TQargJkFbxcY1PJjd\nsFQQDiM3ThGdTic4eza4Xgc4LdTtQy1e8h3QHxgPfAlsAB6SVGryFmOMF/gaiAGigQ8l3VGM3Bhg\nCJCNG8Y5txgZhaJrZfPVV18xa9YsmjZtyvDhw0uNqpDExIkTmT9/Pm3btuWMM87AGEMgEOCss85i\nwYIFdO3albfeestGW1QCP/74I19++SWJiYlccMEFOI5ToX7+7//+j2nTppGSksLHH39catRWIBDg\nvPPO46effiItLY0JEybYc1sNHKbROD9L6rJf2zxJXUPZPtSygjcADq4z8gEgHri4rI0k7TbGDJSU\nbYyJBGYYY46WNKOIsoV5nY0xR+Hmde4dol4h88UXX/DZhx+SmJzM1ddeWxiK98knnzDl009JbtSI\na/72N+rUqVNqP8cee2zIVZACgQDvvvsuC2fPpmVaGkOHDsXr9SKJwYMHk9KgAWnduxfK79mzh7HP\nPMNvixfT9aijuPjii4mICN+8t23btvHEU0+wadsmTh58MkOGDClV/scff+T6m68nMyeTKy66gmuv\nddNlr169mrHPjSV7dzbnnX1embVsP/roI+7/579A4p677ywsGzhv3jxeeeUNPB4PV1xxadAN4tbh\nHfX4E3i9MTzy74c45phjKrS/Rx55ZLETps4991wmT55BYqKfDz98j06dOgEwfvx4vprxFSmNUrj2\nmmuJjY2loKCAqKgoImP8eH0+cnJy8Pl8SOLll1/mhx/m0r59S66++iqio6PxeDy8/fbbIeu4Z88e\nnn76GZYsWUHv3t24+OKLMcawe/dunnzyKZYvX8MxxxzFiBEjKpywrTg2btzIU089w7ZtOznjjJML\nf9Pr1q3j6afHkZmZzTnnnM7RRx8dtjEtB01xP4DQ7yTK+RgRT/DNcAUeQRxgNtBxv/axwLlF1otN\n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\nwUSUx+LOfSq+IHJxhHhF8QNnAm2C642AwZV9Jdv/SmupOlavXq2EhIaKiLhN8Lgcp4neeONNTZo0\nSfgQd+Le4Segu+++Wz///LP8/iQZc5/gEfl8yZoyZUq5xx05cqSbgO1RxF0IB02cOFFvv/2OHKex\nYLQiIu5QfHwDrVy5Ui+88JIcJ0UwRh7Pzapbt4nWr1+v008/W27e+icF18iYWC1ZskT3P3S/m7f+\nKRT11yg1bdu03AnMJOm8y8+T098RzyDvGV71TO+pvLy8cvcTDnbs2KFmzdopKuqvgqfkOB10//3/\nKnc/q1atCp7z2wWj5fM11ltvvV0JGlc+HJ539gflYQkpGqcmUFPKEtYmVq5cyejRT7FzZxYjRpzO\n4MGDAfj888+55Z5byM3L5ZpLruH6668H3Ek/Tz31HHv25HP55efTp0+fCo37xBNP8MSLTxATGcMj\n9z9SWFFrypQpvPHGe8TGOtxww9W0bOmGGE+cOJF33/2ExMQ4brrpb4V5cG677TbefXcSdev6efHF\nsRxxhBvI8Nbbb/HpV5/SOLkxf7/x79SrV6/cOgYCAcaOG8t3c7+jQ8sO3HzDzaWWK6xstm7dyn/+\nM4oNGzYzZMhAhg8/t0KVrVauXMmoUU+RmZnNiBGnc/zxx1eCtpVPTYjGCTfGmIm48fvHA92A3bjv\nTkOKxrHG/hAmEAjw/vvvs2HDBnr37k2vXr3C2n9mZibjx48nKyuLE044oczQ1MmTJ3PllVeSn5/P\nfffdxyWXXFKq/Pr16/n444/xeDycfvrphaUiy8uSJUuYMmUK8fHxnHXWWYWTjBYsWMDUqVNJTEzk\n7LPPti6JWsRhauz9uAkjf5G0zBjTCOgs6YuQOqjsR48wPsIU/7xWSwkEAhp82mD5j/Ir5uoYOY0d\nPftC+aNfSiIjI0OpnVLlP9kv7xVe+ZP8mjFjRonyr7/+usCRmyt+uMCnO++8s0T5xYsXK6FhgnwX\n+eSc6yg5Jbkw1XN5+PLLL+U4SfJ6/09+/4lq27abdu3apU8++USOkyyv90r5/ceqS5e+FQ5HtBx6\ncBi6cQ52qXYFynPwLfuYNGmSYrvEij3BH9uvKNofHba46Af/9aCiL4je92N+G3Xq06lE+eiYOoIb\ni0RyjJKJKLns4ZCzh8g8agr799zu0eXXXF5uPVu16iq3CIcEBfJ6z9SoUaPUqFFrwVeF7Y5zgp5/\n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\nxd4YY2LA/wNLiKmxtMn5MwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## K-nearest neighbors (KNN) classification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Pick a value for K.\n", "2. Search for the K observations in the data that are \"nearest\" to the measurements of the unknown iris.\n", " - Euclidian distance is often used as the distance metric, but other metrics are allowed.\n", "3. Use the most popular response value from the K \"nearest neighbors\" as the predicted response value for the unknown iris." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN classification map for iris (K=1)\n", "\n", "![1NN classification map](images/iris_01nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN classification map for iris (K=5)\n", "\n", "![5NN classification map](images/iris_05nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN classification map for iris (K=15)\n", "\n", "![15NN classification map](images/iris_15nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### KNN classification map for iris (K=50)\n", "\n", "![50NN classification map](images/iris_50nn_map.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question:** What's the \"best\" value for K in this case?\n", "\n", "**Answer:** The value which produces the most accurate predictions on unseen data. We want to create a model that generalizes!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Review of supervised learning\n", "\n", "![Supervised learning diagram](images/supervised_learning.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Requirements for working with data in scikit-learn\n", "\n", "1. Features and response are **separate objects**\n", "2. Features and response should be entirely **numeric**\n", "3. Features and response should be **NumPy arrays** (or easily convertible to NumPy arrays)\n", "4. Features and response should have **specific shapes** (outlined below)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "iris.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal_lengthsepal_widthpetal_lengthpetal_widthspeciesspecies_num
05.13.51.40.2Iris-setosa0
14.93.01.40.2Iris-setosa0
24.73.21.30.2Iris-setosa0
34.63.11.50.2Iris-setosa0
45.03.61.40.2Iris-setosa0
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ " sepal_length sepal_width petal_length petal_width species \\\n", "0 5.1 3.5 1.4 0.2 Iris-setosa \n", "1 4.9 3.0 1.4 0.2 Iris-setosa \n", "2 4.7 3.2 1.3 0.2 Iris-setosa \n", "3 4.6 3.1 1.5 0.2 Iris-setosa \n", "4 5.0 3.6 1.4 0.2 Iris-setosa \n", "\n", " species_num \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] } ], "prompt_number": 6 }, { "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": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "# alternative ways to create \"X\"\n", "X = iris.drop(['species', 'species_num'], axis=1)\n", "X = iris.loc[:, 'sepal_length':'petal_width']\n", "X = iris.iloc[:, 0:4]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "# store response vector in \"y\"\n", "y = iris.species_num" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "# check X's type\n", "print type(X)\n", "print type(X.values)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "# check y's type\n", "print type(y)\n", "print type(y.values)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# check X's shape (n = number of observations, p = number of features)\n", "print X.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(150, 4)\n" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# check y's shape (single dimension with length n)\n", "print y.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(150L,)\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## scikit-learn's 4-step modeling pattern" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 1:** Import the class you plan to use" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.neighbors import KNeighborsClassifier" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 2:** \"Instantiate\" the \"estimator\"\n", "\n", "- \"Estimator\" is scikit-learn's term for \"model\"\n", "- \"Instantiate\" means \"make an instance of\"" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn = KNeighborsClassifier(n_neighbors=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Name of the object does not matter\n", "- Can specify tuning parameters (aka \"hyperparameters\") during this step\n", "- All parameters not specified are set to their defaults" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print knn" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_neighbors=1, p=2, weights='uniform')\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 3:** Fit the model with data (aka \"model training\")\n", "\n", "- Model is \"learning\" the relationship between X and y in our \"training data\"\n", "- Process through which learning occurs varies by model\n", "- Occurs in-place" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn.fit(X, y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_neighbors=1, p=2, weights='uniform')" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Once a model has been fit with data, it's called a \"fitted model\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 4:** Predict the response for a new observation\n", "\n", "- New observations are called \"out-of-sample\" data\n", "- Uses the information it learned during the model training process" ] }, { "cell_type": "code", "collapsed": false, "input": [ "knn.predict([3, 5, 4, 2])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "array([2], dtype=int64)" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Returns a NumPy array, and we keep track of what the numbers \"mean\"\n", "- Can predict for multiple observations at once" ] }, { "cell_type": "code", "collapsed": false, "input": [ "X_new = [[3, 5, 4, 2], [5, 4, 3, 2]]\n", "knn.predict(X_new)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "array([2, 1], dtype=int64)" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tuning a KNN model" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# instantiate the model (using the value K=5)\n", "knn = KNeighborsClassifier(n_neighbors=5)\n", "\n", "# fit the model with data\n", "knn.fit(X, y)\n", "\n", "# predict the response for new observations\n", "knn.predict(X_new)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "array([1, 1], dtype=int64)" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "# calculate predicted probabilities of class membership\n", "knn.predict_proba(X_new)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "array([[ 0. , 0.8, 0.2],\n", " [ 0. , 1. , 0. ]])" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "# print distances to nearest neighbors (and their identities)\n", "knn.kneighbors([3, 5, 4, 2])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "(array([[ 3.19374388, 3.20312348, 3.24037035, 3.35559235, 3.35559235]]),\n", " array([[106, 84, 59, 88, 66]], dtype=int64))" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparing KNN with other models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Advantages of KNN:\n", "\n", "- Simple to understand and explain\n", "- Model training is fast\n", "- Can be used for classification and regression!\n", "\n", "Disadvantages of KNN:\n", "\n", "- Must store all of the training data\n", "- Prediction phase can be slow when n is large\n", "- Sensitive to irrelevant features\n", "- Sensitive to the scale of the data\n", "- Accuracy is (generally) not competitive with the best supervised learning methods" ] } ], "metadata": {} } ] }