{
"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",
"\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",
" Sepal_Length | \n",
" Sepal_Width | \n",
" Petal_Length | \n",
" Petal_Width | \n",
" Species | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 5.1 | \n",
" 3.5 | \n",
" 1.4 | \n",
" 0.2 | \n",
" setosa | \n",
"
\n",
" \n",
" | 1 | \n",
" 4.9 | \n",
" 3.0 | \n",
" 1.4 | \n",
" 0.2 | \n",
" setosa | \n",
"
\n",
" \n",
" | 2 | \n",
" 4.7 | \n",
" 3.2 | \n",
" 1.3 | \n",
" 0.2 | \n",
" setosa | \n",
"
\n",
" \n",
" | 3 | \n",
" 4.6 | \n",
" 3.1 | \n",
" 1.5 | \n",
" 0.2 | \n",
" setosa | \n",
"
\n",
" \n",
" | 4 | \n",
" 5.0 | \n",
" 3.6 | \n",
" 1.4 | \n",
" 0.2 | \n",
" setosa | \n",
"
\n",
" \n",
"
\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",
" count | \n",
"
\n",
" \n",
" | Species | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | setosa | \n",
" 50 | \n",
"
\n",
" \n",
" | versicolor | \n",
" 50 | \n",
"
\n",
" \n",
" | virginica | \n",
" 50 | \n",
"
\n",
" \n",
"
\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",
" Sepal_Length | \n",
" Sepal_Width | \n",
" Petal_Length | \n",
" Petal_Width | \n",
" Species | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" -0.900681 | \n",
" 1.019004 | \n",
" -1.340227 | \n",
" -1.315444 | \n",
" 0 | \n",
"
\n",
" \n",
" | 1 | \n",
" -1.143017 | \n",
" -0.131979 | \n",
" -1.340227 | \n",
" -1.315444 | \n",
" 0 | \n",
"
\n",
" \n",
" | 2 | \n",
" -1.385353 | \n",
" 0.328414 | \n",
" -1.397064 | \n",
" -1.315444 | \n",
" 0 | \n",
"
\n",
" \n",
" | 3 | \n",
" -1.506521 | \n",
" 0.098217 | \n",
" -1.283389 | \n",
" -1.315444 | \n",
" 0 | \n",
"
\n",
" \n",
" | 4 | \n",
" -1.021849 | \n",
" 1.249201 | \n",
" -1.340227 | \n",
" -1.315444 | \n",
" 0 | \n",
"
\n",
" \n",
"
\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": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGECAYAAADZfzztAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XuUHGd95vHnGY2UQXYbxTdkfEHGmIshWWMLSIyAxORiowBLFg5hCRhCwmZBEZwEhxD2BLIxyQaTC8EkoAlOJsQhsBsITojWViIbYhlkJMd3I+TYxjed9bQs24qEpBnPb/+o6lJbHs1Mq7r77er6fs7p0+rqrq5fV4/6qbeq3nodEQIAQJJGUhcAABgchAIAoEAoAAAKhAIAoEAoAAAKhAIAoEAoIDnbb7V9deo65mP7dts/1uX3vNf2T3TzPTtc/kdt/3Wq5WPwEAroufl++CLiioj4qX7WdCQi4oURcW3qOoBeIhSQlO3R1DWgc3xvw4tQQF/ZfoftTbb/yPYjkj6aT7suf975cw/bfsz2LbZfNMd73W17t+17bL/1kGV8Kn+P79h+ddt8T7f9Ods7bD9o+xLbi9qe/yXbd+bve4ftc/LpRYvH9ojt37D977Z32v6S7WPz58Zs/3U+/VHb37b9jDlWy0vy5eyy/Re2x/L3uc32a9vqWmy7afvsw6yP19u+yfbjeV0X5NOfaftK24/Yvsv2L83x/bwu3032qO1rbb+g7bl7bX/Q9i2S9hAMw4lQQAovk3S3pBMlfeyQ535K0islPVfSMklvlrTz0DewfZSkP5F0YUQ0JJ0n6aZZlnG8pI9I+nLrR1vShKRpSc+R9OJ8mb+Yv++bJH1U0tslHSPpdbMtX9JaSf9Z0qskPVPSLkmfzp+7SNLTJZ0q6ThJvyzp+3Osj7dK+mlJZ+Sf+3/k0/9K0s+3ve41knZExE06hO2X5q+/WNl6e6Wke/OnvyDpgbzON0r63faQbHuP5+avfb+kEyT9k6R/sL2k7WVvkbRa0rKImJ7jM6GiCAWk8FBEfCoipiPi0B/LKUkNSc+X5Ii4MyJ2HOZ9ZiS9yPbTImJHRNze9tzDkv44IqYi4ouStklanW+xXyjp/RGxJyIelvRHkn4un+8XJX08Ir4dmbsi4nuzLPu/SfpwRDwQEfuVBckb863nKWVh8JyIeCIitkbE43Osj8si4v6IeERZSL4ln/7Xkl5j+5j88dskff4w7/EuSZdHxIaImImIByPiO7ZPlbRK0gcjYl8eKH+ev9eh3izpa/l7TEn6hKSnKQvclj/Ja50r5FBhhAJSuP9wT0TERkmXKdvq/n+217X9KLa/bo+yH7FflrTD9tdsP7/tJQ/Gk6/2+D1lW8rPkrQ4n+dR249K+qyyVouUbd3/+wI+w7MkfaXtPe6U9ISkZyj74b5K0t/afsj2x20vnuO92tdHq05FxEOSNkn6L7aXKQuzKw7zHoer+5mSHomI3Ycs4+TDvLYIwIiYyWtrf+1hvzsMB0IBKcx5ad6I+JOIOFfSC5XtTrn4MK+7KiJ+UtJJkr4jabzt6ZNtu+3xaZIeUvajtl/S8RGxLL8dExEvzF93v7LdOPO5X9muq2Vtt7F8C30qIn47Is5StpX9M8p2Rx3OqbPU2TKhbBfSmyR9MyIenKOe2ep+SNKxthuHLGO293lIWdhJyo7v5LW1v5bLKg85QgEDxfZLbL8s37LeI2mfsi3wQ1/3jPyg6FHKfuT/45DXnShpbX5w9k2SXiDpn/JdUVdL+gPbx+QHjM+w/ap8vj+X9AHb5+YHvZ9j+1l6qs9I+ljrOdsn2H59/u8ft/1D+cHrx5XtTnrKZ2jzXtun5Mc8flPSF9ue+3tJ50h6n7JjBofzOUnvtP3q/DOdbPv5EXG/pOsl/V5+APyHle1qmq3F8SVlu9hena//X1O2bq+fY7kYMoQCBs0xyrb4dynblbFT2b7tQ40o+9F6SNIjyg74vqft+c2SzpTUVLaf/o0R0Tpg/HZJSyTdkS/n/yhrbSgi/nf++r+RtFvZj/KxeqpPSrpS0tW2d0v6lrKD25K0PH/Px5XtVvq6suMDh/M3yoLq7vx2SeuJfN/930k6XdKXD/cGEXGDpHcqOz7yWL7MVpi9RdIKZevqK5I+EhEbZnmPbcpaJZ9Stt5eK+m1EXFgjtoxZMwgOxg2tt8h6RcjYlXqWrrB9m9Jem5E/Py8LwZK4jxjYIDlu5TepdnPFgK6jt1HwIDKO5ndL2l9RHwjdT2oB3YfAQAKtBQAAAVCAQBQqNyB5uOPPz5WrFiRugwAqJStW7c2I+KE+V5XuVBYsWKFtmzZkroMAKgU27Ndw+sp2H0EACgQCgCAAqEAACgQCgCAAqEAACgQCgCAAqEAACgQCgCAAqEAACgQCgCAAqEAACgQCgCAAqEAAAvVbEqrV0s7d6aupGcIBQBYqPFxafNmad261JX0DKEAAAvRbEoTE9Ly5dn9kLYWCAUAWIjxcWlqShoby+6HtLVAKADAfFqthEYje9xoDG1rgVAAgPm0Wgmj+WCVo6ND21ogFABgPhs2SNPT0uTkwdv0dDZ9yFRujGYA6LuNG1NX0De0FAAABUIBAFAgFAAABUIBAFAgFAAABUIBAFAgFAAABUIBAFAgFNA7qa49X7flon9q8B0TCuidVNeer9ty0T81+I4dEalr6MjKlStjy5YtqcvAfJpNadWq7MJh09PSpk3SccexXFRXxb9j21sjYuV8r6OlgN5Ide35ui0X/VOT75iWArqvtUU1NnZwq2rfvt5vWdVtueifIfiOaSkgnVTXnq/bctE/NfqOCQV0X6prz9dtueifGn3H7D4CgBpg9xEAoGOEAgCgQCgAAAqEAgCgQCgAAAqEAgCgQCgAAAqEAgCgQCgAAApJQ8H2qbavsX2n7dttvy9lPQBQd6OJlz8t6dci4kbbDUlbbW+IiDsS1wUAtZS0pRAROyLixvzfuyXdKenklDUBQJ0NzDEF2yskvVjS5rSVAEB9DUQo2D5a0t9Jen9EPD7L8++2vcX2lsnJyf4XCAA1kTwUbC9WFghXRMSXZ3tNRKyLiJURsfKEE07ob4EAUCOpzz6ypM9JujMi/jBlLQCA9C2Fl0t6m6Tzbd+U316TuCYAqK2kp6RGxHWSnLIGAMBBqVsKAIABQigAAAqEAgCgQCgAAAqEAgCgQCgAAAqEAgCgQCgAAAqEAtCu2ZRWr5Z27kxdCZAEoQC0Gx+XNm+W1q1LXQmQBKEAtDSb0sSEtHx5dk9rATVEKAAt4+PS1JQ0Npbd01pADREKgHSwldBoZI8bDVoLqCVCAZAOthJG8wsHj47SWkAtEQqAJG3YIE1PS5OTB2/T09l0oEaSjqcADIyNG1NXAAwEWgpA1dG3Al1EKABVR98KdBGhAFQZfSvQZYQCUGX0rUCXEQpAVdG3Aj1AKABVRd8K9AChAFQVfSvQA/RTAKqKvhXoAVoKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKAIACoQAAKBAKwCBoNqXVq6WdO/s7L3AIQgEYBOPj0ubN0rp1/Z0XOAShAKTWbEoTE9Ly5dl9J1v8ZeYFZkEoAKmNj0tTU9LYWHbfyRZ/mXmBWRAKQEqtLf1GI3vcaCx8i7/MvMBhEApASq0t/dHR7PHo6MK3+MvMCxwGoQCktGGDND0tTU4evE1PZ9N7OS9wGKOpCwBqbePGNPMCh0FLAQBQIBQAAAVCAQBQIBQAAAVCAQBQIBQAAAVCAQBQIBQAAAVCARgAO+/bpm+ffaIeuX976lJQc4QCMABuvWStnr29qVt+Z03qUlBzhAKQ2M77tum0r16jR56+OLuntYCEkoeC7cttP2z7ttS1ACnceslajTwRmlo8qpEngtYCkkoeCpL+UtIFqYsAUmi1EvaNZdem3Dc2SmsBSSUPhYj4hqRHUtcBpNBqJcwsyv4rziwaobWApCpx6Wzb75b0bkk67bTTElcDdM8x192g0ZnQMbv3P2U6kEIlQiEi1klaJ0krV66MxOUAXXPOHbtmnX5Kn+sAWpLvPgIADA5CAWjT3NvU6itWa+fenalLAZJIHgq2vyDpm5KeZ/sB2+9KXRPqa3zruDY/uFnrtq5LXQqQRPJQiIi3RMRJEbE4Ik6JiM+lrgn11Nzb1MTNE1p+9HJN3DxBawG1lDwUgEExvnVcUzNTGhsd09TMFK0F1BKhAOhgK6GxpCFJaixp0FpALREKgA62EkZHsrO0R0dGaS2glggFQNKGuzdoemZak3sni9v0zLQ23L0hdWlAX1Wi8xrQaxsv2pi6BGAg0FLA0EnW16DZlFavlnbWZLkYSh2Fgu3zbP9X229v3XpVGHCkkvU1GB+XNm+W1tVkuRhKjljYpYRsf17SGZJukvREPjkiYm2PapvVypUrY8uWLf1cJCqkubepVZev0ujIqKZnprXpFzbpuKXH9WHBTWnVKml0VJqeljZtko4b4uWicmxvjYiV872uk5bCSkkvj4j3RMSv5Le+BgIwn2R9DcbHpakpaWwsu+/XVnuq5WJodRIKt0la3qtCgLKS9TVoNqWJCamRLVeNRva41/v4Uy0XQ23eULD9D7avlHS8pDtsX2X7ytat9yUCC5Osr0Fra300P5lvdLQ/W+2plouhtpBTUj/R8yqALmjva3Do9A+94kM9XPCGbH/+5ORTp39oCJeLodbJgebfj4gPzjet1zjQDACd68WB5p+cZdqFHcwPABhwCzmm8N9t36psvINb2m73SLql9yWilsp0yCoxbxU7vjEwELppIS2Fv5H0WklX5vet27kR8fM9rA11VqZDVol5q9jxjYGB0E2dHFM4dpbJuyNiqrslzY1jCjVQpkNWiXmr2PEtWc2onF4cU7hR0qSk70ranv/7Hts32j73yMoEZlGmQ1aJeavY8Y2BgdBtnbQUPiPpKxFxVf74pyRdIOlLkj4ZES/rWZVtaCkMudZW89jYwS3nffsWtvVcYt7WFvfY6Fix1b1vel/vt7yrWDMqqSeXuWgFgiRFxNWSXhkR35L0A0dQI/BUZTpklZi3ih3fGBgIvdBJKDxi+4O2n5Xffl3SLtuLJM30qD7UTXuHrNZtejqb3sN5kw2yU8WaMdQ62X10vKSPSFolyZKuk/Tbkh6TdFpE3NWrItux+wgAOtf13UcR0cyvjPriiDg7ItZExGREHOhXICCBKg4ck2reqmJ9oc2CQ8H2c22vs3217Y2tWy+LwwCo4sAxqeatKtYX2nSy++hmSZ+RtFUHB9lRRGztTWmzY/dRH1Vx4JhU81YV66s2enH20XRE/FlE3BARW1u3EjVi0FVx4JhU81YV6wuH6KSl8FFJD0v6iqT9rekR8UhPKjsMWgp9Uqa/QKrlppq3qlhftdKLlsJFki6WdL2yXUhbJfHrPKyqOHBMqnmrivWFWXRy9tHps9ye3cvikFCZ/gKplptq3qpifWEWnew+WirpV5X1SXi37TMlPS8i/rGXBR6K3UcA0Lle7D76C0kHJJ2XP35A0iVHUBsAYEB1EgpnRMTHJU1JUkR8X1nPZmCwMGBN/9B5beh0EgoHbD9NUkiS7TPUdhYSMDAYsKZ/6Lw2dDoJhY9I+r+STrV9haR/kfTrPakKOFLNpjQxIS1fnt13sAXb3NvUxM0TWn70ck3cPEFrYT4l1jUGVydnH22Q9LOS3iHpC5JWKhtwBxgcDFjTP3ReG0oLPvto1pnt+yLitC7WMy/OPsJhMWBN/9B5rXJ6cfbRrMspOT/QPQxY0z90XhtaZUPhyJsZQLcxYE3/0HltaI3O9wLbn9LsP/6WtKzrFQFHauORX8l940VcBb4jJdY1BttCWgpbdPBaR+23LZJ+pXelAUemTF+DI513/fb1esXlr9DSjy3VKy5/hdZvX9/xsoFBMG8oRMTEXLfW6/IWBZBcmb4GRzLv+u3rtWb9Gm3buU37p/dr285tWrN+DcGASip7TKHdy7v4XsARKdPX4EjnvfT6S7XIi/T4/se1ZHSJHt//uBZ5kS69/tIj/RhAMt0MBSC5Mn0NjnTeex69R3sO7FEoNOIRhUJ7DuzRvY/ee4SfAkiHUMDQaG3pN5Y0JEmNJY0Fb/GXmfeUxima3DupRV4kSVrkRZrcO6mTGyeX+DRAGt0MBfosIKkyfQ3KzHvGD56hUGgmZhSR3yt0xg+eUe4DAQl0MxQ+2cX3AjpWpq9BmXnve/w+LRvLzs4+8MQBSdKysWW67/H7yn0gIIF5L3Nh+x80Rye1iHhdt4uaC5e5AIDOdfMyF5+Q9Adz3LAAXKe/A+vXS+efL51+ena/vn+ndpb6nhhbAENgIf0Uvj7XrR9FDgOu079A69dLa9ZIO3ZIxx6b3a9Z07dgKPU9MbYAhkAnYzSfKen3JJ0laaw1PSKe3ZvSZlfF3UetK3C2rr7JlTfncP75WRAcddTBaXv2SCed1PNLK5T6nlpXDW1dMZSrhWLA9GqM5j+TNC3pxyX9laTPH1l59cJ1+jtwzz3S0qVPnrZ0qXTvvT1fdKnvibEFMCQ6CYWnRcS/KGtdfC8iPirp/N6UNTzKnP9eS6efLu3d++Rpe/dKK1b0dLGlvqfWCGSNbF41GoxEhsrqJBT22R6RtN32GttvkHRij+oaGlynv0MXXywdOJDtMorI7g8cyKb3UKnvibEFMEQ6CYX3S1oqaa2kcyW9TdJFvShqmHCd/g5deKF02WXZMYRdu7L7yy7LpvdQqe+JsQUwRDoejtP2MZIiInb3pqS5VfFAMwCk1vUDzbZX2r5V0i2SbrV9s+1zyxQJABgsnew+ulzSeyJiRUSskPReZWckAZC0875t+vbZJ+qR+7f3dbl0jEQ3dRIKuyPiX1sPIuI6SUl2IQGD6NZL1urZ25u65XfW9HW5dIxEN3USCjfY/qztH7P9Ktt/Kula2+fYPqdXBQJVsPO+bTrtq9fokacvzu771FooM6gQMJtOQuFsSc+V9BFJH5X0AknnKbv+0Se6XhlQIbdeslYjT4SmFo9q5InoW2uBjpHoto7PPup6AfYFyi67vUjSn0fE/5rr9Zx9hEGz875teuwlP6QDixdpZtGIRp6Y0ZKpJ7Rsy+069tQze7bc1mU5xkbHiktz7Jvex2VUMKtenH30DNufs70+f3yW7XeVLHKRpE9LulDZNZXeYvusMu8J9FurlTCzKPvvlAVD71sLdIxEL3Sy++gvJV0l6Zn54+8q69BWxksl3RURd0fEAUl/K+n1Jd8T6KtjrrtBozOhY3bvL26jM6Fjrruhp8ulYyR6YbSD1x4fEV+y/SFJiohp20+UXP7Jku5ve/yApJeVfE+gr865Y9es00/p8XI3XtTbq8ainjppKeyxfZzyUdhs/4ikx0ouf7ZxnZ9ykMP2u21vsb1lcnKy5CJRBaXO+WewGwyZfv5JdxIKvyrpSkln2N6k7NLZv1Jy+Q9IOrXt8SmSHjr0RRGxLiJWRsTKE044oeQiUQWlzvlnsBsMmX7+Sc8bCrZfYnt5RNwo6VWSflPSfklXK/tRL+Pbks60fbrtJZJ+TlnwoMZKnfPfuoz18uVcvhpDod9/0gtpKXxW0oH83+dJ+rCyM4Z2SSqVWxExLWmNsgPYd0r6UkTcXuY9UX2lzvlnsBsMmX7/Sc/bT8H2zRHxn/J/f1rSZD7AjmzfFBFn97bEJ6OfwnArdc5/a0jMsbGDw2Lu28fQmKisbv5Jd7OfwiLbrbOUXi2p/ZSHTs5eAuZV6px/BrvBkEnxJ72QUPiCpK/b/qqk70v6V0my/RyVP/sIeJJS5/wz2A2GTIo/6QVd5iI//fQkSVdHxJ582nMlHZ0fgO4bdh8BQOcWuvtoQbt/IuJbs0z77pEUBgAYXJ30UwAqocygMwxYg7ojFDB0ygw6w4A1qDtCAUOlzKAzDFgDEAoYMmUGnWHAGoBQwBBpbek3ljQkSY0ljQVv8ZeZFxgmhAKGRplBZxiwBsgQChgaZQadYcAaIJN8jOZO0XkNADrX9TGaUU+pztsvtdxEg+zQxwHDgFDAnFKdt19quYkG2aGPA4YBoYDDSnXefqnlJhpkhz4OGBaEAg4r1Xn7pZabaJAd+jhgWBAKmFWq8/ZLLbfVSmhk86rR6EtrgT4OGCaEAmaV6rz9UstNNMgOfRwwTAgFzCrVefullptokB36OGCY0E8BAGqAfgqQlPbcec7bB6qHUBhyKc+d57x9oHoIhSGW8tx5ztsHqolQGGIpz53nvH2gmgiFIZXy3HnO2weqi1AYUinPnee8faC6CIUhlfLcec7bB6qLfgoAUAP0UwAAdIxQALqkjp31Eo1nVEnbtkknniht3566krkRCkCX1LGzXqLxjCpp7dosRNesSV3J3AgFoAvq2Fkv0XhGlbRtm3TNNdLixdn9ILcWCAWgC+rYWS/ReEaVtHatFJFdzT1isFsLhAJQUh076yUaz6iSWq2E9mE+Brm1QCgAJdWxs16i8YwqqdVKGMl/bUdGBru1QCgAJdWxs16i8Ywq6YYbshDYv//gLSKbPohGUxcAVN3GizamLqHvNtbvIx+xXbtSV9AZWgoAaoW+FXMjFADUCn0r5kYoAKgN+lbMj1AAUBv0rZgfoQCgFuhbsTCEAoBaoG/FwhAKAGqBvhULQz8FALVA34qFoaUAACgQCgCSoBPZYCIUACRBJ7LBRCgA6Ds6kQ0uQgFA39GJbHARCgD6ik5kg41QANBXdCIbbIQCgL6iE9lgo/MagL6iE9lgo6WAOTX3NrX6itVDPQg90kjVT6HMcuvQt4JQwJzGt45r84Obh3oQeqSRqp9CmeXWoW+FIyJ1DR1ZuXJlbNmyJXUZtdDc29Sqy1dpdGRU0zPT2vQLm3Tc0uNSl4Uh0GxKq1ZlB5mnp6VNm6Tj+vCnVWa5qWruFttbI2LlfK+jpYDDGt86rqmZKY2NjmlqZorWAromVT+FMsutS98KWgqYVauVMDY6VrQU9k3vo7WA0lpb3GNjB7e69+3r/ZZ3meWmqrmbaCmglFYrYXQkO0FtdGSU1gK6IlU/hTLLrVPfimShYPtNtm+3PWN73vRCf224e4OmZ6Y1uXeyuE3PTGvD3ZxMjnJS9VMos9w69a1ItvvI9gskzUj6rKQPRMSC9gmx+wgAOrfQ3UfJOq9FxJ2SZDtVCQCAQ9TumAKdsdArVe3YVMXOXFVd11XQ01Cw/c+2b5vl9voO3+fdtrfY3jI5OVmqJjpjoVeq2rGpip25qrquqyD5Kam2r1WfjinQGQu9UtWOTVXszFXVdZ0ap6TOgs5Y6JWqdmyqYmeuqq7rqkh59tEbJH1K0gmSHpV0U0T89HzzHWlLgc5Y6JWqdmyqYmeuqq7rQTDwLYWI+EpEnBIRPxARz1hIIJRBZyz0SlU7NlWxM1dV13WV1Gb3EZ2x0CtV7dhUxc5cVV3XVZL8QHOn6LwGAJ0b+N1H6I8y/TLWb1+v8yfO1+mfPF3nT5yv9dvX96BCSNK2bdKJJ0rbt6euBHVHKAy5I+2XsX77eq1Zv0Y7du/QsWPHasfuHVqzfg3B0CNr12YHUdesSV0J6o5QGGLNvU1N3Dyh5Ucv18TNEx21Fi69/lItGVmio5YcJds6aslRWjKyRJdef2kPK66nbduka66RFi/O7mktICVCYYiV6Zdxz6P3aOnipU+atnTxUt376L1drhJr10oR2Zk0EbQWkBahMKRarYTGkoYkqbGk0VFr4fRlp2vv1N4nTds7tVcrlq3odqm11moltJ9iSWsBKREKQ6psv4yLz7tYB2YOaM+BPYoI7TmwRwdmDuji8y7uZdm102oljOT/E0dGaC0gLUJhSJXtl3HhmRfqsgsv00mNk7Rr3y6d1DhJl114mS4888IeV14vN9yQhcD+/QdvEdl0IAX6KQBADdBPAeizOl7jv46fedgRCkCX1PEa/3X8zMOOUAC6oNmUJiak5cuz+zpsOdfxM9cBoQB0QR2v8V/Hz1wHhAJQUmuLuZF1CVGjMfxbznX8zHVBKAAl1fEa/3X8zHVBKAAl1fEa/3X8zHUxmroAoOo2bkxdQf/V8TPXBS0FAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFAECBUAAAFAgFoE2zKa1eLe3cmbqShatizRhchALQZnxc2rxZWrcudSULV8WaMbgIBSDXbEoTE9Ly5dl9Fba8q1gzBhuhAOTGx6WpKWlsLLuvwpZ3FWvGYCMUAB3c4m40sseNxuBveVexZgw+QgHQwS3u0dHs8ejo4G95V7FmDD5CAZC0YYM0PS1NTh68TU9n0wdVFWvG4BtNXQAwCDZuTF1B56pYMwYfLQUAQIFQAAAUCAUAQIFQAAAUCAUAQIFQAAAUCAUAQIFQAAAUCAUAQIFQAAAUHBGpa+iI7UlJ30tdR4eOl9RMXcQAYD1kWA8Z1kN/18GzIuKE+V5UuVCoIttbImJl6jpSYz1kWA8Z1sNgrgN2HwEACoQCAKBAKPQHw55kWA8Z1kOG9TCA64BjCgCAAi0FAECBUOgT25fa/o7tW2x/xfay1DWlYPtNtm+3PWN7oM666DXbF9jeZvsu27+Rup4UbF9u+2Hbt6WuJSXbp9q+xvad+f+H96WuqYVQ6J8Nkl4UET8s6buSPpS4nlRuk/Szkr6RupB+sr1I0qclXSjpLElvsX1W2qqS+EtJF6QuYgBMS/q1iHiBpB+R9N5B+XsgFPokIq6OiOn84bcknZKynlQi4s6I2Ja6jgReKumuiLg7Ig5I+ltJr09cU99FxDckPZK6jtQiYkdE3Jj/e7ekOyWdnLaqDKGQxi9IWp+6CPTVyZLub3v8gAbkRwBp2V4h6cWSNqetJDOauoBhYvufJS2f5akPR8RX89d8WFnT8Yp+1tZPC1kPNeRZpnHqX83ZPlrS30l6f0Q8nroeiVDoqoj4ibmet32RpJ+CrSVSAAADzklEQVSR9OoY4nOB51sPNfWApFPbHp8i6aFEtWAA2F6sLBCuiIgvp66nhd1HfWL7AkkflPS6iNibuh703bclnWn7dNtLJP2cpCsT14REbFvS5yTdGRF/mLqedoRC/1wmqSFpg+2bbH8mdUEp2H6D7Qck/aikr9m+KnVN/ZCfZLBG0lXKDip+KSJuT1tV/9n+gqRvSnqe7Qdsvyt1TYm8XNLbJJ2f/x7cZPs1qYuS6NEMAGhDSwEAUCAUAAAFQgEAUCAUAAAFQgEAUCAUAAAFQgFDyfaH80sS35KfA/6yLr73j9n+x8M8Z9tN2z+YPz7Jdthe1faaSdvH2f5l22+f5T1WtC4tbfvs9vPXbX/U9ge69VmAQ3GZCwwd2z+q7HIi50TEftvHS1rSj2VHRNjerKxz3j9JOk/Sv+X319l+nqRmROyUtJAOjGdLWpm/F9BztBQwjE5S9sO7X5IiohkRD9k+1/bXbW+1fZXtkyTJ9rW2/9j29bZvs/3SfPpL82n/lt8/b4HL36QsBJTf/6GykGg9vj5//2KrP6/tZtvflPTefNoSSf9T0pvz1s6b8/c4K6/5bttrj3w1AU9FKGAYXS3pVNvftf2ntl+VX3zsU5LeGBHnSrpc0sfa5jkqIs6T9J78OUn6jqRXRsSLJf2WpN9d4PKv18FQeKmkv9fBi+Gdpyw0DvUXktZGRCs8lI+78FuSvhgRZ0fEF/Onni/pp/P3/kj+2YCuYPcRhk5E/IftcyW9QtKPS/qipEskvUjZtackaZGkHW2zfSGf9xu2j8mHS21ImrB9prLLXC/0x/cGSS+2fZSkxXk9d9t+jrJQ+IP2F9t+uqRlEfH1fNLnlY3Qdjhfy1tB+20/LOkZyq7CCpRGKGAoRcQTkq6VdK3tW5Xtkrm9fUv80Flmefw7kq6JiDfkA6Fcu8Bl77V9l7LBlG7MJ39L0msknSjp0JHnPMvy57K/7d9PiP/H6CJ2H2Ho2H5evnXfcrayK5OekB+Elu3Ftl/Y9po359NXSXosIh6T9HRJD+bPv6PDMjZJer+yK4Iqv3+fpG8dOpZGRDwq6bG2M5Te2vb0bmUtFqAvCAUMo6OV7fa5w/Ytks5Stm/+jZJ+3/bNkm7Swf3+krTL9vXKzghqXc7545J+z/YmZbubOrFJ0rN1MBRuVDawzvWHef07JX06P9D8/bbp1yg7sNx+oBnoGS6djdqzfa2kD0TEltS1AKnRUgAAFGgpAEfI9juVHSdotyki3puiHqAbCAUAQIHdRwCAAqEAACgQCgCAAqEAACgQCgCAwv8HVFJnlLCA4rUAAAAASUVORK5CYII=\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
}