Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manishkumarmailbox/d9b5ee81f30274f76945092a8fa701d6 to your computer and use it in GitHub Desktop.
Save manishkumarmailbox/d9b5ee81f30274f76945092a8fa701d6 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://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/Logos/organization_logo/organization_logo.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": 1,
"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": 2,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2021-02-14 05:33:18-- 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)... 169.63.118.104\n",
"Connecting to cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)|169.63.118.104|: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",
"2021-02-14 05:33:18 (1.86 MB/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": 3,
"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": 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.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 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:\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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": 6,
"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": 7,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1. , 2. , 4. ],\n",
" [ 1. , 1.5 , 2.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn import linear_model\n",
"train_x = np.asanyarray(train[['ENGINESIZE']])\n",
"train_y = np.asanyarray(train[['CO2EMISSIONS']])\n",
"\n",
"test_x = np.asanyarray(test[['ENGINESIZE']])\n",
"test_y = np.asanyarray(test[['CO2EMISSIONS']])\n",
"\n",
"\n",
"poly = PolynomialFeatures(degree=2)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**fit_transform** takes our x values, and output a list of our data raised from power of 0 to power of 2 (since we set the degree of our polynomial to 2). \n",
"\n",
"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": 8,
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 48.77087091 -1.23083502]]\n",
"Intercept: [109.92723506]\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": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XX, 2)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 24.00\n",
"Residual sum of squares (MSE): 985.85\n",
"R2-score: 0.76\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": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 27.56843313 4.73391052 -0.50590113]]\n",
"Intercept: [132.06822464]\n"
]
}
],
"source": [
"# write your code here\n",
"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=3)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly\n",
"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": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 16,
"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)+clf.coef_[0][3]*np.power(xx,3)\n",
"plt.plot(xx, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 23.92\n",
"Residual sum of squares (MSE): 978.71\n",
"R2-score: 0.76\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": [
"<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.12"
},
"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