Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jukomol/3b40f30b6d6a05a9678c938c72df96b6 to your computer and use it in GitHub Desktop.
Save jukomol/3b40f30b6d6a05a9678c938c72df96b6 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,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<center>\n",
" <img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/images/IDSNlogo.png\" width=\"300\" alt=\"cognitiveclass.ai logo\" />\n",
"</center>\n",
"\n",
"# Polynomial Regression\n",
"\n",
"Estimated time needed: **15** minutes\n",
"\n",
"## Objectives\n",
"\n",
"After completing this lab you will be able to:\n",
"\n",
"- Use scikit-learn to implement Polynomial Regression\n",
"- Create a model, train,test and use the model\n"
]
},
{
"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>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Importing Needed packages\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"button": false,
"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,
"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.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2021-04-18 16:51:05-- https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/FuelConsumptionCo2.csv\n",
"Resolving cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)... 198.23.119.245\n",
"Connecting to cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)|198.23.119.245|: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.07s \n",
"\n",
"2021-04-18 16:51:06 (1023 KB/s) - ‘FuelConsumption.csv’ saved [72629/72629]\n",
"\n"
]
}
],
"source": [
"!wget -O FuelConsumption.csv https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/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](https://www.ibm.com/us-en/cloud/object-storage?cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ&cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ&cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Understanding the Data\n",
"\n",
"### `FuelConsumption.csv`:\n",
"\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?cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ&cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ&cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ&cm_mmc=Email_Newsletter-_-Developer_Ed%2BTech-_-WW_WW-_-SkillsNetwork-Courses-IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork-20718538&cm_mmca1=000026UJ&cm_mmca2=10006555&cm_mmca3=M12345678&cvosrc=email.Newsletter.M12345678&cvo_campaign=000026UJ)\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,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Reading the data in\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"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": 6,
"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.\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"button": false,
"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": 7,
"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:\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [
{
"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(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"#### Creating train and test dataset\n",
"\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.\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"button": false,
"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,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"polynomial_regression\">Polynomial regression</h2>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"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",
"$$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",
"**PolynomialFeatures()** 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: \n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"button": false,
"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. , 9. ],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 10,
"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",
"The equation and the sample example is displayed below. \n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
" v_1\\\\\n",
" v_2\\\\\n",
" \\vdots\\\\\n",
" v_n\n",
"\\end{bmatrix}\\longrightarrow \\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",
"$$\n",
"\\begin{bmatrix}\n",
" 2.\\\\\n",
" 2.4\\\\\n",
" 1.5\\\\\n",
" \\vdots\n",
"\\end{bmatrix} \\longrightarrow \\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",
"$$\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",
"so we can use **LinearRegression()** function to solve it:\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 51.94675475 -1.69936106]]\n",
"Intercept: [105.24193781]\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:\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 12,
"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,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 24.51\n",
"Residual sum of squares (MSE): 1001.45\n",
"R2-score: 0.75\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?\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 34.31468983 3.24391465 -0.41821758]]\n",
"Intercept: [123.72384274]\n",
"Mean absolute error: 24.32\n",
"Residual sum of squares (MSE): 992.51\n",
"R2-score: 0.75\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEICAYAAACwDehOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA7UUlEQVR4nO29eZgU1bn4/3lnARxRkQENLsygEg0YRcGVfOMCKheNy40YDCqiBgWMGs1NJOQXTW4wu5EsIKiokVGDxns1XCMKoiaECKOgAmrEsEgkikZBRISZeX9/nGqo7qnqrl6qe2b6/TzPebrr9Kmq0w1z3jrvKqqKYRiGYQBUlHoChmEYRtvBhIJhGIaxExMKhmEYxk5MKBiGYRg7MaFgGIZh7MSEgmEYhrGT2IWCiFSKyFIRmeMd3ywi/xSRZV4b7hs7UURWicjrInJG3HMzDMMwkqkqwj2uBV4F9vT1/VJVf+4fJCL9gJFAf2A/YJ6IfFZVm8Mu3KNHD62vry/8jA3DMDowL7zwwnuq2jPos1iFgogcAJwJTAauzzD8HOBBVf0UWC0iq4BjgUVhJ9TX19PY2Fio6RqGYZQFIrI27LO41Ue3Ad8CWlL6rxaRl0Vkpojs7fXtD7zlG7Pe60tCRMaKSKOING7cuDGOORuGYZQtsQkFETkLeFdVX0j5aBpwMDAA2AD8InFKwGVa5eBQ1RmqOkhVB/XsGbj7MQzDMHIkTvXRYOBsz5DcBdhTRGap6kWJASJyBzDHO1wPHOg7/wDg7RjnZxiGYaQQ205BVSeq6gGqWo8zID+tqheJSC/fsPOA5d77x4CRItJZRPoAfYHFcc3PMAzDaE0xvI9S+amIDMCphtYAVwKo6goRmQ2sBJqACek8jwzDMIzCU5TgNVV9RlXP8t5frKqfV9UjVPVsVd3gGzdZVQ9W1UNV9U/FmJthGNnT0AD19VBR4V4bGko9I6NQWESzYXQwxo+HqioQca/jxxf2+g0NMHYsrF0Lqu517FgTDB0FEwqG0YEYPx6mTYNmT/Ha3OyOCykYJk2CrVuT+7Zudf1G+0fac+W1QYMGqQWvGcYuqqp2CQQ/lZXQ1FSYe1RUuB1CKiLQkhqRZLRJROQFVR0U9JntFAyjAxEkENL150Lv3tn1G+0LEwqGYWTF5MlQU5PcV1Pj+o32jwkFwzCyYtQomDED6uqcyqiuzh2PGlXqmRmFoBRxCoZhxERlZbhNoZCMGmVCoKNiOwXD6ECMHZtdv2GkYjsFw+hATJ3qXmfMcDuGykonEBL9hpEJ2ykYRhuhUFHCU6c691NV95qNQLBIZcOEgmHkQaGih4OihC++2F23WIuzRSobYMFrhpEziejhVMaNy15dU1/vFuEwamri9/AJm0NdHaxZE999jeKTLnjNhIJh5Egho4fDooT9xL04W6Ry+WARzYYRA4WMHo4SDbxuXfbX9ZPJXmCRygaYUDCMnJGgArJp+tMRFCWcStTFOcjOEcVeYJHKBphQMIycCVP35KKR9UcJQ2vBEnVxDsuSeuWVmTObWqSyAWZTMIycSbcjyPfPqqHBLdjr1rkdwuTJ0RbnKLYJP2YvKE/MpmAYKRTCHz8sdUQhUkqMGuWMyi0t7jXq03q2wsjsBUYqJhSMsqNQ/vjtLaWE2QuMKJhQMMqOQlUOmzrVxSQkdgaVlbnFKBQLsxcYUTCbglF2dGR//EIG1Bkdl5LaFESkUkSWisgc77i7iDwlIm94r3v7xk4UkVUi8rqInBH33IzypJT++HHnFmpvuxej7VEM9dG1wKu+4xuB+araF5jvHSMi/YCRQH9gGDBVRAqcBd4wSuePX6zcQvkkxDOMWIWCiBwAnAnc6es+B7jXe38vcK6v/0FV/VRVVwOrgGPjnJ9RnpTKHz9XW4ZlLjWKSdw7hduAbwF+Te2+qroBwHvdx+vfH3jLN26915eEiIwVkUYRady4cWMskzY6Prm6fOZDWJqKRH/Q4m+ZS41iE5tQEJGzgHdV9YWopwT0tTIHquoMVR2kqoN69uyZ1xwNo5iks2WELf7XXlsYTynDiEqcO4XBwNkisgZ4EDhVRGYB74hILwDv9V1v/HrgQN/5BwBvxzg/wygq6WwZYaql998Pvla+yfFyoX9/p25LtP79iz8HI35iEwqqOlFVD1DVepwB+WlVvQh4DBjtDRsNPOq9fwwYKSKdRaQP0BdYHNf8DKPYpLNlZLvIFzsSuX9/WLkyuW/lynYqGBIW+E8+gc2bXduyxR3nkuK2g1GKGs0/BmaLyOXAOmAEgKquEJHZwEqgCZigqvYvZHQoRo0Ktl/07h1c4Ka21q1V/l1EKSKRUwVCpv6is3kzrF7tDET//Ce8/bZr773ntlv//veuxX/LlvQBKZ06uR95jz2ge3fYe2/o2RN69YLPfAYOOAD69HGGn/32c0agDoQFrxlGGyBhU0hd/GfMcO9zSY5XSOJM/hcZVVi/Hl5+GZYvh9dec+3vf3eLvp/KSth3X7eY19a6tuee0LUrdO3KS6915g+PVfPxjmoUoZJmdqtu5stnb+fIQ7a6f4jNm+GDD1x7913YsMH1+enSBT77Wfjc56BfPxgwAI46ygmOXHKoFwmrvGYYeZJr1tK2do9cKYlQ+Oc/4W9/gyVLXFu61C3QCXr1gsMOc4vyQQe5p/c+fdyC3LNn2syEOZce3brVCabVq11btcoJpldfdceJH6NHDzj+eDjhBDjxRDjuONhtt1x+hVgwoWAYeZDuKb7Yi3apBEeQTQHcw/GKFQW4gap74l+wAJ57DhYu3GVoqa6GI46AgQPdk/gRR8Dhh8Nee+V8u1hSnWzZ4nYxS5dCY6MTaK+95j7r3NkJiFNPhTPOgEGDSqp2SicUUNV22wYOHKiGETd1dapuCUludXWFvc+sWe6aIu511qzWn9fUJM+hpqb1uDCGDEk+d8iQ7ObXr1/y+f36ZXd+K955R/W++1Qvuki1V69dF95vP9URI1Rvu031+edVt23L80atKda/qb7/vuqcOao33KB69NHuHxdUe/Rw3/vhh1W3bCnwTTMDNGrIumo7BcPIQFwJ9Dp1gh07wj9PtSkEqTugtcpj6FCYP3/X8ZAh7tXf5/9s3ryspp07qu4p+o9/hDlz3NM0OFXL0KFwyimuHXJI7Pr4ku3+3nsPnnwS/vQn195/36mVhg2Dr3wFvvSlzHVZC4DtFAwjD+J4qqyuDr5maqutbb07CGoJUncDUVqsNDWpPvus6jXXqB54oLuhiOoJJ6j+8IeqS5aoNjfHPIlgMu3MYmfHDtWnn1a9+updO6WuXVUvucT1x/i7YDsFw8idOJ4qC/kgXFnp3O5zvW7BlwBVp09/4AF46CH417+cTv2MM+Dcc+HMM2GffTJepqxobna2lIYGePhh2LTJGc8vvxwuu8y5whYQMzQbRp4U2sBbaO1I4s+4pELhjTfgvvtcW7PGCYKzzoIRI2D4cOf3b2Tmk0/gkUfgzjvhmWecof388+Hqq52xugD/eUwoGEYbI8rfdU2NUzeHpbpI4LcpFF0ofPQRzJ4Nd90FixY5A8zQoU5innuuiw0wcueNN1zu85kzXYzEMcfAt74F552XVzHwkhbZMYyOQKHTV1dXh3/mT4ExZUp6u2N1dXJ0c8KoHDtLlsAVV7hYgSuugA8/hJ/+1G2l5s6FSy4xgVAI+vaFX/7SxWz89rcuSG/ECDj0ULj77njuGWZsaA/NDM1GoQkyPubrChpGqrG5ujr9nIKMxJ06tZ5HkOtpQYzlH3+seuedqgMH7voRLrtM9a9/VW1pye1HMLKjqcm5sR5zjDPe5whmaDaMzIQZlMNUOBmjXwtMzlG45GksX7fOqTDuuMM9qfbv72p8XnRRXgFkRh6owvbtzm6TA6Y+MowIlDp9dSYVVaYiPenIpdrcT768mNkVX6Gp7iCaf/IzXux2ijN8vvIKTJhgAqGUiOQsEDJhQsEwPLJd5Lt3z+9+fiHQoweMGZO+wlq6Ij0Fo6UFHnuMVb2+wLcfOY7TdS63cj19WM3AfzzM+N+f1KYTvRkFIEyv1B6a2RSMQhKmd6+oCO6vrc39XkF2ikw6/3xsGxnP3b5d9d57d+ayWE2dXsNt2pXNSedUVub+nY22A2lsCiVf2PNpJhSMQhK2cIYt2CK53ytMAGW6R65RuGH369t7m+rtt6vW17uOz39etaFBK9lRmghooyikEwqmPjIMjzC9e11d8Ph81DZheYwy3WPUKGdUbmlxr1ED6FJVY53ZxgR+w9PrDoarruK9yn1dTqKXXoKvfhUqg+tv5eEab7QTTCgYho+gRTeotrKIW9gLEbMQRqdO0SusDR2aXD956NDkzxPz78SnXMU03qAvv+HrrKYPp/EkdW8vomHTWTvtBWPHBt8nrN/oOJhQMIwM+HcQ4NZN9Ty5gwzChSJxj0ykZkUFd+wXDNu3NjGae3idQ5nGeNZSxxDm8UWeYx6nsfUTYdKkXeMHD4aqlM1CVZXrNzo4YXql9tDMpmAUm0JlTM0mi6nfdhBkU0h3bmVFi04//WFdyWGqoIsZpKcxV6Elrf2iaPUGjJKA2RQMozBEjRUYP949WYu41/HjXX/CDTUbEruR8ePda6rbahhf5FkWthzP2CfPRxHO4xGOZTFPcTrQ2q3Ub7/IJybCaN8EW5MMwwike/fgYDZ/zML48TBt2q7j5mZ3/Pe/u5xxqQFyUdi61amwmptb96fyOVbyU77FWfwfb3EAY5jJ77iEFsKtxDU1yfaL3r2DjeEFjYkw2iSx7RREpIuILBaRl0RkhYh83+u/WUT+KSLLvDbcd85EEVklIq+LyBlxzc0wcmXbtsz9iWppqcyfH7yI19XBrFmZC26lCoRU9uEdpnEVr/B5/h9/5tv8mM/yd+5hTFqBEBTdHGRcTxUcRgclTK+Ub8PtT7t676uB54HjgZuBbwaM7we8BHQG+gBvApXp7mE2BaNYpEtKl+q/n429wK/Lz3SPysrg/r69t+n0Q36im9hDt1Olv+JqrWVjTnEQQd+5ZJXJjNigFDYF795bvMNqr6XzpzgHeFBVP1XV1cAq4Ni45mcYCcL0/wkaGnaloIhCtr78CZVMwh02aNdQU+PsB8n9yohOj/LCtv6MXfVt9jzrJCaPXM41/Jr36ZF0fteu6e8dRK4xEUb7JlZDs4hUisgy4F3gKVV93vvoahF5WURmisjeXt/+wFu+09d7fYYRGwn9f0I1k9D/+wXDtdfCjh3pr+NPB3ToocFj9tsvvUomIZwuusgV3+raNTmIburUXa6xh/Eaz3YZxuzt57JHj86uhsEf/8jNDxzKuHG7BFNlpUtoevHFwXMaPjy43yhjwrYQhWxAN2ABcDiwL1CJE0iTgZnemN8CF/nOuQv4csC1xgKNQGPv3r3j2FkZZUSYSsaf4yeqGijKNf0qmbBx/jZuXPI5/Q7crCuG36BaVaW6116qU6a4vEUZMBdTww9toZ6CiNwEfKyqP/f11QNzVPVwEZkIoKo/8j6bC9ysqovCrmn1FIx8SZfwM/GnETUpaJTxiTH9+8PKlZmvWVEBXbrA1q3KV/g9v+AG9udtVp10OYfMvgX22SfS3CoqgoPhRJx6yCgvSlJPQUR6ikg37/1uwFDgNRHp5Rt2HrDce/8YMFJEOotIH6AvsDiu+RkGhOv//f21tZmvE2WMnygCAdyCfcDW13mK03iQC3mHfTmOvzF0zZ2RBQIUKe220SGI06bQC1ggIi8DS3A2hTnAT0XkFa//FOAbAKq6ApgNrASeACaoagYnPMPIjyg5fqZMcXmIwqiudmMKTWe2cTM38TJHcAxLmMBvOIYlLOY41q4NNoqHMXly6x2MiLmYGgGE6ZXaQzOXVKMQjBsXrt8fMsSN8ev1u3QJHpOgEG6rpzBfX6evKmgDF+q+bEhrd8iEVyahVevXr2A/o9GOwNJcGEYyfjfUGTPczmDIkNbjEonlEu6ZV13VOoBt/vzoT+wJ+vUL7u/O+9zFZTzNELrt2cL8b8/lazX38w6fCb1WWLCcnzB1VVQ1llFGhEmL9tBsp9A+iDsIKtvrjxuX+Uk9F8+iBFGuo6rarZv/sxYdU/Ogas+e7mI33qi6dWvS94t63SDyOdfoeGCV14xSkU8JybiuH8UVNBe1TzZj/IJpf97SR/mSKujqfY5RfemlrOYdpUSmCQXDTzqhYOojI1YmTWqd72frVpJy9xf7+plyCKUjirdSFJzKR7mCO1hBf4Yyj+v5BZ99bxEccUTgOVb4xigGJhSMWIk7BXMu1892AffbGgq1MB/QvIYnOZ07GMsLDORwlvNLrmdHS/jkBg928QZ+KiqiFb4ZNy67fqN8MaFgxErc/vGZrp+oX1BRsat0ZtgCPm5ca2PzkCEwb96u46lTg8dMnbrrOCx4TQSnsZk+nVf4PMfzN65iGkOZx2oOAtILrEmTWgeatbS03hUFfefBg1tfu7LSKqkZAYTpldpDM5tC26eUNoV0n/ndUCsro7l1Rv0+Ybr7A1mrOnSoKujKA4Zqb9Zk5V4qEnxdf6bTsPnV1gafa2kuyhPM0GyUklwX4KiEeR/Fke8nyjVbj2nRS5mpm2RP1d13V739dtWWlqx/l9zunb6lS51tdFxMKBglI+6dQjqiPFnHcU3/d96XDTs9i/512Emq//hHzvcOc6X1C5Ow+YW12trcfwuj/ZJOKJhNwYiVuL2P0hFWySxThbN0RLGRjBrlBcT1fITlHM4ZPEnjRb9k3xVPQ58+Od/78ccz94fNL8zOEVZJzihfTCgYsVLKAvCffJJdPwQbaf39a9cG5xBau9Y3fvNmjp9+KdM3fpk11HNmrxd5fdh1rV2HsiTKbxlWRlM1+NyPPw7/zkaZEraFaA/N1Edtn1Lm8c82YGvWrNbqFxGnnklVgSXGpY4f0vnPunGPem2iQn/Ad7WK7Qqq1dWtVWa77ZZ87m67pf8+UX/LIBtLut8iNSguUffB6LhgNgWjVJTSppCtUKiqSn9OusW0iu36Q76jTVToKg7SE1iYVn+fKhCiCIZ8fssw76Owtvvu2f3WRvsinVAw9ZERKwn9el1dcmnJtljvt6kpu/GJyOhDeIOFDGYSt3AvoxnAMhZxYqvx77+/630uqq18fsspU1yKbz+px34+/jjzNY2OiQkFI3YKVQA+W9132iCyAlBZoVzK3SzlKA5hFefzEJczky3sUZgbFJBRo+Duu5MFyt13l3pWRpskbAvRHpqpj8qHXFQn2aqP0o1PvXev3T7QxoMvUAV9mpN1f94KHBd232znlutvkImKiuA5VFTkfk2j7YOpj4z2TjFcW8NqHPTrl6y2OW/fv/L33QcwcM0fWHbBLVzeex5vywE71TlR2G239P1Bu6I4foMrr8yu3ygDwqRFe2i2U+j4RKklEBYNnC7QLCwKOrVCWVJlsqYm1R/+0N2wTx/VRYsC5xx1FxDmfTRrlmqnTsmfpR6nfp98iDvi3Gh7kGanIO7z9smgQYO0sbGx1NMwYiKRvC716TiMceOSE9PtsQds2dJ6XJcuzr6xffuuvk6dYObMNPaODRvgoovg6adh5Ei4/XbYa6/AodXVwUbrqirYsSPz9+jRI9konUDEiYFUamvhvfcyX9cwEojIC6o6KOgzUx8ZsZNrcFSQuiQdqaqbIIEALorXLxDAHV97bciF586FI4+ERYvgzjtpOPN+6o/cK/T7hHkxRfVuChIIECwQEuMt6MwoFCYUjFhJPO2vXesWtbVr3XGUBSzbqOfU4jnZ1k1otRg3NcHEiTBsGOy7LzQ20tDlcsZeKTl9nzhpK/Mw2j+xqY9EpAvwHNAZqAIeVtWbRKQ78HugHlgDXKCqH3jnTAQuB5qBa1R1brp7mPqo7ZNIDZFKXZ1zT83l3DAqK5OfxnNxPd355/DWW3DhhbBwIVxxhXP0r6mJ9H3S3TfKn1tlZeu6CVGJ8rsaRt7qIxHpKSLfEZEZIjIz0TKc9ilwqqoeCQwAhonI8cCNwHxV7QvM944RkX7ASKA/MAyYKiJZPusZbY2wRT3KYj95stP1RyW1eE7XrtHPBaebB1yGuaOOgpdeco/ed9yxM6FQ2O4lKfdRRMLUarkKhHTzM4yoVEUc9yjwZ2Ae7ik+I56FO6HVrfaaAucAJ3v99wLPAN/2+h9U1U+B1SKyCjgWWBRxjkYbpLIyuCZyVNVO1CfrsWOTjcyQPiq3ujrZ6FtdDb+6tQm+8z340Y9cneTZs+HQQ5PO6907vaAbMybcIOz/zqlG9IT6J18KVdHOKGPC3JL8DVgWZVzAeZXAMpxw+InX92HKmA+8198AF/n67wLOT3d9c0lt++QSpJUgasGYXO6d6pL68K/fVj3pJPfh176munVr4DWDAsiiNr/raLrkdrlcuxCBbEb5QAGC1+aIyPAcBE6zqg4ADgCOFZHD0wwP0sS2et4SkbEi0igijRs3bsx2SkaRqasL78/klRRVFZKL501S6o27F/Dl/x4AS5bA737n3JhCosv8+Yeyxf8UX+iU4lHyIFmKbCMSYdLC34CPgBZgm/f+I2BzlHN917gJ+CbwOtDL6+sFvO69nwhM9I2fC5yQ7pq2U2j7hFULGzIkc8qG3XfP7yk54+6iuVl18mSX0+Gww1SXL9du3ZLHdesW/t2yfZL3B4XluhsIakkBdiGUMlut0fagFMFrItIT2KGqH4rIbsCTwE+Ak4D3VfXHInIj0F1VvyUi/YH7cXaE/XBG6L6qGmrDMO+jtk/nzq1jAtLh956pqIhmUwg6FzJ4Af37A7jkEpgzxwWj3XEHex/YlQ8/bD22Wzf44IPW/dnOzx9klm5uYTaJdGQan48XmNHxSOd9FNXQjIicDXzRO3xGVedkOKUXcK/nQVQBzFbVOSKyCJgtIpcD64ARAKq6QkRmAyuBJmBCOoFgtA+yEQiQrD7JdmFMVb2EGbkHVbwIA8+H9evhN79h/PLxzOgmgWOBQEGRy/zCgtJS2X338MC7XCllBTyjfRHVJfXHwLW4BXslcK3XF4qqvqyqR6nqEap6uKr+wOt/X1WHqGpf7/XfvnMmq+rBqnqoqv4p969lpJKPPnn8eJeiQcS9jh8f1yzz855JPTdokb+Mu/hzy4nO9ejPf2b8iglMuz1cIJSCOGoZRKktbRhAZJvCy0CF77gSeDnKuXE2sylEIx99cphNIGrStEx2gELZFBJ2Cj/+tNCd+URncIUq6FMMVX33XVVtXYoyrQ0ihWyrmfmvk25Mth5Iqd87CLMpGH7ItxynJxS6+467m1BoP+RTJzls0aysjHbv1KyjfuNoWKbSBJlqC2eaU6K/N2t0CQNVQf+bSVpBU6sx6VqYsXnWLFd72T829ThMKIR9t1mzghfwRMbXLl2yFwj+e6b7vY3yoRBC4UJgLXAPLuBsNTAyyrlxNhMK0UiXQjoT2T49F/LeQSmks3miB9WhPKkbqdUP2VO/xKOtxoXNL1UghC2oQf1R55dukfZ/Vlvrmi3mRqHIWyi4a9ALOBsXefyZqOfF2UwoRCOfnUK+lbnyESq5BHLtpKVFv1/zI22iQl/mcD2Ev+8cU1u7a1jXruHXSizA2apehgwJvl42T/UJTO1jxEHOQgE4zHs9OqilO7cYzYRCNPJZWML0+rvvHu3e+QiFTE/xodfctEn1vPNUQe9npNawJXRxznSPmppw20E6oZq2WE8W5CPQDSOMfITCDO91QUB7Ot25xWgmFKKTqz45H/WPan5CIaedwmuvuUC0ykq9Xm5VaGk1xm97yCethH834SeqEI5S8Szf398wgiiI+qgtNhMK8ZPvk2o+QiFMDRPWzuZ/VffYQ7VHD9Wnn45073xyGSVadXXygh/lN4vq1VXInYIZmo0EhTA0jwD28N5/F3gEOCrKuXE2EwrRyXVByPTUm+m6+QiFqOojoVlv5nuqoEsYqBcOXquq0T2nMtWBrq3NLDj8doooT/fZzK0QNgWzTRh+CuKS6r1+AZdC+xzg+SjnxtlMKEQj3wUhnedNpuvmIxSiCIQ9+VAf5UuqoHczWruwVcHtMrKNsUj3fTIJDv/3ifJ0n83vUognfLNNGH4KIRSWeq8/Ar7q7ytlM6EQjbgWhEIuftm6doLqobyqr3Ko7qBSr+ZXmmo/UI2mt/ePqahwRvR8dj5RhGW+8R/ZYrYJw08hhMIcYDrwJtANV2LzpSjnxtlMKEQjrgUhygKZzyKa7twz+aN+yJ76Dj31izwT6Yk7iGx3E2GeSH71UeI7pXu6zzdSPFtsp2D4SScUotZTuACXynqYqn7oRTT/V8RzjRITV96bsOppUauqJfIxXXTRrgpkCVKPd6FM4oc8xtms4hAG0chznBRxxq25/fbs+i+4IFp/Ur2GNa3rHAwe7PJQ+amocP1xMHnyzoqiO6mpcf2GkUSYtPA34GCgs/f+ZOAaoFuUc+NstlOIRlxPpfnuFLL1+tmdj3Q256uC3seonfaDoBY1UCzKd/BTqCfuUjy5m/eRkYAC7BT+ADSLyCG4Mpl9cLUPjHbA449n1x+VdFXVohC+G2hNPatZyGD+k0e4gZ9zMfexjeDqaEOGwLx50a+dDVFTUOdaVS7OVNaZdi+GARFTZwMtqtoE/Cdwm6p+A5f2wmgHxLUAFUslcTILWMIx9GYd/8GfuJUbCK7e6p63sxEIXbtm19+9e+b+hgYYM8YVtVF1r2PGJAsGS2VttFWiCoUdInIhcAnO6AxQHc+UjEIT1wLkr1csEq1OcHYoE/gNT3Ea77IPx7CEpzi9UBcHnO2gKqXUVFVVuE1h27bM/dde68o1+Nmxw/UnMB2/0WYJ0yv5G9AP+BVwoXfcB7gxyrlxNrMpRCOXOIVCZenMxmbgb3vt9unO+geP8iXdg02Rzsv194mqa8/XjpLrfQ2jkGBpLoxsFqBMqR8qKqIvYLkIhM9UvKNvfOYLqrj6B0Jz5HPjXlwLKRSKjQkhI0E6oSDu82BEZLaqXiAirwD+geI2GXpETBuYSAwaNEgbGxtLOYUOSViRdz9R6winK1AfxACW8ijn0IP3GMPdzOYr2V0Ap4YprBprFz16BNdarq2F996LPqbYNDTA2LHJxv04fyejbSMiL6jqoKDPMtkUElrQs4Av+Vri2OiARDFAx1FH+HweYiGDEZQv8JecBAK4hW/SpAJPzmPKFOjUKbmvUyfXn82YYjNpUnAsSFy/k9F+SSsUVHWD97pWVdcCHwAf+ZrRAQnzsIkLoYWbuYmHuIClHMUgGlnK0XldM9NOJ1dGjYKZM5ON6zNnJj9tRxlTbErhAmu0TyJ5H4nIlSLyDq5W8wteS6u3EZEDRWSBiLwqIitE5Fqv/2YR+aeILPPacN85E0VklYi8LiJn5P61jHwI87Dxk4jGzeSPn4nd2cJDjOAmfsBMxnAqT/Mu+2Y75dD5xUEUf/+2FhNgLrBGZMKMDf4GvAH0iDLWd04vvOpswB7A33FeTDcD3wwY3w94CZdXqQ8uz1JlunuYoTkeohh0x43LP0tqb9boUo7UJir0OoIL4uTTjF1Y6mzDDwWIaH4TyCL+1KmeVPVF7/1HwKvA/mlOOQd4UFU/VdXVwCrg2GzuaYST7xN9gspKGDcOpk7NT099IgtZwjH0YTVn8n/cxjcIC0gz8if+mBKjoxBVKEwE/ioi00XkV4kW9SYiUg8cBTzvdV0tIi+LyEwR2dvr2x94y3faetILESMiDQ1w8cXJEbYXXxwuGGprw/ubmpxAgNz11KO5hwWcwib24jieZy7Don2RMqJQQtxPW1NpGW2TqEJhOvA08Dd22RReiHKiiHTF5U66TlU3A9NwCfYGABuAXySGBpzeyl9WRMaKSKOING7cuDHi9Mubyy5zwsCPqusPYsCAaP3Z6qkraOZnfJN7GMNzfJHjeJ7XOSxs2nkRp00hbhLuo34hPnZsYQSDYWQkTK/kb8Bfo4wLOK8al3L7+pDP64Hl3vuJwETfZ3OBE9Jd32wK0chW7x61/kI2NoU9+VDnMFwV9FdcrVVsL6j9oCPZFKz2gRE3FMCmsMB7Qu8lIt0TLd0JIiK4jKqvquqtvn5/Ir3zgOXe+8eAkSLSWUT6AH2BxRHnZxSQ1F1FWH9UPfVBvMlfOZHTeZKrmMY1/JqmmFNnRa3p0BYx91GjlFRlHgLAV73Xib4+BQ5Kc85g4GLgFRFZ5vV9B7hQRAZ4568BrgRQ1RUiMhtYCTQBE1S1OeL8jCJRX++StiUW/lGj0uumT614htktXwbgdJ7kGU6Jf5JAczv+n9O7d3CchbmPGkUhbAvRHpqpj6KRrYolk1rGryJKm09n+nRtqqjSFXxOD+aN2NVFHUXVYu6jRtyQq/pIRL7lez8i5bNbYpJTRonp1y/95wm30zCD6P2/a3J5oq+8ktf2H8oJLOJNDkm6Rli9gkLQ3lNQm/uoUUoyJcR7UVWPTn0fdFwKLCFeNNIlpQv656+qyqx+EQlWc+zFhzzaZSQnbZsL3/gGnab8jB0trRX8Iu4+/roD1dWt6xBEpUsX+PRTNye/esswjNbkkxBPQt4HHRtFJA4/9gRR9PFBAuFgVrGIEzhx23y44w649dZAgQBOGKUKK5Hss6om2LYNrrrK/O8NI18yCQUNeR90bBSJtuDHfsghyR4+J7OAxRxLTzZyRsU8uOKKjNfYvr31cefOuc9pxozczzUMw5FJKBwpIptF5CPgCO994vjzRZifEUAh0yDnust45pldO4qvMYMnOZ0N9OJYFrOg5aTsL+gRJRlfGO3Z48gw2gppXVJVtR17e3dcCunHnthlQHZql+Zm2Kd7ExP//U2uYwqP8x9cyANsZq/QNBlx055jEwyjrdCOkwGUL4VOg5zLLmMvNnHfB2dxHVP4JddxNo+xmb2AaBXZILhwfT4CJSHcDMPIHRMK7ZDJk4MX1HzcMLPZZRzEmyzieE7R+VzBHVzPL2n2bTo//TTadYLcLqdMyT5vkT9zq2EY+RE1otloQ4waBQsXukW0udktiqNH5+d1E3WXcRLP8AdchPJpPMWznJzzPYOiocePd1k8o1JX5zyODMMoDLZTaIc0NMCdd+4yrDY3u+NcvY+i7jKu4A6e4jTeZR+OZTHPycmB43J1K4XsPYgOOSTzGMMwomNCoR1y7bWtg7x27HD92RIlWraCZm7lG9zBWOYzhOP5G//gYK66Knh8WH8UsvUgeuaZ3O9lGEZrTH3UDnn//ez605FJ9bInm3iACxnOn5jCNdzAL3baDxI6fL8aa+zY/HT7lZXZCQZzQzWMwmI7hQ7G+PEufUQijcT48blfqw//4K+cyGk8xZXcznVMSTIogxMATU0uiM5flS1XsvUgMjdUwygstlNoh1RUhBtjp03b9b65Ofk4G77Is/yBL1NBC2cwlwWcmtN1wp78wxbz1N1HJswN1TAKi+0U2jhBOY6y8c7Jhcu5k3kMZSM9XYRyGoGQKQfTyScHnxfWD7t2H/vtFz7G3FANIx5sp9CGSeQ4SqS0SEQfp9sp5EVTE/zXf3Ent/EEZzCSB9lEt6znB7sM13/7W/C5Yf1+qkOKs5kbqmHER9rU2W2djp46u74+uAJXIdn5z79pE4wcCU880cqgHEZdXfD8/It2tmm7/VRUBI8RiX+3ZBgdmXxSZxslJNtcRp065XijN9+EE06AefNg+vRAg3IqQ4bEX0u4e0gV8LB+wzDyx4RCGybbXEbbtzuPIz+px61YsACOPRbeeQeeeiqy5XbDhmg5mMJSVmSbysIwjOJgf5ptmLAcR+loakp/7Gcs0+H002HffWHx4vTW3xRWroyWg+nKK4PPD+v38+9/Z9dvGEb+mFBow4TV6s2XSpqYwjVM5yonFBYtgoMPLtj8/NHRU6c6L6GEC2o2XkOFzgZrGEZmYjM0i8iBwO+AzwAtwAxVnSIi3YHfA/XAGuACVf3AO2cicDnQDFyjqnPT3aOjG5rDyCe3UDc+YDYXcBrz+AXXc0PTT1sFDey9N3z4YeZrxe2jMH58cJyFuaIaRn6UytDcBNygqp8DjgcmiEg/4EZgvqr2BeZ7x3ifjQT6A8OAqSJS9vGqhazF/Fle53mO4ySeZQwz+Sa/CIwi++ij3O9RSB5/PLt+wzDyJzahoKobVPVF7/1HwKvA/sA5wL3esHuBc7335wAPquqnqroaWAUcG9f82gNhtZhz4XTm8jzH0Y0POYUF3MOY0LFtJZ9Q3N5NhmG0pig2BRGpB44Cngf2VdUN4AQHsI83bH/gLd9p672+siWsFnN2KNdyG48znLXUcQxL+CuD855bMXIOmU3BMIpP7EJBRLoCfwCuU9XN6YYG9LXSWovIWBFpFJHGjRs3FmqabZJ8A9c68Sl3cgW38Q0e5RwGs5B11CWNyVUlVYyYxzgqzBmGkZ5YhYKIVOMEQoOqPuJ1vyMivbzPewHvev3rgQN9px8AvJ16TVWdoaqDVHVQz54945t8GyCfp/F9eIenOZXLmckP+P84n4f5mK6txiVUUtkKhmJEFEfxbjIMo7DEJhRERIC7gFdV9VbfR48Bo733o4FHff0jRaSziPQB+gKL45pfeyBX3f4AltLIII5iKSOYzU38AE3zT711q1NVJYji3ZSNwMrHWD5qlEuZ0dLiXk0gGEa8xLlTGAxcDJwqIsu8Nhz4MXCaiLwBnOYdo6orgNnASuAJYIKqthGTZ2nIxfX0An7PQgajCINZyMOMiHSe33gbpXJaVIN3mLE8qmAoZH0IwzAioKrttg0cOFA7Mm4ZjdaEZv1vJqmC/pnBug//yur8urpd9501S7WiInhcZaXquHHRv0NdXeb7hTFuXPC52dzfMIzWAI0asq5altQ2TNSdwh5s5j4u5hwe4w6uYAK/ZQfRs+PV1CTr6sOys+aSsjqfTKdVVeEFetKl7zAMIz2WJbUDczCrWMQJnMn/cTW/ZiwzshIIQcbbMK+ntWuztwnk41YaZlNpK3EUhtERsSI7bZguXWDbtvDPT+NJfs9XaKaS03iKZzgl63sEPfmHldCE4EI66Zg8ObkQD0R3K822lKdhGPljO4U2TLhAUG7g5/yJ/+AtDuQYluQkEMLI9CSe6q2UjnzcSsOM2VaX2TDiw3YK7YwufMIdfI2LaOBhvsyl3BMYf5APYRXV/GSTamLUqNxcSRNJ72bMcIKqstIJBEuGZxjxYTuFdsSBrOMvfIGvcj+T+CEjeKjgAgGCI4lTKVaqialTnVFZ1b2aQDCMeLGdQjvhizzLQ4ygM59yDo8yhy/Fdq/EU/2kSeE7huHDY7u9YRglxHYKbR5lAr9hPkP4N905lsWxCoQEiUjiurrgz4uVvtqC1wyjuJhQaMN04RPuZgy/4es8znCO43n+zqFFnUM699S4SRTZSRi+m5vdsQkGw4gPEwptlXXrWCj/j0u5l5u5iXP5XzazV8bTsq3pnIkw989iuIVOn55dv2EY+WNCoS2yYAEMHMjB+gZn8yjf5+a0Ce38jB6dXA959GhXvjKIsH4/pQwgC4t4LkaGVsMoV0wotCVU4dZb4bTToEcPjmUxf+TsrC5x113J6pa77nLvU5/sKythcIRaO7W12fUbhtG+MaHQVvj4Y/jqV+GGG+Ccc2Dx4qztByKwfXty3/btTt2S+mTf3BwtAC2sXnMx6jjvvnt2/YZh5I8JhbbAG2/A8cfD738PP/oRPPww7LFH1pcJy20Ypm6JYixOFTKZ+gvJ9OkuoZ6figqzKRhGnJhQKDWPPQaDBsGGDTB3Ltx4Y26FFDogo0bB736XnCLjd7+zQjuGEScWvFYqmpvhe9+DW26BgQPhD38IDwooIRUVwTuN1Cf4uMg1RYZhGLlhO4VSsHEjDBvmBMJll/HAhL9Qf1Jdq3KVXQufwSJrrrwyu37DMNo3tlMoNs8/DyNGwLvvwp130tDl8qTU0v7U1LffDpdeWtqCMpaUzjDKC6u8VixU4be/heuvh/33d+qio4/OWOVs/PhdC3Jc0zIMo7ywymulZssW52769a/DGWfAiy/C0UcD4Smo161zaqR777VKY4ZhFA8TCnGzYgUccwzMns2yC26hz8uPUlG7907bQbpylZMmJVcsS0d1tavUlg0WgGYYRiqxCQURmSki74rIcl/fzSLyTxFZ5rXhvs8misgqEXldRM6Ia15F5b774Nhj4YMPmHfjPAbPmciadRWo7rIdDB8enK9o8uTsCtmIwJgxLpOon6oql86iujq5v7oapkzJ7WsZhtFxiXOncA8wLKD/l6o6wGuPA4hIP2Ak0N87Z6qItN9KvJ98Al/7GlxyidslLF3KFQ2ntHrq37rVpaAOK1eZTSGb7dvdte65J/la99zjjMJ3353cf/fd5uppGEZrYjU0i0g9MEdVD/eObwa2qOrPU8ZNBFDVH3nHc4GbVXVRuuu3SUPz668776JXXoHvfAe+/32oqqKiItioKxIecdzQEFz0PkyllO5ahmEYCdqaoflqEXnZUy/t7fXtD7zlG7Pe62tf3H+/C0TbsAGeeMLpgDx9TvfuwaeE9UN40fuwGLdilcg0DKPjUmyhMA04GBgAbAB+4fUH5XUI3MKIyFgRaRSRxo0bN8YyyazZuhWuuMKt4kcdBUuXOi+jApCogNbS4mRMokRmaiaMhB0ijIYGFxiXGiBXqPGGYXQQVDW2BtQDyzN9BkwEJvo+mwuckOn6AwcO1JKzYoVq//6qIqqTJqnu2BE4TETVKZCSm0jrsbNmqdbVuc/q6tzxrFmqNTWtz4VdY8IIOremJvycWbNUO3VKHt+pU/p7GIbRfgAaNWzdDvugEC1VKAC9fO+/ATzove8PvAR0BvoA/wAqM12/pEKhpUX1jjtUd9tNdZ99VJ98Mu3wurpgoVBXlzwubAGvrY12fj73ThB2r9razPcyDKPtk04oxOmS+gCwCDhURNaLyOXAT0XkFRF5GTjFEwyo6gpgNrASeAKYoKptN2Rr0yYYOdJ5GJ14Iixb5grjpGHy5HDXUz9BsQlbt8L77wdfN4rbaroAuSDC7hXWbxhGByJMWrSHVpKdwqJFqn36qFZWqt5yi2pzc+RTg9RCqf1BT+jpWhw7hXT3q6xUHTcu8lc2DKMNQil2Ch2O5mb3WP+FL7j18bnnYOLErHJI+43Ga9a444Tb6dq16fMQ1dZCp07JfZ06pTcuJxg+PLv+dJHOzc0wbZrLyWQYRsfDhEIU3noLhgyB737XxSAsW+bURgUgSiqLmhq44ILWQiOdEPHz+OPZ9U+Z0joCOpUZM6Ld2zCM9oUJhUw89BAccQS88IILA77/fthrr4JdPp1NwB+b8PjjsGNH8uc7dkSrs5ytTWHUqF0R0GFYkj7D6JiYUAjjo4/gssvcI/pnP+tiDy69tOClMsMCzurqktVM2S7sUe6RLtgtoeqqDEk2EtZvGEb7xoRCEAsXwpFHurzV3/0u/OUvcMghsdwqqldS1IU9KOgs6j2CSBT8idpvGEY7J8wC3R5awb2PPv3UBaBVVDgPo7/8pbDXDyHMKyl1TKYAtHRjotwjjHHjnNeReR8ZRseAUgWvxd0KKhSWL1c96ij3k1x6qeqmTYW7doHItLCncz3NRygYhtGxSCcUrBxnSwvcdpvLaLrnns6qe+65hZhe0Uln7kjNrlpTsytFt2EY5UVby5LadnjzTTj5ZLjhBhg2DJYvb7cCAdIbf4OipKN4LhmGUV6Up1BoaXGVZ448El56yVWi+Z//gX32KfXM8iJbN9FsKrsZhlEelKdQmD8fJkxwAWjLl8Po0QV3NS0FYXEFYTsIq79gGEYq5SkUhg51RXDmzoUDDyz1bApGmOvp2LG5u6QahlFelKdQEHFFcDrA7sBPWKW2qVPD60AbhmH4Me8jwzCMMsO8jwzDMIxImFAwDMMwdmJCoYMRlPsoXb9hGIYfEwrtiEwLe2rBnrVr3fH48cH9JhgMw0jFDM3thMSCny5VRX29W/BTqawMDmyrq3PpsQ3DKC/M0NwBCKrQlpqqIixCOSzS2SKaDcNIxYRCOyFKkZ2wCGWLaDYMIyqxCQURmSki74rIcl9fdxF5SkTe8F739n02UURWicjrInJGXPNqr0QpsmMRzYZh5EucO4V7gGEpfTcC81W1LzDfO0ZE+gEjgf7eOVNFxAo++ohSPc0img3DyJdYDc0iUg/MUdXDvePXgZNVdYOI9AKeUdVDRWQigKr+yBs3F7hZVRelu345GZrBGZsnTXIqo969nUCwhd0wjGxJZ2iuKvJc9lXVDQCeYEjkqt4f+Jtv3Hqvz/AxapQJAcMw4qWtGJqDMtMFbmFEZKyINIpI48aNG2OelmEYRnlRbKHwjqc2wnt91+tfD/hzWB8AvB10AVWdoaqDVHVQz549Y52sYRhGuVFsofAYMNp7Pxp41Nc/UkQ6i0gfoC+wuMhzMwzDKHtisymIyAPAyUAPEVkP3AT8GJgtIpcD64ARAKq6QkRmAyuBJmCCqmZZXNIwDMPIl9iEgqpeGPLRkJDxkwHznDcMwygh7Tr3kYhsBAKy/USmB/BegabTXijH7wzl+b3tO5cP2X7vOlUNNMq2a6GQLyLSGOar21Epx+8M5fm97TuXD4X83m3FJdUwDMNoA5hQMAzDMHZS7kJhRqknUALK8TtDeX5v+87lQ8G+d1nbFAzDMIxkyn2nYBiGYfgwoWAYhmHspCyFgogM84r5rBKRG0s9n2IgIgeKyAIReVVEVojItaWeU7EQkUoRWSoic0o9l2IhIt1E5GERec37Nz+h1HOKGxH5hvd/e7mIPCAiXUo9pzjItoBZtpSdUPCK9/wW+A+gH3ChV+Sno9ME3KCqnwOOByaUyfcGuBZ4tdSTKDJTgCdU9TDgSDr49xeR/YFrgEFe/ZZKXOGujsg9RCxglgtlJxSAY4FVqvoPVd0OPAicU+I5xY6qblDVF733H+EWiQ5fs0JEDgDOBO4s9VyKhYjsCXwRuAtAVber6oclnVRxqAJ2E5EqoIaQTMvtHVV9Dvh3Svc5wL3e+3uBc3O9fjkKhf2Bt3zHZVfQx6uIdxTwfImnUgxuA74FtJR4HsXkIGAjcLenNrtTRHYv9aTiRFX/Cfwcl2hzA7BJVZ8s7ayKSlIBM2CfDONDKUehELmgT0dERLoCfwCuU9XNpZ5PnIjIWcC7qvpCqedSZKqAo4FpqnoU8DF5qBPaA54O/RygD7AfsLuIXFTaWbVPylEoRC7o09EQkWqcQGhQ1UdKPZ8iMBg4W0TW4NSEp4rIrNJOqSisB9aramIn+DBOSHRkhgKrVXWjqu4AHgFOLPGciklYAbOsKUehsAToKyJ9RKQTzhj1WInnFDsiIjgd86uqemup51MMVHWiqh6gqvW4f+enVbXDPz2q6r+At0TkUK9rCK5WSUdmHXC8iNR4/9eH0MGN6ymEFTDLmtjqKbRVVLVJRK4G5uI8FGaq6ooST6sYDAYuBl4RkWVe33dU9fHSTcmIka8DDd6Dzz+AMSWeT6yo6vMi8jDwIs7TbikdNOVFNgXMcrq+pbkwDMMwEpSj+sgwDMMIwYSCYRiGsRMTCoZhGMZOTCgYhmEYOzGhYBiGYezEhIJRNohIs4gs87Wco3xF5K+FnFvKtQeJyK/iur5hpMNcUo2yQUS2qGrXUs/DMNoytlMwyh4RWSMi3xeRF0XkFRE5zOvv6eWmf1FEpovIWhHp4X22xXs9WUSe8dUuaPAiahGRgSLyrIi8ICJzE2kIUu49wsv//5KIPOe75hzv/eO+nc0mERnt1Yf4mYgsEZGXReTKYv1WRsfHhIJRTuyWoj76iu+z91T1aGAa8E2v7yZcaoyjgf8Beodc9yjgOlx9joOAwV6eqV8D56vqQGAmMDng3O8BZ6jqkcDZqR+q6nBVHQBcDqwF/td7v0lVjwGOAb4mIn0i/gaGkZayS3NhlDWfeAtsEIkEgS8A/+m9/wJwHoCqPiEiH4Scu1hV1wN4KUTqgQ+Bw4GnvI1DJS6lcyoLgXtEZLZvDkl4u5P7gAtUdZOInA4cISLne0P2AvoCq0PmZxiRMaFgGI5Pvddmdv1dBKVZT3eu/3wBVqhq2jKYqnqViByHKwS0TEQG+D/3KgU+CPxAVRPlFwX4uqrOjTg/w4iMqY8MI5y/ABcAeE/n2dS9fR3omaiNLCLVItI/dZCIHKyqz6vq94D3SE7rDi7R2cuq+qCvby4wzlNRISKf7ehFdIziYTsFo5zYzZchFlwN43Ruqd8HHvBsD8/i1D8fRbmRqm731Du/EpG9cH9rtwGpGXl/JiJ9cU//84GXgJN8n38TWOGb9/dwpUXrgRc9o/ZG8ii/aBh+zCXVMEIQkc5As5du/QRcJbMBJZ6WYcSK7RQMI5zeuBz1FcB24Gslno9hxI7tFAzDMIydmKHZMAzD2IkJBcMwDGMnJhQMwzCMnZhQMAzDMHZiQsEwDMPYyf8PVVJPpOVjLl8AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"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",
"\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_y,test_y3_ ) )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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",
"\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_y,test_y3_ ) )<details><summary>Click here for the solution</summary>\n",
"\n",
"```python\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",
"\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_y,test_y3_ ) )\n",
"\n",
"```\n",
"\n",
"</details>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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=\"https://www.ibm.com/analytics/spss-statistics-software\">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://www.ibm.com/cloud/watson-studio\">Watson Studio</a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Thank you for completing this lab!\n",
"\n",
"## Author\n",
"\n",
"Saeed Aghabozorgi\n",
"\n",
"### Other Contributors\n",
"\n",
"<a href=\"https://www.linkedin.com/in/joseph-s-50398b136/\" target=\"_blank\">Joseph Santarcangelo</a>\n",
"\n",
"## Change Log\n",
"\n",
"| Date (YYYY-MM-DD) | Version | Changed By | Change Description |\n",
"| ----------------- | ------- | ---------- | ----------------------------------------------------- |\n",
"| 2021-01-11 | 2.3 | Lakshmi | Changed R2-score calculation in polynomial regression |\n",
"| 2020-11-04 | 2.2 | Lakshmi | Made changes in markdown of equations |\n",
"| 2020-11-03 | 2.1 | Lakshmi | Made changes in URL |\n",
"| 2020-08-27 | 2.0 | Lavanya | Moved lab to course repo in GitLab |\n",
"| | | | |\n",
"| | | | |\n",
"\n",
"## <h3 align=\"center\"> © IBM Corporation 2020. All rights reserved. <h3/>\n"
]
}
],
"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.13"
},
"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