Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save edisoncastro01/abb13b24c6ae14a790de759ea7194eb6 to your computer and use it in GitHub Desktop.
Save edisoncastro01/abb13b24c6ae14a790de759ea7194eb6 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": [
"--2020-11-21 23:45:31-- 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)... 67.228.254.196\n",
"Connecting to cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)|67.228.254.196|: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.06s \n",
"\n",
"2020-11-21 23:45:31 (1.25 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. , 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",
"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. 51.7594585 -1.69368117]]\n",
"Intercept: [105.54758099]\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: 22.33\n",
"Residual sum of squares (MSE): 895.20\n",
"R2-score: 0.73\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": 11,
"metadata": {},
"outputs": [],
"source": [
"# write your code here\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",
"-->\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",
"| 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.11"
},
"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