{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 5.05: K-NN Classification" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.neighbors import KNeighborsClassifier as KNN\n", "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read in the breast cancer diagnosis dataset" ] }, { "cell_type": "code", "execution_count": 2, "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", "
mean radiusmean texturemean perimetermean areamean smoothnessmean compactnessmean concavitymean concave pointsmean symmetrymean fractal dimension...worst textureworst perimeterworst areaworst smoothnessworst compactnessworst concavityworst concave pointsworst symmetryworst fractal dimensiondiagnosis
017.9910.38122.801001.00.118400.277600.30010.147100.24190.07871...17.33184.602019.00.16220.66560.71190.26540.46010.11890malignant
120.5717.77132.901326.00.084740.078640.08690.070170.18120.05667...23.41158.801956.00.12380.18660.24160.18600.27500.08902malignant
219.6921.25130.001203.00.109600.159900.19740.127900.20690.05999...25.53152.501709.00.14440.42450.45040.24300.36130.08758malignant
311.4220.3877.58386.10.142500.283900.24140.105200.25970.09744...26.5098.87567.70.20980.86630.68690.25750.66380.17300malignant
420.2914.34135.101297.00.100300.132800.19800.104300.18090.05883...16.67152.201575.00.13740.20500.40000.16250.23640.07678malignant
\n", "

5 rows × 31 columns

\n", "
" ], "text/plain": [ " mean radius mean texture mean perimeter mean area mean smoothness \\\n", "0 17.99 10.38 122.80 1001.0 0.11840 \n", "1 20.57 17.77 132.90 1326.0 0.08474 \n", "2 19.69 21.25 130.00 1203.0 0.10960 \n", "3 11.42 20.38 77.58 386.1 0.14250 \n", "4 20.29 14.34 135.10 1297.0 0.10030 \n", "\n", " mean compactness mean concavity mean concave points mean symmetry \\\n", "0 0.27760 0.3001 0.14710 0.2419 \n", "1 0.07864 0.0869 0.07017 0.1812 \n", "2 0.15990 0.1974 0.12790 0.2069 \n", "3 0.28390 0.2414 0.10520 0.2597 \n", "4 0.13280 0.1980 0.10430 0.1809 \n", "\n", " mean fractal dimension ... worst texture worst perimeter worst area \\\n", "0 0.07871 ... 17.33 184.60 2019.0 \n", "1 0.05667 ... 23.41 158.80 1956.0 \n", "2 0.05999 ... 25.53 152.50 1709.0 \n", "3 0.09744 ... 26.50 98.87 567.7 \n", "4 0.05883 ... 16.67 152.20 1575.0 \n", "\n", " worst smoothness worst compactness worst concavity worst concave points \\\n", "0 0.1622 0.6656 0.7119 0.2654 \n", "1 0.1238 0.1866 0.2416 0.1860 \n", "2 0.1444 0.4245 0.4504 0.2430 \n", "3 0.2098 0.8663 0.6869 0.2575 \n", "4 0.1374 0.2050 0.4000 0.1625 \n", "\n", " worst symmetry worst fractal dimension diagnosis \n", "0 0.4601 0.11890 malignant \n", "1 0.2750 0.08902 malignant \n", "2 0.3613 0.08758 malignant \n", "3 0.6638 0.17300 malignant \n", "4 0.2364 0.07678 malignant \n", "\n", "[5 rows x 31 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('../Datasets/breast-cancer-data.csv')\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this exercise we will choose mean radius and worst radius as the classification features to use in the model. Construct a plot to visualise the corresponding measurements with the class allocations." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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9NNP5x3veAdz5sxh2bJlI+s6XnLJJZx00kkcd9xxLF++fGT76aefzic+8QkWLlzI0Ucfza233spLL73E6tWr+dGPfkRTUxM/+tGPxvQciIiISP7Gf+BV4iUH/vSnP9Ha2sqWLVt44IEH+P73v89tt93GF77wBS699FLmzJnDLbfcwp133skll1zCJz/5yazHa21tpbW1lT/84Q8ceuihKbfdeeed9PT0cN999/GXv/yF3//+9wBcdNFF/OEPf+Cee+7h+eef5+c///nIffbs2cPGjRvp6emhq6uLvffem0suuYRzzz2XgYEBzj333DE9fhEREclfyQIvY8xUY8xGY8xdxph7jTFdwfZvG2P+aowZCC5NpWpD0BA3AyKs/VFXl6wJUoSZEUceeSRz586lrq6OY489ljPOOANjDHPnzmXr1q0MDQ3xzne+k+OOO4729vacC2avX7+ed77znQCcd955KbctXLiQww8/nLq6Opqamti6dSsAN910E83NzcydO5ff/va3Ked429veBsD8+fNH9hcREZHKKGWP14vAUmvtPKAJONsYsyi47WPW2qbgUvqFCP3aH6EiTUedMmXKyO91dXUj1+vq6tizZw+f/vSnWbJkCffccw/XXXcdL7zwQlHONWnSJPbs2cMLL7zAhz/8Ya666iruvvtuLrzwwpRzhPcJ9xcREZHKKVngZZ3ngquTg0tlMtozLTlQhgT7oaEhDjvsMMDlcuWyaNEirr76agB++MMf5tw/DLIOPPBAnnvuOa666qqc95k+fTo7d+7MuZ+IiIgUV0lzvIwxk4wxA8DfgF9bazcEN60xxmwxxqw1xkzJcN/lxphNxphNTz31VOGNqPCSAx//+Mf593//d0455RSGh4dz7t/T00N3dzcLFy7k8ccfp76+Puv+DQ0NXHjhhcydO5e3vOUteS2ovWTJEu677z4l14uIiJSZsWXo9THGNAA/BVYATwNPAHsDlwN/ttZeku3+CxYssJs2bUrZdv/993PMMcfk14DOTpdIHw4vhsFYQ8OYZzYW265du9hnn30wxvDDH/6QH/zgB1xzzTVlbcOonlsRERFJYYzZbK1dEHdbWZYMstYOGmNuBs621n4h2PyiMeZbwEdL3oAaWnJg8+bNXHTRRVhraWhoYN26dZVukoiIiBRJyQIvY8xBwO4g6NoHeC3wn8aYQ6y1jxtjDPAW4J5StSHSoOzXq8Spp57KXXfdVelmiIiISAmUssfrEOA7xphJuFyyK621PzfG/DYIygwwAHyo0BNYazFVGkDVqnIMPYuIiExUJQu8rLVbgBNiti8txvGnTp3K008/zQEHHKDgq0istTz99NNMnTq10k0REREZl8qS41UKhx9+OI888ghjmvEoaaZOncrhhx9e6WaIiIiMSzUbeE2ePJkjjzyy0s0QERERydv4X6tRREREpEoo8BIREREpEwVeIiIiImWiwEtERESkTBR4iYiIiJSJAi8RERGRMlHgJSIiIlImCrxEREREykSBl4iIiEiZKPASERERKRMFXiIiIiJlosBLRERkorI2+/Vyq7b2lIACLxERkYmosxPa25PBjbXuemen2lNCCrxEREQmGmthcBB6e5PBTnu7uz44WP6epmprTwkZWwMPZsGCBXbTpk2VboaIiMj44Qc3odZWWLsWjFF7xsAYs9lauyD2NgVeIiIiE5S1UOcNfiUSlQ1yqq09BcoWeGmoUUREZCIKe5h8fo7VRG9PiSjwEhERmWj8Yb3WVtez1NqammM1kdtTQntVugEiIlLFrE0d6olel9pkDDQ0pOZQrV3rbmtoKP/fuNraU0LK8RIRkXidnW5GWfhBGPZKNDSMuyn+E1a1BdbV1p4CKcdLRERGZwJN75/QokFNpYOcamtPCWioUURE0vlDPb29ySn+NTq9X6RaaKhRREQyGyfT+0XKSUONIiIyehNker9IOSnwEhGRdBNoer9IOSnHS0RE0k2g6f0i5aQcLxERyWycTO8XKSfleImISGEmwPR+kXJS4CUiIiJSJgq8RERERMpEgZeIiIhImSjwEhERESkTBV4iIiIiZaLAS0RERKRMFHiJiIiIlIkCLxEREZEyUeAlIiISiq7mUgOru0htUeAlIiIC0NmZugB4uFB4Z2clWyXjjAIvERERa2FwEHp7k8FXe7u7Pjioni8pmr0q3QAREZGKChf+XrvWXe/tdReA1la3XWtUSpGox0tERCqn0jlV/vCiMdDdnXq7gi4pMgVeIiJSGZXOqYoOLyYSMH9+6j7R9kXvLzJKGmoUEZHy84MecD1LYU5Va2uyB6qUMg0vNjXB5s2wcmVyW309DA0le8DCILGhQcn3MioKvEREpPyqJacqbEd4fnBBV11dsn1h0FXJIFHGDWNr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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "markers = {\n", " 'benign': {'marker': 'o', 'facecolor': 'g', 'edgecolor': 'g'},\n", " 'malignant': {'marker': 'x', 'facecolor': 'r', 'edgecolor': 'r'},\n", "}\n", "plt.figure(figsize=(10, 7))\n", "for name, group in df.groupby('diagnosis'):\n", " plt.scatter(group['mean radius'], group['worst radius'], \n", " label=name,\n", " marker=markers[name]['marker'],\n", " facecolors=markers[name]['facecolor'],\n", " edgecolor=markers[name]['edgecolor'])\n", " \n", "plt.title('Breast Cancer Diagnosis Classification Mean Radius vs Worst Radius');\n", "plt.xlabel('Mean Radius');\n", "plt.ylabel('Worst Radius');\n", "plt.legend();\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before actually going into training a model, lets further split the training dataset into a training and a validation set in the ratio 80:20 to be able to impartially evaluate the model performance later using the validation set." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "train_X, valid_X, train_y, valid_y = train_test_split(df[['mean radius', 'worst radius']], df.diagnosis, \n", " test_size=0.2, random_state=123)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Construct a KNN model with 3 nearest neighbours. One of the great things about K-NN classifiers is that we do not need to encode the classes for the method to work. We can simply keep the diagnosis strings:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_jobs=None, n_neighbors=3, p=2,\n", " weights='uniform')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = KNN(n_neighbors=3)\n", "model.fit(X=train_X, y=train_y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Evaluate the model on the validation set by computing the validation set accuracy" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9210526315789473" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.score(X=valid_X, y=valid_y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }