Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DryLabRebel/6bbeef69bcf94d73e1ed346e20f7a0fd to your computer and use it in GitHub Desktop.
Save DryLabRebel/6bbeef69bcf94d73e1ed346e20f7a0fd to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<center>\n",
" <img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/images/IDSNlogo.png\" width=\"300\" alt=\"cognitiveclass.ai logo\" />\n",
"</center>\n",
"\n",
"# Polynomial Regression\n",
"\n",
"Estimated time needed: **15** minutes\n",
"\n",
"## Objectives\n",
"\n",
"After completing this lab you will be able to:\n",
"\n",
"- Use scikit-learn to implement Polynomial Regression\n",
"- Create a model, train,test and use the model\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Table of contents</h1>\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <ol>\n",
" <li><a href=\"#download_data\">Downloading Data</a></li>\n",
" <li><a href=\"#polynomial_regression\">Polynomial regression</a></li>\n",
" <li><a href=\"#evaluation\">Evaluation</a></li>\n",
" <li><a href=\"#practice\">Practice</a></li>\n",
" </ol>\n",
"</div>\n",
"<br>\n",
"<hr>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Importing Needed packages\n"
]
},
{
"cell_type": "code",
"execution_count": 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-05-28 07:00:08-- 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.002s \n",
"\n",
"2021-05-28 07:00:08 (30.3 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. , 2.4 , 5.76],\n",
" [ 1. , 1.5 , 2.25],\n",
" ...,\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 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. 49.91418671 -1.45596099]]\n",
"Intercept: [108.13837991]\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: 21.17\n",
"Residual sum of squares (MSE): 820.61\n",
"R2-score: 0.78\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. 32.39395491 3.36780114 -0.39904912]]\n",
"Intercept: [126.71061202]\n",
"Mean absolute error: 21.08\n",
"Residual sum of squares (MSE): 813.72\n",
"R2-score: 0.78\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",
"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",
"poly = PolynomialFeatures(degree=3)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly\n",
"\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_)\n",
"\n",
"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\")\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_ ) )\n",
"\n",
"# Well the MSE is slightly smaller, but R2 is the same, and MAE is a teeeny, tiny bit smaller, so I guess it improved the fit a bit\n",
"# Could you claculate the AIC or -2LL, to assess whether the difference in fit is significant? Or are these mostly for linear model fitting?"
]
},
{
"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.13"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment