{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Descending into ML\n", "\n", "Author: Gaurav Vaidya " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Source\n", "This content is based on the [Descending into ML](https://developers.google.com/machine-learning/crash-course/descending-into-ml/) section of Google's *Machine Learning Crash Course*.\n", "\n", "# Learning objectives\n", "\n", "* A model is a way to predict the label for a given set of features.\n", "* Loss is a way of measuring how far the predicted label is from the actual label.\n", "\n", "# Linear regression for fun and profit\n", "\n", "[Linear regression](https://en.wikipedia.org/wiki/Linear_regression) is a method for finding the straight line or hyperplane that best fits a set of points. \n", "\n", "> If you remember this from previous mathematical training -- great! If not, just think of it as drawing a *line of best fit* on your data. And if you don't know what that is, don't worry, I'll show you!\n", "\n", "# Working with the Iris flower dataset\n", "\n", "Let's start by loading the [Iris flower data set](https://en.wikipedia.org/wiki/Iris_flower_data_set) introduced earlier." ] }, { "cell_type": "code", "execution_count": 1, "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", " \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", " \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", " \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
55.43.91.70.4setosa
64.63.41.40.3setosa
75.03.41.50.2setosa
84.42.91.40.2setosa
94.93.11.50.1setosa
105.43.71.50.2setosa
114.83.41.60.2setosa
124.83.01.40.1setosa
134.33.01.10.1setosa
145.84.01.20.2setosa
155.74.41.50.4setosa
165.43.91.30.4setosa
175.13.51.40.3setosa
185.73.81.70.3setosa
195.13.81.50.3setosa
205.43.41.70.2setosa
215.13.71.50.4setosa
224.63.61.00.2setosa
235.13.31.70.5setosa
244.83.41.90.2setosa
255.03.01.60.2setosa
265.03.41.60.4setosa
275.23.51.50.2setosa
285.23.41.40.2setosa
294.73.21.60.2setosa
..................
1206.93.25.72.3virginica
1215.62.84.92.0virginica
1227.72.86.72.0virginica
1236.32.74.91.8virginica
1246.73.35.72.1virginica
1257.23.26.01.8virginica
1266.22.84.81.8virginica
1276.13.04.91.8virginica
1286.42.85.62.1virginica
1297.23.05.81.6virginica
1307.42.86.11.9virginica
1317.93.86.42.0virginica
1326.42.85.62.2virginica
1336.32.85.11.5virginica
1346.12.65.61.4virginica
1357.73.06.12.3virginica
1366.33.45.62.4virginica
1376.43.15.51.8virginica
1386.03.04.81.8virginica
1396.93.15.42.1virginica
1406.73.15.62.4virginica
1416.93.15.12.3virginica
1425.82.75.11.9virginica
1436.83.25.92.3virginica
1446.73.35.72.5virginica
1456.73.05.22.3virginica
1466.32.55.01.9virginica
1476.53.05.22.0virginica
1486.23.45.42.3virginica
1495.93.05.11.8virginica
\n", "

150 rows × 5 columns

\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\n", "5 5.4 3.9 1.7 0.4 setosa\n", "6 4.6 3.4 1.4 0.3 setosa\n", "7 5.0 3.4 1.5 0.2 setosa\n", "8 4.4 2.9 1.4 0.2 setosa\n", "9 4.9 3.1 1.5 0.1 setosa\n", "10 5.4 3.7 1.5 0.2 setosa\n", "11 4.8 3.4 1.6 0.2 setosa\n", "12 4.8 3.0 1.4 0.1 setosa\n", "13 4.3 3.0 1.1 0.1 setosa\n", "14 5.8 4.0 1.2 0.2 setosa\n", "15 5.7 4.4 1.5 0.4 setosa\n", "16 5.4 3.9 1.3 0.4 setosa\n", "17 5.1 3.5 1.4 0.3 setosa\n", "18 5.7 3.8 1.7 0.3 setosa\n", "19 5.1 3.8 1.5 0.3 setosa\n", "20 5.4 3.4 1.7 0.2 setosa\n", "21 5.1 3.7 1.5 0.4 setosa\n", "22 4.6 3.6 1.0 0.2 setosa\n", "23 5.1 3.3 1.7 0.5 setosa\n", "24 4.8 3.4 1.9 0.2 setosa\n", "25 5.0 3.0 1.6 0.2 setosa\n", "26 5.0 3.4 1.6 0.4 setosa\n", "27 5.2 3.5 1.5 0.2 setosa\n", "28 5.2 3.4 1.4 0.2 setosa\n", "29 4.7 3.2 1.6 0.2 setosa\n", ".. ... ... ... ... ...\n", "120 6.9 3.2 5.7 2.3 virginica\n", "121 5.6 2.8 4.9 2.0 virginica\n", "122 7.7 2.8 6.7 2.0 virginica\n", "123 6.3 2.7 4.9 1.8 virginica\n", "124 6.7 3.3 5.7 2.1 virginica\n", "125 7.2 3.2 6.0 1.8 virginica\n", "126 6.2 2.8 4.8 1.8 virginica\n", "127 6.1 3.0 4.9 1.8 virginica\n", "128 6.4 2.8 5.6 2.1 virginica\n", "129 7.2 3.0 5.8 1.6 virginica\n", "130 7.4 2.8 6.1 1.9 virginica\n", "131 7.9 3.8 6.4 2.0 virginica\n", "132 6.4 2.8 5.6 2.2 virginica\n", "133 6.3 2.8 5.1 1.5 virginica\n", "134 6.1 2.6 5.6 1.4 virginica\n", "135 7.7 3.0 6.1 2.3 virginica\n", "136 6.3 3.4 5.6 2.4 virginica\n", "137 6.4 3.1 5.5 1.8 virginica\n", "138 6.0 3.0 4.8 1.8 virginica\n", "139 6.9 3.1 5.4 2.1 virginica\n", "140 6.7 3.1 5.6 2.4 virginica\n", "141 6.9 3.1 5.1 2.3 virginica\n", "142 5.8 2.7 5.1 1.9 virginica\n", "143 6.8 3.2 5.9 2.3 virginica\n", "144 6.7 3.3 5.7 2.5 virginica\n", "145 6.7 3.0 5.2 2.3 virginica\n", "146 6.3 2.5 5.0 1.9 virginica\n", "147 6.5 3.0 5.2 2.0 virginica\n", "148 6.2 3.4 5.4 2.3 virginica\n", "149 5.9 3.0 5.1 1.8 virginica\n", "\n", "[150 rows x 5 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "iris_dataset = pd.read_csv('../nb-datasets/iris_dataset.csv')\n", "iris_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", "
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": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.head()" ] }, { "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", " \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_width
count150.000000150.000000150.000000150.000000
mean5.8433333.0540003.7586671.198667
std0.8280660.4335941.7644200.763161
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width\n", "count 150.000000 150.000000 150.000000 150.000000\n", "mean 5.843333 3.054000 3.758667 1.198667\n", "std 0.828066 0.433594 1.764420 0.763161\n", "min 4.300000 2.000000 1.000000 0.100000\n", "25% 5.100000 2.800000 1.600000 0.300000\n", "50% 5.800000 3.000000 4.350000 1.300000\n", "75% 6.400000 3.300000 5.100000 1.800000\n", "max 7.900000 4.400000 6.900000 2.500000" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.describe()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "versicolor 50\n", "setosa 50\n", "virginica 50\n", "Name: species, dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.species.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This refers to three species of plants:\n", "* [*Iris versicolor*](https://en.wikipedia.org/wiki/Iris_versicolor) (purple iris or poison flag),\n", "* [*Iris virginica*](https://en.wikipedia.org/wiki/Iris_virginica) (Virginia iris), and\n", "* [*Iris setosa*](https://en.wikipedia.org/wiki/Iris_setosa) (bristle-pointed iris)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# What's a \"Sepal\"?\n", "\n", "![An image illustrating petals and sepals side by side](../nb-images/Petal-sepal.jpg)\n", "![*Alcea rosea*, a plant with distinctive sepals and petals](../nb-images/Alcea_rosea3_ies.jpg)\n", "\n", "A sepal is the green leaf-like structure found underneath the petal in many flowers. [Sepals](https://en.wikipedia.org/wiki/Sepal) provides protection for the flower when budding, and support for it once it is blooming.\n", "\n", "Given that that is the case, we might expect plants with larger petals to also have larger sepals for additional support." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Can we predict the length of the petal of a plant from the length of its sepal?" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "iris_dataset.plot(\"sepal_length\", \"petal_length\", kind=\"scatter\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "iris1 = iris_dataset.plot(\n", " \"sepal_length\",\n", " \"petal_length\",\n", " kind=\"scatter\",\n", " title=\"Petal and sepal length in three species of Iris\"\n", ")\n", "iris1.set_xlabel(\"Sepal length (cm)\")\n", "iris1.set_ylabel(\"Petal length (cm)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks like the answer is... yes! If we draw a line across the plot, we can *predict* what the petal length might be for a plant given a particular sepal length.\n", "\n", "**That's all a model is!** -- something that can extrapolate from known data to predict what the value might be for a given input value." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear regression can define that model precisely\n", "\n", "Drawing a line by hand is fine, but we would like to determine exactly how the petal length varies as the sepal length varies. Luckily, `matplotlib` can run a linear regression for us easily." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 5.1\n", "1 4.9\n", "2 4.7\n", "3 4.6\n", "4 5.0\n", "Name: sepal_length, dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.sepal_length.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1.4\n", "1 1.4\n", "2 1.3\n", "3 1.5\n", "4 1.4\n", "Name: petal_length, dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.petal_length.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Scikit-learn's LinearRegression module needs the data as a two-dimensional array:\n", "* It expects each row to contain multiple features.\n", "* It expects as many rows as there are data points." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[5.1],\n", " [4.9],\n", " [4.7],\n", " [4.6],\n", " [5. ],\n", " [5.4],\n", " [4.6],\n", " [5. ],\n", " [4.4],\n", " [4.9],\n", " [5.4],\n", " [4.8],\n", " [4.8],\n", " [4.3],\n", " [5.8],\n", " [5.7],\n", " [5.4],\n", " [5.1],\n", " [5.7],\n", " [5.1],\n", " [5.4],\n", " [5.1],\n", " [4.6],\n", " [5.1],\n", " [4.8],\n", " [5. ],\n", " [5. ],\n", " [5.2],\n", " [5.2],\n", " [4.7],\n", " [4.8],\n", " [5.4],\n", " [5.2],\n", " [5.5],\n", " [4.9],\n", " [5. ],\n", " [5.5],\n", " [4.9],\n", " [4.4],\n", " [5.1],\n", " [5. ],\n", " [4.5],\n", " [4.4],\n", " [5. ],\n", " [5.1],\n", " [4.8],\n", " [5.1],\n", " [4.6],\n", " [5.3],\n", " [5. ],\n", " [7. ],\n", " [6.4],\n", " [6.9],\n", " [5.5],\n", " [6.5],\n", " [5.7],\n", " [6.3],\n", " [4.9],\n", " [6.6],\n", " [5.2],\n", " [5. ],\n", " [5.9],\n", " [6. ],\n", " [6.1],\n", " [5.6],\n", " [6.7],\n", " [5.6],\n", " [5.8],\n", " [6.2],\n", " [5.6],\n", " [5.9],\n", " [6.1],\n", " [6.3],\n", " [6.1],\n", " [6.4],\n", " [6.6],\n", " [6.8],\n", " [6.7],\n", " [6. ],\n", " [5.7],\n", " [5.5],\n", " [5.5],\n", " [5.8],\n", " [6. ],\n", " [5.4],\n", " [6. ],\n", " [6.7],\n", " [6.3],\n", " [5.6],\n", " [5.5],\n", " [5.5],\n", " [6.1],\n", " [5.8],\n", " [5. ],\n", " [5.6],\n", " [5.7],\n", " [5.7],\n", " [6.2],\n", " [5.1],\n", " [5.7],\n", " [6.3],\n", " [5.8],\n", " [7.1],\n", " [6.3],\n", " [6.5],\n", " [7.6],\n", " [4.9],\n", " [7.3],\n", " [6.7],\n", " [7.2],\n", " [6.5],\n", " [6.4],\n", " [6.8],\n", " [5.7],\n", " [5.8],\n", " [6.4],\n", " [6.5],\n", " [7.7],\n", " [7.7],\n", " [6. ],\n", " [6.9],\n", " [5.6],\n", " [7.7],\n", " [6.3],\n", " [6.7],\n", " [7.2],\n", " [6.2],\n", " [6.1],\n", " [6.4],\n", " [7.2],\n", " [7.4],\n", " [7.9],\n", " [6.4],\n", " [6.3],\n", " [6.1],\n", " [7.7],\n", " [6.3],\n", " [6.4],\n", " [6. ],\n", " [6.9],\n", " [6.7],\n", " [6.9],\n", " [5.8],\n", " [6.8],\n", " [6.7],\n", " [6.7],\n", " [6.3],\n", " [6.5],\n", " [6.2],\n", " [5.9]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris_dataset.sepal_length.values.reshape(-1, 1)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.85750967] -7.0953814782793145\n" ] } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "X = iris_dataset.sepal_length.values.reshape(-1, 1)\n", "Y = iris_dataset.petal_length\n", "\n", "model = LinearRegression()\n", "model.fit(X, Y)\n", "slopes = model.coef_\n", "intercept = model.intercept_\n", "\n", "print(slopes, intercept)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In other words, based on the available data, we can construct a model that predicts a petal length given a particular sepal length.\n", "\n", "$$petal\\_length = 1.8575 * sepal\\_length - 7.095$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Equation of a Line\n", "\n", "You may be familiar with this as the [equation of a line](https://en.wikipedia.org/wiki/Linear_equation#One_variable):\n", "\n", "$$ y = mx + c $$\n", "\n", "See how easy it is to predict a petal value given a sepal value: you just plug it into the equation! For example:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.1925\n" ] } ], "source": [ "# What is the predicted petal length when the sepal length is 5cm?\n", "sepal_length = 5\n", "petal_length = 1.8575 * sepal_length - 7.095\n", "print(petal_length)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.192166848827913\n" ] } ], "source": [ "# We could be more precise by plugging in the slope and intercept values directly.\n", "petal_length = slopes[0] * sepal_length + intercept\n", "print(petal_length)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine learning? For real?\n", "\n", "Yes! By convention, we write this equation like this when thinking about it in machine-learning terms:\n", "\n", "$$ y' = b + w_1x_1 $$\n", "\n", "Where:\n", "* $y'$ is the *predicted label* (the desired output), which in our example is the petal length in centimeters.\n", "* $b$ is the *bias* (the y-intercept, sometimes referred to as $w_0$), which in our example is 7.095 cm.\n", "* $w_1$ is the *weight* of feature 1, which is the same concept as the \"slope\" in the traditional equation of the line. In our example, this is 1.8575.\n", "* $x_1$ is a *feature* (a known input), which in our example is the sepal length.\n", "\n", "Writing it in this way makes it easy to extend our model when we are considering multiple features, such as sepal length and sepal width and many more. In that case, our equation would look like:\n", "\n", "$$ y' = b + w_1x_1 + w_2x_2 + w_3x_3 + \\ldots + w_nx_n $$\n", " \n", " \n", "# What does this model actually look like?\n", "\n", "We can draw this model onto our plot from earlier as a *line of best fit*.\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEWCAYAAABliCz2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJztvXmYVMX1uP+eGWaYYRlRGYgoOO6CRFFQg/sCmBi3qFFJjEERogY0PzVGJRoVlejXjcUNJeIGcUXcgoAfkEURQRZxABUdEBBnkH0ZGZjz++Pe6eluerk9vU+f93nu032r6ladW919uu6pU6dEVTEMwzAaP3npFsAwDMNIDabwDcMwcgRT+IZhGDmCKXzDMIwcwRS+YRhGjmAK3zAMI0cwhZ8GRKRMRFREmqSgrbtE5KVkt+MVEekjIjPC5KWsX2KRK0z5L0XktAS1fZqIrExEXZmOiHQQkS0ikp/CNg8TkXkisllErm/A9SeLyNJkyJZqTOH7ISIVIrLd/UL+KCLPiUgLD9fFpCyM9JKIPxZVPUJVpzawfRWRgxvadjajqitUtYWq7kphs7cAU1W1paoOC84UkakicnW4i1V1uqoellQJU4Qp/N05V1VbAMcAxwL/TLM8hhFAKkfHjYT9gS8bcmE6njaTiSn8MKjqKuB/QGcAEdlDREaJyA8iskpE7hWRfBHpCDwFdHefDDa45X/rPkZuEpHvReQur22LyK0issx9BC0Xkd/55fURkRki8pCIrBeR70TkN375B4jIR+61k4DWEdppLSLvisgGEVknItNFJM/Naycib4hIldvG9X7X3SUir4vIK247n4vIUV7kj4VwfR5DP0xzZZgsIo/7mbamua8b3M+su991IesLIVuFiPTw649XReQFt70vRaRbmOvq2l7gtn2pX95NIlLp3u+VfumjReRJEXlfRLYCp4tIU1fWFe7T6FMiUux3zTkiMt/9bD8WkSPDyCMi8qjb7kYRWSginf3afUpEJrn39ZGI7O937eFu3joRWSoil/jlFYvIwyKy3K13hpsW8HQV5TM+2G1zo4isFZFXInwe57n9vkGcEXtHN/3/gNOBEW5/HxquDrf8aSKyUkT+ISJrgOckyOTm5q1y+2SpiJwZqc6MQlXtcA+gAujhvm+PMyoY7J6/BTwNNAfaALOBv7h5fYAZQXWdBvwS50/1SOBH4AI3rwxQoEkYOX4PtHOvvRTYCuzj11YN0A/IB64FVgPi5n8CPAI0BU4BNgMvhWlnCM6fVYF7nAyI2+5c4E6gEDgQ+BY4y73uLleGi93rbga+Awo8yj8jjDwB/eKhz6P1w0Ou/CcBm+r6IVT/R6svynflLqAaONu9dggwK8L3TIGDg74rO4F73P48G9gG7OnmjwY2Aie6fVoEPAa8DewFtATeAYa45Y8BKoHjXXn+7MrbNIQsZ7mfdSv3s+/o91mNxvn+nILzfRpa99m5n8n3wJVAE7fNtcARbv7jwFRgX1eGE9w6YvmMxwKD/O75pDD9eSjOd6yn23+3AN8AhW7+VODqCJ+HL9/vs3jAlbfYTVvp5h/m3nc7v+/SQenWXZ51XLoFyKTD/VFsATYAy4En3A+8LfAzUOxXtjcwxX3fhzBKzK/8Y8Cjfl+SsAo/xLXzgfP92vrGL6+ZW9cvgA7ul7W5X/4Ywiv8e4Dx+CkfN/14YEVQ2m3Ac+77u/BTaO4P8gfgZI/yR1X4Hvs8Wj8088t/iegKP2R9Eb4r/gp/sl9eJ2B7hM8zlMLfHiRPJfAr9/1o4AW/PMFRcAf5pXUHvnPfP4k7UPHLXwqcGkKWM4CvgF8BeUF5o4H/+p23AHbhDIYuBaYHlX8a+Jf7fdgOHBXnZ/wCMBLYL8rv4w7g1aDv4yrgNPd8KrEp/B1AUdDnU6fwD3Y/mx64A5xsOhqVfSpBXKCqk/0TROSXOCOHH0SkLjkP558+JCJyPPBvHJNQIc5o4TUvAojIFcCNOD8OcH5o/qaZNXVvVHWbK1NdmfWqutWv7HKcH2go/h+Ospro1jFSVf+NY/NsJ655yiUfmO537rt3Va11H3nbeZTfC/sTvc8j9cM6Vd0WJG+4fohWnxfW+L3fBhSJSBNV3enx+p+Cym4Latv/vktx/pDm+vWN4HxG4PTdn0VkoN81hbifjz+q+n8iMgJnRN5BRMYBN6vqpuB2VXWLiKxz69kfOD7oO9IEeBGn/4uAZVHuOdpnfAswGJgtIuuBh1X1PyHqaYfzPa+Ts1ZEvsd5umgIVapaHSpDVb8Rkb/h/G6OEJEPgBtVdXUD20oppvC98T3OSKR1mB9wqJCjY4ARwG9UtVpEHsOD0nNtpM8AZwKfqOouEZmP84OOxg/AniLS3E/pdwgjH6q6GbgJuElEjgCmiMhnOPf7naoeEqEtn/IUx+6/H7A6Tvn9idbnkfgB2EtEmvkpfX9ln40hYv1lXoszgj5CnbmmYL4H7lPV+zxV7HiuDBORNsCrwN9xRs0Q+Dm3wDEhrXbb+EhVewbX534fqoGDgAURmo74GavqGhwTGyJyEjBZRKap6jdBRVfjmE/r2hdX7lB944WI3w9VHQOMEZESnKeaB4A/NbCtlGKTth5Q1R+AicDDIlIiInkicpCInOoW+RHYT0QK/S5riTPKrBaR44A/eGyuOc4XrgrAnbzr7FHO5cAc4G4RKXR/JOeGK+9O7B3s/kA24Tyu78Kxo25yJ6eKxZmc7iwix/pd3lVELnQn3/6G88OdFY/8QfcSrc+99MNdbj90D+qHKqAWZ24iHfwYT9uqWovzp/qoq6QRkX1F5Cy3yDPANSJyvDg0F8eJoGVwXSJyrFuuAMdMVI3zHajjbBE5yf1uDwY+VdXvgXeBQ0XkTyJS4B7HikhHV77/AI+IM/mfLyLdRaRp0H1E/IxF5Pcisp9bfD3O9yqUO+erwG9F5Ez3Pm7C+T5+HFvPRkccn/4z3HupxvnjTaWLaVyYwvfOFTiPxeU4X77XgX3cvP/DmeBdIyJr3bTrgHtEZDPO5OerXhpR1XLgYZxJxx9xRi4zY5DzDzg2+HU49tQXIpQ9BJiMM2/xCfCEqk5Vx0f6XKALzmTsWuBZYA+/a8fj2HHX44xuLlTVmgTI70+kPo/GH3Hs2j8B9wKv4CgB3FH/fcBM16vjVw2Ur6HcBTzvtn1JtMJh+AfOxOQsEdmE8zkeBqCqc3BGxiNw+u0bnDmKUJTg/EGsxzGL/IQz2V3HGJzv0TqgK06/1j0d9gIuwxlhr6F+ohOcifwvgM/cax8gtL6J9BkfC3wqIltwJqhvUNXvgitQ1aXA5cBwnO/quTju1TvC3HM8NMUx1a7Fuec2wO1JaCcp1Hk0GIZnxHExPVhVL0+3LF4Rx6Vviar+K92yZAsiMhpnstLWojQSbIRvNEpc88JBrpng18D5OC6AhpGz2KSt0Vj5BfAmsDewErhWVeelVyTDSC9m0jEMw8gRzKRjGIaRI2SUSad169ZaVlaWbjEMwzCyhrlz565V1VIvZTNK4ZeVlTFnzpx0i2EYhpE1iMjy6KUczKRjGIaRI5jCNwzDyBFM4RuGYeQIpvANwzByBFP4hmEYOYIpfMMwjBzBFL5hGEaOYArfMAwjTaxcuZLu3buzbt26lLRnCt8wDCMNDBgwgPbt2zNr1iw++OCDlLSZUSttDcMwGjtfffUVhx12mO98+PDh9O7dOyVtm8I3DMNIAarKJZdcwuuvv+5L27x5My1atIhwVWIxk45hGEaS+fzzz8nLy/Mp+5dffhlVTamyBxvhG4ZhJA1V5bTTTmPatGkAtGnThhUrVtC0adMoVyYHG+EbhmEkgY8++oi8vDyfsn/33Xf58ccf06bswUb4hmEYCWXnzp107tyZpUuXAtC5c2fmz59Pfn5+miWzEb5hGEbCePvttykoKPAp+2nTpvHFF19khLIHG+EbhmHETXV1Nfvssw8bNmwA4Mwzz2TSpEmISJolC8RG+IZhGHHwwgsvUFxc7FP28+fPZ/LkyRmn7MFG+IZhGA1i06ZN7LHHHr7z3r17M2bMmDRKFB0b4RuGYcTI0KFDA5T9119/nfHKHmyEbxiG4ZmqqiratGnjO7/++usZOnRoGiWKDRvhG4ZheOCOO+4IUParVq3KKmUPSVT4InKYiMz3OzaJyN+S1Z5hGEYyWLFiBSLCvffeC8DgwYNRVdq1a5dmyWInaSYdVV0KdAEQkXxgFTAuWe0ZhmEkmmuvvZannnrKd/7TTz+x1157pVGi+EiVSedMYJmqLk9Re4ZhGA1myZIliIhP2T/xxBOoalYre0jdpO1lwNhQGSLSH+gP0KFDhxSJYxiGsTuqyoUXXshbb70FQF5eHhs3bgwf1bKqCioqoKwMSktTJmdDSfoIX0QKgfOA10Llq+pIVe2mqt1Ks6DDDMNonMyZM4e8vDyfsh87diy7du0Kr+zHjoX994eePZ3XsSHHtBlFKkb4vwE+V9UfU9CWYRhGTNTW1nLyySfz8ccfA9CuXTu+++47CgsLw19UVQV9+8L27c4BznmPHhk90k+FDb83Ycw5hmEY6WTKlCnk5+f7lP3//vc/Vq1aFVnZg2PGCS5TUOCkZzBJHeGLSDOgJ/CXZLZjGIYRCzU1NXTs2JFly5YB0KVLF+bMmeM9qmVZGezYEVypk57BJHWEr6rbVHVvVd2YzHYMwzC88tZbb1FYWOhT9jNnzmTevHmxhTAuLYVRo6C4GEpKnNdRozLanAMWWsEwjBxh+/bttG3bls2bNwPQq1cvJkyY0PColr17Q4cOMHEi9OoFJ56YQGmTg4VWMAyj0fPcc8/RrFkzn7JfsGABH3zwQXwhjAcOhJNOgnvucV4HDkyQtMnDFL5hGI2WjRs3IiJcddVVAFx++eWoKkceeWR8FS9eDCNGBKaNGOGkZzCm8A3DaJQ88sgjtGrVyne+bNkyXnzxRe8VVFXBZ585r8HMnh36mnDpGYIpfMMwGhWVlZWICDfddBMAN954I6rKgQce6L2SaIuqjjsu9HXh0jMEU/iGYTQabrvtNtq2bes7X716NQ8//HBslfgvqtq40Xnt2zdwpN+xIwwYEHjdgAFOegZjCt8wjKxn+fLliAj//ve/Abj//vtRVfbZZ5/YK/O6qGr4cCgvh9Gjndfhwxsiekoxt0zDMLKafv368eyzz/rO161bx5577tnwCmNZVNWxY8aP6v2xEb5hGFlJeXk5IuJT9k8//TSqGp+yh6xdVOUFG+EbhpFVqCrnn38+77zzDgCFhYWsW7eO5s2bJ66R3r2dQGipCH2cwhDLNsI3DCNrmD17Nnl5eT5l/8orr/Dzzz8nVtnXUVoKxx6bXCWc4hDLNsI3DCPjqa2tpXv37sx2/dz3228/li1bFj2qZSaThhDLNsI3DCOjmTx5Mvn5+T5lP2HCBL7//HMKFywIvSgqW0hDiGVT+IZhZCQ1NTUccMAB9OzZE4CuXbuyc+dOzlq3Lut2mgpJGkIsm8I3DCPjePPNNyksLKTCHe1+8sknTrz6deuiL4rKFtLgDWQ2fMMwMoZt27bRunVrtrs27bPPPpt33323PqplnRmkzuYN9WaQbHSbTKU3EDbCNwwjQxg1ahTNmzf3KfsvvviC9957LzCEcZbuNBWRVHgDuZjCNwwjrWzYsAER4eqrrwagT58+qCqdO3fevXAjXhSVCkzhG4aRNh588MGAlbHffvstzz33XOTQxL17w/LlMHmy89q79+5lIl2fSFLVToIwhW8YRspZs2YNIsI//vEPAP7+97+jqhxwwAHeFiNFMoOkajFTihdNJQJR1XTL4KNbt246Z86cdIthGEYS+cc//sGDDz7oO//hhx/4xS9+4ZxUVTnK039StrjYGcl7MdvEe71XUtWOB0Rkrqp281I2qSN8EWklIq+LyBIRWSwi3ZPZnmFkLFn26J8MKioqEBGfsn/ggQdQ1Xpl7xSKbzFSqhYzpWHRVCJItklnKDBBVQ8HjgIye8NHw0gGWfjon2iuvPJKx1zjsn79em655ZbdC5aVwbZtgWnbt3v3wkmVF0+WegslTeGLSAlwCjAKQFV3qOqGZLVnGBmJl92TGjGLFi1CRBg9ejQAzz77LKoasNfsbvi7YYY6j0SqvHiy1FsomQuvDgSqgOdE5ChgLnCDqm71LyQi/YH+AB06dEiiOIaRBrJtoVCCQvWqKueccw7vv/8+AMXFxaxdu5ZmzZpFbqOiwlGe/qPnoqLY+itVi5lSvGgqESTTpNMEOAZ4UlWPBrYCtwYXUtWRqtpNVbuVZkGHGUZMZNOjf4JMT7NmzSIvL8+n7F9//XW2bdvmKPtobSSqv1K1mCmFi6YSQTIV/kpgpap+6p6/jvMHYBi5Q7Y8+ifA9LRr1y66detG9+6Ob0ZZWRk7duzgoosu8t5GtvRXlpI0ha+qa4DvReQwN+lMoDxZ7RlGxuJloZAXEuHpE66OOL1OJk6cSJMmTZg7dy4AkyZN4rvvvqOgoCD2Nnr3hrlzYdgw57Wh/WXsRrKDpw0EXhaRQuBb4Mokt2cYmUlpaXyj1LFjndFwYaFj8hg1KnZFGKmOBppSduzYwUEHHcTKlSsBOP744/n444/JywsxlvTaRiLu1QiNqmbM0bVrVzUMI4jKStXiYlWoP4qLnfRE1jFmjJNWUuK8jhkTscpXX31VAd/x6aefRpcjWhuJuNccA5ijHnWshUc2jEwnEZ4+Xurw4nVSVcXWxYvZs0cPampqADj33HMZP358YFTLcERrI9u8mrIMU/iGkekkwnOlrAw2bw5M27Jl9zoimZ7GjmXkn//MX1xFD/Dll1/SqVMn73JEayObvJqyEAueZhiZTiI8V9auhdrawLTaWifdA+u//hr5wx98yr4voMXFdLIFTVmFKXzDiEYivGMWL4bnn3deG5Ifr6ePuwG453Q/hgwZwl6HHuo7rwCeheTFjkmUV5OxO16N/ak4bNLWyDjqJhn32MPTRGZIBgwInIQcMCC2/ERQXh7YRt1RXh72ktWrVwdMyt7apIlNpmYgxDBpG3WELyJ5InK0iPxWRM4QkbbJ/hMyjIwgEXFwFi+GESMC00aMqB/JR8tPFK1bQ35+YFp+vpMegptvvpl27dr5ztesWcOQF14wU0uWE1bhi8hBIjIS+Ab4N9AbuA6YJCKzRORKETGTkNF4SUQI3GimlFhMLfGYlioqoEWLwLTmzXe7l28/+wwR4eGHHwbgoYceQlVp27atmVoaAZG8dO4FngT+4j42+BCRNsAfgD8BzydPPMNII4nwGDnuuMjp0fLriHcxkod7+dPJJ/PSjBm+8w3PPsseffsGXhPvAjIjvXi1/aTiMBu+kXHEuBgpJJFs9JWVqsG28SZNAm3jiVqMFOZeFi5cGGCr/4/Z6LMKErnwSkTygd8CZfg9EajqI8n5CzKMDMLjYqSI+cOHw3XXOWaa446Djh3r8yoqHNPKxo31ac2aBS40StRipKB70dat+fVZZzFx4kQAWgI/AsWR2khQ+GQjPXixwb8D9AH2xvlO1B2GkRskYsPsjh3hz38OVPbgzWyUyMVI7r18/PXX5OXl+ZT9uNGj2VRcXK/sQ7VhO3dlP9EeAYCFXh8X4j3MpGNkFUk2tcRcxgM7d+7Uo446yme+Ofjgg3XHjh3R27AYNxkLCY6l8z8R6aWqE5P5x2MYWUciTS0dOsDEidCrF5x4Yugyce6uNGHCBH7zm9/4zj/88EPOOOMMb21YjJtGgReFPwsY57pg1gACqKqWJFUyw8h0EmVqGTiw3hf/nntgwADH7h9MAz1kduzYwf7778+aNWsAOOGEE5g+fXroEMbh2rAYN40CLzb8h4HuQDNVLVHVlqbsDYPExH1J8sKr//73vzRt2tSn7D/77DNmzpwZWtlHwmLcNAq8jPC/Bha5tiLDMPyJ19QSaeFV8ARvDB4yW7dupaSkhFo3YNrvfvc73njjDWTtWmfxVkNkzcJNu41AvCj8H4CpIvI/4Oe6RDW3TMNwiGcxUhIWXj355JNcd911vvPFixdz+OGHJ2YnKVt4ldV4ea77DvgQKMTcMg0jsXTs6Njs/RkwIHB07zGmz7p16xARn7Lv378/quoo+0TEBTKynqgjfFW9OxWCGEaDmDkzsneLFzNIKhYTRWoj0sIs8OQhc++993LHHXf4spcvX06HDh1iqiPu+zAyn2h+m8AkoJXf+Z7AB179PmM5zA/fiImePQP9wnv1Csz3Eto4EeGPoxFvG5WVqoWFgfdaWKhaWamrVq0KCIswaNCg8HXE60efir4yYoYY/PC9KPz5IdLmearc2SvhC2C+F6FM4RsBVFaqzp4dWinNmBGovOqOGTPqr42m4FKxmChRG5AXFATWUVCgN/TvH6DsK6PVWaewmzePXWHbwquMJRaF78WGv0tEfM+GIrK/+wXzyumq2kVVu8VwjZHrRFvGPzHMOsC6dC+hjUOFOVZN7C5OiWijosKJr+PyDSA1NQwdORKARx99FFWl1IuJpc7ZLlanu0SEijbSjheFPwiYISIvisiLwDTgtuSKZeQ0XiYYe/UKfW1dupeFQi1aBNq0Aaqrd48bHw+JaMPvXv4IHOKXtXHjRv72t79Fr6OuT6urYetW5zWWSVtbeNUoiKrwVXUCcAzwCvAq0FVVP/BYvwITRWSuiPQPVUBE+ovIHBGZU2UeA7lFuA09vIwmTzxxd6XvP3HrZaHQli1Ouj/FxU66Fzm94LWNSJSWsuDOOxFgjJv0/DXXoKqUlHhcAxnvCN2/P5s3t4VX2Uo4Ww9QFskWhBNiYb8oZdq5r22ABcApkcqbDT+HiDQBGIu9eMYM1TvvrLfdBxNpHsBLO4mYcI0W7z4CtbW1esYZZ/js9K1attTtK1bEJkOdHImYtC0qcuYAiops0jZDIBGTtsBrwBvAFcARrtLuAJwBDAY+Bnp6bgjuAm6OVMYUfo4Qi6KNMzpkVJIdIbIBm4fXMX369IBJ2fHjxzfgBv2Ip09t0jZjiUXhh/XDV9Xfi0gnHLPhVcA+wDZgMfA+cJ+qVoe7XkSaA3mqutl93wu4J4aHD6Ox4sUnPFHL+KP5jffuDV26hN+cxIvveqQ2Ygmd4LJr1y66dOnCokWLADjssMNYtGgRTZp4WRgfgXg2c7FomY0Dr/8MsR7AgThmnAXAl8CgaNfYCD9HSNVoMV4//ESYfGIc4b/33nsBo/opU6bE3w9eSZSZzUgpJNIPP5WHKfwcItkmm0T54SfC5BNpT1uX6upqLS0t9Sn6k08+WXft2pXYPolEJpnZjJiIReHH+YxoGA0k2ZEXvZggvJqWwm1O4tXMMXw4XHZZ2BAQY8aM4Y9//KPvfO7cuRxzzDENv/dIxGOy8fqZWfiFzMXrP0MqDhvhGwkjUSP8SKNzryP8MKaSzZs3B5hvfv/732ttbW3y+iQVJhsLv5BySLRJB9gXOAE4pe7w2kAshyl8I6HEu1esF/t7tDbCKNLhQ4YEKPslS5Ykpw+iyJFQk43Z+dNCLAo/qklHRB4ALgXKgV11DwY4K24NI3PxYoKIVMaLh020NoJMJT8Brbdvh9ucxerXXnstTzzxhLf7iWYqiZSfCs8o8+TJeLzY8C8ADlPVn6OWNIxMw8uGHeHKeN2cJFIbfiEJ7gH+5Ze1YsUK2rdvH1m2OqJtXhIt32tohHg2OLHwCxmPl1g63wIFyRbEMDKO1q0h2Pe9SRMn3Sulpax88EGEemV/54UXoqrelX202EJeYg+lYk9a2/c24wk7wheR4Timm23AfBH5kMAtDq9Pvng5SLZ4OCRCznhMFIlk8eLwC6+aN3eUaB3NmsW08GrAgAE8/vjj9UUXL6b14YfvLkM85hivppRU7Elr+95mNuGM+8CfIxxXeJ0kiOXI+UnbbPFwSISc0epIVV/E64UTRs6lS5cGTMoOHTo0vAzR7jWaHDZZmtOQ4A1QbvCSlogjpxV+tvxoE7WhRyYosHi9cELIWVtUpJecf36Ast+0aVPD+8KLHF7yjUZLLArfiw3/zyHS+jT8mcIISbZsMOFVzkghhaPVkaq+iOSFU0fv3rB8OUye7Lz6T4QGyTkPyKuu5tXx4wF48cUXUVVatmwZXyjoaHLU5c+dC8OGOa/B+XXEE+rZyH7C/RMAvYF3gPXA237HFGCy13+UWA4b4TeSEX62mCjiiGTpL2ct6Kl+I/q999pLt2/fXl8uUxY8ZYvJ0IgJEhQeeX/gNOAT4FS/4xigidcGYjlyWuGrZs9jeSLiy2SKicJDnJtIfHTHHQHmm3duvjmwQKYseMqWAYURMwlR+Ok4cl7hq0besCOTCCfn7NnOCNJfsZSUOOle6/CanyjKy1VHj/Y+slfVmpoaPfzww32KvlO7dlqzcOHuBb32RwNkiKmNWD4XI6uIReF7WWm72f1S+7MRmAPcpKrfNtCaZIQinoUvqSScnLEsvol2r6nqi44dw8amD8U777zDeeed5zv/qLCQU7ZuheOPb9iCp2iLpqLhpQ1bFGXgbeHVI8DfceLp7AfcDDwD/Bf4T/JEM7KSRrz4prq6mr322sun7E8/6SRqi4o4ZceOhi948rJoKhpe+rwRfy6Gd8R5IohQQORTVT0+KG2Wqv5KRBao6lGJEqZbt246Z86cRFVnpBMvi6ailQm3ICrRcnjgxRdf5IorrvCdf/755xy9cyf07Bm4MKukxPGkOfZYb3J89pn3OqKRiD43sg4Rmauq3TwVjmbzwZm0vQTnaSDPfT/LzZvv1Xbk5TAbfg4RzWMkzslUT214YOPGjQGTspdeeml9CONUrEkwjCiQ4IVXB+K4Z64Fqtz3BwPFwEleG/JymMLPEaIpuXjdJb204YHHHnssQNl/9dVXuxdKhDdRtnhnGRlJLAo/6qStOpOy54bJnuHpMcIw/IkW+yWWjb+TsOn22rVrKfUrM3DgQIYNGxa6cCJix1j8GSNFePHSKQX6AWX+5VX1quSJZTRqysoCFTFAdXW9x4jXsMSRvFsa6JVy5513MnjwYN/5ypUr2XfffSNekxBvomzxzjKyGi9eOuOBPYDJwHt+h2E0nGBnAf9zL2GJo3m3xOiV8v333yMiPmV/9913o6rRlb1GAAyvAAAdTElEQVRhZBFeNkBppqr/aGgDIpKP47O/SlXPaWg9RpYRycOmosIJM+zvmVJcHBjuN1pY4gTu4HRtnz489fzzvvO1a9ey99571xcwzxajkeBlhP+uiJwdRxs3AIvjuN7INgYOhE6doE8f53XgwMD8aOYWrwuJtm0LLLN9e+gdnI49NqSiXrp0KSLiU/aPFxSgY8YEKvuxY2H//R3Xyf33d84NI0vxovBvwFH61SKySUQ2i8gmL5WLyH7Ab4Fn4xHSyCIWL4YRIwLTRoxw0uuIZm7xao4RiXweBlXloosu4nB3IxIBNgPX1dTEvpOUYWQRXrx0WsZR/2PALUDYOkSkP9AfoEOHDnE0ZXgmmSYKrx42vXtDly7hzT5eNgcvLg58EigqiuqFM3fuXLp1q1+jMqa4mN7x7iRlGFlC1BG+OFwuIne45+1FJIwbRcB15wCVqjo3UjlVHamq3VS1W6n9iJJPsk0UsXjYdO0KN9zgvIaSI4I5JqqnTxC1tbWcfPLJPmXftm1bqr//nt0i1sRqWjKMbCKaoz7wJPA4sNg93xP4zMN1Q4CVQAWwBmdv3JciXWMLr5JMqlZ1Rlslm6gVqgUFgXUUFISsY8qUKQELqN577736zEwJ02wYDYRELrwCjlfVY0RknvsHsV5ECqNdpKq3AbcBiMhpwM2qernnfyIj8aTKRDF8OFx2GUycCL16wYknJl6OaJ4+OKP6zp07s9idPzjyyCP5/PPPyc/Pr78mmunIFkUZjQgvk7Y1rmulgm8hVm1SpTKSQ6pMFGPHOiajoUOd12BzTSLkiFLHkiVLOPnkk33KfsaMGSxYsCBQ2dcRyXTkJd8wsgQvCn8YMA5oIyL34YRTuD+WRlR1qpoPfvpJRYhcL54tiZAjTB01rVoxZMgQunTpwpIlSxg9ejS1tbWcGPyUYRg5SNTwyAAicjhwJo4H24eqmhS/eguPnCKS6aUTS7jfRMjhV8f8Vau46qqrmDdvHhdffDEjRoygbdu2DbwRw8gOYgmPHNaGLyJ7+Z1WAmP981R1XcNFNNJKMuO2eF0QlSg5SkupbtmSe++9lwceeIC9996bN954gwsvvDC+eg2jERJp0nYujt2+bjVL3aOAuO8PTKJcRjbTwAVRDeGTTz7hqquuYsmSJfTp04eHH36YvfbaK/qFhpGDhFX4qnpAKgUxGgmxLIiKw6SzdetWBg0axLBhw2jfvj0TJkzgrLPOilN4w2jceJm0NQzvePXAiWMB2Icffsgvf/lLhg4dynXXXceiRYtM2RuGB0zhG4nFiwdOA2PUbNy4kX79+tGjRw+aNGnCtGnTGDFiBC1bxhP9wzByBy8Lr4xMIhtC9XqJg+Nl4ZXfvb4zaxbXXHMNa9as4ZZbbuGuu+6iuLg46bdiGI0Jr146u2FeOmkg0g5PmUYkDxwvZh/3XquaNOGGbdsYu2sXv/zlLxk/fnxA8DPDMLwT1g9fRL4j0EvHH1XVhHvpmB9+BKqqHFu3/6i4uBiWL8/ckX4k6v68CgocZe//51VVhXbowH+rq7ke2Aj8s0kTbq2ooNB2oDKMABLih29eOhlGYwvVG8Hss2r2bK7duZN3gOOA/wBHNGsGq1eDKXzDaDCebPgisidwCFBUl6aq05IllBGCxhiqN8jso6qMGjWKm2+6iR07d/Iwzu47+ZD992oYGYCXePhXA9OAD4C73de7kiuWsRupiIOTRr799lt69uxJv379OPqYY1j4yCPcWFxMfiO8V8NIF15G+DcAxwKzVPV0N67O3ckVK4eJ5IUTbZeoLGTXrl2MGDGC22+/nfz8fJ566in69etHXl4eXH555nskGUYW4UXhV6tqtYggIk1VdYmIHJZ0yXKRaF442eSl44HFixfTt29fPvnkE84++2yeeuop2rdvX18gmTF/DCMH8bLwaqWItALeAiaJyHhgdXLFykGiLUZqRBtq19TUcN9999GlSxeWLl3KSy+9xLvvvhuo7A3DSDheNjH/nfv2LhGZAuwB/C+pUuUi0bxwGomXzrx587jqqquYP38+l1xyCcOHD6dNmzbpFsswcgIvk7Yv1r1X1Y9U9W0cTzkjkUTzwslyL53q6mpuv/12jj32WNasWcO4ceN45ZVXTNkbRgrxYtI5wv/E3e6wa3LEyWGieeFksZfOxx9/zNFHH82QIUO44oorKC8v54ILLki3WIaRc0QKrXAbcDtQLCKbqF9xuwMYmQLZco9GtqH2li1bGDRoEMOHD6dDhw588MEH9OrVK91iGUbOEmml7RBgiIgMUdXbUihTbhPNMyVLPFcmT55Mv379WL58OQMGDOD++++nRYsW6RbLMHIaLyadQSJyuYjcASAi7UXkuGgXiUiRiMwWkQUi8qWImO9+DrBhwwb69u1Lz549adq0KdOmTWPYsGGm7A0jA/Ci8B8HugN/cM+3uGnR+Bk4Q1WPAroAvxaRXzVISiM2qqqczcRT7LI5fvx4OnXqxPPPP8+tt97K/PnzOemkk1Iqg2EY4fGi8I9X1b8C1QCquh4ojHaROmxxTwvcI3RoTiNxxLGTVEOprKzksssu44ILLqBNmzZ8+umnDBkyhKKiougXG4aRMrwo/BrXM0cBRKQUqPVSuYjki8h8oBKYpKqfNlhSIzopXpylqowZM4ZOnToxbtw4Bg8ezGeffUbXrubEZRiZiBeFPwwYB7QRkfuAGcD9XipX1V2q2gXYDzhORDoHlxGR/iIyR0TmVGXhqtGMom5xlj91i7MSzMqVKznvvPP44x//yCGHHMK8efP45z//SUFBQcLbMgwjMURV+Kr6MnALMAT4AbhAVV+LpRFV3QBMBX4dIm+kqnZT1W6lWeB9ktGkYHGWqjJy5EiOOOIIPvzwQx599FFmzJhBp06dEtaGYRjJIZIffhFwDXAw8AXwtKru9Fqxa/qpUdUNIlIM9AAeiFNeIxJ1i7OCd5JK0B/psmXL6NevH1OmTOGMM87gmWee4cADE77xmWEYSSJSLJ3ngRpgOvAboCPwtxjq3gd43rX/5wGvquq7DRXU8EgSFmft2rWLYcOGMWjQIAoKChg5ciRXX301IqF2vzQMI1OJpPA7qeovAURkFDA7lopVdSFwdByyGQ0lgYuzysvL6du3L7NmzeKcc87hySefZL/99ktI3YZhpJZINvyaujexmHKMxkFNTQ2DBw/m6KOP5uuvv+bll1/m7bffNmVvGFlMpBH+UW4MHXDi6PjH1FFVLUm6dEZamDt3LldddRULFy7ksssuY+jQoRbV0jAaAWFH+Kqar6ol7tFSVZv4vTdl3wjZvn07t956K8cffzxVVVWMHz+esWPHmrI3jEaCly0OjRxgxowZ9O3bl6+++oq+ffvy0EMP0apVq3SLZRhGAvGy8MpoxGzZsoWBAwdyyimnsGPHDiZNmsSzzz5ryt4wGiGm8HOYiRMn0rlzZx5//HGuv/56vvjiC3r06JFusQzDSBKm8HOQ9evXc+WVV3LWWWdRVFTEjBkzeOyxxyyEsWE0ckzh5xjjxo2jU6dOvPjii9x+++3Mnz+fE044Id1iGYaRAmzSNkf48ccfGThwIK+99hpdunTh/fff5+ijbV2cYeQSNsJv5KgqL730Ep06dWL8+PHcd999zJ4925S9YeQgNsJvxHz//fdcc801vP/++3Tv3p1Ro0bRsWPHdItlGEaasBF+I6S2tpann36aI444gqlTp/LYY48xffp0U/aGkePYCL+R8cEHH/DrXzvbDpx55pk888wzHHDAAWmWyjCMTMAUfiNhx44dHHDAAaxevRpwlP2kSZMshLFhGD7MpNMIeOWVV2jatKlP2c+ePZvJkyebsjcMIwAb4WcxW7dupVWrVuzc6USvvuCCC3jzzTdN0RuGERIb4WcpTz/9NC1atPAp+/LycsaNG2fK3jCMsNgIP8tYt24de++9t++8X79+jBw5Mo0SGYaRLdgIP4u4//77A5R9RUWFKXvDMDxjI/wsYPXq1ey7776+80GDBnHvvfemUSLDMLIRU/gZzo033sijjz7qO//xxx9tByrDMBpE0kw6ItJeRKaIyGIR+VJEbkhWW42RZcuWISI+Zf/II4+gqqbsDcNoMMkc4e8EblLVz0WkJTBXRCapankS22wUXH755bz88su+840bN1JSYtsIG4YRH0kb4avqD6r6uft+M7AY2DfyVbnNggULEBGfsh89ejSqasreMIyEkBIbvoiUAUcDn4bI6w/0B+jQoUMqxEkfVVVQUQFlZVBa6ktWVXr16sXkyZMB2GOPPfjhhx8oLi5OaDuGYeQ2SXfLFJEWwBvA31R1U3C+qo5U1W6q2q20MSunsWNh//2hZ0/ndexYAGbOnEleXp5P2b/11lts2LCh4co+TDuGYRiiqsmrXKQAeBf4QFUfiVa+W7duOmfOnKTJkzaqqhzlu327L2lXURHHHHggC8udKY1DDz2UL7/8kiZN4njoCtEOxcWwfLmN9A2jkSIic1W1m5eyyfTSEWAUsNiLsm/UVFRAYaHv9H2gSXW1T9lPmTKFpUuXxqfsQ7QDQEGBk24YRs6TTBv+icCfgC9EZL6bdruqvp/ENjOTsjLYsYOfgQ5ApZt80vHH89HHH5OXl6D/XbedAGpqnHTDMHKeZHrpzFBVUdUjVbWLe+SesgcoLWVs374UUa/s59x7L9NnzUqcsnfbYdQox4xTUuK8jhpl5hzDMABbaZt0tmzZQsuWLX3nF59xBq+OHYskawFV797QpQvMng3HHQfJ2tZw8eLkt2HeRoaRUCx4WhJ54oknApT9kiVLeO3DD5On7MHxyunaFW64wXlNhpfOwIHQqRP06eO8DhyY+DbM28gwEk5SvXRipbF46fz000+0bt3ad37ttdfyxBNPJL/hVHjpLF7sKPlgyssTN9I3byPD8ExGeOnkJFVVDL7mmgBlv2LFinplv3gxPP+889pQZs6Ef/3LeQ0mFV46s2fHlt4QzNvIMJKCKfwEserxx5E2bbjz6acBuON3v0NVad++vVMgEWaQXr3gpJPgnnuc17POCswvK4Nt2wLTtm9PrJfOccfFlt4QzNvIMJKCKfwEcH2/fuw3YIDvvAq4Z8IExzQBzoh+xIjAi0aMiG2kP3MmTJoUmDZx4u4j/eAtDhO95WHHjuB3r4BznsiJW/M2MoykYF46sRDkNfL1119z6KGH+rKHAtfXndSZIEpLI5tBghXlzJmOIu/VC048sT594sTQdUycWF+uosJRjv6j46Kiejnq8OJhE8lDZvhw5+nirbfgggvgnHNC1xEPqfI2MoxcQlUz5ujatatmLGPGqBYXq+6xh2pxsV7WvbsCvmNTUZEq1B/FxaqVlc615eWBeXVHeXlgGz17Bub36lWfN2NG6DpmzKgvU1mpmpcXmJ+XVy+HquqAAYH5AwZEvVcdMyYw30sd8RJNBsMwVFUVmKMedWzalbz/kbEKv7LSUTqgn/speUBfeOEFp0ydgiopaZiSjKbQKytD5/sr82h1ePnj8bvXuP68EtTfIWUwDMNHLAo/d2z4VVXw2Wf1dvVYqKhACwo4HTjGTdpbhO3Tp/OnP/3JSejd23EbnDzZee3dO7CO4cPhnXegb1/ndfjwwPxIJhtXBvbYIzCvpCTQcyVaHV48bKJ5yHj10omzv81LxzAST24o/DgX8Uxfs4a8TZuY6p6/A6wVoeiwwwILlpbCsceGnlwcOBDOPdeZfDz33N29dHr1Ct14XXpZGWzZEpi3dWug50q0Orx42ETzkPFSR7yLpsxLxzCSg9dHgVQcSTHpxGEeqKmp0U6dOvnMN51AaxpixvBqSolksvFSR7QylZWq+fmBefn5u/dFPOapRJljoslgGIaqmkknEK/mgSATxLvvvktBQQHlbgjjj4AvCXJr8mrG8GpKiWSy8VJHtDIVFdCiRWBe8+a794UX89SMGXDnnc6rv3kqUeaYaDIYhhE7Xv8ZUnEkbYQfzXPFzyOkuqhI927RwjeqP+2007T2yy+jj64jeZWkarLUywg/kaPvUPdaWalaUBDYRkGBTbgaRpLAvHT8iEEJvhjkgTNv3rz6euI1Y8TiDhnKjOHVHBOtnXhNJdHutbJStbAwML+w0BS+YSQJU/j+jB4dWuGPHu3kz56tm0pKAhT9ZU2aqM6evXtd5eXOdcG2+9mzndGuf/0lJbvXEe56fyorneuCFaTXNry0E64NL0STIxY5E0E892IYjYBYFH7jX2kbxatk+OTJXL+pfm/1r4BDCgpCe4R07Bh6xadXr5Jw1/tTWhray6esLDB6JEB1dWxyRmvDC9HuNZUeNmPHOm6uhYVOm6NGma3fMCLQ+Cdtw8R+WVtaiohw/e23O0n5+WhJCYc0JG5LqmK/qEY+TwXR7jVVfVFV5Sj77dth40bntW/fhvn9G0aO0DhG+NF2Rho+HK67zheX5a5XXuFuv3IrV65k38LC+HZX6t0bevRI3g5NFRXQrJmj3OooLt49Tk4qiHavye4LqPcG8n/q8Y9fZBjGbmS/wvf6WN+xI9+3aEGHDh18SXfffTd33nlnfZl4FUU8ppJoZNpipGj3msy+gMzrD8PIArLbpBPDY/1f//rXAGW/du3aQGWf6VjI4ECsPwwjZpI2wheR/wDnAJWq2jkpjXh4rF+6dCmHH364L3vEiBH89a9/bVh76d5UOxWmkmzC+sMwYiKZJp3RwAjghaS1EOGxXlW55JJLeP31131ZmzdvpkXwSlOvZIpHSLJNJdmG9YdheCZpJh1VnQasS1b9QNjH+rkrVpCXl+dT9i+//DKq2nBlbx4hhmE0AtI+aSsi/YH+QICN3TN+j/W1HTpw6sUXM2PGDADatm3L8uXLadq0aXxCmkeIYRiNgLRP2qrqSFXtpqrdShuqPEtLmbp1K/m/+IVP2b/33nusWbMmfmUP5hFiGEajIO0KPxEsWrSI008/HYAjjzySnTt3cvbZZyeuAfMIMQyjEdAoFP6ee+7JqaeeyvTp01mwYAH5+fmJb8TC9RqGkeUk0y1zLHAa0FpEVgL/UtVRyWhr3333ZerUqcmoOhDzCDEMI4tJmsJXVRsCG4ZhZBCNwqRjGIZhRMcUvmEYRo5gCt8wDCNHMIVvGIaRI5jCNwzDyBFM4RuGYeQIpvANwzByBNF07IsaBhGpApanUYTWwNo0tu8VkzPxZIusJmdiaQxy7q+qnlaEZpTCTzciMkdVu6VbjmiYnIknW2Q1ORNLrslpJh3DMIwcwRS+YRhGjmAKP5CR6RbAIyZn4skWWU3OxJJTcpoN3zAMI0ewEb5hGEaOYArfMAwjR8hZhS8i+SIyT0TeDZHXR0SqRGS+e1ydJhkrROQLV4Y5IfJFRIaJyDcislBEjslQOU8TkY1+/XlnmuRsJSKvi8gSEVksIt2D8jOlP6PJmSn9eZifDPNFZJOI/C2oTNr71KOcmdKn/5+IfCkii0RkrIgUBeU3FZFX3P78VETKYqk/aRugZAE3AIuBkjD5r6jqgBTKE47TVTXcgovfAIe4x/HAk+5rOogkJ8B0VT0nZdKEZigwQVUvFpFCoFlQfqb0ZzQ5IQP6U1WXAl3AGUABq4BxQcXS3qce5YQ096mI7AtcD3RS1e0i8ipwGTDar1hfYL2qHiwilwEPAJd6bSMnR/gish/wW+DZdMsSJ+cDL6jDLKCViOyTbqEyEREpAU4BRgGo6g5V3RBULO396VHOTORMYJmqBq+UT3ufBhFOzkyhCVAsIk1w/uhXB+WfDzzvvn8dOFNExGvlOanwgceAW4DaCGUuch9BXxeR9imSKxgFJorIXBHpHyJ/X+B7v/OVblqqiSYnQHcRWSAi/xORI1IpnMuBQBXwnGvKe1ZEmgeVyYT+9CInpL8/g7kMGBsiPRP61J9wckKa+1RVVwEPASuAH4CNqjoxqJivP1V1J7AR2NtrGzmn8EXkHKBSVedGKPYOUKaqRwKTqf9HTTUnquoxOI/FfxWRU4LyQ/2zp8PPNpqcn+PE+zgKGA68lWoBcUZOxwBPqurRwFbg1qAymdCfXuTMhP704ZqdzgNeC5UdIi0tvuBR5Ex7n4rInjgj+AOAdkBzEbk8uFiISz33Z84pfOBE4DwRqQD+C5whIi/5F1DVn1T1Z/f0GaBrakX0ybHafa3EsTkeF1RkJeD/9LEfuz8CJp1ocqrqJlXd4r5/HygQkdYpFnMlsFJVP3XPX8dRrMFl0t2fUeXMkP705zfA56r6Y4i8TOjTOsLKmSF92gP4TlWrVLUGeBM4IaiMrz9ds88ewDqvDeScwlfV21R1P1Utw3m8+z9VDfgXDbIxnoczuZtSRKS5iLSsew/0AhYFFXsbuML1hPgVziPgD5kmp4j8os7OKCLH4XzvfkqlnKq6BvheRA5zk84EyoOKpb0/vciZCf0ZRG/Cm0nS3qd+hJUzQ/p0BfArEWnmynImu+uet4E/u+8vxtFfnkf4ueylE4CI3APMUdW3getF5DxgJ86/Z580iNQWGOd+B5sAY1R1gohcA6CqTwHvA2cD3wDbgCszVM6LgWtFZCewHbgsli9pAhkIvOw+2n8LXJmB/elFzkzpT0SkGdAT+ItfWsb1qQc5096nqvqpiLyOY17aCcwDRgbpplHAiyLyDY5uuiyWNiy0gmEYRo6QcyYdwzCMXMUUvmEYRo5gCt8wDCNHMIVvGIaRI5jCNwzDyBFM4RtpQ0QGuZEBF7oRChMaVEucCIihoqGGTE9AexeISCe/86kiEnXjaRHZJxHyiEipiEyItx6j8WIK30gL4oT8PQc4xg1h0YPAmCvZyAVAp6ildudGnBXdcaGqVcAPInJivHUZjRNT+Ea62AdYWxfCQlXX1oVoEJGuIvKRG4ztg7qVz+6I+TER+ViceOHHuenHuWnz3NfDwrYahLtS+D8i8pl7/flueh8ReVNEJojI1yLyoN81fUXkK1eeZ0RkhIicgLMq+/+5TysHucV/LyKz3fInhxHjImCCW3e+iDwkzv4CC0VkoJteISL3i8gnIjJHRI5x+2ZZ3QIil7eAP3q9fyPHUFU77Ej5AbQA5gNfAU8Ap7rpBcDHQKl7finwH/f9VOAZ9/0pwCL3fQnQxH3fA3jDfX8a8G6Itn3pwP3A5e77Vq48zXFWV3+LE6ukCFiOE8OkHVAB7OXKOh0Y4V4/GrjYr52pwMPu+7OBySFkOQCY63d+LfCG3/3s5b5WANe67x8FFgItgVKcYIB11+8LfJHuz9eOzDwstIKRFlR1i4h0BU4GTgdeEZFbgTlAZ2CSG64hHydUbB1j3euniUiJiLTCUXzPi8ghOJEDC2IQpRdOML2b3fMioIP7/kNV3QggIuXA/kBr4CNVXeemvwYcGqH+N93XuUBZiPx9cMIh19EDeEqd0LfUtePytvv6BdBCVTcDm0WkWkRaqRM3vxLnT8kwdsMUvpE2VHUXzih4qoh8gRMUai7wpap2D3dZiPPBwBRV/Z04W75NjUEMAS5SZ1ek+kRnAvlnv6RdOL8Xz5tNuNTVUXd9MNtx/mT85QkX76Surtog2Wr96i5y6zSM3TAbvpEWxNln9BC/pC44ZpOlQKk7qYuIFEjgZhSXuukn4URe3Ihjdlnl5veJUZQPgIF+kRKPjlJ+NnCqiOwpTnjai/zyNuM8bcTCVwSO/CcC17h1IyJ7xVjfoeweVdUwAFP4RvpogWOGKReRhTjeLXep6g6cyIUPiMgCHDu/f0zw9SLyMfAUzv6eAA8CQ0RkJo4JKBYG45iAForIIvc8LOrsSnQ/8CnO5jjlOLsOgbO/wt/dyd+DwlQRXN9WYJmIHOwmPYsTJnehe/9/iPF+Tgfei/EaI0ewaJlG1iAiU4GbVXVOmuVo4c5BNMHZ8OU/qhpqU2yv9f0O6Kqq/0yAbNOA81V1fbx1GY0PG+EbRuzcJSLzcUwn3xHndnjun0VFvEKJSCnwiCl7Ixw2wjcMw8gRbIRvGIaRI5jCNwzDyBFM4RuGYeQIpvANwzByBFP4hmEYOcL/D66ArbGEUki7AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "iris1 = iris_dataset.plot(\"sepal_length\", \"petal_length\", kind=\"scatter\", title=\"Petal and sepal length in three species of Iris\", color=\"red\")\n", "iris1.set_xlabel(\"Sepal length (cm)\")\n", "iris1.set_ylabel(\"Petal length (cm)\")\n", "\n", "iris1.plot(iris_dataset.sepal_length, iris_dataset.sepal_length * slopes[0] + intercept, 'black')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Err...\n", "\n", "You might have noticed that this is *not* a very good model:\n", "\n", "* There's a lot of points at the bottom of the figure that don't follow the predicted relationship.\n", "* Petal sizes above 3cm seem to be increasing less quickly as sepal size increases than the predicted relationship.\n", "\n", "Let's calculate the predicted petal length for each flower -- what does our model predict as compared to the actual petal length we see?" ] }, { "cell_type": "code", "execution_count": 22, "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", "
sepal_lengthpetal_lengthpredicted_petal_length
05.11.42.377918
14.91.42.006416
24.71.31.634914
34.61.51.449163
45.01.42.192167
\n", "
" ], "text/plain": [ " sepal_length petal_length predicted_petal_length\n", "0 5.1 1.4 2.377918\n", "1 4.9 1.4 2.006416\n", "2 4.7 1.3 1.634914\n", "3 4.6 1.5 1.449163\n", "4 5.0 1.4 2.192167" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.DataFrame({\n", " 'sepal_length': iris_dataset.sepal_length,\n", " 'petal_length': iris_dataset.petal_length\n", "})\n", "data['predicted_petal_length'] = data.sepal_length * slopes[0] + intercept\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we plot the predicted petal length against the actual petal length, what would we expect to see?" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "predicted1 = data.plot('petal_length', 'predicted_petal_length', kind='scatter', color='red')\n", "predicted1.plot(data.petal_length, data.petal_length, 'black')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Loss\n", "\n", "Loss is a number indicating how bad the model's prediction was on one particular data point. If the model's prediction is perfect, the loss is zero; otherwise, the loss is greater. **The goal of training a model is to find a set of *weights* and *biases* that have low loss, on average, across all examples.**\n", "\n", "In this example, we have **150 data points** that provide a feature (the sepal length) as well as the label (the petal length). We can use these to determine how much total loss our model has over this dataset by calculating predicted labels and comparing them to the actual labels.\n", "\n", "There are many different measures of loss. One common measure of loss that is particularly useful in linear regressions is *squared loss* (or $L_2$ loss). This is defined as *the square of the difference between the label and the prediction*. In other words, it is equal to:\n", "$$ = (predicted\\ label - actual\\ label)^2 $$\n", "$$ = (observation - prediction(x))^2 $$\n", "$$ = (y - y')^2 $$\n", "\n", "We can use this equation to find the loss for a single data point. What does this look like in Python?" ] }, { "cell_type": "code", "execution_count": 24, "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", "
sepal_lengthpetal_lengthpredicted_petal_lengthsquared_error
05.11.42.3779180.956323
14.91.42.0064160.367740
24.71.31.6349140.112167
34.61.51.4491630.002584
45.01.42.1921670.627528
\n", "
" ], "text/plain": [ " sepal_length petal_length predicted_petal_length squared_error\n", "0 5.1 1.4 2.377918 0.956323\n", "1 4.9 1.4 2.006416 0.367740\n", "2 4.7 1.3 1.634914 0.112167\n", "3 4.6 1.5 1.449163 0.002584\n", "4 5.0 1.4 2.192167 0.627528" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['squared_error'] = (data.petal_length - data.predicted_petal_length)**2\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But how can we measure our total loss across all our 150 data points?\n", "\n", "## Mean Square Error (MSE)\n", "\n", "The Mean Square Error (MSE) can be calculated as the arithmetic mean of all squared losses in a particular dataset $D$. We can calculate this as the total squared loss divided by the number of data points, i.e.:\n", "\n", "$$ MSE = \\frac{1}{N} \\sum_{(x, y)\\ \\in\\ D}{(y - y')^2} $$\n", "\n", "What does this look like in Python?" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7423201713947026" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.squared_error.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tada!\n", "\n", "We now have:\n", "* A model that allows us to *predict* (or *infer*) the petal length from the sepal length within this dataset.\n", "* A measure for determining how much the prediction varied from the actual *label*, i.e. its *loss*.\n", "* A measure for determining how well the model performed on a particular dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises\n", "\n", "Here are a few exercises to test your understanding of this material." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 1\n", "\n", "In the [Iris flower dataset](https://en.wikipedia.org/wiki/Iris_flower_data_set), we looked at whether we could predict the petal length based on sepal length.\n", "\n", "For this exercise, try using the sepal width to predict petal width, find the equation of the line of best fit, and plot that line on the same graph." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas\n", "import numpy\n", "import matplotlib.pyplot as plt\n", "\n", "# Import Iris dataset.\n", "iris_dataset = # How can we load our dataset?\n", "\n", "# Plot sepal widths against petal widths.\n", "iris_dataset.plot(\n", " # How do we plot this dataset?\n", ")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Hmm, this is NOT looking good. Oh well, let's see how awful it is!\n", "# Construct our model.\n", "slope, intercept = # How do we calculate the slope (weight) and intercept (bias).\n", "print(slope, intercept)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "iris1 = iris_dataset.plot(\n", " # How do you plot a pretty graph?\n", ")\n", "iris1.set_xlabel(\"#TODO\")\n", "iris1.set_ylabel(\"#TODO\")\n", "iris1.plot(\n", " # How can you plot the line of best fit?\n", ")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 2\n", "\n", "For the model that predicts petal length from sepal length in Exercise 1, calculate the Mean Square Error (MSE)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Calculate predicted petal widths.\n", "iris_dataset['predicted_petal_width'] = # How?\n", "iris_dataset['squared_error'] = # How??\n", "print(\"The mean squared error is: \",\n", " # How???\n", ")" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }