Created
June 8, 2020 06:47
-
-
Save NewDaBai/216893cc0228516f7fe7910ea2a66cf5 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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-06-08 06:22:18-- 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-06-08 06:22:18 (1.14 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, | |
"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, | |
"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, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEHCAYAAABBW1qbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO2df5Qc1XXnP3dGI6GRjIGRzAqERoQAiUQcbCYkXuUHscA4sg/Y2dgr72DrxDkRlkiCk/VxrNVubCerLJs4icluBFHMD9mamGVjZ80hBBsJnKwdYiIwYCTMIi8SyGhBgH+AwYCku39U9Ux1T1XXj67q6un5fs6p01Wv6lXd7pHerXfvffeauyOEEEIADNQtgBBCiN5BSkEIIcQkUgpCCCEmkVIQQggxiZSCEEKISaQUhBBCTDKnypub2X7geeAocMTdx8zsJOB/AMuB/cC73f074fWbgF8Lr/8td/9iu/svWrTIly9fXpX4QgjRl9x7773PuPviuHOVKoWQX3T3ZyLHHwF2uftVZvaR8Ph3zWwFsBZYCZwC7DSzs9z9aNKNly9fzu7du6uUXQgh+g4zO5B0rg7z0aXA9nB/O/COSPtN7v6yuz8G7APOr0E+IYSYtVStFBz4kpnda2brw7aT3f0QQPj5urD9VOCJSN+DYZsQQoguUbX5aJW7P2lmrwPuMLNvtrnWYtqm5eAIlct6gGXLlpUjpRBCCKDimYK7Pxl+Pg38LYE56CkzWwIQfj4dXn4QOC3SfSnwZMw9t7n7mLuPLV4c6ycRQghRkMqUgpktMLPXNPaBtwAPAbcA68LL1gFfCPdvAdaa2TwzOx04E7inKvmEEEJMp8qZwsnAV8zsAYLB/e/c/XbgKuAiM3sUuCg8xt33ADcDe4HbgSvaRR4JIWYXExOwfDkMDASfExN1S9Sf2ExOnT02NuYKSRWi/5mYgPXr4cUXp9qGh2HbNhgfr0+umYqZ3evuY3HntKJZCNHzbN7crBAgON68uR55+hkpBSFEz/P44/naRXGkFIQQPU9S9Lmi0stHSkEI0fNs2RL4EKIMDwftolykFIQQPc/4eOBUHh0Fs+BTTuZq6EZCPCGE6JjxcSmBbqCZghBCiEmkFIQQQkwipSCEEGISKQUhhBCTSCkIIYSYREpBCCHEJFIKQgghJpFSEEIIMYmUghBCiEmkFIQQQkwipSCEEGKSypWCmQ2a2dfN7Nbw+GNm9m0zuz/c1kSu3WRm+8zsETO7uGrZhBBCNNONhHhXAg8Dx0fa/szdPxG9yMxWAGuBlcApwE4zO0t1moUQontUOlMws6XA24BPZbj8UuAmd3/Z3R8D9gHnVymfEEKIZqo2H30S+DBwrKX9N8zsQTO73sxODNtOBZ6IXHMwbBNCCNElKlMKZvZ24Gl3v7fl1DXAGcC5wCHgTxpdYm7jMfddb2a7zWz34cOHyxRZCCFmPVXOFFYBl5jZfuAm4M1mtsPdn3L3o+5+DPgrpkxEB4HTIv2XAk+23tTdt7n7mLuPLV68uELxhRBi9lGZUnD3Te6+1N2XEziQ73T3y8xsSeSydwIPhfu3AGvNbJ6ZnQ6cCdxTlXxCCCGmU0c5zj8ys3MJTEP7gcsB3H2Pmd0M7AWOAFco8kgIIbpLVxavufuX3f3t4f573f0n3P317n6Jux+KXLfF3c9w97Pd/e+7IZsQYmYwMQHLl8PAQPA5MVG3RP2JVjQLIVLZuBHmzAGz4HPjxu4+f2IC1q+HAwfAPfhcv16KoQqkFIQQbdm4Ea65Bo6GxtyjR4PjbiqGzZvhxReb2158MWgX5WLu06I+ZwxjY2O+e/fuusUQoq8ZGAjezlsxg2OtK5D6WIZ+wszudfexuHOaKQgh2pL03tjN98lly/K1i+JIKQghep4tW2B4uLlteDhoF+UipSCE6HnGx2HbNhgdDUxGo6PB8fh43ZL1H1IKQoi2bNiQr70qxsdh//7Ah7B/vxRCVUgpCDHDqTp+f+vWQAEMDgbHg4PB8datnd1X6w56EykFISqmyhj/pPj9jRvLHXC3boUjR4JnHDlSjkLQuoPeRCGpQlRII8a/lTLetCEY8A8cmN5u1hwdNDzcWzb4JLlHRwPTkKiWdiGpUgpCVMicOVOLvqIMDgZv3J2SFL8fRy8NuFp3UC9apyBETcQphHbteckTp//448Wfk2YCy+sf0LqD3kVKQYgKsbjSUW3a8xIXv59076IDblqaiyL+Aa076F2kFISokDJWA7d7S4+L3//AB8odcK+9tn17kbxEWnfQw7j7jN3OO+88F6ITNmxwHxx0h+Bzw4Zy7x8M//FbVvni+qbJWeb3SvsOZvHnzIo/U1QLsNsTxlXNFMSspRvZPxux/VnbW9m2LV87BGab7dubv9f27dWFe8o/0F9IKYhZS5EBNy/r1+drb6WIo7rbaablH+gvKlcKZjZoZl83s1vD45PM7A4zezT8PDFy7SYz22dmj5jZxVXLJmY3VUcGQeergYvMNJKijIpGH6WluRgfh3Xrmr/junXyD8xUujFTuBJ4OHL8EWCXu58J7AqPMbMVwFpgJfBWYKuZZZxkC5GfTk07WelkNXCRmUbZ5pw0xdZtc5WolkqVgpktBd4GfCrSfCmwPdzfDrwj0n6Tu7/s7o8B+4Dzq5RPzG46Ne10g1WrgoijKHPmBO1JxJlzhobghReKp71op9hUFa2/qHqm8Engw0B0jeLJ7n4IIPx8Xdh+KvBE5LqDYZsQlVBVorcy2bx5+srnI0eaB9zWhWPQHO45MhJ8PvtsNXmGyjZXiXqpTCmY2duBp9393qxdYtqmRXOb2Xoz221muw8fPtyRjEKUneitbNIG3KSFYzCVZnrhQnjlleb+Zb7JK/qov6hyprAKuMTM9gM3AW82sx3AU2a2BCD8fDq8/iBwWqT/UuDJ1pu6+zZ3H3P3scWLF1covhD1kzbgZjHdVP0mX1X00cqVwQynsa1c2dn9RDYqUwruvsndl7r7cgIH8p3ufhlwC7AuvGwd8IVw/xZgrZnNM7PTgTOBe6qST4iZQNqAm2XAr/pNvorVyStXwt69zW1790oxdIM61ilcBVxkZo8CF4XHuPse4GZgL3A7cIW7lxgcKMTMI23AzTLgd2MdQdlV0VoVQlr7bKLK+hyA0lwI0Sk7driPjgZpHUZHg+NuPnt4uDm9xPDwdBnqlLEInaYH6VeKpj1pBaW5EKIa6q4gltV00/omDyqFORPpxip8KQUhOmAmxuhXocjKdgqvWJGvfbbQjVX4UgpCdEAdMfrRwdcMLrssfYCPrmVYty6/IrvwwuZnXnjh1LkqnMJ79kxXACtWBO2zmW6swpdSEKIDuh2jn6U4T+sA3zozSHqrjKuZDIEC2LWruW3XrinFUJVTeM+eZsv5bFcI0J1V+FIKQnRAr2YIjc5U4kxccSS9bbYqhLR2UR3dWIUvpSBEB/RqBbHoTCWrKatMu7SojqpX4UspCNFntM5UspqyRkerkUfMLKQUhOiAukNSoyTNVOJMXHGsWRPfvnp1vnYxs5FSEKINrRlIWwf7boek+rQUkVPtSauJW01cSb6D226Lb9+5c7oCWL06aIfu1aUQ3UFKQYgEsswC6ghJbV3PumFDetqD6OK1Y8emn0+TeefO5mc2FAKUFxFTefoGkY2kpc4zYVOaC1Elo6PxKQVGR6euGRmJv2ZkpDq5NmxwHxxsnwqiXdqDLN8rL6tXN99r9er836mM9A0iGyjNhRD56cXiMRs3wjXXpEcKXXttstmr7DDaiQm4++7mtrvvbn5mmhmuG+kbREaStMVM2DRTEFWS5Y3aLP4as/LkiCazazc7aLe1JskrM0Fe0u80OBjcf2TEfe7c9vIoAV53QTMFIfKT5Y06KdxzYKCcZHOtfo2ivPhikN4iWrKzXarrdmktWklaCX30aCDzs8+mV36Ts7p3kFIQIoEsC9OSwj0bA2KnIapZVyNnIatMaWktyiJqhrvggvhrktpFdZh38vpRM2NjY7579+66xRCznImJYPB+/PHgTTzO3j86OpWyOg8DA53NENoxOBjMFJYtC5RbQ9ml5VcaHAyUSmMlbZZ8THFEf5Ply+NnHEV/N9EeM7vX3cfizmmmIESHdBru2S4Us6rEetA8c3j/+7PPZo4eDZzdDTmLmHhazXC96NSfrVSmFMzsODO7x8weMLM9ZvbxsP1jZvZtM7s/3NZE+mwys31m9oiZXVyVbEJUxYIF+dpbo4laB9wf/dHyZYzjlVfgyivz9WlEBp19dvq1Q0MwMpJshut2tlnRhiQPdKcbYMDCcH8I+BrwM8DHgA/FXL8CeACYB5wOfAsYbPcMRR+JXiBrdFAcSesNBgfbn69qc5++5iDt+nbfO2t0U9ayoqIcqCP6KHz2C+HhULi1s45eCtzk7i+7+2PAPuD8quQTogw6jQ5Kq6TVbj1CY/jcsaPZGT4yEn/94GA2+39cWouk+zXkSCIpuqmVXs02Oxup1KdgZoNmdj/wNHCHu38tPPUbZvagmV1vZieGbacCT0S6HwzbhOgaeVMtdBodlBaKmSVU86tfhYMHg8H54EE499z4UNrt24NBOklpRNujaS02bIi/vszCLjC9jrQUQj1UqhTc/ai7nwssBc43s3OAa4AzgHOBQ8CfhJfHvcNMewcxs/VmttvMdh8+fLgiycVsJM2+H0dSjH5Wkuzxjfakgffo0ak1BK0y79oFb3pT81v3unWBAhsI/8e3KpuhIbj66vhnpRV2Oe64+H5J7aK36VpIqpl9FPiBu38i0rYcuNXdzzGzTQDu/l/Cc18EPubud8fcDlBIqiiXOXPizTWDg0Exkzx9WkkKVW2Ehba7fuPGwJSSpwhOVOaGiSs6oxkaguOPh+eemx6SmpdFi4IFaq2MjMAzzxS7p6iWWkJSzWyxmZ0Q7s8HLgS+aWZLIpe9E3go3L8FWGtm88zsdOBM4J6q5BOilTT7ft5zUZJCVbO0RyttZSUqV5yJ69VXg4G8YXL66lez37uV557L1y56mzkV3nsJsN3MBgmUz83ufquZfcbMziUwDe0HLgdw9z1mdjOwFzgCXOHuKhAousbgYPIg33DQrljRXEB+dDSbCanbVc2i5qG0WP+GmQyKlXZMmkkpRcXMpMroowfd/Q3u/np3P8fdfz9sf6+7/0TYfom7H4r02eLuZ7j72e7+91XJJkSDqGM5y1v/3r2wcuXUcdaqZt1ab9Ag6ovIGutfNCNpkmktqV30NlrRLAqTlg6512VISkOdFra5d+/UfmsoZRJf/nJ2udpxwgntz7c6gSG74srjsxB9TNIChpmwafFaffTCYqNOZUhbOFYknXPePnmvL1qMJssCu8b3zkuR30nUC20WrykhnihELyQw61SGdm/27unn48gbwZT3GUUipFppzJBaaZ1hZKXI7yTqpePoozCS6D+Y2bZwwdn1ZnZ9uWKKmUQvJDDrVIa0hWErVsSfb22PmrDmz4/vU9ZCryIRUq2sWjW1XqHBwEDQXoSkxW1J7aK3yepT+ALwWmAn8HeRTcxSeiGBWRYZ2vkc0grO79kzXQG0Rh+1prl44YXpA+7q1clv4Elv2UntZRSj2bx5eijssWPNRW9a6QX/kegSSXal6Abcn+W6bm/yKdTHTPApZJFxw4Yp38LgYP5C8UmlKLP+Lt3yKUTJW0I07XdM882I3oM2PoWsSuE/A2uyXNvNTUqhXjodUMugXa3hLDWWO7m/e/a6yUnPLCJjVYqsqIxyNM882imFrOajK4FbzeyHZvZ8uH2/kqmLmBFMTAQJ1qI5d7Zv7y2zQqc+h1bTUFwZy6zmsqRnZqkD3Up0hfORI/mdw2vW5GtP+x3zmsBEj5OkLWbCpplCfZTxFt4paWaNBQviZVywINv9s3zHHTvc585NnykMDibPNro946pjppA24xLdhU7NR8E9uAT4RLi9PWu/KjcphfrIa5fOQt6Bo2qzRtbBbmgoXSkkKa64/kND7b973PV5KNunkPY77dgx/ZlmUgx10rFSAK4CdgHvD7c7gKuy9K1yk1Koj7JnCkUc12mDWzeUQtLv0JgZJDlhG7/TyEj8+ZGReJmSFFAexVDkb9dOYaf9Tkkzqblzs8ssyqUMpfAgMBA5HgQezNK3yk1KoT7Kjj5KGqhGRoo7kruhFDpVTHll7PQ7ucebvObOLf63q1o5i/JppxTy5D6KZl15bXEvhugHyi6fmOTMfPbZZEdvESdt2aStlShjXUEVBO92ycd5+MAH8rWLHidJW0Q34D3AAeBGYDvwGLA2S98qN80U+ocs8f5xZo5OzBppZOnfqb29qplCO+d1FUEC7Z6nmULvQUmO5iUEzuZLgX+VtV+Vm5RC/7Bjh/vAQHbFEDf4tJLFodpOqaxYEd9/xYrpsnfLxJXFp5C2wK2KIIF2rF4d/7zVq6t5nkinsFIAfiz8fGPc1q5vNzYphf4haSDLsiUphoUL469fuDA4n8W23qoYWhVCGp3OJOJIiz5KUq4DA9l+lypoVQxSCPXSiVLYFn7eFbPd2a5vNzYphXopM/Y8KUon64whjrQBN2/kT1Zaf5cNG6ozccWRds92q7C1jmB2UIr5KO8GHEdQY/kBYA/w8bD9JIKQ1kfDzxMjfTYB+4BHgIvTniGlUB9lRx8VVQjtBtAq6iWkkfd3qUMpZPk9u53HSnSXdkohUz0FM3sXcLu7P29m/zE0H/2Bu3+9TR8DFrj7C2Y2BHyFIF3GLwPPuftVZvaRUCn8rpmtAD4LnA+cQpCR9SxvU6dZ9RTqo+x6Ckl1ArJQtFZBFXUA8v4uVcgwMBDf1yzIhpr1t+5mbQzRXTqupwD8p1Ah/CxwMUEE0rXtOoQK6YXwcCjcnMBRvT1s3w68I9y/FLjJ3V9298cIZgznZ5RPdJmkYvVZitjH0Um9gaS+Cxe2bx8ZiT+f1J6FpNDaAwfKSzsdrSs9Z05wHCVJmTTaL7gg23O6WRtD9A5ZlULjveJtwDXu/gVgblonMxs0s/uBp4E73P1rwMnufggg/HxdePmpwBOR7gfDNtGDlB1/H1f4JYsMq1fDbbfFD7g/+EF8v0b71VfD0FDzuaGhoD0P0UG63du9e6AcfvVXiyuG1rrSR48Gx62KoR379mW7rpu1MUQPkWRXim7ArcBfAt8iWMQ2D3ggS9+w/wkEzulzgO+2nPtO+PkXwGWR9uuAfxNzr/XAbmD3smXLSrSyiTxksYXncUTnWafQcIiOjEyPHsob2dOps7xo1FTDmV22nyTtnllTfef1KSjh3cyCEtJcDBP4As4Mj5cAb8nSN3KPjwIfInAiL4nc55FwfxOwKXL9F4E3tbunHM31kRa5U6bDNe9WZp7/+fOb+82f33y+XdRU2gCc5XfM8zuV8VsWGdSLJPUT9dJOKWR1NJ8BHHT3l83sAuD1wKfd/btt+iwGXnX375rZfOBLwH8FfgF41qcczSe5+4fNbCXw10w5mneFSkiO5h4krYB8mQ7XvDQcqkWcuBs3Buk62jli58+HF1+cela7Z6SdX7gw3sy1YEFQ2rOVLN+pk98yw3AwjUWLgnQkrYyMwDPPFJdFVEcZjubPAUfN7EcJzDqnEwzg7VgC3GVmDwL/QuBTuJUg4+pFZvYocFF4jLvvAW4G9gK3A1e0Uwj9Ttk1cdOck3lJKyDfaYGbTihqC2+11yfx0ktT+536VtL8HjOBOIXQrl30OElTiOgG3Bd+fhj4zXD/61n6Vrn1q/mo7DUAZdT1bSXNjJE3v05ZpqNOVgvnWUCX9bdNu0deGas2HxWh7PuJ6qEEn8LXCJLiPQScHrY9lKVvlVu/KoWyE5ZVUVg9bSDotk+hjNXCRQfPdsng0nwGVSiFvE77xlY09URVK8NFdbRTClnNR78KvAnY4u6PmdnpwI7y5isiStmmlzRTTxWUnVo7jWPHAl9FVfePMn9+8/GqVbB0afA9ly4NjhuUFfbaYMOG9Pa4lOIN0yEEpq1TTmk+v3o17NxZTKarr4a5LQHqc+cW/46iZpK0xUzY+nWmUPabV1qCtCKUbTLoJPdR0jPz/o5ZwjVbf7MsM6J24ZpFMohmqekcfebIyPTooLLTWCgkdWZB0ZmCmd0cfn7DzB6MbN8IHchiBtD6ZpvWXgdVzFrOPTdfu3v6PY8da3bSb948FYnU4MUXYd26qSABCGYxcbOZs86Kf05SO8DWrUGEl3vwuXXr9GvGx6eeuXAhvPrqdBk3b05+Rl6iz+vWjE1UQ9uQVDNb4u6HzGw07ry7F0xqUA79GpKalrum7vs1+iaRZXBt5TWviQ/BzErcM9PCZrNe365/0m8bZXg42XSWV0ZoDpsdHAzSfMQphgZV/P3FzKZwSKpPpaM4ECqA7wDPRzZRAWklHuu+XxVUEYKZ15eSNf9StH+W37DdW3leGYukuejG37/sEGpRI0l2pegGXA48BewnKMX5GPB/s/StcutXn0LZhdWzRgLlsQuX7VPoxJ8Q3aJFcIpEXUXt9UlbtH/cb5vnd8krY5HvVHaIc7fvL8qHEkJSHwUWZbm2m1s/K4Wy0wakDfh5n1lEKRStp1xUMRRZnxFVCkmO59b+0e+VRZG0Pi+PjEWVcZWO4CpqPotqKUMp3A4MZ7m2m1u/KoU6/pNVkYMnSidlKYtsDbJE6kSvbXfPtP5Ffpe8Mlax5qRTul3zWXROO6WQNffRG4AbCBaxvRwxPf1WaXasAsjRXB55HcdZrp+YCGzpjz8efKc4O3kjF1KZuY+iMuShDOd53lxGeVm5Evbund6+YgXs2dP5/YtQdsElUT1l5D76S+BO4J+BeyObqIDWhUdp7b3IxETguD1wIBhQkxynRYvy9Cqt4alp7Xl55JF87d0gbrHc8HDQLmYeWZXCEXf/HXe/wd23N7ZKJZvFRBOuZWkvg7KrkMXF78dRtChPO1asKP+eWUmaUbSbaeSJ3KljdXoa3V69Lqolq1K4y8zWm9kSMzupsVUq2SwmyURUZUx52akKss4Ayh7MOjGjJJmPyjZtRZmYCCqxNWZUaZXZyq54VxZavNY/ZFUK/46gCM4/MWU66j9jfh/R+va5cWP7t9Hxcbj++ua3veuvL/6fO+sg1Uk95CgN92arQsjzFv6BD+RrL4Mrr5y+2vjVV4P2OJLWUnRS41qIJpI80DNh69foo6Jhhw2yxM4PDHQWlpgmY9YooSzZQrNscaGWReLn80QCFfldOr2+DBmrQLmPZhYUDUkFPhzZf1fLuT9s17cbm5RCPFlTJy9YUJ2MSUn4OlUiaVt0kV8dob3dUAq9hhavzTzaKYU089HayP6mlnNvLWmyIlro1Omb1Z5fZXWvPP6PgaxGzAy88sqU6aWO6m95/3ZlO/jrICkpYJkJ90T3SPvvaAn7ccfNJ81OM7O7zOxhM9tjZleG7R8zs2+b2f3htibSZ5OZ7TOzR8zs4lzfpI+Ybfnpg4lneTTKQNaR8ynv364f/tZ1ll4VFZA0hQhmGEEZztb9uOOYvkuAN4b7rwH+D7AC+BjwoZjrVwAPAPMIakB/Cxhs94x+NR+5d2ajzWpqiasNUFbuoyy1CarcGt+nDrNG3r/dTLfHK83FzIM25qM5KTrjJ83s+wSzgvnhPuHxcSnK5hDQyLL6vJk9DJzapsulwE3u/jLwmJntA84H7k6RURTk8sun9huLzRpmgAMHpiJaikQglf32X4SG3I1V1cuWBQuqqg6XHB/P94y81/caW7Y0/9sBLV6b0SRpizI3YDnwOHA8wUxhP/AgcD1wYnjNfwcui/S5DviVdvft15nCjh3T37TNsr9Bpr1Fx0Ws5H3bS3tLT8ql1M2Zwmym27OPmT7bmW3Qae6jTjCzhcA/ENR3/ryZnQw8AzjwB8ASd3+/mf0FcLe77wj7XQfc5u6fa7nfemA9wLJly8470G95EoB58wKHaStz58LLL09vb6VIDp+8+ZbSnrFo0ZRtvw56YaZSF62zPmhf6EfMPsrIfVT0wUPA54AJd/88gLs/5e5H3f0Y8FcEJiKAg8Bpke5LgSdb7+nu29x9zN3HFi9eXKX4tRGnENq1l0HZTtnnnisui+gMRQOJTqhMKZiZEZiAHnb3P420L4lc9k7goXD/FmCtmc0zs9OBM4F7qpJPNFN2UrOTlASlNhQNJDqhypnCKuC9wJtbwk//yMy+YWYPAr8I/DaAu+8Bbgb2EtRvuMLda0zz1Z+YBXWBW8s3diup2cBAtbmExMwovyp6l7Too8K4+1eIX8twW5s+WwDFLFRMo64vtC/43o7jjoMf/jC+HZLNR+6Bj6JKxTCTFn5VgaKBRCdU6lMQ9ZA1dfS2bVP7ExPwvvc1Z+t83/uSE8j9yI+0b6/rbXVoaGYt/KoCpbIWnSClUBF5snOWTVxlrjiiaasvv3x6lNGxY81rGbI8o9G+Zk38+aT2Tli4cGrwu+EGDX6gVNaiOJWZj2YzZS8EizIwUM0irKQ8SEXzI92WYCRMau+El16qttaEELMJzRQqoMqQwIZpZ/36zmcfVdr1uxkBU2fVMSH6DSmFCujGgFiGkqlygVc3fQp1Vx0Top+QUqiAbg2IvRx3nrbuocyBXFXHhCgPKYUK6JaTtZfjztMiYM4+u/NnDA7Chg3Fw2qFENOpPPdRlYyNjfnu3b1XKjop78/ICDzzTHr/LLb+drls8vgKGn/+snMfpTFnTnFfQNYcUEKIeGrLfTRbSUoEV0aCuKrizrtdtL4T5/DP/Vx5cgghmlFI6gyjqtDLhglm27ZgwB4cDGz1VZlmBgeLK4Yvf7lUUYQQETRTqImNGwMTSlIuojrYuhWOHAnMP0eOVGur78Q5rBBUIapDM4UKMEu2z0OgABq5h6CcXETdJu07ptE6M8mDQlCFqA7NFAqQlsIiydHaaI/mHIqS1N4t8sxefvzH87XHEZ2ZnHJK9n4KQRWiOjRTyEkZKSyS3ozrNIvknb08/HD8fZLa0xgaim9fuDBIY9ENP4cQQiGpuVm+PFAErYyOBonHID1cMykcc3AweHPuNNyzSEhqmkx5nlHkn1TZ9xNCJKOQ1BJJKgmdp1T0BRfka6+K+fOn9uuevST5CeQ/EKK7SCnkpIzB6+j8eQkAABAUSURBVP7787VXxUsvTe3n/V4LF+ZrT6NupSSECKiyRvNpZnaXmT1sZnvM7Mqw/SQzu8PMHg0/T4z02WRm+8zsETO7uCrZOqGMwavKxW1FSXLeJrVfe21gcooyZ07QXoTR0XztQohqqHKmcAT49+7+48DPAFeY2QrgI8Audz8T2BUeE55bC6wE3gpsNbOeMx7MhMHrhBPy99m6Ncgj1JgZpOUVGh+HG29szm10443FV1l3syiPECKZypSCux9y9/vC/eeBh4FTgUuB7eFl24F3hPuXAje5+8vu/hiwDzi/KvmKMhMGr+9+t1i/vIvXyqzu1c2iPEKIZLriUzCz5cAbgK8BJ7v7IQgUB/C68LJTgSci3Q6GbT1F0iC1bdvUugWRn24W5RFCJFO5UjCzhcDngA+6+/fbXRrTNi0Y0czWm9luM9t9+PDhssTMTFKU0dGjU1XRqqSOms/doJtFeYQQyVSqFMxsiEAhTLj758Pmp8xsSXh+CfB02H4QOC3SfSnwZOs93X2bu4+5+9jixYurEz6BukMkyyzH2UukFeURQnSHKqOPDLgOeNjd/zRy6hZgXbi/DvhCpH2tmc0zs9OBM4F7qpKvKL0SIllWzedOSEv3kYfxcVi3rtnRvW5duenBhRDpVDlTWAW8F3izmd0fbmuAq4CLzOxR4KLwGHffA9wM7AVuB65w9x4ZgnuTJHv7ggXZ+udZ+dxKI93HgQPlzF4mJoJw1obSPXo0OO6n2ZAQMwGluchJJwMpBANoWkqHrM+IptaIcuGFsGtXev8FC+CFF7I9q5Us6T7ycNxx8dXU5s2DH/4w//2EEMkozUUf0s7efued2e7xgx8Uf37Z0UJJ5TVVdlOI7iKlMMPIUo6zG5M/RQsJ0Z8odfYMo6pynHnZsqU5hTgoWkiIfkAzhT6kU79HFsbHg9lKNM1Fu9lLGqtX52sXQlSDHM05qdvRXGY9hZEReOaZbNd2g1YH+erVsHNnffII0a/I0TzLyJqc793vrlaOvJx1VvM6hbPOqlceIWYjUgp9SNzq4Dg+/enqZclKoxxodJ3CNde0rxMthCgfKYU+pNXen0QnIalls21bvnYhRDVIKfQp0bTWMwFVXhOiN5BSqIGkNBSN9rIjcZJmC92IUhJCzCykFLpIoyJa2iC9b1/8+aR2IYQoCymFLvLa1wafSfmGGu1JNRmK1mpICmPtpWjkmVDmVIjZgJRCF1EVsWRUT0GI3kBKIYaNG2HOnMCcM2dOeWGRJ51Uzn36kbJXSAshiqHcRy004uUbNOLlIb2Qfa+yenV8Ku1eSyExPi4lIETdaKbQQlq8/MhI8Xs/91zxvp2wc+d0BaAUEkKIOKQUWkiLl+8kNUSdaaV37gwcy41NCkEIEUeVNZqvN7OnzeyhSNvHzOzbLeU5G+c2mdk+M3vEzC6uSi5oX1u4kXunlUb7bbcVe+bQ0JTTNC0kde7c+PNJ7UIIURZVzhRuBN4a0/5n7n5uuN0GYGYrgLXAyrDPVjNLGJ47I6228Pr18f0a7VkiiIaGAgd1lKgiSAsRvf766YrDLGgXQogqqUwpuPs/Almt6JcCN7n7y+7+GLAPOL8KuTZvbi4MA8Hx5s3B/tatsGFDc7bODRumnMxJJqDBwamomeOPhyNHms+/8srUM9Ji8sfH4TOfaY7E+cxn5IQVQlRPHT6F3zCzB0Pz0olh26nAE5FrDoZtpZOltvCqVbB0aTAgL10aHDdIiqffvj3IM7R/f7JDufGMLDH50dxF+/dLIQghukO3lcI1wBnAucAh4E/C9jgre6yRxczWm9luM9t9+PDh3AIkpZRutKeZl+Li6detC2YBDR9F0nqExiwjS0x+O79HFjrtL4SYpbh7ZRuwHHgo7RywCdgUOfdF4E1p9z/vvPM8LwMD0RicqW1gIDg/Ohp/fnDQ3Sw4v2PH1P127HAfHm6+dmjIfe7c5rbh4eZ+7Yi7Z97+rc+fOzd7fyFEfwPs9oRxtdJynGa2HLjV3c8Jj5e4+6Fw/7eBn3b3tWa2EvhrAj/CKcAu4Ex3b5s4uUg5zrRSlwMD6TmBhoen3uyXL4/PSTQyAgsXBiajZcsC01BWE1DSPUdHA1NSGosWwbPPxsvUS+U3hRD10K4cZ2VKwcw+C1wALAKeAj4aHp9LYBraD1weURKbgfcDR4APuvvfpz2jiFKYMyd+LcLgYOAcThqQW2kM0ElKxKx4LYNO75mWEntwMDCJzdQV2kKIzqilRrO7v8fdl7j7kLsvdffr3P297v4T7v56d7+koRDC67e4+xnufnYWhVCUtJDTNWviz7fScBonRSN1slAtySdRVu4klboUQiQx61Y0p4WcZl2c1hj0k5RIVuVSBVlTcajUpRCilVmnFCBQAEeOBCaaI0eazShZFqdFw0eTlEjRlc+QHNKaNXfS1VcHC+jSUKlLIUQrs1IptCPL4rRo+GiWdQ9lyZDVJDU+DjfcMBXymkRSSg8hxOxFSqGFLIvTolFERQfwdusIyig4E138lpQi+4ILst9PCDE7kFJoIW+xlyIDeJEFcp0UnFHNZyFEVqQUYsiTYqLIAJ6Wf6lsqjBxCSH6EymFArSafiBfnqKkdRCN9rSZRF6qCJsVQvQnUgo5KWPATqvZUPZMogwfhRBidiClkJMyBuy06m5lm3vK9lEIIfqXOemXiChlDNijo8m5jSAw68Sd78TcMz4uJSCESEczhZyUYZ9PM+fI3COEqAsphZyUtYagnTlH5h4hRF1Umjq7aopkSS2DiYnAh1AkLbYQQtRNLVlS+5kySmWmVUZT5TQhRB1IKZRA3gE8Lay17HUKQgiRFZmPOqQxgEfDVKOV2eJIq6zWaeU1IYRoRy2V17pBLyiFIgN4WmW1Kqq5CSFEg1p8CmZ2vZk9bWYPRdpOMrM7zOzR8PPEyLlNZrbPzB4xs4urkqtsiqxbSAtrVVoKIURdVOlTuBF4a0vbR4Bd7n4msCs8xsxWAGuBlWGfrWY2I7L9FxnAtU5BCNGrVFmj+R+B1lphlwLbw/3twDsi7Te5+8vu/hiwDzi/KtnKpMgArnUKQohepdtpLk5290MA7n7IzF4Xtp8K/HPkuoNhW8/TGKjzrltISzuhtBRCiDroldxHcUUjYz3gZrYeWA+wrEeM7BrAhRD9QrfXKTxlZksAws+nw/aDwGmR65YCT8bdwN23ufuYu48tXry4UmGFEGK20W2lcAuwLtxfB3wh0r7WzOaZ2enAmcA9XZZNCCFmPZWZj8zss8AFwCIzOwh8FLgKuNnMfg14HHgXgLvvMbObgb3AEeAKd0+oOiCEEKIqKlMK7v6ehFOrE67fAijoUgghakS5j4QQQkwyo9NcmNlhICbJRGYWAc+UJE5VSMZykIzlIBnLoW4ZR909NlJnRiuFTjGz3Un5P3oFyVgOkrEcJGM59LKMMh8JIYSYREpBCCHEJLNdKWyrW4AMSMZykIzlIBnLoWdlnNU+BSGEEM3M9pmCEEKICLNSKcQVAOo1zOw0M7vLzB42sz1mdmXdMrViZseZ2T1m9kAo48frlikOMxs0s6+b2a11y5KEme03s2+Y2f1mVm85wQTM7AQz+xsz+2b47/JNdcsUxczODn+/xvZ9M/tg3XK1Yma/Hf5/ecjMPmtmx9UtU5RZaT4ys58HXgA+7e7n1C1PHGHCwCXufp+ZvQa4F3iHu++tWbRJzMyABe7+gpkNAV8BrnT3f07p2lXM7HeAMeB4d3973fLEYWb7gTF379n4ejPbDvxvd/+Umc0Fht39u3XLFUdYpOvbwE+7eydrmUrFzE4l+H+ywt1fCtP73ObuN9Yr2RSzcqaQUACop3D3Q+5+X7j/PPAwPVZjwgNeCA+Hwq2n3jLMbCnwNuBTdcsykzGz44GfB64DcPdXelUhhKwGvtVLCiHCHGC+mc0BhknICF0Xs1IpzDTMbDnwBuBr9UoyndA0cz9BGvQ73L3XZPwk8GHgWN2CpODAl8zs3rBmSK/xI8Bh4IbQFPcpM1tQt1BtWAt8tm4hWnH3bwOfIEgIegj4nrt/qV6pmpFS6HHMbCHwOeCD7v79uuVpxd2Puvu5BDUwzjeznjHHmdnbgafd/d66ZcnAKnd/I/BLwBWhibOXmAO8EbjG3d8A/ICwxnqvEZq2LgH+Z92ytGJmJxKUHz4dOAVYYGaX1StVM1IKPUxop/8cMOHun69bnnaEpoQvA2+tWZQoq4BLQnv9TcCbzWxHvSLF4+5Php9PA39L79UoPwgcjMwE/4ZASfQivwTc5+5P1S1IDBcCj7n7YXd/Ffg88K9rlqkJKYUeJXTiXgc87O5/Wrc8cZjZYjM7IdyfT/AP/pv1SjWFu29y96XuvpzAnHCnu/fUWxmAmS0IgwkITTJvAXoqMs7d/x/whJmdHTatJqh/0ou8hx40HYU8DvyMmQ2H/8dXE/gLe4ZZqRTCAkB3A2eb2cGw6E+vsQp4L8HbbSPEbk3dQrWwBLjLzB4E/oXAp9CzYZ89zMnAV8zsAYKKg3/n7rfXLFMcvwlMhH/vc4E/rFmeaZjZMHARwRt4zxHOtP4GuA/4BsEY3FOrm2dlSKoQQoh4ZuVMQQghRDxSCkIIISaRUhBCCDGJlIIQQohJpBSEEEJMIqUgZg1mdrQli2bhFblm9k9lytZy7zEz+/Oq7i9EOxSSKmYNZvaCuy+sWw4hehnNFMSsJ6xl8HEzuy+safBjYftiM7sjbP9LMztgZovCcy+EnxeY2ZcjdQYmwpWqmNl5ZvYPYZK7L4bp0Fuf/a4wr/4DZvaPkXveGu7fFpnZfM/M1oVJCP/YzP7FzB40s8u79VuJ/kdKQcwm5reYj/5t5NwzYUK6a4APhW0fJUiN8UaCfETLEu77BuCDwAqCbKKrwrxV/w34FXc/D7ge2BLT9/eAi939JwmSuDXh7mvChIO/BhwA/le4/z13/yngp4BfN7PTs/8MQiQzp24BhOgiL4UDbByNtAj3Ar8c7v8s8E4Ad7/dzL6T0Pcedz8IEKYRXw58FzgHuCOcOAwSpEpu5avAjWGxldjUDOHs5DPAu939e2b2FuD1ZvYr4SWvBc4EHkuQT4jMSCkIEfBy+HmUqf8XlrNvtL8Be9y9bclKd/+Amf00QSGg+82sSWmFFcRuAn7f3RtJ8gz4TXf/Ykb5hMiMzEdCJPMV4N0A4dv5iTn6PgIstrCOsZkNmdnK1ovM7Ax3/5q7/x7wDHBayyVXAQ+6+02Rti8CG0ITFWZ2Vo8XvBEzCM0UxGxifmjeaXC7u7cLS/048NnQ9/APBOaf57M8yN1fCc07f25mryX4v/ZJYE/LpX9sZmcSvP3vAh4AfiFy/kPAnojcv0dQWnQ5cF/o1D4MvCOLXEKkoZBUIRIws3nAUXc/Er7xX9PGJyFEX6CZghDJLANuNrMB4BXg12uWR4jK0UxBCCHEJHI0CyGEmERKQQghxCRSCkIIISaRUhBCCDGJlIIQQohJpBSEEEJM8v8B1Ou58Axie6kAAAAASUVORK5CYII=\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, | |
"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, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 1. , 3.5 , 12.25],\n", | |
" [ 1. , 3.5 , 12.25],\n", | |
" [ 1. , 3.5 , 12.25],\n", | |
" ...,\n", | |
" [ 1. , 3.2 , 10.24],\n", | |
" [ 1. , 3.2 , 10.24],\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, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Coefficients: [[ 0. 48.46596621 -1.25195063]]\n", | |
"Intercept: [110.80388744]\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: 21.89\n", | |
"Residual sum of squares (MSE): 826.55\n", | |
"R2-score: 0.71\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": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "ValueError", | |
"evalue": "shapes (238,4) and (3,1) not aligned: 4 (dim 1) != 3 (dim 0)", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-20-c00f024e1d91>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_x_poly\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrain_y\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mtest_x_poly3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpoly3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_x\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mtest_y_poly3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_x_poly3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Coefficients: '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoef_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Intercept: '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintercept_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/linear_model/base.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[0mReturns\u001b[0m \u001b[0mpredicted\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 212\u001b[0m \"\"\"\n\u001b[0;32m--> 213\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_decision_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 214\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0m_preprocess_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstaticmethod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_preprocess_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/linear_model/base.py\u001b[0m in \u001b[0;36m_decision_function\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[0mX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccept_sparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'csr'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'csc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'coo'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 197\u001b[0m return safe_sparse_dot(X, self.coef_.T,\n\u001b[0;32m--> 198\u001b[0;31m dense_output=True) + self.intercept_\n\u001b[0m\u001b[1;32m 199\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 200\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/utils/extmath.py\u001b[0m in \u001b[0;36msafe_sparse_dot\u001b[0;34m(a, b, dense_output)\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 173\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 174\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[0;34m(*args, **kwargs)\u001b[0m\n", | |
"\u001b[0;31mValueError\u001b[0m: shapes (238,4) and (3,1) not aligned: 4 (dim 1) != 3 (dim 0)" | |
] | |
} | |
], | |
"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", | |
"clf3.fit(train_x_poly, train_y)\n", | |
"test_x_poly3 = poly3.fit_transform(test_x)\n", | |
"test_y_poly3 = clf3.predict(test_x_poly3)\n", | |
"print ('Coefficients: ', clf3.coef_)\n", | |
"print ('Intercept: ',clf3.intercept_)\n", | |
"print(\"R2-score: %.2f\" % r2_score(test_y_poly3 , 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 © 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.10" | |
}, | |
"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