{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"
\n",
"___"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# K Nearest Neighbors with Python\n",
"\n",
"You've been given a classified data set from a company! They've hidden the feature column names but have given you the data and the target classes. \n",
"\n",
"We'll try to use KNN to create a model that directly predicts a class for a new data point based off of the features.\n",
"\n",
"Let's grab it and use it!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import Libraries\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get the Data\n",
"\n",
"Set index_col=0 to use the first column as the index."
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = pd.read_csv(\"Classified Data\",index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" WTT | \n",
" PTI | \n",
" EQW | \n",
" SBI | \n",
" LQE | \n",
" QWG | \n",
" FDJ | \n",
" PJF | \n",
" HQE | \n",
" NXJ | \n",
" TARGET CLASS | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.913917 | \n",
" 1.162073 | \n",
" 0.567946 | \n",
" 0.755464 | \n",
" 0.780862 | \n",
" 0.352608 | \n",
" 0.759697 | \n",
" 0.643798 | \n",
" 0.879422 | \n",
" 1.231409 | \n",
" 1 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.635632 | \n",
" 1.003722 | \n",
" 0.535342 | \n",
" 0.825645 | \n",
" 0.924109 | \n",
" 0.648450 | \n",
" 0.675334 | \n",
" 1.013546 | \n",
" 0.621552 | \n",
" 1.492702 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.721360 | \n",
" 1.201493 | \n",
" 0.921990 | \n",
" 0.855595 | \n",
" 1.526629 | \n",
" 0.720781 | \n",
" 1.626351 | \n",
" 1.154483 | \n",
" 0.957877 | \n",
" 1.285597 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 1.234204 | \n",
" 1.386726 | \n",
" 0.653046 | \n",
" 0.825624 | \n",
" 1.142504 | \n",
" 0.875128 | \n",
" 1.409708 | \n",
" 1.380003 | \n",
" 1.522692 | \n",
" 1.153093 | \n",
" 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 1.279491 | \n",
" 0.949750 | \n",
" 0.627280 | \n",
" 0.668976 | \n",
" 1.232537 | \n",
" 0.703727 | \n",
" 1.115596 | \n",
" 0.646691 | \n",
" 1.463812 | \n",
" 1.419167 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" WTT PTI EQW SBI LQE QWG FDJ \\\n",
"0 0.913917 1.162073 0.567946 0.755464 0.780862 0.352608 0.759697 \n",
"1 0.635632 1.003722 0.535342 0.825645 0.924109 0.648450 0.675334 \n",
"2 0.721360 1.201493 0.921990 0.855595 1.526629 0.720781 1.626351 \n",
"3 1.234204 1.386726 0.653046 0.825624 1.142504 0.875128 1.409708 \n",
"4 1.279491 0.949750 0.627280 0.668976 1.232537 0.703727 1.115596 \n",
"\n",
" PJF HQE NXJ TARGET CLASS \n",
"0 0.643798 0.879422 1.231409 1 \n",
"1 1.013546 0.621552 1.492702 0 \n",
"2 1.154483 0.957877 1.285597 0 \n",
"3 1.380003 1.522692 1.153093 1 \n",
"4 0.646691 1.463812 1.419167 1 "
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Standardize the Variables\n",
"\n",
"Because the KNN classifier predicts the class of a given test observation by identifying the observations that are nearest to it, the scale of the variables matters. Any variables that are on a large scale will have a much larger effect on the distance between the observations, and hence on the KNN classifier, than variables that are on a small scale."
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.preprocessing import StandardScaler"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"scaler = StandardScaler()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"StandardScaler(copy=True, with_mean=True, with_std=True)"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scaler.fit(df.drop('TARGET CLASS',axis=1))"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"scaled_features = scaler.transform(df.drop('TARGET CLASS',axis=1))"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" WTT | \n",
" PTI | \n",
" EQW | \n",
" SBI | \n",
" LQE | \n",
" QWG | \n",
" FDJ | \n",
" PJF | \n",
" HQE | \n",
" NXJ | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" -0.123542 | \n",
" 0.185907 | \n",
" -0.913431 | \n",
" 0.319629 | \n",
" -1.033637 | \n",
" -2.308375 | \n",
" -0.798951 | \n",
" -1.482368 | \n",
" -0.949719 | \n",
" -0.643314 | \n",
"
\n",
" \n",
" 1 | \n",
" -1.084836 | \n",
" -0.430348 | \n",
" -1.025313 | \n",
" 0.625388 | \n",
" -0.444847 | \n",
" -1.152706 | \n",
" -1.129797 | \n",
" -0.202240 | \n",
" -1.828051 | \n",
" 0.636759 | \n",
"
\n",
" \n",
" 2 | \n",
" -0.788702 | \n",
" 0.339318 | \n",
" 0.301511 | \n",
" 0.755873 | \n",
" 2.031693 | \n",
" -0.870156 | \n",
" 2.599818 | \n",
" 0.285707 | \n",
" -0.682494 | \n",
" -0.377850 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.982841 | \n",
" 1.060193 | \n",
" -0.621399 | \n",
" 0.625299 | \n",
" 0.452820 | \n",
" -0.267220 | \n",
" 1.750208 | \n",
" 1.066491 | \n",
" 1.241325 | \n",
" -1.026987 | \n",
"
\n",
" \n",
" 4 | \n",
" 1.139275 | \n",
" -0.640392 | \n",
" -0.709819 | \n",
" -0.057175 | \n",
" 0.822886 | \n",
" -0.936773 | \n",
" 0.596782 | \n",
" -1.472352 | \n",
" 1.040772 | \n",
" 0.276510 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" WTT PTI EQW SBI LQE QWG FDJ \\\n",
"0 -0.123542 0.185907 -0.913431 0.319629 -1.033637 -2.308375 -0.798951 \n",
"1 -1.084836 -0.430348 -1.025313 0.625388 -0.444847 -1.152706 -1.129797 \n",
"2 -0.788702 0.339318 0.301511 0.755873 2.031693 -0.870156 2.599818 \n",
"3 0.982841 1.060193 -0.621399 0.625299 0.452820 -0.267220 1.750208 \n",
"4 1.139275 -0.640392 -0.709819 -0.057175 0.822886 -0.936773 0.596782 \n",
"\n",
" PJF HQE NXJ \n",
"0 -1.482368 -0.949719 -0.643314 \n",
"1 -0.202240 -1.828051 0.636759 \n",
"2 0.285707 -0.682494 -0.377850 \n",
"3 1.066491 1.241325 -1.026987 \n",
"4 -1.472352 1.040772 0.276510 "
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_feat = pd.DataFrame(scaled_features,columns=df.columns[:-1])\n",
"df_feat.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train Test Split"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(scaled_features,df['TARGET CLASS'],\n",
" test_size=0.30)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using KNN\n",
"\n",
"Remember that we are trying to come up with a model to predict whether someone will TARGET CLASS or not. We'll start with k=1."
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"knn = KNeighborsClassifier(n_neighbors=1)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=1, n_neighbors=1, p=2,\n",
" weights='uniform')"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"knn.fit(X_train,y_train)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pred = knn.predict(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Predictions and Evaluations\n",
"\n",
"Let's evaluate our KNN model!"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.metrics import classification_report,confusion_matrix"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[125 18]\n",
" [ 13 144]]\n"
]
}
],
"source": [
"print(confusion_matrix(y_test,pred))"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 0.91 0.87 0.89 143\n",
" 1 0.89 0.92 0.90 157\n",
"\n",
"avg / total 0.90 0.90 0.90 300\n",
"\n"
]
}
],
"source": [
"print(classification_report(y_test,pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Choosing a K Value\n",
"\n",
"Let's go ahead and use the elbow method to pick a good K Value:"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"error_rate = []\n",
"\n",
"# Will take some time\n",
"for i in range(1,40):\n",
" \n",
" knn = KNeighborsClassifier(n_neighbors=i)\n",
" knn.fit(X_train,y_train)\n",
" pred_i = knn.predict(X_test)\n",
" error_rate.append(np.mean(pred_i != y_test))"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmsAAAGJCAYAAADVKHTwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VNX9//HXnSyTzCQsagSsUBX0qIAbtCqIWveflaJd\nFP3WtlasSq0U1LqBotiiRUDqt9ZWqVVrv7ihiOKudUHbKrYKag8KVqjKImK2SUKSub8/JoEsk2Qm\nmTtzZ/J+Ph48yMxdzrmfeyfzybnnnuO4rouIiIiI+FMg0xUQERERkY4pWRMRERHxMSVrIiIiIj6m\nZE1ERETEx5SsiYiIiPiYkjURERERH8vPdAVEJLsYY6LASiAKuIDT9P+p1tp1aSw3BJQDk621K7rY\n9lygwFp7u1f166L8a4GdrbUXN70uAP4C7Ap8y1pb3mLdF4CnrbU3tdnHJcA4a+2pnZRzF7DSWjvP\ng8MQkQxRsiYiyXKBo621WzNdblMCcyswpottjyCW6GWcMSYELAYqgeOttdvarPJb4JfATW3enwRc\n5H0NRcRvlKyJSLKcpn/tGGOOAhYA1cRavi4Hft3i9deBc4CfAQ3ARuAia+2HTa1COwF7AY9ba6/s\nrFxjTB4wBNjS9HpX4PfEWqsGAh8DpxNL1L4FHGeMqbHW/s4YcxXwbWJdQf5DrHVuQ5tjWQ7MtdYu\nbno9u2nRLcA9wM5Nr5dZa6/pMmqxffQDlgErrLU/62C1R4FbjDFjrbXLm7Y7CsBa+7wxxgHmA4cC\npU0xmWStfb1NWVFgF2vtF21fG2NOAaYDBUAEuMxa+7dEjkFE0k991kSkO140xrzV9O+fxpiHWywb\nDpxhrT0YqGvz+gjgUuCoptf/ByxpsW2xtXZknEStZbn/MsZ8Aqwm1tp2TtOyicBr1tqx1tqhQA1w\ntrX2UeAxYH5TonY2MBL4urX2EOBJYGGcsu5o3rcxJgB8H7gTOA9YY60dDRwJDDPGlCYQs0HAX4H9\nges7Wsla29hU9qQWb58H3Nb086HAIGvt4dbaEcQSxyvi7Krt9DRu07EMA34F/D9r7SjgfGCxMaY4\ngWMQkQxQy5qIdEdnt0HXW2v/28Hrk4D7m1t7rLV3G2NuMcZ8tWn5q4mUa4w5iFgL1WvW2s+b9vUb\nY8wRxpipwN7EksR4rUWnAF8DVhhjIPZHa7xE5QFgTlOL3WjgA2vtGmPMU8ATTXV+DrjCWlvZRb0B\nJgAXEGtdfMgY8w1rbbSDdf8AvGuMCQNB4ATgwqbj/JsxZoYx5gJgKHA0UBFnH3FbP4HjibU8NrfS\nQayVcxg+uVUsIq2pZU1EuqOjRACgqpPX8X7nBIjdjou3bdxyrbX/AqYBC40xQwCMMTcB1wGbiN0O\nfbaDeuYBN1lrD25q3RsNjGu7krU2AjwI/A/wI2KtXVhr3wT2bCrjq8AbxpjDuqg3wF3W2j8CU4jd\nvpzf0YpNt2SfBc4EzgYeak4IjTHfBJ4g1lL2KHB7B8dJ8/tNDzQ0ywOet9Ye0iIGY4BVCRyDiGSA\nkjURSaengTOMMbsAGGPOAT631n6Y7I6stYuA14n1IYNY69Mt1tr7gM+JtSDlNS1rYEdC+DQwqcWt\nyxuI3UqM505iidrhwMNNdZ4NXGOtfcxa+3PgXWCfBKpc11TvOmJ96X5gjDmrk/V/RyxR/AGxhw6a\nHQc8Zq39PbACOLXFcba0iVgiCvCdFu+/AJxgmpoVjTEnA28DRQkcg4hkgG6DikiyXGJ9xxqbXjcP\n3XEVsX5iHbLWPmeMmQ+80HQLbjPwzRb77arcti4C3jbGHE+sVW2uMeYaYsnZK8Ru7UGsX9qtxhis\ntTcZY74C/K2p0/06YglZvPq+ZYypJ9ay1fzU5i3A3caYd4glYG8T63uHMeafwLnW2re6iMOHxpjz\ngLuMMauste/EWeclY8zOxJLZd1ssuh34izHmX0Aj8DKtk7FmU4DbjDFbibXSfda03/eMMT8BFjXl\naw3AeGttp+dORDLHcd2ufj+KiIiISKZ42rLW9JfzbcCBQC2xx8vXtlknBDwD/Nhau7rF+4cCN1pr\nv+FlHUVERET8zOs+a6cCQWvtGOBKoNWo2saYUcBLxMZVavn+ZcQ68wY9rp+IiIiIr3mdrB0BPAVg\nrf07Ozq7NiskltD9u837HwKneVw3EREREd/zOlnrQ2zuvmYNTYNLAmCtfd1a+wltHju31j5CrNOr\niIiISK/m9dOgFcTGE2oW6GQQyG5zXdd1nM6GfRIRERHxjaSSFq+TteXERgt/qGnQyGRHx07oYBzH\nYfPmRAYQ713KykoVlzYUk/gUl/gUl/gUl/YUk/gUl/jKyhKZoW4Hr5O1R4DjmyZEBjjHGHMmELbW\n3tlivY7GD9G4IiIiItKreZqsWWtdmuaza2F1nPWOifPex8SmQBERERHptTTdlIiIiIiPKVkTERER\n8TElayIiIiI+pmRNRERExMeUrImIiIj4mJI1ERERER9TsiYiIiLiY0rWRERERHxMyZqIiIiIjylZ\nExEREfExJWsiIiIiPqZkTURERMTHlKyJiIiI+JiSNREREREfU7ImIiIi4mNK1kRERER8TMmaiIiI\niI8pWRMRERHxMSVrIiIiIj6mZE1ERETEx5SsiYiIiPiYkjURERERH1OyJiIiIuJjStZEREREfEzJ\nmoiIiIiPKVkTERER8TElayIiIiI+pmRNRERExMfyM12BTHAqygkuXUJg4waiAwZSN34Cbp++ma6W\niIiISDu9LlkLzZ9DaME8nEj19vdKrr6cyJRpRKZelsGaiYiIiLTXq5K10Pw5hGfPave+E6ne/r4S\nNhEREfGTXtNnzakoJ7RgXqfrhBbMw6msSFONRERERLrWa5K14NIlrW59xuNEqgkuXZKmGomIiIh0\nrdcka4GNG1K6noiIiEg69JpkLTpgYErXExEREUmHXpOs1Y2fgBsKd7qOGwpTN35CmmokIiIi0rVe\nk6y5ffoSmTKt03UiU6bhlvZJU41EREREutarhu5oHpaj7Thr9cEw26ZpnDURERHxn16VrEEsYauZ\ndD7BpUv4fOVG5v5lCObq8Uz8SXGmqyYiIiLSTq9L1gDc0j7UnnU2JcAVMyEYzHSNREREROLrNX3W\nOqJETURERPys1ydrIiIiIn6mZE1ERETEx5SsiYiIiPiYkrUmS5bk8z//U0xdXaZrIiIiIrKDkrUm\nK1bk8eyz+Tz7bK98QFZERER8Sslak4kT6wG4//6CDNdEREREZAdPm5GMMQ5wG3AgUAtMstaubbNO\nCHgG+LG1dnUi23hh//2jHHhgI889l8emTQ677up6XaSIiIhIl7xuWTsVCFprxwBXAvNaLjTGjAJe\nAvZKdBsvTZxYT2Ojw8MP61aoiIiI+IPXydoRwFMA1tq/A6PbLC8klpz9O4ltPHPaafUUFLi88IKS\nNREREfEHr5O1PkB5i9cNxpjtZVprX7fWfgI4iW7jpZ12gqeeirBoUU06ihMRERHpktdNSBVAaYvX\nAWtt1INtUmbkyLQVJSIiItIlr5O15cApwEPGmMOAlR5tQ1lZadcr9UKKS3uKSXyKS3yKS3yKS3uK\nSXyKS895naw9AhxvjFne9PocY8yZQNhae2eL9dzOtkmkoM2bK3tc2VxTVlaquLShmMSnuMSnuMSn\n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\nD0aMiPKvf+WxbVumayPZSh9JEZEMOf30WB+4++/P3K1Q14VLLy1i7doAkydv44QTes/Trunyu9/V\n8s47VRQWZromkq00zpqISBtORTnBpUtwK7dSVNo0+GufvikvZ489XMaMaeDLjyth4V8IlbcYkNWD\n8po1H19g4wZeXfMVnlt8JqNGlXD11XWeldmbpeO2eldanvN0XmNUbaWoxLvPUNvy0n18aStPMxjk\nLo0c3Z5iEp/iskNo/py0Tj3k3nAzu9w5l0Cayot3fFWEqZh8CQUzL01oH7pe2vNzTNJ9Tau8riU7\ng0HezJkzk6qkT82MRNQZoK1wOIji0ppiEp/iEhOaP4fw7Fk49a2H6HDq6yl89WXIz6f+8LEpLa//\n3PSWF+/4Cqmn9I2XEi5P10t7fo1JJq5plZfQZ+i6ZMpVy1oO8/NfepmimMSnuMRua+x8wL6t/lpu\nyw2F2bLSpmQ+zGwuT9dLe36MSTZfY7leXrIta3rAQEQECC5d0ukvYQAnUh3rh6PypBuqq+Hjj9M3\njl2uX2O5Xl5LStZERIDAxg0pXa+3lyetVVfDvvuWMGVK+uYJzfVrLNfLa7XPlO9RRCQLRQcMTOl6\nvb08aS0cjj0VumJFXtrmCc31ayzXy2tJyZqICMQevQ+FO13HDYWpGz8hK8urPWUCNXnpK0/aS/c8\noXXjJ9BYnN5ruqEodz9D6S6vJSVrIiKA26cvkSnTOl0nMmVaSjoqJ1pe1c9SV969j+3CDY1XdrpO\nKo9P2kv3PKGRgr78tvTyTtf54LuXpOycf9HYl7mFV3RepzR/hrK5vJaUrImINIlMvYzqK2e0++vZ\nDYWpvnJGysds6qi8mrwwV3MDN7hXp6ScVasCXHVVkNv6XcWnk69J2/FJa+meJ3TGjCBTNs3g4YOv\na3fOG4rCTGcWx714LVu3pqa899/P44bo1Tw1bma78rYVhqm6In2foVRf01VVMHduIVsnp/d3RDMN\n3ZHD/PgoeaYpJvEpLq05lRUEly6htGorlc2jr3vY4tRcXvNo6BvHTeAbEwaxdavDG29Us8su3f89\nXV8PRx8d4oMP8rj33ggnntjYrrxkj0/XS3uJxuSMM4rZeWeX3/62FsfDB0PXrXMYNy7MXntFefLJ\nCMX17c/5r2/fhTlzgpx0Uj13352a+qxf77Dbbi75kR2fod8u3pUr3zqD+5flMXq0N7M59PSa7ozr\n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\nSUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.plot(range(1,40),error_rate,color='blue', linestyle='dashed', marker='o',\n",
" markerfacecolor='red', markersize=10)\n",
"plt.title('Error Rate vs. K Value')\n",
"plt.xlabel('K')\n",
"plt.ylabel('Error Rate')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we can see that that after arouns K>23 the error rate just tends to hover around 0.06-0.05 Let's retrain the model with that and check the classification report!"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WITH K=1\n",
"\n",
"\n",
"[[125 18]\n",
" [ 13 144]]\n",
"\n",
"\n",
" precision recall f1-score support\n",
"\n",
" 0 0.91 0.87 0.89 143\n",
" 1 0.89 0.92 0.90 157\n",
"\n",
"avg / total 0.90 0.90 0.90 300\n",
"\n"
]
}
],
"source": [
"# FIRST A QUICK COMPARISON TO OUR ORIGINAL K=1\n",
"knn = KNeighborsClassifier(n_neighbors=1)\n",
"\n",
"knn.fit(X_train,y_train)\n",
"pred = knn.predict(X_test)\n",
"\n",
"print('WITH K=1')\n",
"print('\\n')\n",
"print(confusion_matrix(y_test,pred))\n",
"print('\\n')\n",
"print(classification_report(y_test,pred))"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WITH K=23\n",
"\n",
"\n",
"[[132 11]\n",
" [ 5 152]]\n",
"\n",
"\n",
" precision recall f1-score support\n",
"\n",
" 0 0.96 0.92 0.94 143\n",
" 1 0.93 0.97 0.95 157\n",
"\n",
"avg / total 0.95 0.95 0.95 300\n",
"\n"
]
}
],
"source": [
"# NOW WITH K=23\n",
"knn = KNeighborsClassifier(n_neighbors=23)\n",
"\n",
"knn.fit(X_train,y_train)\n",
"pred = knn.predict(X_test)\n",
"\n",
"print('WITH K=23')\n",
"print('\\n')\n",
"print(confusion_matrix(y_test,pred))\n",
"print('\\n')\n",
"print(classification_report(y_test,pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Great job!\n",
"\n",
"We were able to squeeze some more performance out of our model by tuning to a better K value!"
]
}
],
"metadata": {
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}