Created
June 3, 2019 14:00
-
-
Save shas043/fb8f42205bd33930f58f54b6fe32c93e to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains hidden or 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, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"import pandas as pd\n", | |
"import pylab as pl\n", | |
"import numpy as np\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<h2 id=\"download_data\">Downloading Data</h2>\n", | |
"To download the data, we will use !wget to download it from IBM Object Storage." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"--2019-06-03 13:28: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.193\n", | |
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|67.228.254.193|:443... connected.\n", | |
"HTTP request sent, awaiting response... 200 OK\n", | |
"Length: 72629 (71K) [text/csv]\n", | |
"Saving to: ‘FuelConsumption.csv’\n", | |
"\n", | |
"FuelConsumption.csv 100%[===================>] 70.93K --.-KB/s in 0.04s \n", | |
"\n", | |
"2019-06-03 13:28:19 (1.63 MB/s) - ‘FuelConsumption.csv’ saved [72629/72629]\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"!wget -O FuelConsumption.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"__Did you know?__ When it comes to Machine Learning, you will likely be working with large datasets. As a business, where can you host your data? IBM is offering a unique opportunity for businesses, with 10 Tb of IBM Cloud Object Storage: [Sign up now for free](http://cocl.us/ML0101EN-IBM-Offer-CC)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"\n", | |
"## Understanding the Data\n", | |
"\n", | |
"### `FuelConsumption.csv`:\n", | |
"We have downloaded a fuel consumption dataset, **`FuelConsumption.csv`**, which contains model-specific fuel consumption ratings and estimated carbon dioxide emissions for new light-duty vehicles for retail sale in Canada. [Dataset source](http://open.canada.ca/data/en/dataset/98f1a129-f628-4ce4-b24d-6f16bf24dd64)\n", | |
"\n", | |
"- **MODELYEAR** e.g. 2014\n", | |
"- **MAKE** e.g. Acura\n", | |
"- **MODEL** e.g. ILX\n", | |
"- **VEHICLE CLASS** e.g. SUV\n", | |
"- **ENGINE SIZE** e.g. 4.7\n", | |
"- **CYLINDERS** e.g 6\n", | |
"- **TRANSMISSION** e.g. A6\n", | |
"- **FUEL CONSUMPTION in CITY(L/100 km)** e.g. 9.9\n", | |
"- **FUEL CONSUMPTION in HWY (L/100 km)** e.g. 8.9\n", | |
"- **FUEL CONSUMPTION COMB (L/100 km)** e.g. 9.2\n", | |
"- **CO2 EMISSIONS (g/km)** e.g. 182 --> low --> 0\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## Reading the data in" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>MODELYEAR</th>\n", | |
" <th>MAKE</th>\n", | |
" <th>MODEL</th>\n", | |
" <th>VEHICLECLASS</th>\n", | |
" <th>ENGINESIZE</th>\n", | |
" <th>CYLINDERS</th>\n", | |
" <th>TRANSMISSION</th>\n", | |
" <th>FUELTYPE</th>\n", | |
" <th>FUELCONSUMPTION_CITY</th>\n", | |
" <th>FUELCONSUMPTION_HWY</th>\n", | |
" <th>FUELCONSUMPTION_COMB</th>\n", | |
" <th>FUELCONSUMPTION_COMB_MPG</th>\n", | |
" <th>CO2EMISSIONS</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>2014</td>\n", | |
" <td>ACURA</td>\n", | |
" <td>ILX</td>\n", | |
" <td>COMPACT</td>\n", | |
" <td>2.0</td>\n", | |
" <td>4</td>\n", | |
" <td>AS5</td>\n", | |
" <td>Z</td>\n", | |
" <td>9.9</td>\n", | |
" <td>6.7</td>\n", | |
" <td>8.5</td>\n", | |
" <td>33</td>\n", | |
" <td>196</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2014</td>\n", | |
" <td>ACURA</td>\n", | |
" <td>ILX</td>\n", | |
" <td>COMPACT</td>\n", | |
" <td>2.4</td>\n", | |
" <td>4</td>\n", | |
" <td>M6</td>\n", | |
" <td>Z</td>\n", | |
" <td>11.2</td>\n", | |
" <td>7.7</td>\n", | |
" <td>9.6</td>\n", | |
" <td>29</td>\n", | |
" <td>221</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>2014</td>\n", | |
" <td>ACURA</td>\n", | |
" <td>ILX HYBRID</td>\n", | |
" <td>COMPACT</td>\n", | |
" <td>1.5</td>\n", | |
" <td>4</td>\n", | |
" <td>AV7</td>\n", | |
" <td>Z</td>\n", | |
" <td>6.0</td>\n", | |
" <td>5.8</td>\n", | |
" <td>5.9</td>\n", | |
" <td>48</td>\n", | |
" <td>136</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>2014</td>\n", | |
" <td>ACURA</td>\n", | |
" <td>MDX 4WD</td>\n", | |
" <td>SUV - SMALL</td>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>AS6</td>\n", | |
" <td>Z</td>\n", | |
" <td>12.7</td>\n", | |
" <td>9.1</td>\n", | |
" <td>11.1</td>\n", | |
" <td>25</td>\n", | |
" <td>255</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2014</td>\n", | |
" <td>ACURA</td>\n", | |
" <td>RDX AWD</td>\n", | |
" <td>SUV - SMALL</td>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>AS6</td>\n", | |
" <td>Z</td>\n", | |
" <td>12.1</td>\n", | |
" <td>8.7</td>\n", | |
" <td>10.6</td>\n", | |
" <td>27</td>\n", | |
" <td>244</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" MODELYEAR MAKE MODEL VEHICLECLASS ENGINESIZE CYLINDERS \\\n", | |
"0 2014 ACURA ILX COMPACT 2.0 4 \n", | |
"1 2014 ACURA ILX COMPACT 2.4 4 \n", | |
"2 2014 ACURA ILX HYBRID COMPACT 1.5 4 \n", | |
"3 2014 ACURA MDX 4WD SUV - SMALL 3.5 6 \n", | |
"4 2014 ACURA RDX AWD SUV - SMALL 3.5 6 \n", | |
"\n", | |
" TRANSMISSION FUELTYPE FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY \\\n", | |
"0 AS5 Z 9.9 6.7 \n", | |
"1 M6 Z 11.2 7.7 \n", | |
"2 AV7 Z 6.0 5.8 \n", | |
"3 AS6 Z 12.7 9.1 \n", | |
"4 AS6 Z 12.1 8.7 \n", | |
"\n", | |
" FUELCONSUMPTION_COMB FUELCONSUMPTION_COMB_MPG CO2EMISSIONS \n", | |
"0 8.5 33 196 \n", | |
"1 9.6 29 221 \n", | |
"2 5.9 48 136 \n", | |
"3 11.1 25 255 \n", | |
"4 10.6 27 244 " | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = pd.read_csv(\"FuelConsumption.csv\")\n", | |
"\n", | |
"# take a look at the dataset\n", | |
"df.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Lets select some features that we want to use for regression." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>ENGINESIZE</th>\n", | |
" <th>CYLINDERS</th>\n", | |
" <th>FUELCONSUMPTION_COMB</th>\n", | |
" <th>CO2EMISSIONS</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>2.0</td>\n", | |
" <td>4</td>\n", | |
" <td>8.5</td>\n", | |
" <td>196</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2.4</td>\n", | |
" <td>4</td>\n", | |
" <td>9.6</td>\n", | |
" <td>221</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1.5</td>\n", | |
" <td>4</td>\n", | |
" <td>5.9</td>\n", | |
" <td>136</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>11.1</td>\n", | |
" <td>255</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>10.6</td>\n", | |
" <td>244</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>10.0</td>\n", | |
" <td>230</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>3.5</td>\n", | |
" <td>6</td>\n", | |
" <td>10.1</td>\n", | |
" <td>232</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>3.7</td>\n", | |
" <td>6</td>\n", | |
" <td>11.1</td>\n", | |
" <td>255</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>3.7</td>\n", | |
" <td>6</td>\n", | |
" <td>11.6</td>\n", | |
" <td>267</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" ENGINESIZE CYLINDERS FUELCONSUMPTION_COMB CO2EMISSIONS\n", | |
"0 2.0 4 8.5 196\n", | |
"1 2.4 4 9.6 221\n", | |
"2 1.5 4 5.9 136\n", | |
"3 3.5 6 11.1 255\n", | |
"4 3.5 6 10.6 244\n", | |
"5 3.5 6 10.0 230\n", | |
"6 3.5 6 10.1 232\n", | |
"7 3.7 6 11.1 255\n", | |
"8 3.7 6 11.6 267" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']]\n", | |
"cdf.head(9)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Lets plot Emission values with respect to Engine size:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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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": 7, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([ True, True, True, ..., False, True, True])" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"msk = np.random.rand(len(df)) < 0.8\n", | |
"train = cdf[msk]\n", | |
"test = cdf[~msk]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<h2 id=\"polynomial_regression\">Polynomial regression</h2>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Sometimes, the trend of data is not really linear, and looks curvy. In this case we can use Polynomial regression methods. In fact, many different regressions exist that can be used to fit whatever the dataset looks like, such as quadratic, cubic, and so on, and it can go on and on to infinite degrees.\n", | |
"\n", | |
"In essence, we can call all of these, polynomial regression, where the relationship between the independent variable x and the dependent variable y is modeled as an nth degree polynomial in x. Lets say you want to have a polynomial regression (let's make 2 degree polynomial):\n", | |
"\n", | |
"\n", | |
"$y = b + \\theta_1 x + \\theta_2 x^2$\n", | |
"\n", | |
"Now, the question is: how we can fit our data on this equation while we have only x values, such as __Engine Size__? \n", | |
"Well, we can create a few additional features: 1, $x$, and $x^2$.\n", | |
"\n", | |
"\n", | |
"\n", | |
"__PloynomialFeatures()__ function in Scikit-learn library, drives a new feature sets from the original feature set. That is, a matrix will be generated consisting of all polynomial combinations of the features with degree less than or equal to the specified degree. For example, lets say the original feature set has only one feature, _ENGINESIZE_. Now, if we select the degree of the polynomial to be 2, then it generates 3 features, degree=0, degree=1 and degree=2: " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 1. , 2. , 4. ],\n", | |
" [ 1. , 2.4 , 5.76],\n", | |
" [ 1. , 3.5 , 12.25],\n", | |
" ...,\n", | |
" [ 1. , 3. , 9. ],\n", | |
" [ 1. , 3.2 , 10.24],\n", | |
" [ 1. , 3. , 9. ]])" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from sklearn.preprocessing import PolynomialFeatures\n", | |
"from sklearn import linear_model\n", | |
"train_x = np.asanyarray(train[['ENGINESIZE']])\n", | |
"train_y = np.asanyarray(train[['CO2EMISSIONS']])\n", | |
"\n", | |
"test_x = np.asanyarray(test[['ENGINESIZE']])\n", | |
"test_y = np.asanyarray(test[['CO2EMISSIONS']])\n", | |
"\n", | |
"\n", | |
"poly = PolynomialFeatures(degree=2)\n", | |
"train_x_poly = poly.fit_transform(train_x)\n", | |
"train_x_poly" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**fit_transform** takes our x values, and output a list of our data raised from power of 0 to power of 2 (since we set the degree of our polynomial to 2).\n", | |
"\n", | |
"$\n", | |
"\\begin{bmatrix}\n", | |
" v_1\\\\\n", | |
" v_2\\\\\n", | |
" \\vdots\\\\\n", | |
" v_n\n", | |
"\\end{bmatrix}\n", | |
"$\n", | |
"$\\longrightarrow$\n", | |
"$\n", | |
"\\begin{bmatrix}\n", | |
" [ 1 & v_1 & v_1^2]\\\\\n", | |
" [ 1 & v_2 & v_2^2]\\\\\n", | |
" \\vdots & \\vdots & \\vdots\\\\\n", | |
" [ 1 & v_n & v_n^2]\n", | |
"\\end{bmatrix}\n", | |
"$\n", | |
"\n", | |
"in our example\n", | |
"\n", | |
"$\n", | |
"\\begin{bmatrix}\n", | |
" 2.\\\\\n", | |
" 2.4\\\\\n", | |
" 1.5\\\\\n", | |
" \\vdots\n", | |
"\\end{bmatrix}\n", | |
"$\n", | |
"$\\longrightarrow$\n", | |
"$\n", | |
"\\begin{bmatrix}\n", | |
" [ 1 & 2. & 4.]\\\\\n", | |
" [ 1 & 2.4 & 5.76]\\\\\n", | |
" [ 1 & 1.5 & 2.25]\\\\\n", | |
" \\vdots & \\vdots & \\vdots\\\\\n", | |
"\\end{bmatrix}\n", | |
"$" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"It looks like feature sets for multiple linear regression analysis, right? Yes. It Does. \n", | |
"Indeed, Polynomial regression is a special case of linear regression, with the main idea of how do you select your features. Just consider replacing the $x$ with $x_1$, $x_1^2$ with $x_2$, and so on. Then the degree 2 equation would be turn into:\n", | |
"\n", | |
"$y = b + \\theta_1 x_1 + \\theta_2 x_2$\n", | |
"\n", | |
"Now, we can deal with it as 'linear regression' problem. Therefore, this polynomial regression is considered to be a special case of traditional multiple linear regression. So, you can use the same mechanism as linear regression to solve such a problems. \n", | |
"\n", | |
"\n", | |
"\n", | |
"so we can use __LinearRegression()__ function to solve it:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Coefficients: [[ 0. 49.01964369 -1.3484326 ]]\n", | |
"Intercept: [110.06981412]\n" | |
] | |
} | |
], | |
"source": [ | |
"clf = linear_model.LinearRegression()\n", | |
"train_y_ = clf.fit(train_x_poly, train_y)\n", | |
"# The coefficients\n", | |
"print ('Coefficients: ', clf.coef_)\n", | |
"print ('Intercept: ',clf.intercept_)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"As mentioned before, __Coefficient__ and __Intercept__ , are the parameters of the fit curvy line. \n", | |
"Given that it is a typical multiple linear regression, with 3 parameters, and knowing that the parameters are the intercept and coefficients of hyperplane, sklearn has estimated them from our new set of feature sets. Lets plot it:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0, 0.5, 'Emission')" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n", | |
"XX = np.arange(0.0, 10.0, 0.1)\n", | |
"yy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XX, 2)\n", | |
"plt.plot(XX, yy, '-r' )\n", | |
"plt.xlabel(\"Engine size\")\n", | |
"plt.ylabel(\"Emission\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<h2 id=\"evaluation\">Evaluation</h2>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Mean absolute error: 24.60\n", | |
"Residual sum of squares (MSE): 1022.42\n", | |
"R2-score: 0.66\n" | |
] | |
} | |
], | |
"source": [ | |
"from sklearn.metrics import r2_score\n", | |
"\n", | |
"test_x_poly = poly.fit_transform(test_x)\n", | |
"test_y_ = clf.predict(test_x_poly)\n", | |
"\n", | |
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y_ - test_y)))\n", | |
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y_ - test_y) ** 2))\n", | |
"print(\"R2-score: %.2f\" % r2_score(test_y_ , test_y) )" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h2 id=\"practice\">Practice</h2>\n", | |
"Try to use a polynomial regression with the dataset but this time with degree three (cubic). Does it result in better accuracy?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"coefficient [[ 0. 25.32960013 5.13228242 -0.53314587]]\n", | |
"intercept [135.39450253]\n", | |
"Mean absolute error: 24.81\n", | |
"Residual sum of squares (MSE): 1024.14\n", | |
"R2-score: 0.66\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", | |
"from sklearn.preprocessing import PolynomialFeatures\n", | |
"from sklearn import linear_model\n", | |
"\n", | |
"poly1 = PolynomialFeatures(degree=3)\n", | |
"train_x_poly1 = poly1.fit_transform(train_x)\n", | |
"#train_x_poly1\n", | |
"\n", | |
"clf1 = linear_model.LinearRegression()\n", | |
"train_y1 = clf1.fit(train_x_poly1, train_y)\n", | |
"print('coefficient', clf1.coef_)\n", | |
"print('intercept', clf1.intercept_)\n", | |
"\n", | |
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n", | |
"XX1 = np.arange(0.0, 10.0, 0.1)\n", | |
"yy1 = clf1.intercept_[0]+ clf1.coef_[0][1]*XX1+ clf1.coef_[0][2]*np.power(XX1, 2)+clf1.coef_[0][3]*np.power(XX, 3)\n", | |
"plt.plot(XX1, yy1, '-r' )\n", | |
"plt.xlabel(\"Engine size\")\n", | |
"plt.ylabel(\"Emission\")\n", | |
"\n", | |
"test_x_poly1 = poly1.fit_transform(test_x)\n", | |
"test_y1 = clf1.predict(test_x_poly1)\n", | |
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y1 - test_y)))\n", | |
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y1 - test_y) ** 2))\n", | |
"print(\"R2-score: %.2f\" % r2_score(test_y1 , 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 © 2018 <a href=\"https://cocl.us/DX0108EN_CC\">Cognitive Class</a>. This notebook and its source code are released under the terms of the <a href=\"https://bigdatauniversity.com/mit-license/\">MIT License</a>.</p>" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.8" | |
}, | |
"widgets": { | |
"state": {}, | |
"version": "1.1.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment