Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save abhiray92/7d1f05e6d21f0135395052f6f83134b7 to your computer and use it in GitHub Desktop.
Save abhiray92/7d1f05e6d21f0135395052f6f83134b7 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<a href=\"https://www.bigdatauniversity.com\"><img src=\"https://ibm.box.com/shared/static/cw2c7r3o20w9zn8gkecaeyjhgw3xdgbj.png\" width=\"400\" align=\"center\"></a>\n",
"\n",
"<h1><center>Polynomial Regression</center></h1>\n",
"\n",
"<h4>About this Notebook</h4>\n",
"In this notebook, we learn how to use scikit-learn for Polynomial regression. We download a dataset that is related to fuel consumption and Carbon dioxide emission of cars. Then, we split our data into training and test sets, create a model using training set, evaluate our model using test set, and finally use model to predict unknown value."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Table of contents</h1>\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <ol>\n",
" <li><a href=\"#download_data\">Downloading Data</a></li>\n",
" <li><a href=\"#polynomial_regression\">Polynomial regression</a></li>\n",
" <li><a href=\"#evaluation\">Evaluation</a></li>\n",
" <li><a href=\"#practice\">Practice</a></li>\n",
" </ol>\n",
"</div>\n",
"<br>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Importing Needed packages"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"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": null,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"jupyter": {
"outputs_hidden": true
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"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": 2,
"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",
" <td>0</td>\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",
" <td>1</td>\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",
" <td>2</td>\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",
" <td>3</td>\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",
" <td>4</td>\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": 2,
"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": 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>ENGINESIZE</th>\n",
" <th>CYLINDERS</th>\n",
" <th>FUELCONSUMPTION_COMB</th>\n",
" <th>CO2EMISSIONS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>8.5</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>9.6</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>5.9</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.6</td>\n",
" <td>244</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.0</td>\n",
" <td>230</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.1</td>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\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": 3,
"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": 4,
"metadata": {
"button": false,
"deletable": true,
"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,
"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": 5,
"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. , 2.4 , 5.76],\n",
" [ 1. , 1.5 , 2.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3. , 9. ],\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. 51.15156587 -1.5866513 ]]\n",
"Intercept: [105.61361751]\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": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEGCAYAAACKB4k+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO2deZgU1dW43zPNsAxolBEVRAaMuIBRlIkacR+NigY1LlHRIGpAcEGjyU9iEjX5+OLnjkZUVBRl3BOjEsWFqImo6CiIIhpxGUSJ4hYEZJs5vz9uNfT0VHVXL9U9033e56mnu27fW3W7B+6pe1ZRVQzDMAwDoKLYEzAMwzDaDiYUDMMwjPWYUDAMwzDWY0LBMAzDWI8JBcMwDGM9HYo9gVzYbLPNtG/fvsWehmEYRrvitdde+0JVe/h91q6FQt++fWloaCj2NAzDMNoVItIY9JmpjwzDMIz1mFAwDMMw1mNCwTAMw1iPCQXDMAxjPSYUDMMwjPWYUDAMwzDWY0LBMAzDWI8JBcMwjPbEV1/BTTfBQw9FcnkTCoZhGG2dNWvg4Yfhpz+FLbeEsWPhL3+J5FaRCwURiYnIHBGZ7p1fKiKfiMhc7xia0He8iCwUkXdF5JCo52YYhtFmUYWGBjjnHOjVywmEF1+Es8+GOXPgnnsiuW0h0lyMAxYAGye0XauqVyV2EpEBwAnAQKAX8IyIbKeqTQWYo2EYRtvgP/+BadPgzjth/nzo1AmOPBJGjIAf/xg6RLtsR7pTEJHewOHAbSG6Hwncp6qrVfVDYCGwe5TzMwzDaBOsXQt/+xsMGwa9e8OvfgUbbwy33OKExP33w9ChkQsEiH6ncB3wa2CjpPazReTnQANwgap+DWwFvJzQZ7HX1gIRGQWMAujTp08UczYMwygM77wDt98Od90Fn38OPXvChRfCqafCDjsUZUqR7RRE5Ajgc1V9Lemjm4DvA4OAJcDV8SE+l9FWDaqTVbVWVWt79PDN/GoYhtF2WbHCqYb23ht23BGuuw722gseewwWLYLLLy+aQIBodwpDgGGeIbkzsLGITFPVk+MdRORWYLp3uhjYOmF8b+DTCOdnGIZROObMgcmTnYF42TLYbju44gr4+c9hiy2KPbv1RCYUVHU8MB5ARPYHLlTVk0Wkp6ou8bodDbzlvX8UuEdErsEZmvsDr0Q1P8MwjMhZvhzuu8/ZBhoaoHNnOO44+MUv3E5B/BQkxaUYcQpXiMibIjIPOAA4H0BV5wMPAG8DM4CzzPPIMNom9fXQty9UVLjX+vpiz6iNMW+eiyXo1csJgO++g+uvh08/dfaDffZpkwIBQFRbqe3bDbW1tWqV1wyjJWPHOi1FUxPEYjBqFEyalL/r19e7a65cuaGtqsrdc/jw/N2n3bFqlYsyvukmF0/QqRMcfzyMHu1sBm1ICIjIa6pa6/uZCQXDKB3GjnVrUjJjxuRPMPTtC40+xRxrauCjj/Jzj3bFhx/CzTc7L6Ivv4T+/eHMM11cQXV1sWfniwkFwygTOnRwO4RkYjFYty4/96iocMG2yYhAc3N+7tHmaW6Gp56CP/8ZHn/c/SjDhjmpfOCB7rwNk0ooFCKi2TCMAuEnEFK1Z0OfPv47hbIIG/rmG+dOeuONsHCh8xr67W+dPq1372LPLi+0bXFmGEabY8IEZ0NIpKrKtZcsCxbAWWe5hf/882HzzZ1r6aJF8Ic/lIxAANspGIaRIXFj8sUXuzWxTx8nEErOyNzcDE88ARMnwtNPQ8eOcNJJLiHd4MHFnl1kmFAwjBIiFgu2KeST4cNLUAjEWb7cqYiuvx7ee8+5lf7xj05FtPnmxZ5d5Jj6yDBKiFGjMms3Eli0yCWi693bpavedFOnIvroI2c3KAOBACYUDKPNkI+AsEmTnPtpfGcQi+XXHbUkeeUVOPFE2GYbuPZaOOQQeOklmD3btVdWFnuGBcWEgmHkwNixzg1UxL2OHZvddeIBYY2Nzt2zsRFOOcVdN1MBMWmScz9Vda8mEHxoanKpqvfZB/bYw7mVnn8+fPCBS1O9557FnmHRMJuCYWRJcqBYU9OG80wX4osvbhkhDBtiARobN6h/SlaPXyi++w6mToVrrnH2gpoatzs4/XTYKDnDf3liwWuGkSX5DBQLCghLpGwjhvPBF184SX3DDe79D3/o6hb89KcFKVzT1rDgNcOIgHwGigUFhCWyaFHm1y17PvoIrr7apaD47js4/HBnTN533zaVi6gtYTYFw8iSoDUlm7XGLyAsmbARw5bBFJeldPhw2HZbl7b6Zz+Dt96C6dNhv/1MIKTAdgqGkSVB6p5sNLKJAWGNjW7NSrxO2Ijh+nqXhy2+W2lsdOeJ9yhZVOGFF1zlsscfh27d4Lzz3FFCEcdRYzsFwyggqbyVhg932g5VuPtuZ0MQca9h01KPHt1afdXU5NpLFlUnBPbZx6mFXn0V/ud/nL7tqqtMIGSICQWjLMmHK2lQlHBQe9xbKb5ox72V/O4dFxDNze417FP+ihWZtbdrmprggQdg112dreDjj50h+aOP3JZr002LPcN2iQkFo+zIZHFORabRw5MnZ9ZuBLB2rUtDMWCAsxWsXu3OFy50eYnSGWeMlJhQMMqOfC3OmUYPFyKtdVAa/zae3j8cq1e7Yjb9+8PIkW7xf/BBmD/fGU7KLPI4Kkrhn4phZEQ+F+dMooczVTdlQ5DtYPToduyVFK9vvM02Tur27Om8iF5/HY49tkQkXtsh8l9TRGIiMkdEpnvn3UXkaRF5z3vdNKHveBFZKCLvisghUc/NKE8KsTj7UYhkdUG7lyFDWqfRGDWqjQuGFStc5HG/fjBunHMvffppV//48MPNrTQiCiFixwELEs4vAmaqan9gpneOiAwATgAGAocCk0Qk4v+mRjlSrEyiQ4a0Dp7t0MG1pyLTJ3y/3YtfGo2VK117m2PFCuc11K8fXHAB7LQTPPccPP88HHSQCYOoUdXIDqA3buE/EJjutb0L9PTe9wTe9d6PB8YnjH0S+FGq6w8ePFgNIxvGjFGNxVTBvY4ZE/09a2rc/ZKPmhr3+bRp7r2Ie502zR1VVS37V1W59kwQ8b+3SH6/Y04sX6565ZWqPXq4yR18sOoLLxR7ViUJ0KBB63bQB/k4gIeAwcD+CULhm6Q+X3uvfwZOTmi/HTjW55qjgAagoU+fPtH9aoaRZ1ItzEGLf3V1akESlnQCqaisWKF69dWqm2++QRjMmlXsWZU0qYRCZOojETkC+FxVXws7xKetVWyoqk5W1VpVre3Ro0dOczSMQhKUpqJPn2D1zpdf+o/JNA9SPuoqxzU38eOggzKbQytWrXIG5O9/36mJdt4ZZs2Cp56CvfbK8eJGtkRpUxgCDBORj4D7gANFZBrwmYj0BPBeP/f6Lwa2ThjfG/g0wvkZRkFJtTBnusiHzYMUZ/hw53KbTZQ0OAEwc2bLtpkzsxQMa9a4wJBtt3UG5B12gH/+0xmRTRgUn6AtRD4PWqqPrgQu8t5fBFzhvR8IvAF0AvoBHwCxVNc1m4LR3vCzG6gGq3eqq/NjU8gVv7nFj9CsXas6ZYpq375u4JAhqv/4R2RzNoKhGOqjFFwOHCwi7wEHe+eo6nzgAeBtYAZwlqrmMazHMIpPUPqKoF3ExIm5PeG3CZqbXTWzgQPhtNNgs81gxgz417/ggAOKPTsjmSBp0R4O2ykYhSLoCb+93SNbstopNDerPvaY6i67uI477aT68MOu3SgqtLGdgmG0K/zqJ0cR+JVtErxCUFeXWTvPPw977w0/+QksX+5+rLlz4aijLM6gjWNCwTDSUKjAr6jTUOSSGfaZZ1oLgLo6196COXPgsMNg//2dZLvlFliwAE46KfqQcSMvWJEdw0hDkGdQruUxO3Z0CT/9iO9G4lx8sbtf9+7u/KuvnAfShAmtdxTJnkJ1dbDdds7hJ048MyykzteUSCsBkMjChfC738F997lJXnklnHUWdOkS7uJGm0Gceql9Ultbqw0NDcWehlHi9O3rXz+5psY9DGdDKoGQSHW1yweXvFOJU1XV0vDs5zqaChGnrsqazz6DP/zBTaJjR1fl7Fe/gk02yeGiRtSIyGuqWuv3mamPDCMN+Qj8SiaMQAAXvBYkEKC1GisTgQDZlQ4F4Ntv4dJLXeDZLbfAGWe43cKECSYQ2jkmFAwjDbkGfkVNrmqsjFi71umbtt0WLrsMhg6Ft992uqiePQs4ESMqzKZgGG2Uqiqnkg9KdREn0+jmrFCFhx+Giy6C996D/faDxx6D3XcvwM2NQmI7BcNIQxQuqamKhCXuRiZOTF9dcujQDe8DXURz4aWXYJ994JhjnNvSY4/Bs8+aQChRTCgYRgJ+bqFRuKSuWdNaMFRWOqGTGKeQqLoK4vHHN7wPch3NqrDQ++/D8ce7fETvv+8mMm8eHHGExRqUMCYUDMMjaEfg53kEuevy16xpGRt8xx3+cQrxoLagdTh5Hs880/K6zzyTYWGhr7+GCy6gafsdWfnQ37mMSxhQ+R71Vb9oXSXIKD2CQp3bw2FpLox8EpSULqgOQnV1bvdLTGtRXa3asWPL6ycnvsu1JkJdXctxdXVJHdasUZ04UbV7d20W0Ttip2tPPilqIj4jGrA0F4aRnqAn/yhCeZJ3JV9+6XYOiSSrqHJxja2vd6aBRF56yduNqMKjj7qyl+PGwW67cdiWcxnZdBtL6BU4H6M0MaFgGB6ZevF89VX29/KzU/jR2LhBlZSLa2yQXeTuX81jyQ8OhiOPZMG/Kzh1879TP+IpnvrPzr7XKaj7q1EUTCgYhkfQk3h1tX//bFxB44bsIDuFH4neTtkmzUtezHvwOTczmr8v2ZWO8+dwNjewM/OY+vlQRo2W9ek0kimI+6tRVEwoGIZH0JO4n1uoSMun+DAkqowyZeVKOPnk4PulS3YXn38la/glV/Me/TmNKdzAOWzLQm7kbNZRuf5e4O8dlUsUt9FOCDI2tIfDDM1GoYgbhf0Mz2ENsEGG4kyP5PuNGePfb8yYDX0qpFmHMl3fpb8q6HSG6vYsSHmfZMN3x45maC4VSGFotoR4hpEBuSTHq6jIr9G6psY9uY8Y4bKe+hGLwe+Oe4fd7zufw5jBO2zP+VzLDA5Lee1YzP+auSQBNNoOlhDPMPJE2DTafuqcfOvjGxtddcsggbARy7i86UJ+c98P+BEvcT7X8APeTCsQqqqCr2mG5tLHhIJhZEDXrunbx451+eHiC2u8dkHYzKiZkOzGCiA0M4I7+Tfb8Uuu4U5OZTv+zXWcv95u0GqMFxgXt6MERVCbobn0iUwoiEhnEXlFRN4QkfkicpnXfqmIfCIic71jaMKY8SKyUETeFZFDopqbYWRK3Gto+XL/zxPbJ0/27/Ppp/7tsRhMm5Y+x1EYanmVF9mLOxnJB2zD7rzCKG5lKZsHjqmpgbvvdqqtuEdTFOnCjXZCkLEh1wMQoJv3vhKYDewJXApc6NN/APAG0AnoB7wPxFLdwwzNRiGYNs0Zd9MZgONkYzyO3ydbY/SFpy7VyfILbUJ0CVvoKUxVoSn0vYO+dzziuqbGjMylBMWIaPbuHX9+qvSOVGa2I4H7VHW1qn4ILAQsDaMROencOcMGmsXJtBRxvP+sWbB4sX+fqip/1VUFTVzQ9WaufGQ7flExhWd3Po/t+Dd383Ny/e+dbUyE0b6J1KYgIjERmQt8DjytqrO9j84WkXkiMkVENvXatgI+Thi+2GtLvuYoEWkQkYalS5dGOX2jDAjS/ycKhjBxBd26bXi//fb+fYIKko0a1XoeiVRXu7oKK1a0bN+d2bwie3DVijEwaBC88QZ1b1zDyWM2Xi9oYjEYMwY6d/a/d1C7UcYEbSHyeQCbAM8COwFbADGcQJoATPH63AicnDDmduCYVNc19ZGRK7GYv0olFkvfJ3506NBStVJR4d+vosLFDqS7XvKYZNXVZizVyZyhCrpi016q996r2tyc8ntWV/tfP9ekfkb7hGInxFPVb4DngENV9TNVbVLVZuBWNqiIFgNbJwzrDQSY5gwjPwS5Xia2B/UBZ6S9886WqpXmZv++zc2ukuW6deHLGDc3b1BdCc2cwa28w/acyp1w4YVUNb4DJ5yQtr5BUJ6mXPI3GaVJlN5HPURkE+99F+Ag4B0RSSzkejTwlvf+UeAEEekkIv2A/sArUc3PMCBc8Zkg98x4IFc2uvZvvsms/yDm8CJ7cSujeIud2JU59H3wSuof3SjU+CBXUnMxNZKJcqfQE3hWROYBr+JsCtOBK0TkTa/9AOB8AFWdDzwAvA3MAM5S1RTPaIaRO0HFZ5qa3MP3QQf5u2eCszX4GabzyZZVy7iOcTRQSz8+5BTuYn+eYz47ZVQWNEx8hWEAlvvIKE+SdftBhXTAFaNJ5y6amGcoH26rsYpmvfXg+3XFJj21CdEbGaOb8JVv3zBFdrJxSTVKF4ptUzDKG7+6x8W8vp+nj6Zwlp45c4N7ZpC6KShgLYggm8Imm4C+/wHrfjyUM57+GVXb9OSpy17mippJfMOmvmMs9YSRV4KkRXs4bKfQ9vEL/MpnWcdsrp+J908mT/iZ9PHLbFrJav3bHv+r2rmzarduqtddp7p27foxuZTjtJ2CkQiWJdUoFrlkFY3q+mkcdXyJ/zfp0MHfGykWc15F6a4fdJ0hvMAtjGYgb8Mxx7giDlu1DNOpr3cJ8BLzHXXsCFOmpDd2h5mTUT5YllSjaITNKlrI62cacVxXt0FFFeSeGmSwDiJ+nU34mpsZzQvsQzeW8xMehYceaiUQ4iQv4GEX9DFjMms3yhcTCkakRO0Kme76fvaGoAV8zBgnABKpq4ORI1NXTKurc/EHcYKeyhPbYxXK8dzPAnbkdG7nKi5gIPN5IvYT/8G4dBvJmVbXrnXtiURtwzFKnCC9Uns4zKbQ9immTSHVZ4neR7FYS++hZNIlqUv+Pmn1942NOq/mcFXQVxmsg3jd14spmSAPKZH0v0fQ2MTIbaN8IIVNoegLey6HCYX2QSYLcDYEZfPMxjDrd61U7qp+1wy6b78+65zxuGtX1a5d9YG9rtWOFWtD/y5hvk82WVaN8iOVUDD1kREp9fUwdWrLhHNTpxZGpZGpvSGuWmpsdMtlPDise/fM7uUX7Fbb+S1eqRwC550H++4L8+dz3KzzWN3UAVVnpE5UQfkxdGj69kxtNdkY3Y0SJ0hatIfDdgptn1zcKMOQSkWUaRK4oLlWV7cuYp/u+8R3Rx1ZpX+U3+m6ig6qm22mWl+fNnldEFHtFKxuQvmBqY+MYhFGD54LqRbKzp39P+vc2f9aqRbOysrgz5JtCnFB9SNm6Xx2VAWtj52iD960NKfvmotNIdV3i9LmY7RNUgkFUx8ZkRK191EqFdGqVf6fBbWnclUNqq8cr2mcGCcwYfxy/rTyXF5gb6pYyaE8wfCmu7jw8s1ajK2qcuqb+JGuHGeY33L48A01lkU2zC8VyQWEVq5s7dFklBFB0qI9HLZTaPtE7X2UaqeQqXE1U7WLSGvVyzP/70n9kBptQnQi52hXvvV9ou/Sxf+aXbpE81uGMZaH+Y2M0gBTHxnFJF86a7/rpFoooxYK1dUb7r0JX+ntjFQFXcD2uhcvtOrfqVO4e6UiW08uv7QaqQ5zVS1tTCgY7Z508Qh+QiefQsHv3nFD9k94RD+hp64lpv/LRdqJ79LeNxuhkOuuy0+g2E6hPMlZKAA9gN8Ak4Ep8SPM2CgPEwrlQzZeTPkUCn6Cp5ovdBonqYK+wQ90NxpCq2TS9fFbwKPw5IraO8xom6QSCmENzY8A3wOeAf6ecBhGpIwd65LHBaWYaGwMTuWQKt2EXyqI5BQXcerqNqTObm72qq1VPcyCigEczwNcwqXU0sDrDA79vbp0CW5PTu3d1OTOg36DXPJI+cVUVFW5dqNMCZIWiQcwN0y/Qh+2UyhtMtGD+6lRunXz79u5c+u4g44d3fi6upbtdXVJk1q6VPWEE1RBv6zZVffoPLfVPDp0CL5vIsnG5riRuaIi/PcG9z1zweIUyg9yTZ0tIv8DvKiqj0csozLCUmeXNkFpqoNITpddUeGWzbBUV8MXX6To8Ne/wpgxNH35Ndd1+x3j/3sRG1dXAvDVV841dMIEOPnk4EuEmU+mUcYibgdjGGHJR+rsccB0EVklIt96x7L8TdEwWpOJQIDWapRMYyG+/DLFByedBMccw1ddtmKvygYu/O/vWEslX34J330Hd9/tqZXS1DWIgkwEn2GkI5RQUNWNVLVCVTt77zdS1Y1TjRGRziLyioi8ISLzReQyr727iDwtIu95r5smjBkvIgtF5F0ROSS3r2a0dzKte5AsBCZMcEVoEkk+T8tjj8FOO8GDD8If/sDuOptXVu3coku+g70y3Slk+jsZRipCRzSLyDARuco7jggxZDVwoKruAgwCDhWRPYGLgJmq2h+Y6Z0jIgOAE4CBwKHAJBGxf+5lTCaFa4KMo8lP0arQtav/NaqrE07++19XSGHYMNh8c3j1Vfjd7/jg40rfsakM3kHEjegi7nXsWP85p2P//TPrbxipCCUURORynArpbe8Y57UF4tkzlnunld6hwJHAVK99KnCU9/5I4D5VXa2qHwILgd0z+C5GiTFkiLMLpKO62nntnHJKy4U5qChN585QmbS2V1a6CpgAPPOM2x3cfTf89rfw6quMnTyIDh1SL9iNjU6OhCHIwyguGDJh4cLMxxhGIEEW6MQDmAdUJJzHgHkhxsWAucBy4P+8tm+S+nztvf4ZODmh/XbgWJ9rjgIagIY+ffrk0yBvtDHCZvzMJqLZ1+Nm+XLVsWNdhx12UJ09W1UzjwYOE6cQj0FIPoLaUx35Si5olA/kKSHeJgnvvxdS4DSp6iCgN7C7iOyUorufJrXVc5mqTlbVWlWt7dGjR5hpGEUm2/KQYf3vs0no1iruYJuXYNAg97h+/vnw+uuwu9uopksoF5aamg3vg4zomRrXIbxB3cp0GmEIKxT+BMwRkTtFZCrwGvC/YW+iqt8Az+FsBZ+JSE8A7/Vzr9tiYOuEYb2BT8Pew2ib1Nc7F83EwjUnnxxuQQpT3CaI0AFda9bAb34De+8N69ZxTPdnkWuvQaq6IAJbbZXdQu1HUJGcXAmykSRSX+9UW4l/h5EjTTAYrQkVpwDrF/Af4p7oZ6vqf9L07wGsVdVvRKQL8BTwf8B+wJeqermIXAR0V9Vfi8hA4B6cHaEXzgjdX1UD/0tanELbp1Mnt+4m07EjrF6deuxGG8Hy5an7BFFTExwBDJ5t4M03nSHijTe4XU7nfL2Gb0npVJcTiXEQqTyMqqtTuMcGkO6/8Wab+V8zbWyGUZJkHacgIjt4r7sBPXFP8x8Dvby2VPQEnhWRecCrwNOqOh24HDhYRN4DDvbOUdX5wAM4Q/YM4KxUAsHIjFxUB0FeMmHwEwip2hPJViDEPZGCFt4KmuHqq6G2lmX/XsIwHuEMvS1SgQCZL/SFuHcx52S0UYKMDd4OYrL3+qzP8Y9UYwtxWJqLcOSSXTPIyBo2ZXMYo2s2Y4OOdFlSt6ZR/8H+7uSoo3TLis9CXTfTDKPpvnM6w3G2143i72CUHuSa5qKtYuqjcPTt669KSU4L4UdQqolYzBWbT0cqNUm6f3qZpqlIvmbLeysncQ83chYxmthoyvVw6qlIRbhIMb95BKlkwlwn1e8SpPrq3Nm/alxdnfOiTYWpj4xEck5zISLHichG3vvfishfRWTXfE7SiI5UJSvTkauXTKpMpenI1/PKJnzNvZxIPSfzFjuxC284K2vI0OFevfzVbxMn+sc7BJEYczFtmn+fadOCM5fedlvrTK5hBAK4ufpFd6+PzTCMOEFbiMQDLyYB2Bv4Fy7QbHaYsVEepj4KR7wYTPJRXZ1+bFDGzoqKcPfORW2Rqc9+x46tv/cBzNRF9NY1dNDxTNAK1rX43ulUNV26ZF7gJ6zKLVV20igyl1o2VCMOeciSOkdVdxWRPwFvquo98bboxFV6TH0UjlxUB926wYoVrdu7dg1nCM5FfZRpDqAW11y9mge2+y3HLrqa9+jPSdyzvt5B4tN1mHt06+b/XVOp3wYOhLff3nA+YADMnx/6axhGpOQjS+onInILcDzwuIh0ymCsUWS++iqz9kSSA8PSteeTxGCvjFiwAPbck+MXXcUtjGY3Xm9RAOe55zZ0DZNMLkj4BeU7Gju2pUAAd57stZWLV5dhREXYhf144EngUHWBaN2BX0U2KyOvBEW8homEzWVsrmQe7KUuInm33WDxYobxCGO5iZW0jO5KtIdkknTPj8ZGd41EwRAUAZ3Yns/cR2GxiGYjFEF6pcQD+D7QyXu/P3AusEmYsVEeZlMIRy4uqbkWi8/FphBUOc3XPsJS/RvDVEFf7f5j1U8/TZlfKJFEd9MgF9Hk3yD5SKxpHOY7h51bvsj172iUFqSwKYQVCnOBDsC2wPvAtcDjYcZGeZhQCE8uRsZcxkblW5941PG0fkJPXUVHHce1KjRpXV3mMRap+sd/g1SCI06YBT+X3yUbguaeKMyM8iEfQuF17/XXwDne+zlhxkZ5mFAoPukERtjFz+866YRBJav1Ci5UBZ3Pjrozc1td3y/oLJnEPoneSH79wyyuYYRRoXcKQV5WlmG1PMmHUJgNnAi8BfTz2t4KMzbKw4RCcQmjkggjFIKuk2rstvxbX2WwKugkztQurMjqiTvT3cS0aa0X9FistTBMJ4wGDPC/74AB4eadKbZTMBLJh1AYAFwPnOid9wMuCjM2ysOEQnii8FEPs9CkinNIp5LxP5r1FKbqt3TVL9lUj+ThUDuRIMLuZOLkmvYjjtkUjGKSs1Boq4cJhXBEtSCEUUmkWnTT7QaSj434r97NcFXQ59hXe7MosG9dXbjvkKlQyDWYL9v75gMLXjPipBIK6bKkPuC9viki8xKON73sp0Y74OKLsytEk45c3VUziXUYTAOvsxsnci+/5zIO5B8sblF+YwNhUz9kQ3NzuPZ07p9B8RFh4iaypVVhoeHR3ctov3RI8/k47/WIqCdiREcuuY9SMWGC89FPXNzjaavzhdDMeVzH5VzEf9iS/XieWewd2F81wzPKvwkAABvFSURBVOuL/5hsoqnjxAvaxOtDJ9Zuji/Eo0a5uIRkco2bMIycCdpC+B3AxrjAte644jimPmoH5JL7SDW3HD2Z2QtaHpvxuU5nqCroXzhaN+XLtGMymbtq5jaCMPcO+3uH8YwyjCggD4bm0cBnwEfAh97xQZixUR4mFMKRi1CYNk21srLluMrK/ASvpTr241ldTC/9jk46hhsVmkONS1z4w9pSMlmcwwiFYtgLwmA2BSNOPoTCe8BmYfoW8jChEI5cfNRz3WVkKgwqWKe/51JdR4W+w3a6C3MyvkZ84Y/CDbO9CgXzPjISSSUUwuY+eh8oQAo0IwqyMQgPHOj06oUs47glS3iag7mMS7mHkxjMa7zBoIyvEzeiR2FLqa5O3x6mT6GJytnAKD3CCoXxwIsicouIXB8/opyYkT+CirYEGYST0z4XgoN4mrkMYg9mcyp38HPuYgXdsr5eY2M0yfzCFKtpiwVtonI2MEqQoC1E4gG8AlwDjARGxI80Y7bG1XJeAMwHxnntlwKf4PIpzQWGJowZDywE3gUOSTcvUx+FJxN9chgVTVx9lKuhOcZa/SMXaxOibzJQd2R+1naIFmqoiuhUJmF+y7amv7eIZiMR8mBTeDFMv6QxPYHdvPcbAf/GRUZfClzo038A8AbQCRcx/T4QS3UPEwrRkG7B7dhxQ9WxXNJc9OnwiT7Hvqqgt3Gab6qKXA7Vtrc4FwuzKRiJpBIKYdVHz4rIKBHpKSLd40eaHcgSVX3de/+tt2PYKsWQI4H7VHW1qn7o7Rh2Dzk/Iw35yqVfUwNTpjh/+1z01AfxNG91GEQtDfycqZzB7XxHVfqBGWIBW47hw109h5oaZyuqqXHn5fp7GCkIkhaJBxvcUBOP0C6pQF9gES7O4VKca+s8YAqwqdfnz8DJCWNuB45NdV3bKYQj06fEsMnasklzUcE6vZTfaxOi82Wg7sDbed0dJO8U2iu2wzGihFx3Cqraz+fYJsxYEekG/AU4T1WXATfhivYMApYAV8e7+t3a53qjRKRBRBqWLl0aZgplT6ZP9PvtF649U0Pu5nzGkxzCJfyBu/g5P9TZvMOOwRMvU+rrXWRzY6MTb37V3QwjMoKkhRMm/Drh/XFJn/1vqrFen0pcGc9fBnzeFy8FN87IPD7hsyeBH6W6vu0UwpFpnELY/pnYFPbmn/oJPXUlnXUkt0e2OyiFnYIZhY2oIYedwgkJ78cnfXZoqoEiIjgV0AJVvSahvWdCt6NxNRoAHgVOEJFOItIP6I/zejJypLIys3ZttT/zbw+np1Yu5Eqe5QCW0409mM0dnJbpVygrzH3UKCbpEuJJwHu/82SGAKcAb4rIXK/tN8CJIjIIpxr6CJdCA1Wd72VlfRtYB5ylqk2trmpkzJo1mbWnom9fF98QX/iHD09hrPzmGx7mVI7iER7gOM7gNr5l48xvmgXdsg9xKDp9+jiVkV+7YURNup2CBrz3O2/5oeoLqiqqurOqDvKOx1X1FFX9gdc+TFWXJIyZoKrfV9XtVfWJDL+LUQCS9duBXk1z5sDgwRzO3zmXifyM+wsmEDp0gJtvLsitIiHTYEPDyCtBeiWndqIJWAZ8i3t6X5ZwvjbV2EIcZlMIR6Z69yDvo2T9dlCyvJfOuE21UyfV3r31xL4v+o7v0MH/ukFFbMIepeKpY95HRpSQwqYgGqRAbgfU1tZqQ0NDsafR5klVG8Dvzx+LBReTSbxm9+4tcyB15jv+zNmczhQ46CC45x5k8x7ZTToLxoyBSZMKdjvDaLeIyGuqWuv3WdjgNaOMSCcQwOm3EwVCPz5gFkM4nSn8kd/CjBnQo3ACAZyR2zCM3DChUOZkG9287bYb3g/l77zGYPrxIYcznd/zx2jrSgbQZG4JhpEzJhTKnGwDo557DjaqauJSLuHvHMFH9GUwr/E4h9O1ayRTTUsR5JBhlBwmFIys8upv3PQVD646gkv4A3cygr14kQ9xQe5hn9j9PGxyweobG0bumFBop+QrwV2cTAKjdmEuDdRyQPNMzuQmRnIHq+iy/vNVq8Jdxy/wLZun/VjMjMyGkS/M+6gdUl8Pp53WMvisY8cN2UuTSeV9FKemxmURTdf/ZO5mMqP4kmqO5SFms6dvv/g/q0w9nzIt8BOLwbp14fsbhmHeRyXHuHGto5HXrHHt2RAmMKoDa7mec7ibnzObPRjMa7wi/gIhjBAK4t13M+u//fbZ38swjNaYUGiH5LNucpi8+lvwH/7BgZzDn7maX3IQz/A5W3Dmmf79g9rDkKkHUaZCxDCM1KTLfWSUOHGVURB78DJ/4Rg25WtO4F7uT8iRGNfhT57sFvNYzBl7c9Htx2KZCQZzQzWM/GI7hRJj7FiX+0fEvY4dm/21zuBW/sm+rKIze/JyC4EQZ9Ikp9NXda+5Gnsz9SAyN1TDyC8mFNohFSn+ajfdtOHpuanJnWdKJWu4iTO5lVH8gwP5Ia/yJjtnNdegRTuofdIk50kUdrE3N1TDyC8mFNo4fq6nYdJQZM2SJTzLAZzJLfyJizicv/M1rctxx43J6XYmQYbgVAbi+O6jV6/gPuaGahjRYDaFNky8LGO8lGY8+riiIiLBMHs2/PSnDOIbjud+HuT4wK6qTgAk7kQSdybxxXrBAv/xQe2JBBUBSnSfNQwjv1icQhumb1//Yiv5ZP2f/447nNvQVlux84d/S6suiqt3/Ay9ibEDmcYpJFJR4d9HJOLdkmGUOBan0E7JtPxix45Z3GTtWjj3XBcNt88+8Go4+8GoUcGeP/nyCAqqNGYVyAwjOkwotGEyXfzWrm1thE5llK7mCzjkELjhBjj/fJfuuro61L2efz6cETmoLGaYcplWgcwwCo8JhTZM0KIYhGprtUqQmuUHzONVfggvvghTp8I11zhLcUjefjvY8yex/eabW182bLnM4cP98yOlCrQzDCNHgkqytYejHMpx+pVlzKVcJagezV/0W7rqYnqpzp7d6p5hr6OqOmaMaizmzmMxdx7mOxiGUTxIUY4zsp2CiGwtIs+KyAIRmS8i47z27iLytIi8571umjBmvIgsFJF3ReSQqOZWrgjNXMKl/JVjeIudqKUBdt+9Vb9NNgl/zTDBa8OHO2+h5mb3ak/6htF2iVJ9tA64QFV3BPYEzhKRAcBFwExV7Q/M9M7xPjsBGAgcCkwSkbKOV427pDY2ukU37pKaDVWs4AGO51Iu405GsD/P8R96+vb99tscJm0YRrsmMqGgqktU9XXv/bfAAmAr4EhgqtdtKnCU9/5I4D5VXa2qHwILgdaPsWXExRdviFGIk3wehj40MoshHM3DXMBVjOQOVtM5sL/lEzKM8qUghmYR6QvsCswGtlDVJeAEB7C5120r4OOEYYu9tuRrjRKRBhFpWLp0aZTTLjr5iFHYi1m8yg/px4ccwXSu4QJgQ/BAPgr0GIZROkQuFESkG/AX4DxVXZaqq09bq9AlVZ2sqrWqWtujR498TbNNkmuyt1O5g2c5gG/YhD2YzQwOa9Un2xrNhmGUJpEKBRGpxAmEelX9q9f8mYj09D7vCXzutS8Gtk4Y3hv4NMr5tXWyVeNU0MRVXMAdnMbz7McezOZddgjsn02N5kKR77KjhmGkJkrvIwFuBxao6jUJHz0KjPDejwAeSWg/QUQ6iUg/oD/wSlTzK1U2YhmPMowLuIYbOJvDeIJv2DTtuMTo6TDxa4VIWV1fDyNGtDS0jxhhgsEwoiTKncIQ4BTgQBGZ6x1DgcuBg0XkPeBg7xxVnQ88ALwNzADOUlUzeWZAPz7gJX7EITzJmdzEudxAU8ich4nR04MGpe/fOdhOnTdGj269W2pqcu2GYURDZFlSVfUF/O0EAHUBYyYAlsQgC/bmX/yVnxKjiR/zFM9yYOixyakjnnsu/ZgVKzKfY6YE3aMQ9zaMcsXSXLRhwia4G8GdzKSOr+jOHszOSCD4pY4wl1TDKF+snkIbJlUyO3ARyhO4mPFczjPUcRwPhrIfJJJtXYJUKbHzRVDdiHS/i2EY2WP/vdowq1YFf1bFCh7iWMZzOTczOrRBOV8UogxHkO3AbAqGER22U2iH9OITHmUYg5jLeVzLRMYRbL7JnFisbaiQ4nmUJk9284nFXEyFleA0jOgwodDO2JXXeYyfsDHLGMajPM7heb9HGIEQsuxCzkyaZELAMAqJqY/aEcN4hH+xD+vowBBmRSIQwBmf0zFxYiS3bsXYsa7+goh7HTu2MPc1jHLFhEK7QDmPa3mYo3mLndiD2aFKZmaLX3GfZGbNiuz26xk7Fm66acPOpanJnZtgMIzoEC2ExTAiamtrtaGhodjTiAwRiLGOGziHMdzMgxzLCKbyHWlW7AwI+vPX17vUF0FJ+WIxVz8hSjp08FdlFeLehlHKiMhrqlrr95ntFNowG7GM6RzBGG7mT1zEz7g/rwIhFfHCOEEUwhAddI+2YAQ3jFLFDM1tlUWLeIEj2JEFnMbt3MFpWV9KxH9HUOcbV94SixUwjPLChEJb5LXX4IgjqGElh/EEMzko1LCgxT+ofeHC9Nfs0AHWrPFvNwyj9LDnvbbGY4/BvvtCp07sxYuhBQIE2wf8nvQhXBEfP4GQqj2fBHlBhfGOMgwjO0wotCVuuAGOOgoGDoSXX+ZtBhZ7RkXFzwsqOXmfYRj5xYRCW6CpCc4/H849F4YNc2lKt9yy2LMCgoPUChG8Nny4i2auqXEqML/kfYZh5BcTCsVm5UoW7XkcXHcdExnHNq8/RP3D7vG4LRhzJ05sna21Y8fCBa/FvaCam92rCQTDiBYzFxaTzz/ni72G0fv9VxjHdVzPOFjk8vtAsC2gkMQX4YsvdtXZ+vRx6htbnA2jNLHgtWLx73/DYYex6sNPOVHv4W8c3eLjuDE1jDE4F9rxn98wjCyx4LW2xqxZ8KMfwbJlHKDPthII4J7Khw4twtwMwyhrTCgUkPp6OLPHX1i1dx0fLKvmkfEvs6RmT9++ffrA44+Hv3ZlZebz6do18zGGYZQ2kQkFEZkiIp+LyFsJbZeKyCciMtc7hiZ8Nl5EForIuyJySFTzKhb19TB35EQmfXEcr7Mbu697kZN+932GDg12u1y0KPh6ycbfdJXQko3WFRVwyy3h528YRnkQ5U7hTuBQn/ZrVXWQdzwOICIDgBOAgd6YSSISi3BuhaW5me/G/JIr157H3ziKOmbyJZuxcqXbDQS5Xfbp43+5WKx18NiaNa7dj5oauOuulve46y4zFhuG0ZrIhIKq/hP4KmT3I4H7VHW1qn4ILAR2j2puBWXVKjjxRM749lpu4GyO40FW0WX9x6l2A0HBW6kSxQXtOsy10zCMMBTDpnC2iMzz1EvxosJbAR8n9FnstbVCREaJSIOINCxdujTquebG11/DIYfAAw9wceUVnMv1NNPycb6y0rmgNjY6T6DGRndeX986eKu6Grp0CbgXG3YZfruO+nro29epjfr2deepyLS/YRglgqpGdgB9gbcSzrcAYjhhNAGY4rXfCJyc0O924Jh01x88eLC2WRYtUh04ULWyUrW+XisqVN2yH+6oqWl5uWnTVKuqgvtXVbk+fviNzWd/wzDaF0CDBqyrBd0pqOpnqtqkqs3ArWxQES0Gtk7o2hv4tJBzyytvvulcTj/+GGbMgJNOyjgQLVmtdPHFsHKlf9906R/8xq5c6drz0d8wjNKhoBHNItJTVZd4p0cDcc+kR4F7ROQaoBfQH3ilkHPLG88/D0ce6fw9//Uv2NmVzYzFMisOk2xkDrI9iKQuhpNqbL7aDcMoHaJ0Sb0XeAnYXkQWi8jpwBUi8qaIzAMOAM4HUNX5wAPA28AM4CxVbX/1tR58EH78Y+jVC156ab1AgA2pK5Kpq/PPLZScCTTIEymoPZexQe2qro6C1Ug2jNIlSu+jE1W1p6pWqmpvVb1dVU9R1R+o6s6qOixh14CqTlDV76vq9qr6RFTziowbboCf/Qxqa+GFF1qtrJMmwZgxG9xGYzF3PnJk61QTfqknJkwIJzz8CIqMDmr383qK09QEN91kgsEwShWLaM4VVfjNbzakvX7mGeje3bfrpEmu4Lyqe500yenp165t2W/tWn/9fRjh4UdQZHRQe6LXUxCTJ4e7t2EY7QtLiJcLa9c6vdCdd7rXG2/MuE5lRUVwCc1E43Tfvv7J8Wpq0tsUwt7Dj1SR0u34n45hlDWWEC8KVq6Eo492AuHSS+Hmm7MqXBxWr5+L8TcXe0RQlHRQu2EY7RsTCtnw5ZfOQvzEE04YXHJJ+uRDAYQtORl2YfcLOsulrOX++2fWbhhG+8aEQqZ8/DHssw/MmQMPPQSjR+d0ubAlJ8Ms7PX1znCdGB09cqT7bMSIlkbuESPCpbpYuDCzdsMw2jdmU8iEBQucy+myZfDoo7DffoW7N27RT1UBbbPN3CYmma5dnZBIDEirqgpX7zgXe4RhGG0Tsynkg5dfhr33dm5D//xnwQRCojro4oudIAhKaucnEABWrMg+QjkXe4RhGO0PEwphmDHD2RA23dRVTdtll4Lctr4+OFlePghjpM7FHmEYRvvDhEI67r0XfvIT2G47JxC22aZgt840B1F1tX97coGdOGGe9sPaPAzDKA1MKKTihhvgpJNgyBB47jnYYouC3j5TN9SJE/2jnkePzu1p32oxGEb5YELBD1XnZnruuXDUUU599L3vFXwamerzhw+HKVNaPtVPmeIip+1p3zCMMJj3UTLNzXDOOW4lPf30rIPS8kHcppCN15BhGEYQ5n0UljVr3Go7aRL86ldw661FEwhg+nzDMAqPCYU4K1c6VdF998Hll8MVV2QdpZxPMtXnB5XRtPKahmGEoXiPwW2Jb76BI46AF190j+K/+EWxZ5QVyeqmuAvrrFkwdWrrdrBdh2EYLbGdwmefuUQ+r7wC99/fpgVCuqf9IBfWyZOtvKZhGOEo751CYyMcdBB8+ilMn+5SWLRRgnYBsOFpP8hVNagMqJXXNAwjmfLdKSxY4OIPvvgCnn66TQsECBfIFuSqGpTm2lJVGIaRTHkKhTfegH33dXmMnn8e9tqr2DNKS5hAtqCUFKNGWaoKwzDCEZlQEJEpIvK5iLyV0NZdRJ4Wkfe8100TPhsvIgtF5F0ROSSqeQGw5Zaw667wr3/BzjtHeqt8ESaQLciF1YLXDMMIS2TBayKyL7AcuEtVd/LargC+UtXLReQiYFNV/X8iMgC4F9gd6AU8A2ynqgHacEfRy3EWEAtkMwwjXxQleE1V/wl8ldR8JDDVez8VOCqh/T5VXa2qHwILcQLC8LBANsMwCkGhvY+2UNUlAKq6REQ299q3Al5O6LfYa2uFiIwCRgH0KTNL6fDhJgQMw4iWtmJo9gsd9tVrqepkVa1V1doePXpEPC3DMIzyotBC4TMR6QngvX7utS8Gtk7o1xv4tMBzMwzDKHsKLRQeBUZ470cAjyS0nyAinUSkH9AfeKXAczMMwyh7IrMpiMi9wP7AZiKyGLgEuBx4QEROBxYBxwGo6nwReQB4G1gHnJXO88gwDMPIP5EJBVU9MeCjuoD+EwALpzIMwygibcXQbBiGYbQB2nXlNRFZCjTmcInNgC/yNJ32Qjl+ZyjP723fuXzI9HvXqKqv+2a7Fgq5IiINQVF9pUo5fmcoz+9t37l8yOf3NvWRYRiGsR4TCoZhGMZ6yl0oTC72BIpAOX5nKM/vbd+5fMjb9y5rm4JhGIbRknLfKRiGYRgJmFAwDMMw1lOWQkFEDvUqvC30iv2UPCKytYg8KyILRGS+iIwr9pwKhYjERGSOiEwv9lwKhYhsIiIPicg73t/8R8WeU9SIyPnev+23ROReEelc7DlFQaZVLTOl7ISCiMSAG4HDgAHAiV7lt1JnHXCBqu4I7AmcVSbfG2AcsKDYkygwE4EZqroDsAsl/v1FZCvgXKDWq/QYA04o7qwi407g0KS2i4CZqtofmOmdZ0XZCQVcRbeFqvqBqq4B7sNVfitpVHWJqr7uvf8Wt0j4FjIqJUSkN3A4cFux51IoRGRjYF/gdgBVXaOq3xR3VgWhA9BFRDoAVZRo+v0Mq1pmTDkKha2AjxPOA6u8lSoi0hfYFZhd3JkUhOuAXwPNxZ5IAdkGWArc4anNbhORrsWeVJSo6ifAVbjsy0uA/6rqU8WdVUFpUdUS2DxN/0DKUSiErvJWiohIN+AvwHmquqzY84kSETkC+FxVXyv2XApMB2A34CZV3RVYQQ7qhPaAp0M/EugH9AK6isjJxZ1V+6QchULZVnkTkUqcQKhX1b8Wez4FYAgwTEQ+wqkJDxSRacWdUkFYDCxW1fhO8CGckChlDgI+VNWlqroW+CuwV5HnVEiCqlpmTDkKhVeB/iLST0Q64oxRjxZ5TpEjIoLTMS9Q1WuKPZ9CoKrjVbW3qvbF/Z3/oaol//Soqv8BPhaR7b2mOlwBq1JmEbCniFR5/9brKHHjehJBVS0zJrIiO20VVV0nImcDT+I8FKao6vwiT6sQDAFOAd4Ukble229U9fEizsmIjnOAeu/B5wNgZJHnEymqOltEHgJex3nazaFEU15kUtUyq+tbmgvDMAwjTjmqjwzDMIwATCgYhmEY6zGhYBiGYazHhIJhGIaxHhMKhmEYxnpMKBhlg4g0icjchCPrKF8ReTGfc0u6dq2IXB/V9Q0jFeaSapQNIrJcVbsVex6G0ZaxnYJR9ojIRyJymYi8LiJvisgOXnsPLzf96yJyi4g0ishm3mfLvdf9ReS5hNoF9V5ELSIyWESeF5HXROTJeBqCpHsf5+X/f0NE/plwzene+8cTdjb/FZERXn2IK0XkVRGZJyKjC/VbGaWPCQWjnOiSpD76WcJnX6jqbsBNwIVe2yW41Bi7AQ8DfQKuuytwHq4+xzbAEC/P1A3Asao6GJgCTPAZ+3vgEFXdBRiW/KGqDlXVQcDpQCPwN+/9f1X1h8APgV+ISL/wP4NhBFN2aS6MsuY7b4H1I54g8DXgp977vYGjAVR1hoh8HTD2FVVdDOClEOkLfAPsBDztbRxiuJTOycwC7hSRBxLm0AJvd3I3cLyq/ldEfgzsLCLHel2+B/QHPgyYn2GExoSCYThWe69NbPh/4ZdmPdXYxPECzFfVlGUwVfVMEdkDVwhoroi0EFpepcD7gD+oarz8ogDnqOqTIednGKEx9ZFhBPMCcDyA93SeSd3bd4Ee8drIIlIpIgOTO4nI91V1tqr+HviClmndwSU6m6eq9yW0PQmM8VRUiMh2pV5ExygctlMwyokuCRliwdUwTuWWehlwr2d7eB6n/vk2zI1UdY2n3rleRL6H+792HZCckfdKEemPe/qfCbwB7Jfw+YXA/IR5/x5XWrQv8Lpn1F5KDuUXDSMRc0k1jABEpBPQ5KVb/xGuklmQTcIwSgLbKRhGMH1wOeorgDXAL4o8H8OIHNspGIZhGOsxQ7NhGIaxHhMKhmEYxnpMKBiGYRjrMaFgGIZhrMeEgmEYhrGe/w9Aand9Q27JfQAAAABJRU5ErkJggg==\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: 22.82\n",
"Residual sum of squares (MSE): 870.18\n",
"R2-score: 0.72\n"
]
}
],
"source": [
"from sklearn.metrics import r2_score\n",
"\n",
"test_x_poly = poly.fit_transform(test_x)\n",
"test_y_ = clf.predict(test_x_poly)\n",
"\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y_ , test_y) )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 id=\"practice\">Practice</h2>\n",
"Try to use a polynomial regression with the dataset but this time with degree three (cubic). Does it result in better accuracy?"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 24.27584835 6.2525711 -0.69099691]]\n",
"Intercept: [132.79902464]\n",
"Mean absolute error: 22.75\n",
"Residual sum of squares (MSE): 875.79\n",
"R2-score: 0.71\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# write your code here\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"\n",
"<!-- Your answer is below:\n",
"\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n",
"\n",
"\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2>Want to learn more?</h2>\n",
"\n",
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: <a href=\"http://cocl.us/ML0101EN-SPSSModeler\">SPSS Modeler</a>\n",
"\n",
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at <a href=\"https://cocl.us/ML0101EN_DSX\">Watson Studio</a>\n",
"\n",
"<h3>Thanks for completing this lesson!</h3>\n",
"\n",
"<h4>Author: <a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a></h4>\n",
"<p><a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>, PhD is a Data Scientist in IBM with a track record of developing enterprise level applications that substantially increases clients’ ability to turn data into actionable knowledge. He is a researcher in data mining field and expert in developing advanced analytic methods like machine learning and statistical modelling on large datasets.</p>\n",
"\n",
"<hr>\n",
"\n",
"<p>Copyright &copy; 2018 <a href=\"https://cocl.us/DX0108EN_CC\">Cognitive Class</a>. This notebook and its source code are released under the terms of the <a href=\"https://bigdatauniversity.com/mit-license/\">MIT License</a>.</p>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
},
"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