Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Hamid264/d33081dc1f959acf3c81a65d209e7fa2 to your computer and use it in GitHub Desktop.
Save Hamid264/d33081dc1f959acf3c81a65d209e7fa2 to your computer and use it in GitHub Desktop.
Created on Skills Network 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,
"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,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2020-07-28 20:02:09-- 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.196\n",
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|67.228.254.196|: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.06s \n",
"\n",
"2020-07-28 20:02:09 (1.24 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": 4,
"metadata": {
"button": false,
"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": 4,
"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": 5,
"metadata": {
"button": false,
"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": 5,
"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": 6,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEHCAYAAABBW1qbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwDElEQVR4nO2df5xddXnn389MJiGTqMAksoGQGUqBdmItypTWTX+gAbHRF2i3unFHzUt9NZjQFu36smazW7XddNnWttLdJjYVJJqpLFvtyotSlERtV0ulAQFJkCUuCQSykIA/QBBI8uwf59yZM3fOuefHPeeeO3c+79fr+7r3fs/5nvPcm8z3Od/neb7PY+6OEEIIAdBXtwBCCCG6BykFIYQQk0gpCCGEmERKQQghxCRSCkIIISaRUhBCCDHJvCovbmYHgKeB48Axdx8zs1OB/wGMAAeAt7n798LzNwHvDc//bXf/UqvrL1myxEdGRqoSXwghepI777zzqLsvjTtWqVIIea27H418/jCw292vNrMPh59/18xGgbXASuB0YJeZnevux5MuPDIywp49e6qUXQgheg4zO5h0rA7z0eXAjvD9DuDNkf4b3P15d38I2A9c2HnxhBBi7lK1UnDgy2Z2p5mtD/tOc/fDAOHry8P+M4BHImMPhX1CCCE6RNXmo1Xu/piZvRy4zcy+0+Jci+mbkYMjVC7rAVasWFGOlEIIIYCKVwru/lj4+gTwtwTmoMfNbBlA+PpEePoh4MzI8OXAYzHX3O7uY+4+tnRprJ9ECCFEQSpTCma2yMxe0ngPvB64D7gJWBeetg74Yvj+JmCtmS0ws7OAc4A7qpJPCCHETKpcKZwGfN3M7iGY3P/O3W8FrgYuMbMHgUvCz7j7XuBGYB9wK3Blq8gjIcTcYmICRkagry94nZioW6LexGZz6uyxsTFXSKoQvc/EBKxfD88+O9U3OAjbt8P4eH1yzVbM7E53H4s7ph3NQoiuZ/Pm6QoBgs+bN9cjTy8jpSCE6HoefjhfvyiOlIIQoutJij5XVHr5SCkIIbqeLVsCH0KUwcGgX5SLlIIQousZHw+cysPDYBa8yslcDZ1IiCeEEG0zPi4l0Am0UhBCCDGJlIIQQohJpBSEEEJMIqUghBBiEikFIYQQk0gpCCGEmERKQQghxCRSCkIIISaRUhBCCDGJlIIQQohJpBSEEEJMUrlSMLN+M/uWmd0cfv6omT1qZneHbU3k3E1mtt/MHjCzS6uWTQghxHQ6kRDvKuB+4KWRvj9z949HTzKzUWAtsBI4HdhlZueqTrMQQnSOSlcKZrYceCPwqQynXw7c4O7Pu/tDwH7gwirlE0IIMZ2qzUefAD4EnGjq/00zu9fMrjOzU8K+M4BHIuccCvuEEEJ0iMqUgpm9CXjC3e9sOrQNOBs4HzgM/EljSMxlPOa6681sj5ntOXLkSIkSCyGEqHKlsAq4zMwOADcArzOzne7+uLsfd/cTwF8xZSI6BJwZGb8ceKz5ou6+3d3H3H1s6dKlFYovhBBzj8qUgrtvcvfl7j5C4ED+iru/w8yWRU57C3Bf+P4mYK2ZLTCzs4BzgDuqkk8IIcRM6ijH+Udmdj6BaegAcAWAu+81sxuBfcAx4EpFHgkhRGfpyOY1d/+au78pfP9Od/8Zd3+lu1/m7ocj521x97Pd/Tx3//tOyCaEmB1MTMDICPT1Ba8TE3VL1JtoR7MQIpWNG2HePDALXjdu7Oz9JyZg/Xo4eBDcg9f166UYqkBKQQjRko0bYds2OB4ac48fDz53UjFs3gzPPju979lng35RLuY+I+pz1jA2NuZ79uypWwwhepq+vuDpvBkzONG8A6mHZeglzOxOdx+LO6aVghCiJUnPjZ18nlyxIl+/KI6UghCi69myBQYHp/cNDgb9olykFIQQXc/4OGzfDsPDgcloeDj4PD5et2S9h5SCEKIlGzbk66+K8XE4cCDwIRw4IIVQFVIKQvQAVcbwb90aKID+/uBzf3/weevW9q6rfQfdiZSCEBVTdYx/XAz/u98NS5aUN+Fu3QrHjgXXP3asHIWgfQfdiUJShaiQRox/M2U8aTcYGQkm1VYMDnaXDT5J5uHhwDQkqqVVSKqUghAVMm/e1KavKP39wRN3GSTF8DfTTROu9h3Ui/YpCFETcQqhVX8RssbqP/xw8XukmcDy+ge076B7kVIQokIsrnRUi/4ixMXwx1F0wk1Lc1HEP6B9B92LlIIQFVLGbuC0p/TmGP6hIZg/f/o57Uy4n/xk6/4ieYm076B7kVIQc5q6s3+mkTUZXTSG/+hReO97p4eQrltXfMJNU2xJZqk0c5X2HXQnUgpiztKJ7J+NiTlrfzPbt+frh8Bss2PH9O+1Y0d14Z7yD/QWUgpizlJkws3L+vX5+psp4qjudJpp+Qd6i8qVgpn1m9m3zOzm8POpZnabmT0Yvp4SOXeTme03swfM7NKqZRNzm05EBrW7G7jISqOoOSeJtDQX4+OBeaosc5Wol06sFK4C7o98/jCw293PAXaHnzGzUWAtsBJ4A7DVzDIusoXIT7umnay0sxu4yEqjbHNOmmLrtLlKVEulSsHMlgNvBD4V6b4c2BG+3wG8OdJ/g7s/7+4PAfuBC6uUT8xt2jXtdIJVqwIHeJR584L+JOLMOQMD8MwzxdNetFJsqorWW1S9UvgE8CEgukfxNHc/DBC+vjzsPwN4JHLeobBPiEqoKtFbmWzePHPn87FjMyfc6OaxzZsD8000RNUMnnyymjxDZZurRL1UphTM7E3AE+5+Z9YhMX0zguHMbL2Z7TGzPUeOHGlLRiHKTvRWNlkm3LjNYzt2BCuGEydg8WJ44YXp48t8klf0UW9R5UphFXCZmR0AbgBeZ2Y7gcfNbBlA+PpEeP4h4MzI+OXAY80Xdfft7j7m7mNLly6tUHwh6ifLhJtmvqn6Sb6q6KOVK4MVTqOtXNne9UQ2KlMK7r7J3Ze7+wiBA/kr7v4O4CZgXXjaOuCL4fubgLVmtsDMzgLOAe6oSj4hZgNZJty0Sb/qJ/kqdievXAn79k3v27dPiqET1LFP4WrgEjN7ELgk/Iy77wVuBPYBtwJXunuJwYFCzD6yTLhpk34n9hGUvTu5WSGk9c8lKt+F7+6ztl1wwQUuRN3s3Ok+POxuFrzu3Nn5+w8OugcehaANDk6Xo24Z8xL9Ls1tLrNhQ/xvsmFDvusAezxhXtWOZiHaoBsqiGVZTTQ/yYNKYc5GOrELX0pBiDaYjTH6VSiysp3Co6P5+ucKndiFL6UgRBvUEaMfnXwbLW2Sj+5jWLcuvyK7+OLp97v44qljVTiF9+6dqQBGR4P+uUwnduFLKQjRBp2O0U8qztNqkm9eGSQ9VSbVeb74Yti9e3rf7t1TiqEqp/DevdMt53NdIUBnduFLKQjRBt2cIbSxWokzccWR9LTZrBDS+kV1dGIXvpSCEG3QzRXEGquVrKasMu3Sojqq3oUvpSBEDxJdrWQ1ZQ0PVyePmD1IKQjRBt0QktogabUSZ+KKY82a+P7Vq/P1i9mNlIIQLYhG7cTF83c6JLVVveSkHcXNJq4k38Ett8T379o1UwGsXh30Q+fqUojOIKUgRAJZVgF1hKTG7WlNS30Q3bx24kTsZVvKvGvX9Ps1FAKUFxFTefoGkY2krc6zoSnNhaiS4eH4lALDw1PnDA3FnzM0VJ1cGza49/cH9+nvdx8dzZf6IMv3ysvq1dOvtXp1/u9URvoGkQ2U5kKI/HRj8ZiNG2HbtumlL5P2A2zbFm/2KjuMdmICbr99et/tt880tbUyxXUifYPISJK2mA1NKwVRJVmeqM3izzErT45oMrtWieJatSoT5CX9TkNDU/cYGnKfPz9ZJiXA6yxopSBEfrI8USeFe/b1lZNsrtmvUZRnnw3SWzRkgtaprlultWgmaSf0k09Oyf3kk62rv8lZ3T1IKQiRQJaNaUnhnsePlxOimnU3chayypSW1qJMGqa4iy6KP57UL6rDvJ3Hj5oZGxvzPXv21C2GmONMTAST98MPB0/icTuDh4enUlbnoa+vvRVCK/r7g5XCihWBcmsou6T8StFx69dP7aRNO78Vjd9lZCR+xVH0dxOtMbM73X0s7phWCkK0Sbvhnq1CMatKrAfTVw7veU/21czx44ETuyFnURNP1BTXjU79uUplSsHMTjKzO8zsHjPba2YfC/s/amaPmtndYVsTGbPJzPab2QNmdmlVsglRFYsW5euPiyaKTrg/+ZPlyxjHCy/AVVflG9OIDDrvvGznDwzA0FC8Ka7T2WZFC5I80O02wIDF4fsB4JvALwAfBT4Yc/4ocA+wADgL+C7Q3+oeij4S3UDW6KA4GvsNmlt/f+vj0Xb66TPLcRZt7jP3HKSd3+p7Z41wylJSVJQHdUQfhfd+Jvw4ELZW1tHLgRvc/Xl3fwjYD1xYlXxClEG70UFplbRaZS5tTJ+PPpotjUV/fzb7f1xai6TrNeRIolWEU5RuzjY716jUp2Bm/WZ2N/AEcJu7fzM89Jtmdq+ZXWdmp4R9ZwCPRIYfCvuE6Bh5Uy20Gx2UFoqZNVTzG9+AQ4eCCfrEiUD2KIODsGNHcGxoKP6a0f5oWosNG+LPL7OwC8ysIy2FUA+VKgV3P+7u5wPLgQvN7BXANuBs4HzgMPAn4elxzzAznkHMbL2Z7TGzPUeOHKlEbjE3SbPvx5EUo5+VJHt8oz9p4j1+fGoPwfz50+V2D/LsL1489dS9bl2gwPrCv/hmpTIwANdcE3+vtMIuJ50UPy6pX3Q3HQtJNbOPAD9y949H+kaAm939FWa2CcDd/0t47EvAR9399rjrgUJSRbnMmxdvrunvDybZPGOaSQpVbYSFtjp/48bAlJK3CE5D7oaJK7qiGRiAl74UnnpqZkhqXpYsCTanNTM0BEePFrumqJZaQlLNbKmZnRy+XwhcDHzHzJZFTnsLcF/4/iZgrZktMLOzgHOAO6qST4hm0uz7eY9FSQpVzdIfrbSVh4ZscSauF18MJnL3wOz0jW/ku3aUp57K1y+6m3nppxRmGbDDzPoJlM+N7n6zmX3WzM4nMA0dAK4AcPe9ZnYjsA84Blzp7ioQKDpGf3/yJN9w0I6OTi8gPzyczYRUR1WzhrknLda/YSaDYqUdk1ZSSlExO6ky+uhed3+Vu7/S3V/h7r8f9r/T3X8m7L/M3Q9Hxmxx97Pd/Tx3//uqZBOiQdSxnOWpf98+WLly6nPWqmad2m8QpeGPyBrrXzQjaZJpLalfdDfa0SwKk1aVrNtlaHYsN0gL24ymqm4OpUzia1/LLlcrTj45vn9gINkRnFVx5fVZiB4laQPDbGjavFYf3bDZqF0Z0jaOFUnnnHdM3vOLFqPJssGu8b3zUuR3EvVCi81rSognCtENCczalaHVk717+vE48kYw5b1HkQipZhorpGaiq4s8FPmdRL20HX0URhL9BzPbHm44u87MritXTDGb6IYEZu3KkLYxbHQ0/nhzf9SEtXBh/JiyNnoViZBqZtWqqf0KDfr6gv4iJG1uS+oX3U1Wn8IXgZcBu4C/izQxR+mGBGZZZGjlc0grOL9370wF0Bx91Jzm4plnZk64q1cnP4EnPWUn9ZdRjGbz5pmhsCdOTBW8iaMb/EeiQyTZlaINuDvLeZ1u8inUx2zwKWSRccOGKd9Cf3/+QvFJpSiz/i6d8ilEyVtCNO13TPPNiO6DFj6FrErhPwNrspzbySalUC/tTqhl0KrWcJYay+1c3z173eSkexaRsSpFVlRGOZpnH62UQlbz0VXAzWb2YzN7Omw/rGTpImYFExNBgrVonqAdO7rLrNCuz6HZNBRXxjKruSzpnlnqQDcT3eF87Fh+5/CaNfn6037HvCYw0eUkaYvZ0LRSqI8ynsLbJc2ssWhRvIyLFmW7fpbvuHOn+/z56SuF/v7k1UanV1x1rRTSVl2ic9Cu+Si4BpcBHw/bm7KOq7JJKdRHXrt0FvJOGlWbNbKM37nTfWAgXSkkKa648QMDrb973Pl5KNunkPV3ar6vmRRDXbStFICrgd3Ae8J2G3B1lrFVNimF+ih7pVDEcZ02uXVCKST9Do2VQZITtvE7DQ3FHx8aipcpSQHlUQxF/u1aKewsv1PSamr+/Oxyi/IoQyncC/RFPvcD92YZW2WTUqiPsqOP0ibXuJVDN6wU2lVMeWVs9zu5x5u85s8v/m+XZeVRhtyiPFophTy5j06OvH9ZYSeG6AnKLp+Y5Mw8fjyYOuKcvEWctGWTtleijH0FVRA82yV/zsP73pevX3Q5Sdoi2oC3AweB64EdwEPA2ixjq2xaKfQOWeL940wc7Zo1WpFlfLv29qpWCq2c11UECaQ5y7VS6C4oydG8jMDZfDnwr7KOq7JJKfQOO3e69/VlUwxZI3WymDVaKZXR0fjxo6MzZS+6VyLvZJnFp5C2wa2KIIE0Vq+Ov+fq1dXdUyRTWCkAPxW+vjqutRrbiSal0DskTWRZWpJiWLw4/vzFi4PjWWzrzYqhWSGkUUbkTjNp0UdJyrWvL9vvUhXNikEKoT7aUQrbw9evxrSvtBrbiSalUC9lxp0nRelkXTnEkTbh5o38yUrz77JhQ3UmrjjSrtlqF7b2EMwNSjEf5W3ASQQ1lu8B9gIfC/tPJQhpfTB8PSUyZhOwH3gAuDTtHlIK9VF29FFRhdBqAq2iXkIaeX+XOpRClt+z03msRGdppRQy1VMws7cCt7r702b2H0Pz0R+4+7dajDFgkbs/Y2YDwNcJ0mX8GvCUu19tZh8OlcLvmtko8DngQuB0goys53qLOs2qp1AfZddTSKoTkIWitQqqqAOQ93epQoa+vvixZkE21Ky/dSdrY4jO0nY9BeA/hQrhF4FLCSKQPtlqQKiQngk/DoTNCRzVO8L+HcCbw/eXAze4+/Pu/hDBiuHCjPKJDpNUrD5LEfs42qk3kDR28eLW/UND8ceT+rOQFFp78GB5aaejdaXnzQs+R0lSJo3+iy7Kdp9O1sYQ3UNWpdB4rngjsM3dvwjMTxtkZv1mdjfwBHCbu38TOM3dDwOEry8PTz8DeCQy/FDYJ7qQsuPv4wq/xLF48fRaxKtXwy23xE+4P/pR/DUa/ddcE9Q2jjIwEPTnITpJt3q6dw+Uw7vfXVwxNNeVPn48+NysGFqxf3+28zpZG0N0EUl2pWgDbgb+EvguwSa2BcA9WcaG408mcE6/Avh+07Hvha9/Abwj0n8t8G9irrUe2APsWbFiRXlGNpGLLLbwPI7orPsUYOqaQ0Mzo4eK5ORpx1leNGqq4cwu20+Sds2sqb7z+hSU7G52QQlpLgYJfAHnhJ+XAa/PMjZyjY8AHyRwIi+LXOeB8P0mYFPk/C8Br2l1TTma6yMtcqdMh2veVmae/4ULp49buHD68VZRU2kTcJbfMc/vVMZvWWRSL5LUT9RLK6WQ1dF8NnDI3Z83s4uAVwKfcffvtxizFHjR3b9vZguBLwP/FfgV4EmfcjSf6u4fMrOVwF8z5WjeHSohOZq7kLQC8mU6XPPScKgWceJu3Bik62jliF24EJ59dupere6Rdnzx4ngz16JFQWnPZrJ8p3Z+ywzTwQyWLIEnn5zZPzQER48Wl0VURxmO5s8Dx83sJwnMOmcRTOCtWAZ81czuBf6FwKdwM0HG1UvM7EHgkvAz7r4XuBHYB9wKXNlKIfQ6ZdfETXNO5iWtgHy7BW7aoagtvNlen8Rzz029b9e3kub3mA3EKYRW/aLLSVpCRBtwV/j6IeC3wvffyjK2ytar5qOy9wCUUde3mTQzRt78OmWZjtrZLZxnA13W3zbtGnllrNp8VISyryeqhxJ8Ct8kSIp3H3BW2HdflrFVtl5VCmUnLKuisHraRNBpn0IZu4WLTp6tksGl+QyqUAp5nPbRVjTtRFU7w0V1tFIKWc1H7wZeA2xx94fM7CxgZ3nrFRGlbNNLmqmnCspOrZ3GiROBr6Kq60dZuHD651WrYPny4HsuXx58blBW2GuDDRvS++NSijdMhxCYtk4/ffrx1ath165iMl1zDcxvClCfP7/4dxQ1k6QtZkPr1ZVC2U9eaQnSilC2yaCd3EdJ98z7O2YJ12z+zbKsiFqFaxbJHpqlpnP0nkNDM6ODyk5joZDU2QVFVwpmdmP4+m0zuzfSvh06kMUsoPnJNq2/DqpYtZx/fr5+9/Rrnjgx3Um/efNUJFKDZ5+FdeumggQgWMXErWbOPTf+Pkn9AFu3BhFe7sHr1q0zzxkfn7rn4sXw4oszZdy8OfkeeYner1MrNlENLUNSzWyZux82s+G44+5eMKlBOfRqSGpa7pq6r9cYm0SWybWZl7wkPgQzK3H3TAubzXp+q/FJv22UwcFk01leGWF62Gx/f5DmI04xNKji31/MbgqHpPpUOoqDoQL4HvB0pIkKSCvxWPf1qqCKEMy8vpSs+Zei47P8hq2eyvPKWCTNRSf+/csOoRY1kmRXijbgCuBx4ABBKc6HgP+bZWyVrVd9CmUXVm/X7h1H2T6FdvwJ0RYtglMk6ipqr09q0fFxv22e3yWvjEW+U9khzp2+vigfSghJfRBYkuXcTrZeVgplpw1oNekXuV8RpVC0nnJRxVBkf0ZUKSQ5npvHR79XFkXSfL88MhZVxlU6gquo+SyqpQylcCswmOXcTrZeVQqd/iMrEu2Ud3JqpyxlkdYgS6RO9NxW10wbX+R3yStjFXtO2qWOms+iPVophay5j14FfJpgE9vzEdPTb5dmxyqAHM3lUMRpnGXMxERgS3/44eA7xdnJG7mQysx9FJUhD2U4z/PmMsrLypWwb9/M/tFR2Lu3/esXoeyCS6J6ysh99JfAV4B/Bu6MNFEBzRuP0vq7kYmJwHF78GAwoSY5TosW5elWmsNT0/rz8sAD+fo7QdxmucHBoF/MPrIqhWPu/jvu/ml339FolUo2h4kmXMvS3y5VVCCLi9+Po2hRnlaMjpZ/zawkrSharTTyRO7UsTs9jU7vXhfVklUpfNXM1pvZMjM7tdEqlWwOk2QiqiqmvIo0BVlXAGVPZu2YUZLMR2WbtqJMTASV2BorqrTKbGVXvCsLbV7rHbIqhX9HUATnn5gyHfWeMb+HaH763Lgx+Wl0fByuu276k95117X3h511kmpnNRKl4d5sVgh5nsLf9758/WVw1VUzdxu/+GLQH0fSXop2alwLMY0kD/RsaL0afVQ07LBBltj5vr72whLTZMwaJZQlW2iWlhRqmzd+Pk8kUJHfpd3zy5CxCpT7aHZB0ZBU4EOR929tOvaHrcZ2okkpxJM1dfKiRdXJmJSEr10lktaim/zqiJ/vhFLoNrR5bfbRSimkmY/WRt5vajr2hpIWK6KJdh2/We35VVb3yuP/6MtqxMzACy9MmV7qqP6W99+uCid/p0lKClhmwj3ROdL+HC3hfdzn6QfNzjSzr5rZ/Wa218yuCvs/amaPmtndYVsTGbPJzPab2QNmdmmub9JDzLX89MHCszwaZSDryPmU99+uF/6t6yy9KiogaQkRrDCCMpzN7+M+x4xdBrw6fP8S4P8Ao8BHgQ/GnD8K3AMsIKgB/V2gv9U9etV85N6ejTarqSVaG6Ds3EdZahNU2RrfqQ6zRt7fcrbb45XmYvZBC/PRvBSd8bNm9kOCVcHC8D3h55NSlM1hoJFl9Wkzux84o8WQy4Eb3P154CEz2w9cCNyeIqMoyBVXBK+NjWYNE8DBg1PRLEUjkMp++i9CQ/bGruoVK4INVVWHS46P57tH3vO7jS1bpv//AW1em9UkaYsyGzACPAy8lGClcAC4F7gOOCU8578D74iMuRb49VbX7dWVws6dM5+0zbI/QaY9RTdHrBR50kt7Sk/Kp9TJlcJcptOrj9m+2plr0G7uo3Yws8XAPxDUd/6CmZ0GHAUc+ANgmbu/x8z+Arjd3XeG464FbnH3zzddbz2wHmDFihUXHOy1PAnAggWBw7SZ+fPh+edn9jeTN4dPkVxLafdYsmTKtl8H3bBSqYvmlR+0LvQj5h5l5D4qeuMB4PPAhLt/AcDdH3f34+5+AvgrAhMRwCHgzMjw5cBjzdd09+3uPubuY0uXLq1S/NqIUwit+tulCofsU08VHyvaQ9FAoh0qUwpmZgQmoPvd/U8j/csip70FuC98fxOw1swWmNlZwDnAHVXJJ6aoIqHZqUqCUhuKBhLtUOVKYRXwTuB1TeGnf2Rm3zaze4HXAh8AcPe9wI3APoL6DVe6e41pvnoTs6AucLR8YycTmvX1VZtLSMyO8quie0mLPiqMu3+d+L0Mt7QYswVQzELFNOr6QuuC76046ST48Y/j+yHZfOQe+CmqVAyzaeNXFSgaSLRDpT4FUQ9ZU0dv3x68TkzAu941PVPnu97VOnncT/xE6/66nlYHBmbXxq8qUCpr0Q5SChWQJzNnFcRV5oqjkbb6iitmRhmdODG1jyHPPRr9a9bEH0/qb4fFi6cmv09/WpMfKJW1KE5l5qO5ShUbwaL09ZW/CSspB1I7uZFuSTASJvW3w3PPVVdrQoi5hlYKJVN1OGDDvLN+ffsrkCrt+p2MgKmz6pgQvYaUQsl0ajIsQ9FUucGrkz6FuquOCdFLSCmUTCcnw26OO0/b+1DmRK6qY0KUh5RCyXTSwdrNcedpETDnnVf82g2F0t8PGzYUD6sVQsyk8txHVTI2NuZ79nRXqeiknD9DQ3D0aLZrZLH1t8plk8dX4F5N7qM05s0r5gvImv9JCJFMbbmP5iJJSeDKSg5XRdx5HQXrizqHf+mXypVDCDEdhaTOMqoIvWyYX7ZvDybr/v7ATl+lWaa/v5hi+NrXShdFCBFBK4Ua2LgxMJ/E5SGqi61b4dixwPRz7Fj1dvqizmGFnwpRLVoplIxZsn0eAgXQyDsE5eQhqoO075lG8+okKwo/FaJatFIoQKs0FklO1kZ/I99QM0n9nSLv6uWnfzpffxzR1cnpp2cbo/BTIapFK4WctJvGIumpuE6zSJHVy/335+tPY2Cg9fFO+DmEEApJzc3ISKAImhkeDhKPpYVqJoVi9vcHT83Qfrhn3pDULDLluUeR/1JlX08IkYxCUkskqSR01lLRF12Ur79KFi4MXrth9ZLkK5APQYjOIqWQk3Ynr7vvztdfJc89F7wW+U6LF+frT6MbFJMQotoazWea2VfN7H4z22tmV4X9p5rZbWb2YPh6SmTMJjPbb2YPmNmlVcnWDu1OXlVvbitCkvO2lVP3k58MzE5R5s0L+oswPJyvXwhRDVWuFI4B/97dfxr4BeBKMxsFPgzsdvdzgN3hZ8Jja4GVwBuArWbWdcaD2TB5nXxyvvO3bg1yCOXJKTQ+DtdfPz230fXXF99l3cmcUUKIZCpTCu5+2N3vCt8/DdwPnAFcDuwIT9sBvDl8fzlwg7s/7+4PAfuBC6uSryizYfL6/vfzjymyea3M6l6dLMojhEimIz4FMxsBXgV8EzjN3Q9DoDiAl4ennQE8Ehl2KOzrKpImqe3bg30LohidLMojhEim8mnMzBYDnwfe7+4/bHVqTN+MYEQzW29me8xsz5EjR8oSMzNJUUbHj3cmdLKuus9V08k6FEKIZCpVCmY2QKAQJtz9C2H342a2LDy+DHgi7D8EnBkZvhx4rPma7r7d3cfcfWzp0qXVCZ9A3SGSZZbj7CbSivIIITpDldFHBlwL3O/ufxo5dBOwLny/DvhipH+tmS0ws7OAc4A7qpKvKN0SIllm3eeitEr3kZfxcVi3brqze9268tKDCyGyUeVKYRXwTuB1ZnZ32NYAVwOXmNmDwCXhZ9x9L3AjsA+4FbjS3btkCu5OkuztixZlG59n53MzjXQfBw+Ws3qZmAjCWRtK9/jx4HMvrYaEmA0ozUVO2plI3bOlc8h6j0ZqjWYuvhh2704fv2gRPPNMtns1k5buIy8nnRRfUW3BAvjxj/NfTwiRjNJc9CCt7O1f+Uq2a/zoR8XvX3a0UFKJTZXeFKKzSCnMMrKU4+zE4k/RQkL0JkqdPcuoohxnEbZsmZ5CHBQtJEQvoJVCD9KO3yMr4+PBaiWa5qLV6iWN1avz9QshqkGO5pzU7Wgus57C0BAcPZrt3E7Q7CBfvRp27apPHiF6FTma5xhZk/O97W3VypGXc8+dvk/h3HPrlUeIuYiUQg8Stzs4js98pnpZstIoCRrdp7BtW3qtaCFEuUgp9CDN9v4k2glJLZvt2/P1CyGqQUqhR4mmtZ4NqPKaEN2BlEKHSUpBEe0vOxInabXQiSglIcTsQkqhQzSqoWWZoPfvjz8nqV8IIcpCSqFDvOxlwWtSrqFof1LNhqT+NJLCWLspGnk2lDkVYi4gpdAhVEGsNaqnIER3IKUQw8aNMG9eYNKZN6+csMhTT23/Gr1M2TukhRDFUO6jJhrx8g0a8fKQrZh9N7J6dXwq7W5LITE+LiUgRN1opdBEWrz80FCx6z71VLFxZbBr10wFoBQSQog4pBSaSIuXL5oaou6U0rt2BY7lRpNCEELEUWWN5uvM7Akzuy/S91Eze7SpPGfj2CYz229mD5jZpVXJBa1rCzdy7zTT6L/llvz3GxiYcphmCUmdPz/+nKR+IYQoiypXCtcDb4jp/zN3Pz9stwCY2SiwFlgZjtlqZgnTc3uk1RZevz5+XKO/SBRRdMLPEh563XUzlYdZ0C+EEFVSmVJw938EslrSLwducPfn3f0hYD9wYRVybd48vTAMBJ83bw7eb90KGzZMz9a5YcOUkznJDNTfH0zccSuNF16Yun6WePzxcfjsZ6dH4nz2s3LCCiGqpw6fwm+a2b2heemUsO8M4JHIOYfCvtLJUlt41SpYvjyYkJcvDz43SIqn37EjyDOUlGuocf2s8fjR3EUHDkghCCE6Q6eVwjbgbOB84DDwJ2F/nKU91tBiZuvNbI+Z7Tly5EhuAZJSSjf608xLcfH069YFK4G+vqDF0VhhZI3Hb+X3yEK744UQcxR3r6wBI8B9aceATcCmyLEvAa9Ju/4FF1zgeenri8bgTLW+vuD48HD88f5+d7Pg+M6dU9fbudN9cDB+TKMNDk4fk0bcNfNcY+dO9/nzp4+fPz+fDEKI3gXY4wnzaqXlOM1sBLjZ3V8Rfl7m7ofD9x8Aft7d15rZSuCvCfwIpwO7gXPcvWXi5CLlONNKXfb1pecEGhycerofGYnPSdTfH5h+VqwITEN5zD9J1xweDkxJaSxZAk8+ObO/28pvCiHqoZZynGb2OeB24DwzO2Rm7wX+yMy+bWb3Aq8FPgDg7nuBG4F9wK3AlWkKoShpIadZ9hNEHdNJPoqGf6GIPyCL36MVcQqh0V9m6g4hRO9RZfTR2919mbsPuPtyd7/W3d/p7j/j7q9098saq4bw/C3ufra7n+fuf1+VXGkhp2vWxB9vpjFBJymRdjarJeVJKit/kkpdCiGSmHM7mtNCTrNuTmtM+klKJKtyqYKsqThU6lII0cycUwoQKIBjxwLfwbFj0xPdZTHRRENIk5RIkZ3PDZLyJGXNn3TNNcEu6jRU6lII0cycVAqtSNuc1hxC2q79P48MWU1S4+Pw6U9Phb0mkeRfEULMXaQUmkjbnNbsOC4ygaftISij4Ex081tSiuyLLsp+PSHE3EBKoYm8xV7yTuBpm+OKyJCGaj4LIbIipRBDnhQTeSfwtNxLVVCFiUsI0ZtIKRSg2fwD2ZVI3Ka05v4sq4k8VBE2K4ToTaQUctLuhJ22eQ7KX02U4aMQQswNpBRy0u6EnVbZDco395TtoxBC9C7z6hZgttHuhD08nJzXqMGKFfHntGPuGR+XEhBCpKOVQk7atc9nMeXI3COEqAsphZy0O2FnMeXI3COEqItKU2dXTZHU2WUwMRH4EB5+uFhqbCGEqJNaUmf3Mu2WysxSFU2V04QQdSClUAJ5JvAsIa1l71MQQoisyHzUJo0JPBqmGq3M1kyWqmrtVl4TQohWtDIfSSm0Sd4JPKncp1lgjsp6jhBCFKWucpzXmdkTZnZfpO9UM7vNzB4MX0+JHNtkZvvN7AEzu7Qqucom776FLCGtSkshhKiLKn0K1wNvaOr7MLDb3c8BdoefMbNRYC2wMhyz1cxmRbb/vBO49ikIIbqZKms0/yPQXCvscmBH+H4H8OZI/w3u/ry7PwTsBy6sSrYyyTuBa5+CEKKb6XSai9Pc/TCAux82s5eH/WcA/xw571DY1/U0Juo8+xaypJxQWgohRB10S+6juKKRsR5wM1sPrAdY0SVGdk3gQoheodP7FB43s2UA4esTYf8h4MzIecuBx+Iu4O7b3X3M3ceWLl1aqbBCCDHX6LRSuAlYF75fB3wx0r/WzBaY2VnAOcAdHZZNCCHmPJWZj8zsc8BFwBIzOwR8BLgauNHM3gs8DLwVwN33mtmNwD7gGHCluydUHhBCCFEVlSkFd397wqHVCedvARR0KYQQNaLcR0IIISaZ1WkuzOwIEJNkIjNLgKMliVMVkrEcJGM5SMZyqFvGYXePjdSZ1UqhXcxsT1L+j25BMpaDZCwHyVgO3SyjzEdCCCEmkVIQQggxyVxXCtvrFiADkrEcJGM5SMZy6FoZ57RPQQghxHTm+kpBCCFEhDmnFOKK/3QbZnammX3VzO43s71mdlXdMjVjZieZ2R1mdk8o48fqlikJM+s3s2+Z2c11y5KEmR0ws2+b2d1mVm85wQTM7GQz+xsz+074f/M1dcsUxczOC3+/Rvuhmb2/brmaMbMPhH8z95nZ58zspLplijLnzEdm9svAM8Bn3P0VdcsTR5gscJm732VmLwHuBN7s7vtqFm0SMzNgkbs/Y2YDwNeBq9z9n1OGdhwz+x1gDHipu7+pbnniMLMDwJi7d218vZntAP63u3/KzOYDg+7+/ZrFiiUs0vUo8PPu3s5eplIxszMI/lZG3f25ML3PLe5+fb2STTHnVgoJxX+6Cnc/7O53he+fBu6ny+pLeMAz4ceBsHXdE4aZLQfeCHyqbllmM2b2UuCXgWsB3P2FblUIIauB73aTQogwD1hoZvOAQRIyQtfFnFMKsw0zGwFeBXyzZlFmEJpl7iZIgX6bu3edjMAngA8BJ2qWIw0Hvmxmd4Y1Q7qNnwCOAJ8OTXGfMrNFdQvVgrXA5+oWohl3fxT4OEFC0MPAD9z9y/VKNR0phS7GzBYDnwfe7+4/rFueZtz9uLufT1D/4kIz6ypznJm9CXjC3e+sW5YMrHL3VwO/ClwZmjm7iXnAq4Ft7v4q4EeENda7jdC0dRnwP+uWpRkzO4Wg/PBZwOnAIjN7R71STUdKoUsJ7fSfBybc/Qt1y9OK0IzwNeAN9Uoyg1XAZaG9/gbgdWa2s16R4nH3x8LXJ4C/pftqlB8CDkVWg39DoCS6kV8F7nL3x+sWJIaLgYfc/Yi7vwh8AfjXNcs0DSmFLiR04l4L3O/uf1q3PHGY2VIzOzl8v5DgP/t3ahWqCXff5O7L3X2EwJzwFXfvqqcyADNbFAYUEJpkXg90VXScu/8/4BEzOy/sWk1Q/6QbeTtdaDoKeRj4BTMbDP/OVxP4DLuGOacUwuI/twPnmdmhsOBPt7EKeCfBk20jvG5N3UI1sQz4qpndC/wLgU+ha0M+u5zTgK+b2T0EFQf/zt1vrVmmOH4LmAj/zc8H/rBecWZiZoPAJQRP4F1HuNL6G+Au4NsEc3BX7W6ecyGpQgghkplzKwUhhBDJSCkIIYSYREpBCCHEJFIKQgghJpFSEEIIMYmUgpgzmNnxpiyahXfkmtk/lSlb07XHzOzPq7q+EK1QSKqYM5jZM+6+uG45hOhmtFIQc56wlsHHzOyusKbBT4X9S83strD/L83soJktCY89E75eZGZfi9QZmAh3qmJmF5jZP4RJ7r4UpkRvvvdbw7z695jZP0aueXP4/pbIyuYHZrYuTET4x2b2L2Z2r5ld0anfSvQ+UgpiLrGwyXz0byPHjoYJ6bYBHwz7PkKQGuPVBPmIViRc91XA+4FRgmyiq8LcVf8N+HV3vwC4DtgSM/b3gEvd/WcJkrhNw93XhEkH3wscBP5X+P4H7v5zwM8Bv2FmZ2X8DYRoyby6BRCigzwXTrBxNNIi3An8Wvj+F4G3ALj7rWb2vYSxd7j7IYAwlfgI8H3gFcBt4cKhnyBVcjPfAK4Pi63EpmYIVyefBd7m7j8ws9cDrzSzXw9PeRlwDvBQgnxCZEZKQYiA58PX40z9XVjOsdHxBux195YlK939fWb28wSFgO42s/Ojx8MKYjcAv+/ujSR5BvyWu38po3xCZEbmIyGS+TrwNoDw6fyUHGMfAJZaWMfYzAbMbGXzSWZ2trt/091/DzgKnNl0ytXAve5+Q6TvS8CG0ESFmZ3b5QVvxCxCKwUxl1gYmnca3OrurcJSPwZ8LvQ9/AOB+efpLDdy9xdC886fm9nLCP7WPgHsbTr1j83sHIKn/93APcCvRI5/ENgbkfv3CEqLjgB3hU7tI8Cbs8glRBoKSRUiATNbABx392PhE/+2Fj4JIXoCrRSESGYFcKOZ9QEvAL9RszxCVI5WCkIIISaRo1kIIcQkUgpCCCEmkVIQQggxiZSCEEKISaQUhBBCTCKlIIQQYpL/D/ZoRF15citXAAAAAElFTkSuQmCC\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": 7,
"metadata": {
"button": false,
"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": 8,
"metadata": {
"button": false,
"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": 8,
"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": 9,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 52.57078735 -1.69012804]]\n",
"Intercept: [103.38424037]\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": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 10,
"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": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 24.10\n",
"Residual sum of squares (MSE): 1024.62\n",
"R2-score: 0.67\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. 30.44162781 4.37828825 -0.49993821]]\n",
"Intercept: [126.94181776]\n",
"Mean absolute error: 24.07\n",
"Residual sum of squares (MSE): 1024.62\n",
"R2-score: 0.68\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": [
"# write your code here\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) )"
]
},
{
"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",
"language": "python",
"name": "conda-env-python-py"
},
"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.11"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment