Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save rquintel/f39d835cb64aa5472e500faa14fb4a9f to your computer and use it in GitHub Desktop.
Save rquintel/f39d835cb64aa5472e500faa14fb4a9f to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<a href=\"https://www.bigdatauniversity.com\"><img src=\"https://ibm.box.com/shared/static/cw2c7r3o20w9zn8gkecaeyjhgw3xdgbj.png\" width=\"400\" align=\"center\"></a>\n",
"\n",
"<h1><center>Polynomial Regression</center></h1>\n",
"\n",
"<h4>About this Notebook</h4>\n",
"In this notebook, we learn how to use scikit-learn for Polynomial regression. We download a dataset that is related to fuel consumption and Carbon dioxide emission of cars. Then, we split our data into training and test sets, create a model using training set, evaluate our model using test set, and finally use model to predict unknown value."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Table of contents</h1>\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <ol>\n",
" <li><a href=\"#download_data\">Downloading Data</a></li>\n",
" <li><a href=\"#polynomial_regression\">Polynomial regression</a></li>\n",
" <li><a href=\"#evaluation\">Evaluation</a></li>\n",
" <li><a href=\"#practice\">Practice</a></li>\n",
" </ol>\n",
"</div>\n",
"<br>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Importing Needed packages"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import pylab as pl\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"download_data\">Downloading Data</h2>\n",
"To download the data, we will use !wget to download it from IBM Object Storage."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2019-04-07 23:59:04-- https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv\n",
"Resolving s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)... 67.228.254.193\n",
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|67.228.254.193|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 72629 (71K) [text/csv]\n",
"Saving to: ‘FuelConsumption.csv’\n",
"\n",
"FuelConsumption.csv 100%[=====================>] 70.93K --.-KB/s in 0.04s \n",
"\n",
"2019-04-07 23:59:04 (1.65 MB/s) - ‘FuelConsumption.csv’ saved [72629/72629]\n",
"\n"
]
}
],
"source": [
"!wget -O FuelConsumption.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__Did you know?__ When it comes to Machine Learning, you will likely be working with large datasets. As a business, where can you host your data? IBM is offering a unique opportunity for businesses, with 10 Tb of IBM Cloud Object Storage: [Sign up now for free](http://cocl.us/ML0101EN-IBM-Offer-CC)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"\n",
"## Understanding the Data\n",
"\n",
"### `FuelConsumption.csv`:\n",
"We have downloaded a fuel consumption dataset, **`FuelConsumption.csv`**, which contains model-specific fuel consumption ratings and estimated carbon dioxide emissions for new light-duty vehicles for retail sale in Canada. [Dataset source](http://open.canada.ca/data/en/dataset/98f1a129-f628-4ce4-b24d-6f16bf24dd64)\n",
"\n",
"- **MODELYEAR** e.g. 2014\n",
"- **MAKE** e.g. Acura\n",
"- **MODEL** e.g. ILX\n",
"- **VEHICLE CLASS** e.g. SUV\n",
"- **ENGINE SIZE** e.g. 4.7\n",
"- **CYLINDERS** e.g 6\n",
"- **TRANSMISSION** e.g. A6\n",
"- **FUEL CONSUMPTION in CITY(L/100 km)** e.g. 9.9\n",
"- **FUEL CONSUMPTION in HWY (L/100 km)** e.g. 8.9\n",
"- **FUEL CONSUMPTION COMB (L/100 km)** e.g. 9.2\n",
"- **CO2 EMISSIONS (g/km)** e.g. 182 --> low --> 0\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Reading the data in"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>MODELYEAR</th>\n",
" <th>MAKE</th>\n",
" <th>MODEL</th>\n",
" <th>VEHICLECLASS</th>\n",
" <th>ENGINESIZE</th>\n",
" <th>CYLINDERS</th>\n",
" <th>TRANSMISSION</th>\n",
" <th>FUELTYPE</th>\n",
" <th>FUELCONSUMPTION_CITY</th>\n",
" <th>FUELCONSUMPTION_HWY</th>\n",
" <th>FUELCONSUMPTION_COMB</th>\n",
" <th>FUELCONSUMPTION_COMB_MPG</th>\n",
" <th>CO2EMISSIONS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX</td>\n",
" <td>COMPACT</td>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>AS5</td>\n",
" <td>Z</td>\n",
" <td>9.9</td>\n",
" <td>6.7</td>\n",
" <td>8.5</td>\n",
" <td>33</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX</td>\n",
" <td>COMPACT</td>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>M6</td>\n",
" <td>Z</td>\n",
" <td>11.2</td>\n",
" <td>7.7</td>\n",
" <td>9.6</td>\n",
" <td>29</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX HYBRID</td>\n",
" <td>COMPACT</td>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>AV7</td>\n",
" <td>Z</td>\n",
" <td>6.0</td>\n",
" <td>5.8</td>\n",
" <td>5.9</td>\n",
" <td>48</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>MDX 4WD</td>\n",
" <td>SUV - SMALL</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>AS6</td>\n",
" <td>Z</td>\n",
" <td>12.7</td>\n",
" <td>9.1</td>\n",
" <td>11.1</td>\n",
" <td>25</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>RDX AWD</td>\n",
" <td>SUV - SMALL</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>AS6</td>\n",
" <td>Z</td>\n",
" <td>12.1</td>\n",
" <td>8.7</td>\n",
" <td>10.6</td>\n",
" <td>27</td>\n",
" <td>244</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" MODELYEAR MAKE MODEL VEHICLECLASS ENGINESIZE CYLINDERS \\\n",
"0 2014 ACURA ILX COMPACT 2.0 4 \n",
"1 2014 ACURA ILX COMPACT 2.4 4 \n",
"2 2014 ACURA ILX HYBRID COMPACT 1.5 4 \n",
"3 2014 ACURA MDX 4WD SUV - SMALL 3.5 6 \n",
"4 2014 ACURA RDX AWD SUV - SMALL 3.5 6 \n",
"\n",
" TRANSMISSION FUELTYPE FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY \\\n",
"0 AS5 Z 9.9 6.7 \n",
"1 M6 Z 11.2 7.7 \n",
"2 AV7 Z 6.0 5.8 \n",
"3 AS6 Z 12.7 9.1 \n",
"4 AS6 Z 12.1 8.7 \n",
"\n",
" FUELCONSUMPTION_COMB FUELCONSUMPTION_COMB_MPG CO2EMISSIONS \n",
"0 8.5 33 196 \n",
"1 9.6 29 221 \n",
"2 5.9 48 136 \n",
"3 11.1 25 255 \n",
"4 10.6 27 244 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"FuelConsumption.csv\")\n",
"\n",
"# take a look at the dataset\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets select some features that we want to use for regression."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ENGINESIZE</th>\n",
" <th>CYLINDERS</th>\n",
" <th>FUELCONSUMPTION_COMB</th>\n",
" <th>CO2EMISSIONS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>8.5</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>9.6</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>5.9</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.6</td>\n",
" <td>244</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.0</td>\n",
" <td>230</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.1</td>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.6</td>\n",
" <td>267</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ENGINESIZE CYLINDERS FUELCONSUMPTION_COMB CO2EMISSIONS\n",
"0 2.0 4 8.5 196\n",
"1 2.4 4 9.6 221\n",
"2 1.5 4 5.9 136\n",
"3 3.5 6 11.1 255\n",
"4 3.5 6 10.6 244\n",
"5 3.5 6 10.0 230\n",
"6 3.5 6 10.1 232\n",
"7 3.7 6 11.1 255\n",
"8 3.7 6 11.6 267"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']]\n",
"cdf.head(9)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets plot Emission values with respect to Engine size:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEKCAYAAAAIO8L1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X2UHXd93/H3dx9kayWw8EpQYVm7BIyJTIKxFzBVkjqWeRIc7OQANV2wanwiLLmpgRLAVRtCWuWQhwZMWwkU/CDQBkKBFB+jQvyYFGIgsrGNZUEtsGQLq1gCbCxkbCR/+8fM7c7Oztx5uDN37t39vM6Zs/f+7szc315p53vn9/D9mbsjIiISN9B0BUREpDcpQIiISCIFCBERSaQAISIiiRQgREQkkQKEiIgkUoAQEZFEChAiIpJIAUJERBIN1XlyM9sHPA4cB465+4SZnQz8DTAO7APe4u4/NTMDrgLWAkeBf+3ud7Y7/9KlS318fLy2+ouIzEV33HHHYXdflrVfrQEi9Nvufjjy/APAze7+YTP7QPj8/cDrgNPC7RXA1vBnqvHxcXbt2lVPrUVE5igz259nvyaamC4AtoePtwMXRso/5YFvAEvMbHkD9RMREeoPEA78nZndYWbrw7LnuPtBgPDns8PyU4CHIsceCMtERKQBdTcxrXb3h83s2cCNZvbdNvtaQtmsVLNhoFkPsHLlympqKSIis9R6B+HuD4c/HwH+Fng58KNW01H485Fw9wPAqZHDVwAPJ5xzm7tPuPvEsmWZfSwiIlJSbQHCzBaZ2TNaj4FXA/cC1wPrwt3WAV8KH18PXGyBc4DHWk1RIiLSfXXeQTwH+JqZ3Q18C/iyu38F+DDwKjO7H3hV+BxgJ/ADYC/wV8DGGusmIn1magrGx2FgIPg5NdV0jea+2vog3P0HwEsSyn8MrEkod+DyuuojIv1ragrWr4ejR4Pn+/cHzwEmJ5ur11ynmdQi0vM2bZoODi1HjwblUh8FCBHpeQ8+WKxcqqEAISI9L21Eu0a610sBQkR63ubNMDIys2xkJCiX+ihAiEjPm5yEbdtgbAzMgp/btqmDum7dSNYnItKxyUkFhG7THYSIiCRSgBARkUQKECIikkgBQkREEilAiIhIIgUIERFJpAAhIiKJFCBERCSRAoSIiCRSgBARkUQKECIikqj2AGFmg2b2bTO7IXx+nZk9YGZ3hduZYbmZ2cfMbK+Z3WNmZ9VdNxERSdeNZH1XAHuAZ0bK/sDdPx/b73XAaeH2CmBr+FNERBpQ6x2Ema0AXg98MsfuFwCf8sA3gCVmtrzO+omISLq6m5g+CrwPeDpWvjlsRvqImZ0Qlp0CPBTZ50BYJiIiDagtQJjZG4BH3P2O2EtXAi8CXgacDLy/dUjCaTzhvOvNbJeZ7Tp06FCVVRYRkYg67yBWA280s33AZ4HzzGyHux8Mm5GeBK4FXh7ufwA4NXL8CuDh+EndfZu7T7j7xLJly2qsvojI/FZbgHD3K919hbuPAxcBt7j721r9CmZmwIXAveEh1wMXh6OZzgEec/eDddVPRETaa2LJ0SkzW0bQpHQXcFlYvhNYC+wFjgKXNFA3EREJdWWinLvf5u5vCB+f5+6/5u4vdve3ufuRsNzd/XJ3f374+q5u1E1E+sPUFIyPw8BA8HNqqukazX2aSS0imTZuhKEhMAt+btzY3fefmoL162H/fnAPfq5fryBRNwUIEWlr40bYuhWOHw+eHz8ePO9mkNi0CY4enVl29GhQLvUx91kjSfvGxMSE79qlliiROg0MBN/a48zg6fgMpzlch7nEzO5w94ms/XQHISJtpX2H7OZ3y5Uri5VLNRQgRKTnbd4MIyMzy0ZGgnKpjwKEiPS8yUnYtg3GxoJmpbGx4PnkZNM1m9sUIESkrQ0bipXXZXIS9u0L+hz27VNw6AYFCJE+V/f8gC1bgmAwOBg8HxwMnm/ZUv6cmtPQHxQgRGpW5xyCpPkBl1wCS5dWe/HdsgWOHQve49ixzoOD5jT0Bw1zFalRaw5BXKffwFvGx4MLbDsjI73VXp9W57GxoOlI6pd3mKsChEiNhoamJ5hFDQ4G38Q7lTY/IK6XLr6a09A8zYMQ6QFJwaFdeVF55wE8+GBn75PVTFakT0FzGvqHAoRIjSxpGaw25UUlzQ9I0snFNyvVRtE+Bc1p6B8KECI1qmIWcrtv7/H5AaOjsGDBzOM7vfh+/OPty4vmSdKchv6hACHzWtNZSrPkSZQXnR9w+DBceunMIanr1nV28c0KcmnNV+2atTSnoT8oQMi81Y0spa0Ldd7yuG3bipVPTcH27TN/p+3b6x1Cqj6FuUsBQuatohffMtavL1YeV7STu4m02OpTmLtqDxBmNmhm3zazG8LnzzOzb5rZ/Wb2N2a2ICw/IXy+N3x9vO66yfxW9wgj6HwWctE7kDLNPVmyUm1MTgbNWFU2a0lv6MYdxBXAnsjzPwU+4u6nAT8FLg3LLwV+6u4vAD4S7idSm06bf/LqZBZy0TuQOpp7soJcE81a0h21BggzWwG8Hvhk+NyA84DPh7tsBy4MH18QPid8fU24v0gtOm3+6YbVq4PO86ihoaA8SVpzz9q1neU+ahfktNrb3FX3HcRHgfcBrfmRo8Cj7t6aQ3oAOCV8fArwEED4+mPh/iK1qCMJXdU2bZo94/rYsZkX3+gktU2bguad6BDSdeuCb/R15T6qo1lLekNtAcLM3gA84u53RIsTdvUcr0XPu97MdpnZrkOHDlVQU5nPqkxCV4esi2/SJLXt24M7idYQ0p076/2Gr1FMc1eddxCrgTea2T7gswRNSx8FlphZ66Z5BfBw+PgAcCpA+PpJwE/iJ3X3be4+4e4Ty5Ytq7H6Is3Luvjmad6p+xt+XaOYzjgjuAtqbWec0dn5pLjaAoS7X+nuK9x9HLgIuMXdJ4FbgTeFu60DvhQ+vj58Tvj6Ld7PmQRFKpB18c1z8a/7G34dM6PPOAPuu29m2X33KUh0WxPzIN4PvMfM9hL0MVwdll8NjIbl7wE+0EDdRHpK1sU3z8W/G/MUqp4ZHQ8OWeXzRddn/rt7325nn322izRpxw73sTF3s+Dnjh3df/+REfegByLYRkZm16PpehYV/X3i23y1YUPy57FhQ/FzAbs8xzVWM6lFSuqFldHyNu/Ev+GDlvzsN92Y+R+nACFSUr+O/68jsFXdobxqVbHy+aAbM//jFCBESmpq/H/0QmwGb3tb9sU+Oldi3brige3882e+5/nnT79WR4fy7t2zg8GqVUH5fNWtmf9RChAiJTUx/j9PboH4xT5+x5D2jTNtbevzz4ebb55ZdvPN00Girg7l3btntrbP5+AAzcz8V4AQKamXs5hG72KSmsKSpH0TjQeHrHKpRxMz/xUgRErq5ZXRoncxeZu86mzLlmp0e+a/AoTIHBO/i8nb5DU2Vk99pH8pQIiU1AvDXKPS7mKSmsKSrF2bXL5mTbFymTsUIETaiI7+ic8XaGKYa7v1odNmMcebwtL6GnbuTC6/6abZwWDNmqAcmhldI92hACGSIusOoalhrvG5tBs2ZKdfiE6Ue/rp2a9D+3rfdNPM92wFB6hudE3X00hItjzTrXt1U6oNqdPYWHJqg7Gx4PXR0eTXR0frrdeGDe6Dg+3TUbRLv5D1e5WxZs3Mc61ZU/x3qiqNhGRDqTZEOtOLC+Fs3Ahbt2aPONq6NT2NRtXDc6em4PbbZ5bdfvvM923XVAfNpJGQHPJEkV7ddAchdcr6pm2W/LpZtfWIJtprd9eQttWdvC/tcxocDM4/Ouq+YEH7Oik5X3ehOwiRzmR9004bPnryydUlwov3g5Rx9ChcccXMOkH79NztUmvEpc3APn48qPOPfwxPPTW7TtHOfHV096g8UaRXN91BSN3afdNOSrU9PJz9bbmItG/nnW7t6hTvT8jqVyhbh+idVtH3lM6Q8w7CvOzXkh4wMTHhu3btaroaMo9NTQXfhB98MLijOHIk+MYcNzY2nWa7iIGB8ncOWQYHgzuIlSuDu6LWXURWvqfBweCupjWLN09+qCTRz2R8PPlOpOznJu2Z2R3uPpG1n5qYRDoQX2fhJ7NWUQ+069huN7yzzsR/rSag/fvhHe/I3xR2/HjQCd6qZ5lmoHineC8OCJAaA4SZnWhm3zKzu81st5l9KCy/zsweMLO7wu3MsNzM7GNmttfM7jGzs+qqm0hdFi0qVh4flRS/+L7gBdXXMclTTwX9FEW0Rhidfnr2vsPDMDqaPtu7icy4kq3OO4gngfPc/SXAmcBrzeyc8LU/cPczw+2usOx1wGnhth7YWmPdRCoRH7555EjyfmnlWcM7b7utwwoW0Goay5tCoxXU9uxJ36cVEK69Fg4fTu8U7+XMuPNZbQEi7Atp/VkMh1u71tQLgE+Fx30DWGJmy+uqn0inkmZaF5W1Sli7+Q6trtwdO7LTaIyOTu+TJSm1RpLWe7XrI0kLCHG9nBl3Pqu1D8LMBs3sLuAR4EZ3/2b40uawGekjZnZCWHYK8FDk8ANhmUjXFEn3kHedhXayhnfmGf759a/DgQPBhfrpp4N6R42MwFVXTfeVjI4mnzNaHk2tsWFD8v5VL1QT789RcGherQHC3Y+7+5nACuDlZvZi4ErgRcDLgJOB94e7J323mfXdxMzWm9kuM9t16NChmmou81FWf0BcmTuGuLT2+1Z52kX4+PHpOQrROrsH6wQsXjzzmzhMN4XB7MAzPBwEkSRZC9WceGLycWnl0j+6NszVzD4I/Nzd/yJSdi7wXnd/g5l9ArjN3T8TvvY94Fx3P5h2Tg1zlSoNDSU36QwOBhfdvPsnGRhIP3dS8rzo/hs3Bhf5Igv6ROvcagqL3u0MD8MznxmMuooPcy1q6dLkob2jo0G/g/Sexoe5mtkyM1sSPl4InA98t9WvYGYGXAjcGx5yPXBxOJrpHOCxdsFBpGpZ/QF5y5OkZVDNUx5dRSyvaN2SmsJ++cvgou4eNE99/ev5zx2XNrQ3rVz6x1D2LqUtB7ab2SBBIPqcu99gZreY2TKCJqW7gMvC/XcCa4G9wFHgkhrrJjLL4GD6Rb/VubtqFezeHTweG8vfzNTt1dqiTUhZcwlaTWlQbgnLtDsspcnof3WOYrrH3V/q7r/u7i929z8Oy89z918Ly97WGukUjl663N2fH76utiOpXbRTOs8dwX33wRlnBI+ThmYOpPxFdWs+Q0u07yLvXIKymVOTgkO7cukfmkktpWWlcO71OqSlzs4aCnrffcHPpKGZac1AVc1nWLKk/evxDmTIv+RokSYzmSfyJGzq1U3J+pqTlKiuk6R0TdQhbdGdwcHg9TIpqIseU3T/sgvr5EkZ3vq9i1Kq7v6DkvVJnXohuVqndWh3p+Ce/XqSoiOhir5H0fMnad05xcXvPPIq8zlJsyodxRSOSPr3ZrbNzK5pbZ1XU/pVLyRX67QOWZPQVq1Kfj1aHm/iOvfc5GOqmlRWxYiq1atn95UMDATlZaRNpEsrl/6Rtw/iS8BJwE3AlyObzFO9kFwtTx3a9VGkXbRb5bt3zw4S0VFMSak2br999jFr1qR/M0/79p1WXsXCOps2zR5e+/TTMxfwieuF/iZpQJ52KOCuPPt1e1MfRHP6oQ8iTx03bJjuixgczG7Lj0pbzCfezt/uc+lWH0RU0aVSsz7HrL4c6T3k7IPIGyD+M7A2z77d3BQgmtXJxbUq7VZ8y1pTutPzF1kjOu09y9Sx08+96Htm7a9O6v6TN0DkbWK6ArjBzH5hZo+H289quaWRvjA1Bdu3z8xbtH17bzU9dNpHkdSEtH799O9YpDkt7T3LpLmOzqw+dqx4x/LatcXKsz7Hos1k0kfyRJFe3XQH0Zwqvp13KqvpY9Gi5DouWpTv/Fm/444ds9efbjeENOkuxL37d2JN3EG0uxOT7qPKJqbgfLwR+Itwe0Pe4+rcFCCaU7QdO4+iF5G6mz6yjt+xw314eGb5wEB20Ij3k8TPMTzc/ndP2r+Iqvsg8nxO8fc0U5BoUqUBAvgwcDPwjnC7EfhwnmPr3BQgmlP1HUSZTu+sC13dASLtMxgdnQ50aR24rc9pdDT9HEniwaFMkCjzb9cueGd9TmkBc8GC/HWWalUdIO4BBiLPB4F78hxb56YA0ZyqRzGlXbTaNc00fQeR55t41jmK1rHT38k9uWlswYLy/3Z1B2qpXt4AUSQXUzQLzEnlez1kLqh6ici0jtDjx4NLSbyDGJpfxzjPPIwq5i3UIfiel/68iMsuK1YufSRPFAHeCuwHrgO2Aw8AF+U5ts5NdxBzR9rdQFYzSCdNH1myjs9zF9XEHURWp3cdAwzavafuIHoPNXRSLyfoqL4A+Gd5j6tzU4CYO3bsCDp48wSJvCN+8jQBtQswq1YlH79qVb7j3atvBsvqg8gzka6OAQbtrFmT/H5r1tTzfpKtkgABvCj8eVbSlucN6twUIOaOtAtbni0tSCxenLz/4sXB63na4uNBIhoc8uh0BFCSdqOY0oLswED+z6UO8SCh4NCsqgLEtvDnrQnbLXneoM5NAaJZVY5tTxvtk/eOIknWxbfoCKK84p/Lhg31NYMV/Z3d288A1zyF+aHyJqaiG3Ai8C3gbmA38KGw/HnAN4H7gb8BFoTlJ4TP94avj2e9hwJEc6oexVQ2OLS7mNax3kOWop9LEwEiz+fZ7bxa0l15A0TedN9vNrNnhI//g5l90cxemnHYk8B57v4S4EzgtWZ2DvCnwEfc/TTgp8Cl4f6XAj919xcAHwn3kx61aRMcPTqz7OjR9hlB2+lkVE/asVWkxi6q6s+lqDxpL/J81t2ss/SuvMNc/6O7P25mvwG8hmAk08fbHRAGqiPh0+Fwc+A84PNh+XbgwvDxBeFzwtfXmCmbS69KWqinXXmWTtZLSDt28eL25aOjya+nleeRNlx3//7qUmVH19EeGgqetwQ347NFy9PWrIjr5toe0pvyBojWd67XA1vd/UvAgqyDzGzQzO4CHiGYff194FF3b619dQA4JXx8CvAQQPj6Y0AHf6pSp6rH9yctYpNk8eLp9xgcDNZa2Lkz+eL7858nn6NVftVVMDw887Xh4aA8r/jFetGi9H3dg0BxySXlg0R8He3jx4Pn0SCRZe/efPt1c20P6VF52qGAG4BPEFzglxD0F9yd59jw+CUEHdu/CeyNlJ8KfCd8vBtYEXnt+8BowrnWA7uAXStXrqy8bU7yydPWXaQTO+88CJg+5+jo7FFIRUcIddLRnjbyamgo+3dodYR3s18la03qTvoglIyvv1Bxqo0R4HeB08Lny4FX5zk2co4PAn8AHAaGwrJXAl8NH38VeGX4eCjcz9qdU53UzckaAVRlZ23Rrcp1ChYunHncwoXTr6VdrFsXyayLcZ7PscjnVMXnWOYCXybhoDQrb4DI28S0HPiyu99vZucCbyYYoZQqXMd6Sfh4IXA+sCe8k3hTuNs6guVMAa4PnxO+fkv4i0gPevTR9uVNdtZ20nYebTIygyeemPn6E09Mp/dI6+x2h337Zi/rmeQXvyhWXrennw7qXiRlyhVXwC9/ObPsl78MyqW/5Q0QXwCOm9kLgKsJhqr+dcYxy4Fbzewe4J+AG939BuD9wHvMbC9BH8PV4f5XA6Nh+XuADxT6TeaYqtcAbtexWUbWCKFOF+vpRNm283j7fppW0KiiHyarn6Qf/PjHxcqlj+S5zQDuDH++D/j98PG38xxb5zZXm5iqnmNQxTrGcVlNHUXz/VTVvNTJLOUik/Xyfq6dNAmV+dw7/fzKqPp8Uj8q7oP4JkHCvnuB54Vl9+Y5ts5trgaIqpOp1bGofNZFodt9EFXMUi5zIc1KjJfVx1B1gEj7v5Onc7ps+ou6ZqRLffIGiLxNTJcQdChvdvcHzOx5wI7q7mMkqurmmSYmjFWdDjxLmbbzshYunH68ejWsWBH8jitWBM+jqhhKG7VhQ/vytBTo5503c3jwc587c581a+Cmm8rV6aqrYEFs0PuCBeV/R+kheaJIr25z9Q6i6m9keRK4FVV1s0InuZjS3rPo55jnW3b0M8t7l9RuCGiZTKdZdy1JuaCqbLJMomGu/YWKkvV9Lvz5HYJV5Vrbd9CKcrWpOkAsWpR8vkWLytex6gDRSXBIe8+iF9+879W6IOdZcjTrYllH/1BcHes/SH/LGyAs2DeZmS1394NmNpZy91EysUI1JiYmfNeuXU1WoRYDA8GfcJxZvqGTdZ+vdWyaNv+lUj3jGXDkSPZ+Rd5zaCi5GW1wEI4dy79/2vFpn2vcyEh681rROkIw2mrbtuC4wcEg1ciWLenvX8e/v/Q3M7vD3Sey9mvbB+HuB8Of+8Ng8FPg8cgmNcizlGWT56tDHcM6i/a95M0H1To+7+fXbv5H0TqWSbXRjX//qodlS4/Ic5sBvBP4EbCPYLnRB4Af5Dm2zm2uNjFVvah8FW3lcb3WxNTaogv6lBm9FW3fT9taxyd9rkU/l6J1LPM7VT1sutvnl+pR8TDX+4Glefbt5jaXA0TVqQuyLv5F37NMgCi7fnTZIFGmfT8aINI6raPHx3+ntAEBaRfwonUsG5jr7ERWH0f/qTpAfAUYybNvN7e5GiCa+IOrOidQXCdLb5bZWrJG/ERlLXuadXyZz6VoHeuY09Kpbq9xLZ3LGyDadlK3hIsDXUswYe7JSPPUv62srasEdVJXp2inc579p6aCtvcHHwx+p6R29bGxYP5C1St/5PhvPUsVHe+LFyf3pyxa1FknfMsZZ8B9980uX7UKdu/u/PxljI8nrwPS+reV3lNJJ3XEJ4BbgG8Ad0Q2qUF8olNWeS+amgo6fffvDy6uaZ2uZRcY6lXxBIVZ5UV973vFyrshbXLe5s3N1EeqkzdAHHP397j7te6+vbXVWrN5LJ5BNKu8ClWvrpaUzTVJJ0uNplm1qvpz5pV2p9HuDqTICKAmZsVn6faseemevAHiVjNbb2bLzezk1lZrzeaxtGakOsesV50uIe+dQdUXtk6aWvKs51y1qalghbnWnVbWinNVr+RXlcnJ6RTn3Up5IvXLGyD+FXAl8I9MNy/Nvcb/OST+rXTjxvbfUicn4ZprZn4LvOaa8n/oeS9Ynaz/HNXqGo0HhyLfzi+7rFh5FYqupZA2V6OTNb1FUuXpye7Vba6OYio7lLElz/j8gYHOhjpm1THvaKM8WU3zbEnDN8uMzy8yoqjM59Lp/lXUsQ7KxdRfqCgX0/sij98ce+1P8rxBnZsCRLK86zvXmYspbT5ApwEla4tOKGxiuHA3AkSv0US5/pM3QGQ1MV0UeXxl7LXXVnQTIzGddhjnbf+vc9WyIv0lA3kbOnN46qnp5pkmVrUr+m9X9eCAJjS5vKzUK+tP01IeJz2f+aLZqWZ2q5ntMbPdZnZFWP5HZvZDM7sr3NZGjrnSzPaa2ffM7DWFfpM5ZL7l1w9uSKvTWuqyiRxURf/t5sK/dZPLy0rN2t1eEC41Gn+c9Dzh2OXAWeHjZwD/B1gF/BHw3oT9VwF3AycQrHn9fWCw3XvM1SYm987adPM2x8TXg6gyF1OetRXq3Fq/TxNNH0X/7fq9/V6pNvoPOZuYhjLix0vM7GcEdwsLw8eEz0/MCDwHgVY22MfNbA9wSptDLgA+6+5PAg+Y2V7g5cDtGXWUkt75zunHrYltraaC/funR8aUGclU9V1BGa16t2Zzr1wZTN6qewjm5GSx9yi6f6/ZvHnm/x3QRLk5I08U6XQDxoEHgWcS3EHsI1h46BrgWeE+/w14W+SYq4E3tTvvXL2D2LFj9jdws/zfLLO+XSeNfCn6LTDr23tabqdu3kHMV03ckfT7XdB8Q5W5mDphZouBvydYz/qLZvYc4DDgwH8Clrv7O8zsvwO3u/uO8LirgZ3u/oXY+dYD6wFWrlx59v65lqsBOOGEoLM1bsECePLJ2eVxZXIKFc3/lPUeS5dO9wU0oRfuYJoQvxOE9gsWyfxUdS6mspUYBr4ATLn7FwHc/Ufuftzdnwb+iqAZCeAAcGrk8BXAw/Fzuvs2d59w94lly5bVWf3GJAWHduVVqLpD9yc/KV8XKU8jiqRKtQUIMzOCZqI97v6XkfLlkd1+B7g3fHw9cJGZnWBmzwNOA75VV/1kpqoTrp2sRCyN0IgiqVKddxCrgbcD58WGtP6ZmX3HzO4Bfht4N4C77wY+B9xHsP7E5e7eYAqyucksWAc5vkRltxKuDQzUm9tovuuH5WWlf2SNYirN3b9G8lyJnW2O2Qxo7EPNWusYQ/vF7ts58UT4xS+SyyG9ick96NOoM0j00ySzqmlEkVSp1j4IaUbedNfbtk0/npqCiy+emVX04ovTk9v9yq+0L2/qm+zwcH9NMquaUm9LlRQgalAkg2gdklYcSxJNtf3Od84erfT00zPnSuR5j1b52rXJr6eVd2Lx4umL4bXX6mKo1NtSldqamOarqiecxQ0M1DPhKy0vU9l8TTtTGhLTyjvxxBP1rpUhMl/pDqJidQ8zbDX/rF/f+Z1Jnf0A3RxN0+RqaiJzmQJExbp1Yawi6NQ5maybfRBNr6YmMlcpQFSsmxfGXh7bnjWvosqLulZTE6mHAkTFutk528tj27NG05x+evlzt4LL4CBs2FB+qK6ItFd7LqY6TUxM+K5dvbU0dloOotFROHw43zny9A20y69TpG+h9c9fdS6mLEND5foO8uajEpF0PZGLaT5KS1BXVeK6usa2X3ZZsfJOle1Y/s3frLYeIpJOw1z7TF3DOVvNNNu2BRfvwcGgbb+u5pvBwXJB4rbbKq+KiKTQHURDNm4MmlnSciM1YcsWOHYsaCI6dqzetv2yHcsa0irSPbqDqJhZelt+y8aN07mQoJrcSN2W5/dsJ37HkpeGtIp0j+4gSmiXSiOtgzZaHs2BFJVW3i1F7mp+9VeLlSeJ3rE897n5jtGQVpHu0R1EQVWk0kj7xtxk80nRu5o9e5LPk1aeZXi4/et194mIyGwa5lrQ+HgQFOLGxoLEaHmGf6YN8RwcDL5RdzqEtMww16w6FXmPMv+lqj6fiKTTMNeapC2BXWRp7HPPLVZel4ULpx83fVeT1regPgeR5ii1YuHrAAAP50lEQVRAFFTFheyuu4qV1+WJJ6YfF/29Fi8uVp6l6QAlIrPVuSb1qWZ2q5ntMbPdZnZFWH6ymd1oZveHP58VlpuZfczM9prZPWZ2Vl1160QVF7K6J9OVkdb5m1b+8Y8HzVJRQ0NBeRljY8XKRaR+dd5BHAP+nbv/KnAOcLmZrQI+ANzs7qcBN4fPAV4HnBZu64Gts0/ZvH64kC1ZUvyYLVuCvEZ58xxNTsJ1183MtXTddeVnd3czh5WI5FNbgHD3g+5+Z/j4cWAPcApwAbA93G07cGH4+ALgUx74BrDEzJbXVb+y+uFC9uij5Y4rOlGuypXLurnAkIjk05U+CDMbB14KfBN4jrsfhCCIAM8OdzsFeChy2IGwrKekXbC2bQvmRUg53VxgSETyqf2SZmaLgS8A73L3n7XbNaFs1gBHM1tvZrvMbNehQ4eqqmZuaaOVjh/vznDMpta5rls319EQkXxqDRBmNkwQHKbc/Yth8Y9aTUfhz0fC8gPAqZHDVwAPx8/p7tvcfcLdJ5YtW1Zf5VM0PeyyyiVHe0nWAkMi0n11jmIy4Gpgj7v/ZeSl64F14eN1wJci5ReHo5nOAR5rNUX1kl4ZdlnlOtdltUs5UtTkJKxbN7OTfN26alOai0gxdd5BrAbeDpxnZneF21rgw8CrzOx+4FXhc4CdwA+AvcBfAT2Q37S3pbXPL1qU7/giM67jWilH9u+v5q5maioYItsKwMePB8/n0l2SSL9Rqo2COrmotj7qrLQSed+jld4j7vzz4eabs49ftAiOHMn3XnFZKUeKOvHE5JXiTjgBfvGL4ucTkXRKtTHHtWufv+WWfOf4+c/Lv3/Vo47SlhHV8qIizVGA6DN5lhztxk2hRh2JzH1K991n6lpytKjNm2emPQeNOhKZa3QHMQd10k+S1+RkcBcTTbXR7q4my5o1xcpFpH7qpC6o6U7qKteDGB2Fw4fz7dsN8c71NWvgppuaq4/IXKVO6nksb+LAt7yl3noU9cIXzpwH8cIXNlsfkflOAWIOSpqVnORTn6q/Lnm1ljyNzoPYurX9utgiUi8FiDko3j+QppNhrlXbtq1YuYjUTwFijoqm4u4HWlFOpPcoQDQgLRVGq7zqET1pdxHdGO0kIv1LAaJLoqu8ZV2w9+5Nfj2tXESkDgoQXXLSSdOP0/IftcrT1pxIK8+SNjS2l0Y498NSriLzjQJEl2hltPa0HoRI71GASLBxIwwNBU0+Q0PVDLU8+eTOzzGXVT0zW0Q6p1xMMa3x+C2t8fgAW7Y0U6dOrVmTnP6719JYTE4qIIj0Et1BxGSNxx8dLXfen/yk3HFVuOmm2cFAaSxEJIsCREzWePyy6SmaToN9001Bp3RrU3AQkSx1rkl9jZk9Ymb3Rsr+yMx+GFuCtPXalWa218y+Z2avqate0H4t5VYuoLhW+c6dxd9veHhmZ2vWMNcFC5JfTysXEalDnXcQ1wGvTSj/iLufGW47AcxsFXARcEZ4zBYzS7lUdyZrLeX165OPa5WXGY0UDwhZw06vuWb2MWZBuYhIt9QWINz9H4C8Le8XAJ919yfd/QFgL/DyOuq1adPMRW4geL5pU/B4yxbYsGFmVtENG6Y7qNOaigYHg4t40h3IU09Nnx+yx/xPTsKnPz1zRM+nP60OXBHprib6IP6Nmd0TNkE9Kyw7BXgoss+BsKxyedZSXr0aVqwILs4rVgTPW9LG62/fHuQ9Sst9FD1/njH/0VxK+/YpOIhI93U7QGwFng+cCRwE/ktYntQqn9gQY2brzWyXme06dOhQ4QqkpcFulWc1QSWN11+3LrhDGBgItiTRO488Y/7b9ZPk0enxIiK4e20bMA7cm/UacCVwZeS1rwKvzDr/2Wef7UUNDETH8kxvAwPB62Njya8PDrqbBa/v2DF9vh073EdGko9pbSMjM4/JknTOIufYscN9wYKZxy9YUKwOIjJ3Abs8xzW81iVHzWwcuMHdXxw+X+7uB8PH7wZe4e4XmdkZwF8T9Ds8F7gZOM3d2yZ7LrPkaNZyngMD2TmKRkamv/GPjyfnSBocDJqHVq4Mmo6KNBGlnXNsLGhuyrJ0Kfz4x7PLe22JURFpRuNLjprZZ4DbgdPN7ICZXQr8mZl9x8zuAX4beDeAu+8GPgfcB3wFuDwrOJSVNYw1z3yFaKd2Wp9Gqz+iTP9Bnn6SdpKCQ6u8yvQhIjK31TmK6a3uvtzdh919hbtf7e5vd/dfc/dfd/c3tu4mwv03u/vz3f10d/9fddUraxjr2rXJr8e1LtZpAaWTiXFpeZuqyuek5TxFJI95N5M6axhr3olwrQCQFlDyBpo65E0HouU8RaSdeRcgIAgGx44FfQ3Hjs1MwpenGSc6JDUtoJSZcd2Slrcpbz6nq64KZm9n0XKeItLOvAwQ7WRNhIsPSe20v6BIHfI2W01OwrXXTg+jTZPWHyMiAgoQs2RNhIt3Ope9mLebp1DF4jnRiXZpab3PPTf/+URk/lGAiCm6cE2Zi3mZyXidLJ6jNa5FpAwFiARF0lyUuZhn5YOqWh3NYCIy9ylAlBBvHoJieZOSJsFFy7PuMIqqYyiuiMx9ChAFVXHxzpqsV/UdRhV9GiIy/yhAFFTFxTtr1bqqm4Sq7tMQkflhqOkK9JsqLt5jY+m5liBo+kl6vZMmoclJBQQRKUZ3EAVV0Z6f1eSjJiER6QUKEAVVNUehXZOPmoREpBfUmu67bmXSfVdhairoc3jwwXLpvEVEmtR4uu+5rIrlQLNWfNOKcCLSNAWIChS9mGcNla16HoSISBlqYupQ62IeHfoaXXEuSdaKcZ2uKCci0k7eJiYFiA6VuZinLWtqFjRbZb0uItKJxvsgzOwaM3vEzO6NlJ1sZjea2f3hz2eF5WZmHzOzvWZ2j5mdVVe9qlZmXkTWUFmlxhCRXlBnH8R1wGtjZR8Abnb304Cbw+cArwNOC7f1wNYa61WpMhdzzYMQkX5Q55rU/wDE10C7ANgePt4OXBgp/5QHvgEsMbPlddWtSmUu5poHISL9oNupNp7j7gcB3P2gmT07LD8FeCiy34Gw7GCX61dY66JddF5EVuoLpcYQkab1Si6mpIUxE3vPzWw9QTMUK3ukUV4XcxGZi7o9D+JHraaj8OcjYfkB4NTIfiuAh5NO4O7b3H3C3SeWLVtWa2VFROazbgeI64F14eN1wJci5ReHo5nOAR5rNUWJiEgzamtiMrPPAOcCS83sAPBB4MPA58zsUuBB4M3h7juBtcBe4ChwSV31EhGRfGoLEO7+1pSX1iTs68DlddVFRESKUy4mERFJ1NepNszsEJCQ6CK3pcDhiqpTF9WxGqpjNVTHajRdxzF3zxzl09cBolNmtitPPpImqY7VUB2roTpWox/qCGpiEhGRFAoQIiKSaL4HiG1NVyAH1bEaqmM1VMdq9EMd53cfhIiIpJvvdxAiIpJiXgaIpMWMeomZnWpmt5rZHjPbbWZXNF2nODM70cy+ZWZ3h3X8UNN1SmNmg2b2bTO7oem6pDGzfWb2HTO7y8yaXSYxhZktMbPPm9l3w/+br2y6TlFmdnr4+bW2n5nZu5quV5yZvTv8m7nXzD5jZic2Xac087KJycx+CzhCsAbFi5uuT1yYyHC5u99pZs8A7gAudPf7Gq7a/2dmBixy9yNmNgx8DbgiXM+jp5jZe4AJ4Jnu/oam65PEzPYBE+7es+P3zWw78L/d/ZNmtgAYcfdHm65XEjMbBH4IvMLdO5krVSkzO4Xgb2WVuz9hZp8Ddrr7dc3WLNm8vINIWcyoZ7j7QXe/M3z8OLCHYH2MnhEu7nQkfDocbj33bcPMVgCvBz7ZdF36mZk9E/gt4GoAd3+qV4NDaA3w/V4KDhFDwEIzGwJGSMlc3QvmZYDoJ2Y2DrwU+GazNZktbLq5iyBt+43u3nN1BD4KvA94uumKZHDg78zsjnDNk17zK8Ah4Nqwue6TZrao6Uq1cRHwmaYrEefuPwT+giBZ6UGCzNV/12yt0ilA9DAzWwx8AXiXu/+s6frEuftxdz+TYP2Ol5tZTzXXmdkbgEfc/Y6m65LDanc/i2B99svDZtBeMgScBWx195cCP2d6TfmeEjZ/vRH4H03XJc7MnkWwxPLzgOcCi8zsbc3WKp0CRI8K2/W/AEy5+xebrk87YVPDbcBrG65K3GrgjWH7/meB88xsR7NVSubuD4c/HwH+Fnh5szWa5QBwIHKX+HmCgNGLXgfc6e4/aroiCc4HHnD3Q+7+S+CLwD9vuE6pFCB6UNgBfDWwx93/sun6JDGzZWa2JHy8kOA//nebrdVM7n6lu69w93GCJodb3L3nvq2Z2aJwMAJhs82rgZ4aYefu/xd4yMxOD4vWAD0zaCLmrfRg81LoQeAcMxsJ/87XEPQx9qR5GSDCxYxuB043swPhAka9ZDXwdoJvvK0he2ubrlTMcuBWM7sH+CeCPoieHUba454DfM3M7ga+BXzZ3b/ScJ2S/D4wFf6bnwn8ScP1mcXMRoBXEXwz7znhHdjngTuB7xBcg3t2VvW8HOYqIiLZ5uUdhIiIZFOAEBGRRAoQIiKSSAFCREQSKUCIiEgiBQiZN8zseCzbZ+mZwGb2j1XWLXbuCTP7WF3nF8lLw1xl3jCzI+6+uOl6iPQL3UHIvBeuxfAhM7szXJPhRWH5MjO7MSz/hJntN7Ol4WtHwp/nmtltkXUSpsIZspjZ2Wb292ECvq+Gadzj7/3mcF2Au83sHyLnvCF8vDNyx/OYma0LkyT+uZn9k5ndY2bv7NZnJfOLAoTMJwtjTUz/MvLa4TBZ3lbgvWHZBwnSc5xFkB9pZcp5Xwq8C1hFkPV0dZhL678Cb3L3s4FrgM0Jx/4h8Bp3fwlBgrkZ3H1tmBDxUmA/8D/Dx4+5+8uAlwG/Z2bPy/8xiOQz1HQFRLroifBim6SVmuEO4HfDx78B/A6Au3/FzH6acuy33P0AQJj+fBx4FHgxcGN4QzFIkN457uvAdeHCMYnpIcK7lk8Db3H3x8zs1cCvm9mbwl1OAk4DHkipn0gpChAigSfDn8eZ/ruwgsdGjzdgt7u3XZbT3S8zs1cQLGp0l5nNCGDhymifBf7Y3VsJ/Az4fXf/as76iZSiJiaRdF8D3gIQfmt/VoFjvwcss3DdZjMbNrMz4juZ2fPd/Zvu/ofAYeDU2C4fBu5x989Gyr4KbAibsTCzF/b44j3Sp3QHIfPJwrAJqOUr7t5uqOuHgM+EfRV/T9BE9HieN3L3p8ImoI+Z2UkEf2sfBXbHdv1zMzuN4K7gZuBu4F9EXn8vsDtS7z8kWD51HLgz7BA/BFyYp14iRWiYq0gKMzsBOO7ux8I7ga1t+jBE5hzdQYikWwl8zswGgKeA32u4PiJdpTsIERFJpE5qERFJpAAhIiKJFCBERCSRAoSIiCRSgBARkUQKECIikuj/AXmwBqvUValuAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"#### Creating train and test dataset\n",
"Train/Test Split involves splitting the dataset into training and testing sets respectively, which are mutually exclusive. After which, you train with the training set and test with the testing set."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"msk = np.random.rand(len(df)) < 0.8\n",
"train = cdf[msk]\n",
"test = cdf[~msk]"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"polynomial_regression\">Polynomial regression</h2>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Sometimes, the trend of data is not really linear, and looks curvy. In this case we can use Polynomial regression methods. In fact, many different regressions exist that can be used to fit whatever the dataset looks like, such as quadratic, cubic, and so on, and it can go on and on to infinite degrees.\n",
"\n",
"In essence, we can call all of these, polynomial regression, where the relationship between the independent variable x and the dependent variable y is modeled as an nth degree polynomial in x. Lets say you want to have a polynomial regression (let's make 2 degree polynomial):\n",
"\n",
"\n",
"$y = b + \\theta_1 x + \\theta_2 x^2$\n",
"\n",
"Now, the question is: how we can fit our data on this equation while we have only x values, such as __Engine Size__? \n",
"Well, we can create a few additional features: 1, $x$, and $x^2$.\n",
"\n",
"\n",
"\n",
"__PloynomialFeatures()__ function in Scikit-learn library, drives a new feature sets from the original feature set. That is, a matrix will be generated consisting of all polynomial combinations of the features with degree less than or equal to the specified degree. For example, lets say the original feature set has only one feature, _ENGINESIZE_. Now, if we select the degree of the polynomial to be 2, then it generates 3 features, degree=0, degree=1 and degree=2: "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1. , 2. , 4. ],\n",
" [ 1. , 2.4 , 5.76],\n",
" [ 1. , 1.5 , 2.25],\n",
" ...,\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn import linear_model\n",
"train_x = np.asanyarray(train[['ENGINESIZE']])\n",
"train_y = np.asanyarray(train[['CO2EMISSIONS']])\n",
"\n",
"test_x = np.asanyarray(test[['ENGINESIZE']])\n",
"test_y = np.asanyarray(test[['CO2EMISSIONS']])\n",
"\n",
"\n",
"poly = PolynomialFeatures(degree=2)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**fit_transform** takes our x values, and output a list of our data raised from power of 0 to power of 2 (since we set the degree of our polynomial to 2).\n",
"\n",
"$\n",
"\\begin{bmatrix}\n",
" v_1\\\\\n",
" v_2\\\\\n",
" \\vdots\\\\\n",
" v_n\n",
"\\end{bmatrix}\n",
"$\n",
"$\\longrightarrow$\n",
"$\n",
"\\begin{bmatrix}\n",
" [ 1 & v_1 & v_1^2]\\\\\n",
" [ 1 & v_2 & v_2^2]\\\\\n",
" \\vdots & \\vdots & \\vdots\\\\\n",
" [ 1 & v_n & v_n^2]\n",
"\\end{bmatrix}\n",
"$\n",
"\n",
"in our example\n",
"\n",
"$\n",
"\\begin{bmatrix}\n",
" 2.\\\\\n",
" 2.4\\\\\n",
" 1.5\\\\\n",
" \\vdots\n",
"\\end{bmatrix}\n",
"$\n",
"$\\longrightarrow$\n",
"$\n",
"\\begin{bmatrix}\n",
" [ 1 & 2. & 4.]\\\\\n",
" [ 1 & 2.4 & 5.76]\\\\\n",
" [ 1 & 1.5 & 2.25]\\\\\n",
" \\vdots & \\vdots & \\vdots\\\\\n",
"\\end{bmatrix}\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like feature sets for multiple linear regression analysis, right? Yes. It Does. \n",
"Indeed, Polynomial regression is a special case of linear regression, with the main idea of how do you select your features. Just consider replacing the $x$ with $x_1$, $x_1^2$ with $x_2$, and so on. Then the degree 2 equation would be turn into:\n",
"\n",
"$y = b + \\theta_1 x_1 + \\theta_2 x_2$\n",
"\n",
"Now, we can deal with it as 'linear regression' problem. Therefore, this polynomial regression is considered to be a special case of traditional multiple linear regression. So, you can use the same mechanism as linear regression to solve such a problems. \n",
"\n",
"\n",
"\n",
"so we can use __LinearRegression()__ function to solve it:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 52.55916002 -1.77145211]]\n",
"Intercept: [103.33004988]\n"
]
}
],
"source": [
"clf = linear_model.LinearRegression()\n",
"train_y_ = clf.fit(train_x_poly, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf.coef_)\n",
"print ('Intercept: ',clf.intercept_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As mentioned before, __Coefficient__ and __Intercept__ , are the parameters of the fit curvy line. \n",
"Given that it is a typical multiple linear regression, with 3 parameters, and knowing that the parameters are the intercept and coefficients of hyperplane, sklearn has estimated them from our new set of feature sets. Lets plot it:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XX, 2)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 24.61\n",
"Residual sum of squares (MSE): 1030.78\n",
"R2-score: 0.66\n"
]
}
],
"source": [
"from sklearn.metrics import r2_score\n",
"\n",
"test_x_poly = poly.fit_transform(test_x)\n",
"test_y_ = clf.predict(test_x_poly)\n",
"\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y_ , test_y) )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 id=\"practice\">Practice</h2>\n",
"Try to use a polynomial regression with the dataset but this time with degree three (cubic). Does it result in better accuracy?"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 33.99771692 3.31398814 -0.41850273]]\n",
"Intercept: [123.12797451]\n",
"Mean absolute error: 24.44\n",
"Residual sum of squares (MSE): 1024.94\n",
"R2-score: 0.67\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"poly = PolynomialFeatures(degree=3)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly\n",
"\n",
"clf = linear_model.LinearRegression()\n",
"train_y_ = clf.fit(train_x_poly, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf.coef_)\n",
"print ('Intercept: ',clf.intercept_)\n",
"\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XX, 2)+ clf.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"\n",
"from sklearn.metrics import r2_score\n",
"\n",
"test_x_poly = poly.fit_transform(test_x)\n",
"test_y_ = clf.predict(test_x_poly)\n",
"\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y_ , test_y) )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"\n",
"<!-- Your answer is below:\n",
"\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n",
"\n",
"\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2>Want to learn more?</h2>\n",
"\n",
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: <a href=\"http://cocl.us/ML0101EN-SPSSModeler\">SPSS Modeler</a>\n",
"\n",
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at <a href=\"https://cocl.us/ML0101EN_DSX\">Watson Studio</a>\n",
"\n",
"<h3>Thanks for completing this lesson!</h3>\n",
"\n",
"<h4>Author: <a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a></h4>\n",
"<p><a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>, PhD is a Data Scientist in IBM with a track record of developing enterprise level applications that substantially increases clients’ ability to turn data into actionable knowledge. He is a researcher in data mining field and expert in developing advanced analytic methods like machine learning and statistical modelling on large datasets.</p>\n",
"\n",
"<hr>\n",
"\n",
"<p>Copyright &copy; 2018 <a href=\"https://cocl.us/DX0108EN_CC\">Cognitive Class</a>. This notebook and its source code are released under the terms of the <a href=\"https://bigdatauniversity.com/mit-license/\">MIT License</a>.</p>"
]
}
],
"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.6.8"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment