{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lab 1: Introduction to Machine Learning\n", "\n", "This lab introduces some basic concepts of machine learning with R. In this lab you will use the K-Nearest Neighbor (KNN) algorithm to classify the species of iris flowers, given meaurements of flower characteristics. By completing this lab you will have an overview of an end-to-end machine learning modeling process. \n", "\n", "By the completion of this lab, you will:\n", "1. Follow and understand a complete end-to-end machine learning process including data exploration, data preparation, modeling, and model evaluation. \n", "2. Develop a basic understanding of the principles of machine learning and associated terminology. \n", "3. Understand the basic process for evaluating machine learning models. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview of KNN classification\n", "\n", "Before discussing a specific algorithm, it helps to know a bit of machine learning terminology. In supervised machine learning a set of ***cases*** are used to ***train***, ***test*** and ***evaluate*** the model. Each case is comprised of the values of one or more ***features*** and a ***label*** value. The features are variables used by the model to ***predict** the value of the label. Minimizing the ***errors*** between the true value of the label and the prediction supervises the training of this model. Once the model is trained and tested, it can be evaluated based on the accuracy in predicting the label of a new set of cases. \n", "\n", "In this lab you will use randomly selected cases to first train and then evaluate a k-nearest-neighbor (KNN) machine learning model. The goal is to predict the type or class of the label, which makes the machine learning model a ***classification*** model. \n", "\n", "The k-nearest-neighbor algorithm is conceptually simple. In fact, there is no formal traning step. Given a known set of cases, a new case is classified by majority vote of the K (where $k = 1, 2, 3$, etc.) points nearest to the values of the new case; that is, the nearest neighbors of the new case. \n", "\n", "The schematic figure below illustrates the basic concepts of a KNN classifier. In this case there are two features, the values of one shown on the horrizontal axis and the values of the other shown on the vertical axis. The cases are shown on the diagram as one of two classes, red triangles and blue circles. To summarize, each case has a value for the two features, and a class. The goal of thee KNN algorithm is to classify cases with unknown labels. \n", "\n", "Continuing with the example, on the left side of the diagram the $K = 1$ case is illustrated. The nearest neighbor is a red triangle. Therefore, this KNN algorithm will classify the unknown case, '?', as a red triangle. On the right side of the diagram, the $K = 3$ case is illustrated. There are three near neighbors within the circle. The majority of nearest neighbors for $K = 3$ are the blue circles, so the algorithm classifies the unknown case, '?', as a blue circle. Notice that class predicted for the unknown case changes as K changes. This behavior is inherent in the KNN method. \n", "\n", "![](img/KNN.jpg)\n", "
**KNN for k = 1 and k = 3**
\n", "\n", "There are some additional considerations in creating a robust KNN algorithm. These will be addressed later in this course. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Examine the data set\n", "\n", "In this lab you will work with the Iris data set. This data set is famous in the history of statistics. The first publication using these data in statistics by the pioneering statistician Ronald A Fisher was in his 1936. Fisher proposed an algorthm to classify the species of iris flowers from physical measurements of their characteristics. The data set has been used as a teaching example ever since. \n", "\n", "Now, you will load and examine these data which are in the statsmodels.api package. Execute the code in the cell below and examine the first few rows of the data frame. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\StevePC2\\Anaconda3\\lib\\site-packages\\statsmodels\\compat\\pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", " from pandas.core import datetools\n" ] }, { "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", "
Sepal_LengthSepal_WidthPetal_LengthPetal_WidthSpecies
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
\n", "
" ], "text/plain": [ " Sepal_Length Sepal_Width Petal_Length Petal_Width Species\n", "0 5.1 3.5 1.4 0.2 setosa\n", "1 4.9 3.0 1.4 0.2 setosa\n", "2 4.7 3.2 1.3 0.2 setosa\n", "3 4.6 3.1 1.5 0.2 setosa\n", "4 5.0 3.6 1.4 0.2 setosa" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from statsmodels.api import datasets\n", "iris = datasets.get_rdataset(\"iris\")\n", "iris.data.columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width', 'Species']\n", "iris.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are four features, containing the dimensions of parts of the iris flower structures. The label column is the Species of the flower. The goal is to create and test a KNN algorithm to correctly classify the species. \n", "\n", "Next, you will execute the code in the cell below to show the data types of each column. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Sepal_Length float64\n", "Sepal_Width float64\n", "Petal_Length float64\n", "Petal_Width float64\n", "Species object\n", "dtype: object" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris.data.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The features are all numeric, and the label is a categorical string variable.\n", "\n", "Next, you will determine the number of unique categories, and number of cases for each category, for the lable variable, Species. Execute the code in the cell below annd examine the results. " ] }, { "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", "
count
Species
setosa50
versicolor50
virginica50
\n", "
" ], "text/plain": [ " count\n", "Species \n", "setosa 50\n", "versicolor 50\n", "virginica 50" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris.data['count'] = 1\n", "iris.data[['Species', 'count']].groupby('Species').count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see there are three species of iris, each with 50 cases. \n", "\n", "Next, you will create some plots to see how the classes might, or might not, be well seperated by the value of the features. In an idea case, the lable classes will be perfectly separated by one or more of the feature pairs. In the real-world this ideal situation will rarely, if ever, be the case.\n", " \n", "There are five possible pair-wise scatter plots of these four features. For now, we will just create scatter plots of two variable pairs. Execute the code in the cell below and examine the resulting plots.\n", "***\n", "**Note:** Data visualization and the Seaborn package are covered in another lesson.\n", "***" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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zQ9/+MPe5513XuWkSZMODRs2rP/27ds3eDweHDx40NuxY0d/WVmZt0OHDn6Px4NHH3204+bNm1OfeeaZqN8uKrRI2co1r3CaHvkoLmxL5V71JAABvEmAx3yEmNNDWEiVt6vdC5FTPLNiRxefRzTV5w2ICFJ93oDPI/rMih1dmrPe888/v2rFihWZkydPzl60aFHG9u3bfV988UXaZZddlpObmzvg4Ycf7rpnz55TThWuW7cutXv37jWDBg2qAYCCgoJDH330Uev27dv7U1JSAjfeeGOv559/vm1GRkYAAHbs2JGcn59/Tk5OzoCZM2dMDk+hAAAgAElEQVR22bJlS1roOu1wxtOGIvIXhA9SAqBt1EdEtrKtZUfNccAT8v+BeI3poSy0hrGr3QuRU+wtr0ppnZLU4DRbSpInsLe8qlltIQYNGlSzZs2aTa+//nqbX/7yl9kjR46s6Nu3b9XatWu3NPa+052N8/l8WLt27eY333wz8+WXX243a9asTqtWrSq+8847e9599937xowZU/7222+3nj59erfmjDtSkRx5FQL4LMxPIYC77Bsa2cG2VO6UDPNUYRD1G9NDWUiVt6vdC5FTdG2TVlNTF2jwt7imLuDp2iatWf9C27lzp69169aB22+//fDUqVP3FxYWtjp8+HDSBx980Aow7j5fWFiYCgAZGRn+8vJyLwAMGTKkurS0NHnDhg0pADBv3rwO+fn5x8rLyz2HDx/23nDDDeVPP/10yebNm9MB4NixY96ePXvWAsDcuXM7NGfMVpwxeKnq84391C9nHqGRw9mWyn3hHQAU8NcBAfMRak4PYSFV3q52L0ROcUv+WftqAyrVtX6PqqK61u+pDajckn/Wvuas97PPPksbMmRI/9zc3AEzZszo+vvf/37Pyy+//OX999/fvV+/fgMGDhw4YNmyZRkAMG7cuIN33XVXr9zc3AGBQABPP/30zh//+Mdn5+TkDPB4PLj33nvLjh496h01atQ5OTk5A/Lz8/s98MADJQDwy1/+cs9PfvKTs4cOHdqvQ4cOMbshcLMSNhqsSGSNqp4flZWdARM2mse2G8cunWFc46rPNrzwjlOTNepZaA3jtmxDatGadFd5O7INE02TW6KcyemCl4i0BfAsgHNhXDv7map+EjRfADwO4PsAKgEUqOqaxj6LwYuIHCquLVESWZNbojTD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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "def plot_iris(iris, col1, col2):\n", " import seaborn as sns\n", " import matplotlib.pyplot as plt\n", " sns.lmplot(x = col1, y = col2, \n", " data = iris, \n", " hue = \"Species\", \n", " fit_reg = False)\n", " plt.xlabel(col1)\n", " plt.ylabel(col2)\n", " plt.title('Iris species shown by color')\n", "plot_iris(iris.data, 'Petal_Width', 'Sepal_Length')\n", "plot_iris(iris.data, 'Sepal_Width', 'Sepal_Length')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Examine these results noticing the spearation, or overlap, of the label values. Which pairs of classes are well seperated and which pairs show overlap?\n", "\n", "ANS: Versicolor and Virginica show overlap. All other pairs are well separated. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prepare the data set\n", "\n", "Data preparation is an important step before traning any machine learning model. These data require only two preparation steps:\n", "- Scale the numeric values of the features. It is important that numeric features used to train machine learning models have a similar range of values. Otherwise, features which happen to have large numeric values may dominate model training, even if other features with smaller numeric values are more informative. In this case Zscore normalization is used. This normalization process scales each feature so that the mean is 0 and the variance is 1.0. \n", "- Split the dataset into randomly sampled training and evaluation data sets. The random selection of cases seeks to limit the leakage of information between the training and evaluation cases.\n", "\n", "The code in the cell below normalizes the features by these steps:\n", "- The scale funnction from scikit-learn.preprocessing is used to normalize the features.\n", "- Column names are assigned to the resulting data frame. \n", "- A statitical summary of the data frame is then printed. \n", "\n", "***\n", "**Note:** Data preparation with scikit-learn is covered in another lesson. \n", "***\n", "\n", "Execute this code and examine the results. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Sepal_Length Sepal_Width Petal_Length Petal_Width\n", "count 1.500000e+02 1.500000e+02 1.500000e+02 1.500000e+02\n", "mean -2.775558e-16 -9.695948e-16 -8.652338e-16 -4.662937e-16\n", "std 1.003350e+00 1.003350e+00 1.003350e+00 1.003350e+00\n", "min -1.870024e+00 -2.433947e+00 -1.567576e+00 -1.447076e+00\n", "25% -9.006812e-01 -5.923730e-01 -1.226552e+00 -1.183812e+00\n", "50% -5.250608e-02 -1.319795e-01 3.364776e-01 1.325097e-01\n", "75% 6.745011e-01 5.586108e-01 7.627583e-01 7.906707e-01\n", "max 2.492019e+00 3.090775e+00 1.785832e+00 1.712096e+00\n" ] } ], "source": [ "from sklearn.preprocessing import scale\n", "import pandas as pd\n", "num_cols = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']\n", "iris_scaled = scale(iris.data[num_cols])\n", "iris_scaled = pd.DataFrame(iris_scaled, columns = num_cols)\n", "print(iris_scaled.describe())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Examine these results. You can see the mean and varience of each column in the list printed. The mean is zero and the variance approximately 1.0.\n", "\n", "The methods in the scikit-learn package requires numeric numpy arrays as arguments. Therefore, the strings indicting species must be re-coded as numbers. The code in the cell below does just this using a dictionary lookup. Execute this code and examine the head of the data frame. " ] }, { "cell_type": "code", "execution_count": 6, "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", "
Sepal_LengthSepal_WidthPetal_LengthPetal_WidthSpecies
0-0.9006811.019004-1.340227-1.3154440
1-1.143017-0.131979-1.340227-1.3154440
2-1.3853530.328414-1.397064-1.3154440
3-1.5065210.098217-1.283389-1.3154440
4-1.0218491.249201-1.340227-1.3154440
\n", "
" ], "text/plain": [ " Sepal_Length Sepal_Width Petal_Length Petal_Width Species\n", "0 -0.900681 1.019004 -1.340227 -1.315444 0\n", "1 -1.143017 -0.131979 -1.340227 -1.315444 0\n", "2 -1.385353 0.328414 -1.397064 -1.315444 0\n", "3 -1.506521 0.098217 -1.283389 -1.315444 0\n", "4 -1.021849 1.249201 -1.340227 -1.315444 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "levels = {'setosa':0, 'versicolor':1, 'virginica':2}\n", "iris_scaled['Species'] = [levels[x] for x in iris.data['Species']]\n", "iris_scaled.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, you will split the dataset into a test and evaluation sub-sets. The code in the cell below randomly splits the dataset into training and testing subsets. The features and lables are then seperated into numpy arrays. The dimension of each array is printed as a check. Execute this code to create these subsets. \n", "\n", "***\n", "**Note:** Spliting data sets for machine learning with scikit-learn is discussed in another lesson.\n", "***" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(75, 4)\n", "(75,)\n", "(75, 4)\n", "(75,)\n" ] } ], "source": [ "## Split the data into a training and test set by Bernoulli sampling\n", "from sklearn.model_selection import train_test_split\n", "import numpy as np\n", "np.random.seed(3456)\n", "iris_split = train_test_split(np.asmatrix(iris_scaled), test_size = 75)\n", "iris_train_features = iris_split[0][:, :4]\n", "iris_train_labels = np.ravel(iris_split[0][:, 4])\n", "iris_test_features = iris_split[1][:, :4]\n", "iris_test_labels = np.ravel(iris_split[1][:, 4])\n", "print(iris_train_features.shape)\n", "print(iris_train_labels.shape)\n", "print(iris_test_features.shape)\n", "print(iris_test_labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train and evaluate the KNN model\n", "\n", "With some understanding of the relationships between the features and the label and preparation of the data completed you will now train and evaluate a $K = 3$ model. The code in the cell below does the following:\n", "- The KNN model is defined as having $K = 3$.\n", "- The model is trained using the fit method with the feature and label numpy arrays as arguments.\n", "- Displays a summary of the model. \n", "\n", "Execute this code and examine the summary of these results.\n", "\n", "\n", "***\n", "**Note:** Constructing machine learning models with scikit-learn is covered in another lesson.\n", "***" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_jobs=1, n_neighbors=3, p=2,\n", " weights='uniform')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Defin and train the KNN model\n", "from sklearn.neighbors import KNeighborsClassifier\n", "KNN_mod = KNeighborsClassifier(n_neighbors = 3)\n", "KNN_mod.fit(iris_train_features, iris_train_labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, you will evaluate this model using the accuracy statistic and a set of plots. The following steps create model predictions and compute accuracy:\n", "- The predict method is used to compute KNN predictions from the model using the test features as an argument. \n", "- The predictions are scored as correct or not using a list comprehension. \n", "- Accuracy is computed as the percentage of the test cases correctly classified. \n", "\n", "Execute this code and examine the results. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96.0\n" ] } ], "source": [ "iris_test = pd.DataFrame(iris_test_features, columns = num_cols)\n", "iris_test['predicted'] = KNN_mod.predict(iris_test_features)\n", "iris_test['correct'] = [1 if x == z else 0 for x, z in zip(iris_test['predicted'], iris_test_labels)]\n", "accuracy = 100.0 * float(sum(iris_test['correct'])) / float(iris_test.shape[0])\n", "print(accuracy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the accuacy of the $K = 3$ model? ANS; 96%\n", "\n", "Now, exectue the code in the cell below and examine plots of the classifications of the iris species. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Done'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "levels = {0:'setosa', 1:'versicolor', 2:'virginica'}\n", "iris_test['Species'] = [levels[x] for x in iris_test['predicted']]\n", "markers = {1:'^', 0:'o'}\n", "colors = {'setosa':'blue', 'versicolor':'green', 'virginica':'red'}\n", "def plot_shapes(df, col1,col2, markers, colors):\n", " import matplotlib.pyplot as plt\n", " import seaborn as sns\n", " ax = plt.figure(figsize=(6, 6)).gca() # define plot axis\n", " for m in markers: # iterate over marker dictioary keys\n", " for c in colors: # iterate over color dictionary keys\n", " df_temp = df[(df['correct'] == m) & (df['Species'] == c)]\n", " sns.regplot(x = col1, y = col2, \n", " data = df_temp, \n", " fit_reg = False, \n", " scatter_kws={'color': colors[c]},\n", " marker = markers[m],\n", " ax = ax)\n", " plt.xlabel(col1)\n", " plt.ylabel(col2)\n", " plt.title('Iris species by color')\n", " return 'Done'\n", "plot_shapes(iris_test, 'Petal_Width', 'Sepal_Length', markers, colors)\n", "plot_shapes(iris_test, 'Sepal_Width', 'Sepal_Length', markers, colors)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "In the plots above color is used to show the predicted class. Correctly classified cases are shown by triangles and incorrectly classified cases are shown by circles. \n", "\n", "Answer the following questions:\n", "1. How many misclassified cases are there? ANS: 3\n", "2. Do the misclassified cases appear to be on the boundary between clasess? ANS: Yes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "\n", "In this lab you have created and evaluated a KNN machine learning classification model. Specifically you have:\n", "1. Loaded and explored the data using visualiztion to deterime if the features seperate the classes.\n", "2. Prepared the data by normalizing the numberic features and randomally sampling into training and testing subsets. \n", "3. Constructing and evaluating the machine learning model. Evaluation was performed by statistically, with the accuracy metric, and with visualization. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }