{
"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",
"%matplotlib inline\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 distance(point1, point2):\n",
" \"\"\"Returns the distance between point1 and point2\n",
" where each argument is an array \n",
" consisting of the coordinates of the point\"\"\"\n",
" return np.sqrt(np.sum((point1 - point2)**2))\n",
"\n",
"def all_distances(training, new_point):\n",
" \"\"\"Returns an array of distances\n",
" #between each point in the training set\n",
" #and the new point (which is a row of attributes)\"\"\"\n",
" attributes = training.drop(columns=['Class'])\n",
" def distance_from_point(row):\n",
" return distance(new_point, np.array(row)) # --- possible issue as original = np.array(new_point)\n",
" return attributes.apply(distance_from_point, axis=1)\n",
"\n",
"def table_with_distances(training, new_point):\n",
" \"\"\"Augments the training table \n",
" with a column of distances from new_point\"\"\"\n",
" training1 = training.copy()\n",
" training1['Distance'] = all_distances(training1, new_point)\n",
" return training1\n",
"\n",
"def closest(training, new_point, k):\n",
" \"\"\"Returns a table of the k rows of the augmented table\n",
" corresponding to the k smallest distances\"\"\"\n",
" with_dists = table_with_distances(training, new_point)\n",
" sorted_by_distance = with_dists.sort_values(by=['Distance'])\n",
" topk = sorted_by_distance.take(np.arange(k))\n",
" return topk\n",
"\n",
"def majority(topkclasses):\n",
" ones = len(topkclasses[topkclasses['Class'] == 1])\n",
" zeros = len(topkclasses[topkclasses['Class'] == 0])\n",
" if ones > zeros:\n",
" return 1\n",
" else:\n",
" return 0\n",
"\n",
"def classify(training, new_point, k):\n",
" closestk = closest(training, new_point, k)\n",
" topkclasses = closestk[['Class']]\n",
" return majority(topkclasses)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"tags": [
"remove_input"
]
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Class \n",
" Alcohol \n",
" Malic Acid \n",
" Ash \n",
" Alcalinity of Ash \n",
" Magnesium \n",
" Total Phenols \n",
" Flavanoids \n",
" Nonflavanoid phenols \n",
" Proanthocyanins \n",
" Color Intensity \n",
" Hue \n",
" OD280/OD315 of diulted wines \n",
" Proline \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 14.23 \n",
" 1.71 \n",
" 2.43 \n",
" 15.6 \n",
" 127 \n",
" 2.80 \n",
" 3.06 \n",
" 0.28 \n",
" 2.29 \n",
" 5.64 \n",
" 1.04 \n",
" 3.92 \n",
" 1065 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 13.20 \n",
" 1.78 \n",
" 2.14 \n",
" 11.2 \n",
" 100 \n",
" 2.65 \n",
" 2.76 \n",
" 0.26 \n",
" 1.28 \n",
" 4.38 \n",
" 1.05 \n",
" 3.40 \n",
" 1050 \n",
" \n",
" \n",
" 2 \n",
" 1 \n",
" 13.16 \n",
" 2.36 \n",
" 2.67 \n",
" 18.6 \n",
" 101 \n",
" 2.80 \n",
" 3.24 \n",
" 0.30 \n",
" 2.81 \n",
" 5.68 \n",
" 1.03 \n",
" 3.17 \n",
" 1185 \n",
" \n",
" \n",
" 3 \n",
" 1 \n",
" 14.37 \n",
" 1.95 \n",
" 2.50 \n",
" 16.8 \n",
" 113 \n",
" 3.85 \n",
" 3.49 \n",
" 0.24 \n",
" 2.18 \n",
" 7.80 \n",
" 0.86 \n",
" 3.45 \n",
" 1480 \n",
" \n",
" \n",
" 4 \n",
" 1 \n",
" 13.24 \n",
" 2.59 \n",
" 2.87 \n",
" 21.0 \n",
" 118 \n",
" 2.80 \n",
" 2.69 \n",
" 0.39 \n",
" 1.82 \n",
" 4.32 \n",
" 1.04 \n",
" 2.93 \n",
" 735 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Class Alcohol Malic Acid Ash Alcalinity of Ash Magnesium \\\n",
"0 1 14.23 1.71 2.43 15.6 127 \n",
"1 1 13.20 1.78 2.14 11.2 100 \n",
"2 1 13.16 2.36 2.67 18.6 101 \n",
"3 1 14.37 1.95 2.50 16.8 113 \n",
"4 1 13.24 2.59 2.87 21.0 118 \n",
"\n",
" Total Phenols Flavanoids Nonflavanoid phenols Proanthocyanins \\\n",
"0 2.80 3.06 0.28 2.29 \n",
"1 2.65 2.76 0.26 1.28 \n",
"2 2.80 3.24 0.30 2.81 \n",
"3 3.85 3.49 0.24 2.18 \n",
"4 2.80 2.69 0.39 1.82 \n",
"\n",
" Color Intensity Hue OD280/OD315 of diulted wines Proline \n",
"0 5.64 1.04 3.92 1065 \n",
"1 4.38 1.05 3.40 1050 \n",
"2 5.68 1.03 3.17 1185 \n",
"3 7.80 0.86 3.45 1480 \n",
"4 4.32 1.04 2.93 735 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wine = pd.read_csv(path_data + 'wine.csv')\n",
"\n",
"# For converting Class to binary\n",
"\n",
"def is_one(x):\n",
" if x == 1:\n",
" return 1\n",
" else:\n",
" return 0\n",
"\n",
"wine['Class1'] = wine['Class'].apply(is_one)\n",
"\n",
"# This creates a column 'Class1' - we drop the 'Class' column, rename 'Class1' as 'Class'\n",
"# then move the column to the first position using 'pop' and 'insert'\n",
"\n",
"wine = wine.drop(columns=['Class'])\n",
"wine = wine.rename(columns={'Class1': 'Class'})\n",
"class_label = wine.pop('Class')\n",
"wine.insert(0, 'Class', class_label)\n",
"wine.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Accuracy of Classifier\n",
"To see how well our classifier does, we might put 50% of the data into the training set and the other 50% into the test set. Basically, we are setting aside some data for later use, so we can use it to measure the accuracy of our classifier. We've been calling that the *test set*. Sometimes people will call the data that you set aside for testing a *hold-out set*, and they'll call this strategy for estimating accuracy the *hold-out method*.\n",
"\n",
"Note that this approach requires great discipline. Before you start applying machine learning methods, you have to take some of your data and set it aside for testing. You must avoid using the test set for developing your classifier: you shouldn't use it to help train your classifier or tweak its settings or for brainstorming ways to improve your classifier. Instead, you should use it only once, at the very end, after you've finalized your classifier, when you want an unbiased estimate of its accuracy."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measuring the Accuracy of Our Wine Classifier\n",
"OK, so let's apply the hold-out method to evaluate the effectiveness of the $k$-nearest neighbor classifier for identifying wines. The data set has 178 wines, so we'll randomly permute the data set and put 89 of them in the training set and the remaining 89 in the test set."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Class \n",
" Alcohol \n",
" Malic Acid \n",
" Ash \n",
" Alcalinity of Ash \n",
" Magnesium \n",
" Total Phenols \n",
" Flavanoids \n",
" Nonflavanoid phenols \n",
" Proanthocyanins \n",
" Color Intensity \n",
" Hue \n",
" OD280/OD315 of diulted wines \n",
" Proline \n",
" \n",
" \n",
" \n",
" \n",
" 163 \n",
" 0 \n",
" 12.96 \n",
" 3.45 \n",
" 2.35 \n",
" 18.5 \n",
" 106 \n",
" 1.39 \n",
" 0.70 \n",
" 0.40 \n",
" 0.94 \n",
" 5.28 \n",
" 0.68 \n",
" 1.75 \n",
" 675 \n",
" \n",
" \n",
" 94 \n",
" 0 \n",
" 11.62 \n",
" 1.99 \n",
" 2.28 \n",
" 18.0 \n",
" 98 \n",
" 3.02 \n",
" 2.26 \n",
" 0.17 \n",
" 1.35 \n",
" 3.25 \n",
" 1.16 \n",
" 2.96 \n",
" 345 \n",
" \n",
" \n",
" 38 \n",
" 1 \n",
" 13.07 \n",
" 1.50 \n",
" 2.10 \n",
" 15.5 \n",
" 98 \n",
" 2.40 \n",
" 2.64 \n",
" 0.28 \n",
" 1.37 \n",
" 3.70 \n",
" 1.18 \n",
" 2.69 \n",
" 1020 \n",
" \n",
" \n",
" 113 \n",
" 0 \n",
" 11.41 \n",
" 0.74 \n",
" 2.50 \n",
" 21.0 \n",
" 88 \n",
" 2.48 \n",
" 2.01 \n",
" 0.42 \n",
" 1.44 \n",
" 3.08 \n",
" 1.10 \n",
" 2.31 \n",
" 434 \n",
" \n",
" \n",
" 11 \n",
" 1 \n",
" 14.12 \n",
" 1.48 \n",
" 2.32 \n",
" 16.8 \n",
" 95 \n",
" 2.20 \n",
" 2.43 \n",
" 0.26 \n",
" 1.57 \n",
" 5.00 \n",
" 1.17 \n",
" 2.82 \n",
" 1280 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Class Alcohol Malic Acid Ash Alcalinity of Ash Magnesium \\\n",
"163 0 12.96 3.45 2.35 18.5 106 \n",
"94 0 11.62 1.99 2.28 18.0 98 \n",
"38 1 13.07 1.50 2.10 15.5 98 \n",
"113 0 11.41 0.74 2.50 21.0 88 \n",
"11 1 14.12 1.48 2.32 16.8 95 \n",
"\n",
" Total Phenols Flavanoids Nonflavanoid phenols Proanthocyanins \\\n",
"163 1.39 0.70 0.40 0.94 \n",
"94 3.02 2.26 0.17 1.35 \n",
"38 2.40 2.64 0.28 1.37 \n",
"113 2.48 2.01 0.42 1.44 \n",
"11 2.20 2.43 0.26 1.57 \n",
"\n",
" Color Intensity Hue OD280/OD315 of diulted wines Proline \n",
"163 5.28 0.68 1.75 675 \n",
"94 3.25 1.16 2.96 345 \n",
"38 3.70 1.18 2.69 1020 \n",
"113 3.08 1.10 2.31 434 \n",
"11 5.00 1.17 2.82 1280 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shuffled_wine = wine.sample(len(wine), replace=False) \n",
"training_set = shuffled_wine.take(np.arange(89))\n",
"training_set.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Class \n",
" Alcohol \n",
" Malic Acid \n",
" Ash \n",
" Alcalinity of Ash \n",
" Magnesium \n",
" Total Phenols \n",
" Flavanoids \n",
" Nonflavanoid phenols \n",
" Proanthocyanins \n",
" Color Intensity \n",
" Hue \n",
" OD280/OD315 of diulted wines \n",
" Proline \n",
" \n",
" \n",
" \n",
" \n",
" 129 \n",
" 0 \n",
" 12.04 \n",
" 4.30 \n",
" 2.38 \n",
" 22.0 \n",
" 80 \n",
" 2.10 \n",
" 1.75 \n",
" 0.42 \n",
" 1.35 \n",
" 2.60 \n",
" 0.79 \n",
" 2.57 \n",
" 580 \n",
" \n",
" \n",
" 98 \n",
" 0 \n",
" 12.37 \n",
" 1.07 \n",
" 2.10 \n",
" 18.5 \n",
" 88 \n",
" 3.52 \n",
" 3.75 \n",
" 0.24 \n",
" 1.95 \n",
" 4.50 \n",
" 1.04 \n",
" 2.77 \n",
" 660 \n",
" \n",
" \n",
" 13 \n",
" 1 \n",
" 14.75 \n",
" 1.73 \n",
" 2.39 \n",
" 11.4 \n",
" 91 \n",
" 3.10 \n",
" 3.69 \n",
" 0.43 \n",
" 2.81 \n",
" 5.40 \n",
" 1.25 \n",
" 2.73 \n",
" 1150 \n",
" \n",
" \n",
" 7 \n",
" 1 \n",
" 14.06 \n",
" 2.15 \n",
" 2.61 \n",
" 17.6 \n",
" 121 \n",
" 2.60 \n",
" 2.51 \n",
" 0.31 \n",
" 1.25 \n",
" 5.05 \n",
" 1.06 \n",
" 3.58 \n",
" 1295 \n",
" \n",
" \n",
" 69 \n",
" 0 \n",
" 12.21 \n",
" 1.19 \n",
" 1.75 \n",
" 16.8 \n",
" 151 \n",
" 1.85 \n",
" 1.28 \n",
" 0.14 \n",
" 2.50 \n",
" 2.85 \n",
" 1.28 \n",
" 3.07 \n",
" 718 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Class Alcohol Malic Acid Ash Alcalinity of Ash Magnesium \\\n",
"129 0 12.04 4.30 2.38 22.0 80 \n",
"98 0 12.37 1.07 2.10 18.5 88 \n",
"13 1 14.75 1.73 2.39 11.4 91 \n",
"7 1 14.06 2.15 2.61 17.6 121 \n",
"69 0 12.21 1.19 1.75 16.8 151 \n",
"\n",
" Total Phenols Flavanoids Nonflavanoid phenols Proanthocyanins \\\n",
"129 2.10 1.75 0.42 1.35 \n",
"98 3.52 3.75 0.24 1.95 \n",
"13 3.10 3.69 0.43 2.81 \n",
"7 2.60 2.51 0.31 1.25 \n",
"69 1.85 1.28 0.14 2.50 \n",
"\n",
" Color Intensity Hue OD280/OD315 of diulted wines Proline \n",
"129 2.60 0.79 2.57 580 \n",
"98 4.50 1.04 2.77 660 \n",
"13 5.40 1.25 2.73 1150 \n",
"7 5.05 1.06 3.58 1295 \n",
"69 2.85 1.28 3.07 718 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_set = shuffled_wine.take(np.arange(89, 178))\n",
"test_set.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll train the classifier using the 89 wines in the training set, and evaluate how well it performs on the test set. To make our lives easier, we'll write a function to evaluate a classifier on every wine in the test set:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def count_zero(array):\n",
" \"\"\"Counts the number of 0's in an array\"\"\"\n",
" return len(array) - np.count_nonzero(array)\n",
"\n",
"def count_equal(array1, array2):\n",
" \"\"\"Takes two numerical arrays of equal length\n",
" and counts the indices where the two are equal\"\"\"\n",
" return count_zero(array1 - array2)\n",
"\n",
"def evaluate_accuracy(training, test, k):\n",
" test_attributes = test.drop(columns=['Class'])\n",
" def classify_testrow(row):\n",
" return classify(training, row, k)\n",
" c = test_attributes.apply(classify_testrow, axis=1)\n",
" return count_equal(c, test['Class']) / len(test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now for the grand reveal -- let's see how we did. We'll arbitrarily use $k=5$."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9101123595505618"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"evaluate_accuracy(training_set, test_set, 5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The accuracy rate isn't bad at all for a simple classifier."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Breast Cancer Diagnosis\n",
"Now I want to do an example based on diagnosing breast cancer. I was inspired by Brittany Wenger, who won the Google national science fair in 2012 a 17-year old high school student. Here's Brittany:\n",
"\n",
"![Brittany Wenger](../../images/BrittanyWagner.jpg)\n",
"\n",
"Brittany's [science fair project](https://sites.google.com/a/googlesciencefair.com/science-fair-2012-project-64a91af142a459cfb486ed5cb05f803b2eb41354-1333130785-87/home) was to build a classification algorithm to diagnose breast cancer. She won grand prize for building an algorithm whose accuracy was almost 99%. \n",
"\n",
"Let's see how well we can do, with the ideas we've learned in this course.\n",
"\n",
"So, let me tell you a little bit about the data set. Basically, if a woman has a lump in her breast, the doctors may want to take a biopsy to see if it is cancerous. There are several different procedures for doing that. Brittany focused on fine needle aspiration (FNA), because it is less invasive than the alternatives. The doctor gets a sample of the mass, puts it under a microscope, takes a picture, and a trained lab tech analyzes the picture to determine whether it is cancer or not. We get a picture like one of the following:\n",
"\n",
"![benign](../../images/benign.png)\n",
"\n",
"![cancer](../../images/malignant.png)\n",
"\n",
"Unfortunately, distinguishing between benign vs malignant can be tricky. So, researchers have studied the use of machine learning to help with this task. The idea is that we'll ask the lab tech to analyze the image and compute various attributes: things like the typical size of a cell, how much variation there is among the cell sizes, and so on. Then, we'll try to use this information to predict (classify) whether the sample is malignant or not. We have a training set of past samples from women where the correct diagnosis is known, and we'll hope that our machine learning algorithm can use those to learn how to predict the diagnosis for future samples.\n",
"\n",
"We end up with the following data set. For the \"Class\" column, 1 means malignant (cancer); 0 means benign (not cancer)."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Clump Thickness \n",
" Uniformity of Cell Size \n",
" Uniformity of Cell Shape \n",
" Marginal Adhesion \n",
" Single Epithelial Cell Size \n",
" Bare Nuclei \n",
" Bland Chromatin \n",
" Normal Nucleoli \n",
" Mitoses \n",
" Class \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 5 \n",
" 4 \n",
" 4 \n",
" 5 \n",
" 7 \n",
" 10 \n",
" 3 \n",
" 2 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 2 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 6 \n",
" 8 \n",
" 8 \n",
" 1 \n",
" 3 \n",
" 4 \n",
" 3 \n",
" 7 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 1 \n",
" 1 \n",
" 3 \n",
" 2 \n",
" 1 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 5 \n",
" 8 \n",
" 10 \n",
" 10 \n",
" 8 \n",
" 7 \n",
" 10 \n",
" 9 \n",
" 7 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 6 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 10 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 7 \n",
" 2 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 8 \n",
" 2 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 5 \n",
" 0 \n",
" \n",
" \n",
" 9 \n",
" 4 \n",
" 2 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Clump Thickness Uniformity of Cell Size Uniformity of Cell Shape \\\n",
"0 5 1 1 \n",
"1 5 4 4 \n",
"2 3 1 1 \n",
"3 6 8 8 \n",
"4 4 1 1 \n",
"5 8 10 10 \n",
"6 1 1 1 \n",
"7 2 1 2 \n",
"8 2 1 1 \n",
"9 4 2 1 \n",
"\n",
" Marginal Adhesion Single Epithelial Cell Size Bare Nuclei \\\n",
"0 1 2 1 \n",
"1 5 7 10 \n",
"2 1 2 2 \n",
"3 1 3 4 \n",
"4 3 2 1 \n",
"5 8 7 10 \n",
"6 1 2 10 \n",
"7 1 2 1 \n",
"8 1 2 1 \n",
"9 1 2 1 \n",
"\n",
" Bland Chromatin Normal Nucleoli Mitoses Class \n",
"0 3 1 1 0 \n",
"1 3 2 1 0 \n",
"2 3 1 1 0 \n",
"3 3 7 1 0 \n",
"4 3 1 1 0 \n",
"5 9 7 1 1 \n",
"6 3 1 1 0 \n",
"7 3 1 1 0 \n",
"8 1 1 5 0 \n",
"9 2 1 1 0 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"patients = pd.read_csv(path_data + 'breast-cancer.csv').drop(columns=['ID'])\n",
"patients.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we have 9 different attributes. I don't know how to make a 9-dimensional scatterplot of all of them, so I'm going to pick two and plot them:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Class \n",
" Clump Thickness \n",
" Uniformity of Cell Size \n",
" Uniformity of Cell Shape \n",
" Marginal Adhesion \n",
" Single Epithelial Cell Size \n",
" Bare Nuclei \n",
" Bland Chromatin \n",
" Normal Nucleoli \n",
" Mitoses \n",
" Color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 5 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 1 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" gold \n",
" \n",
" \n",
" 1 \n",
" 0 \n",
" 5 \n",
" 4 \n",
" 4 \n",
" 5 \n",
" 7 \n",
" 10 \n",
" 3 \n",
" 2 \n",
" 1 \n",
" gold \n",
" \n",
" \n",
" 2 \n",
" 0 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 2 \n",
" 3 \n",
" 1 \n",
" 1 \n",
" gold \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Class Clump Thickness Uniformity of Cell Size Uniformity of Cell Shape \\\n",
"0 0 5 1 1 \n",
"1 0 5 4 4 \n",
"2 0 3 1 1 \n",
"\n",
" Marginal Adhesion Single Epithelial Cell Size Bare Nuclei \\\n",
"0 1 2 1 \n",
"1 5 7 10 \n",
"2 1 2 2 \n",
"\n",
" Bland Chromatin Normal Nucleoli Mitoses Color \n",
"0 3 1 1 gold \n",
"1 3 2 1 gold \n",
"2 3 1 1 gold "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"color_table = pd.DataFrame(\n",
" {'Class':np.array([1, 0]),\n",
" 'Color':np.array(['darkblue', 'gold'])}\n",
")\n",
"patients_with_colors = pd.merge(patients, color_table, on='Class')\n",
"\n",
"patent_label = patients_with_colors.pop('Class')\n",
"\n",
"patients_with_colors.insert(0, 'Class', patent_label)\n",
"\n",
"patients_with_colors.head(3)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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g4NLMgcRERERkYbBJnXr1q0AgOHDh0OSJM3rlxkxgo+UIyIiIqLiMdikTpgwAZIkwc/PD9bW1pgwYcJLNyZJEptUIiIiIio2g03q77//DgCwtrbWek1EREREVNIMNqlubm6FviYiIiIiKilGT5x60eXLlzU39a9VqxYaNWoESZJe8i4iIiIiIuMUqUndvXs35syZg6SkJK169erVMWfOHIOPTCUiIiIiKgqjm9QtW7Zg4sSJ8Pb2xty5c+Hl5QW1Wo1r165h8+bNCAwMxJMnTzBq1KiSzEtEREREZsDoJnXlypVo1aoVDh48CFtbW61l/v7+eOONN7By5Uo2qURERERUbBbGrnj79m0MHTpUp0EFAFtbWwwbNkznMgAiIiIioldhdJNav359JCcnG1yelJSEevXqmSQUEREREZk3o5vUefPmYdOmTdi7d6/Ost27d2Pz5s345JNPTBqOiIiIiMyT0dekhoaGwtnZGePGjUNwcDA8PDwgSRLi4+Nx7949eHp64r///S/++9//at4jSRJ27NhRIsGJiIiI6J/L6Cb1ypUrkCQJNWvWBADN9ac2NjaoWbMmcnJycPXqVa338N6pRERERPQqjG5SL126VJI5iIiIiIg0jL4mlYiIiIiotBTapK5fvx7x8fGa1yqVCleuXMHjx4911j1//jymT59u+oREREREZHYKbVKnT5+Oc+fOaV4rlUp06NABv/76q866sbGxWL9+vekTEhEREZHZKbRJVavVRtWIiIiIiEypTF2TumLFCigUCkybNk3uKERERERUgspMk3r27Fls2rQJjRo1kjtKkUi5CSif7o+K9/uifLo/pNwEuSNpsciOht2dpmheoRvs7jSFRXa03JG0fLNuPVLPekB1pRpSz3rgm3ViXVLy+af7cWBdN2T+MRwH1nXD55/ulzuSlmnTTkKhCNf8mjbtpNyRtERHJ6Fp063o1i0KTZtuRXS0OI9W7u+7GgfWdcO5fa1wYF039PddLXckLQsWnIWjYzjatDkBR8dwLFhwVu5IWvL3rZvbV8LtWwDYvTsO1atvRNu2J1C9+kbs3h0ndyQiKsDoW1DJKSMjA/7+/ggNDcXSpUvljmM0KTcBFdMGwvLZ9bzCU8DyaQweOu2D2spd3nD4X4OaPgAScvP+uaLKgl36AGQ5RkBl21HuePhm3Xr4954O63IqAICj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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"pwc_darkblue = patients_with_colors[patients_with_colors['Color'] == 'darkblue']\n",
"pwc_gold = patients_with_colors[patients_with_colors['Color'] == 'gold']\n",
"\n",
"fig, ax = plt.subplots(figsize=(7,6))\n",
"\n",
"ax.scatter(pwc_darkblue['Bland Chromatin'], \n",
" pwc_darkblue['Single Epithelial Cell Size'], \n",
" label='Color=darkblue', \n",
" color='darkblue')\n",
"\n",
"ax.scatter(pwc_gold['Bland Chromatin'], \n",
" pwc_gold['Single Epithelial Cell Size'], \n",
" label='Color=gold', \n",
" color='gold')\n",
"\n",
"x_label = 'Bland Chromatin'\n",
"\n",
"y_label = 'Single Epithelial Cell Size'\n",
"\n",
"plt.ylabel(y_label)\n",
"\n",
"plt.xlabel(x_label)\n",
"\n",
"ax.legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n",
"\n",
"plt.xlim(0, 11)\n",
"plt.ylim(0, 11);\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Oops. That plot is utterly misleading, because there are a bunch of points that have identical values for both the x- and y-coordinates. To make it easier to see all the data points, I'm going to add a little bit of random jitter to the x- and y-values. Here's how that looks:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"tags": [
"remove_input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Bland Chromatin (jittered) \n",
" Single Epithelial Cell Size (jittered) \n",
" Class \n",
" Color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 3.083564 \n",
" 1.974698 \n",
" 0 \n",
" gold \n",
" \n",
" \n",
" 1 \n",
" 3.018529 \n",
" 7.027071 \n",
" 0 \n",
" gold \n",
" \n",
" \n",
" 2 \n",
" 2.986660 \n",
" 1.905804 \n",
" 0 \n",
" gold \n",
" \n",
" \n",
" 3 \n",
" 3.093251 \n",
" 3.062657 \n",
" 0 \n",
" gold \n",
" \n",
" \n",
" 4 \n",
" 3.055900 \n",
" 2.125152 \n",
" 0 \n",
" gold \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Bland Chromatin (jittered) Single Epithelial Cell Size (jittered) Class \\\n",
"0 3.083564 1.974698 0 \n",
"1 3.018529 7.027071 0 \n",
"2 2.986660 1.905804 0 \n",
"3 3.093251 3.062657 0 \n",
"4 3.055900 2.125152 0 \n",
"\n",
" Color \n",
"0 gold \n",
"1 gold \n",
"2 gold \n",
"3 gold \n",
"4 gold "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def randomize_column(a):\n",
" return a + np.random.normal(0.0, 0.09, size=len(a))\n",
"\n",
"jittered = pd.DataFrame(\n",
" {'Bland Chromatin (jittered)':randomize_column(patients['Bland Chromatin']),\n",
" 'Single Epithelial Cell Size (jittered)':randomize_column(patients['Single Epithelial Cell Size']),\n",
" 'Class':patients['Class']})\n",
"\n",
"\n",
"jwc = pd.merge(jittered, color_table, on='Class')\n",
"\n",
"jwc.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqkAAAGTCAYAAAALL4uRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAACE9UlEQVR4nO3deVhUZf8G8HsYQHZBZFNkQMR9j173NX+RueRame2FS9mileLblC2UYouZlhpqWVlvaopbaotLrhVmqbmh4CibIrLvs/z+IEaGOTMMMDPnIPfnurqueM6ZM1/OzDg3z3me58hyc3N1ICIiIiKSEAexCyAiIiIiqokhlYiIiIgkhyGViIiIiCSHIZWIiIiIJIchlYiIiIgkhyGViIiIiCSHIZWIiIiIJIchlQAASUlJYpfQqPH8NQzPX/3x3DUMzx+RdDGkEhEREZHkMKQSERERkeQwpBIRERGR5DCkEhEREZHkOIpdABEREYlHrVajqKhI7DKoCXJ3d4ejo+koypBKRETURKnVahQUFMDb2xsymUzscqgJ0el0yM3Nhaenp8mgysv9RERETVRRUREDKolCJpPB29vbbC8+QyoREVETxoBKYqntvceQSkRERESSw5BKRERERJLDkEpEREREksOQSkRERE3S+vXr0bp1a7HLAAAsW7YM3bp1a/BxDh48CG9vb2RnZwtuV6lU8Pb2xokTJ0wew5J97IEhlYiIiBql69evY968eejZsyf8/f3RqVMnTJo0CT/++KPYpZEVcJ1UIiIianRUKhXuueceeHh4YMGCBejatSu0Wi0OHDiAOXPm4PTp03apo7y8HM7OznZ5rtqUl5eLXYJVsSeViIiIGkSlykd09F6MHr0D0dF7oVLl2/w5X375Zeh0Ouzbtw/jx49HREQEOnTogGnTpuHQoUMAgKtXr2Lq1KkIDg5GcHAwHn74YaSlpZk97ueff45evXrBz88PvXr1wrp16wy2e3t7Iz4+Hg8//DBatWqFt956q171L126FO3bt0fr1q0xffp0FBYWGmz/888/MX78eLRt2xZt2rTBPffcg99//73OtZSVlWHq1KkYPHgwsrKy9O0XL17EPffcg4CAANx5553Yu3evyVqFhhAIDQk4d+4c7r//fgQHB6Ndu3Z46qmncO3atTqfmyoMqURERFRvKlU+xo3bhY0bL+HQoQxs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detWsctrkIKCArz//vsYMmQI2rRpg4CAAERGRuKVV17BpUuXxC7P5o4ePYqFCxciNzfXbs/52WefQSaTYcqUKXV+7HvvvYcdO3YYtZ85cwYLFy40CLlSN3v2bCQkJODkyZNil0JEVC8MqSQZMTExWLVqFVauXIkXX3wRBQUFeOyxx7Bp0yaxS6uXy5cvY/DgwXj33XcRFhYGpVKJ9957D1FRUdixYwf69u0rdok2d+zYMcTFxSEvL89o25YtW7BlyxarPp9arcann36Khx9+GM7Ozvr2Bx98EJmZmQgJCdG3ffzxx0hMTDR4/Pvvv4+dO3caHffs2bOIi4vDlStXrFqvLfXq1Qs9evTA8uXLxS6FiKheHMUugKjKXXfdhTvvvFP/8+OPP44OHTpg06ZNje4e2mq1Gg8//DAyMzOxbds2DBw40GD7a6+9hrfeessqz6XT6VBWVtbobodZPURay08//YRr165h4sSJBu1yuRxyudygzcnJyerPX1fFxcVwc3Oz2fEnTJiAhQsXIj8/H15eXjZ7HiIiW2BPKkmWp6cn3Nzcag0T5eXleOeddzB06FAoFAoEBgbirrvuwg8//GC0r7e3N2bPno2ffvoJgwYNQkBAAHr37i3YW5uUlIQJEyYgKCgI7du3x2uvvYaKigqLat+2bRtOnz6NOXPmGAVUAHBxccG7775r1H79+nU88cQTaNOmDRQKBV544QWUlpYK/g4JCQno378//P398f333wMArl69iujoaLRt2xYBAQEYOHAgvv32W4PHq1QqeHt7Y8mSJVi3bh169eqFoKAgjBkzBpcvXwYALF++HN26dUNgYCAmTpyIzMxMg2McOXIEjz/+OLp27Qp/f3907NgRL774osFl/YULF+LNN98EAPTo0UM/lKNq3GTNManV6/r2229x5513wt/fH/3798f+/fstOu87duxAUFAQOnToYNBuyZhUb29vlJWV4dtvv9XXOmrUKKxfvx5PPfUUAGDMmDH6bevXr9c/9sSJE3jggQcQEhKCwMBADB8+HLt37xas4ddff0VMTAzat2+PVq1a1ekYQN3el0OGDEFJSQn27t1r0fkjIpIS9qSSZOTn5yM7OxsAkJWVhbVr1yI7OxsPPvig2ccVFBTg888/x/jx4/Hwww+jpKQEGzduxNSpU7Fp0ybcddddBvv/8ccf2LlzJ554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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"jwc_darkblue = jwc[jwc['Color'] == 'darkblue']\n",
"jwc_gold = jwc[jwc['Color'] == 'gold']\n",
"\n",
"fig, ax = plt.subplots(figsize=(7,6))\n",
"\n",
"ax.scatter(jwc_darkblue['Bland Chromatin (jittered)'], \n",
" jwc_darkblue['Single Epithelial Cell Size (jittered)'], \n",
" label='Color=darkblue', \n",
" color='darkblue')\n",
"\n",
"ax.scatter(jwc_gold['Bland Chromatin (jittered)'], \n",
" jwc_gold['Single Epithelial Cell Size (jittered)'], \n",
" label='Color=gold', \n",
" color='gold')\n",
"\n",
"x_label = 'Bland Chromatin (jittered)'\n",
"\n",
"y_label = 'Single Epithelial Cell Size (jittered)'\n",
"\n",
"plt.ylabel(y_label)\n",
"\n",
"plt.xlabel(x_label)\n",
"\n",
"ax.legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n",
"\n",
"plt.xlim(0, 11)\n",
"plt.ylim(0, 11);\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For instance, you can see there are lots of samples with chromatin = 2 and epithelial cell size = 2; all non-cancerous.\n",
"\n",
"Keep in mind that the jittering is just for visualization purposes, to make it easier to get a feeling for the data. We're ready to work with the data now, and we'll use the original (unjittered) data."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we'll create a training set and a test set. The data set has 683 patients, so we'll randomly permute the data set and put 342 of them in the training set and the remaining 341 in the test set."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"shuffled_patients = patients.sample(683, replace=False) \n",
"training_set = shuffled_patients.take(np.arange(342))\n",
"test_set = shuffled_patients.take(np.arange(342, 683))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's stick with 5 nearest neighbors, and see how well our classifier does."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9706744868035191"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"evaluate_accuracy(training_set, test_set, 5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Over 96% accuracy. Not bad! Once again, pretty darn good for such a simple technique.\n",
"\n",
"As a footnote, you might have noticed that Brittany Wenger did even better. What techniques did she use? One key innovation is that she incorporated a confidence score into her results: her algorithm had a way to determine when it was not able to make a confident prediction, and for those patients, it didn't even try to predict their diagnosis. Her algorithm was 99% accurate on the patients where it made a prediction -- so that extension seemed to help quite a bit."
]
}
],
"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.6.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}