Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save SoyabulIslamLincoln/85ecac9c6047709baa4de0f32cb7bbc7 to your computer and use it in GitHub Desktop.

Select an option

Save SoyabulIslamLincoln/85ecac9c6047709baa4de0f32cb7bbc7 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<a href=\"https://www.bigdatauniversity.com\"><img src=\"https://ibm.box.com/shared/static/cw2c7r3o20w9zn8gkecaeyjhgw3xdgbj.png\" width=\"400\" align=\"center\"></a>\n",
"\n",
"<h1><center>Polynomial Regression</center></h1>\n",
"\n",
"<h4>About this Notebook</h4>\n",
"In this notebook, we learn how to use scikit-learn for Polynomial regression. We download a dataset that is related to fuel consumption and Carbon dioxide emission of cars. Then, we split our data into training and test sets, create a model using training set, evaluate our model using test set, and finally use model to predict unknown value."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h1>Table of contents</h1>\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <ol>\n",
" <li><a href=\"#download_data\">Downloading Data</a></li>\n",
" <li><a href=\"#polynomial_regression\">Polynomial regression</a></li>\n",
" <li><a href=\"#evaluation\">Evaluation</a></li>\n",
" <li><a href=\"#practice\">Practice</a></li>\n",
" </ol>\n",
"</div>\n",
"<br>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Importing Needed packages"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import pylab as pl\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"download_data\">Downloading Data</h2>\n",
"To download the data, we will use !wget to download it from IBM Object Storage."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2020-02-25 17:25:07-- 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.196\n",
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|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.04s \n",
"\n",
"2020-02-25 17:25:08 (1.57 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,
"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,
"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,
"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": 8,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"msk = np.random.rand(len(df)) < 0.8\n",
"train = cdf[msk]\n",
"test = cdf[~msk]"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"polynomial_regression\">Polynomial regression</h2>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Sometimes, the trend of data is not really linear, and looks curvy. In this case we can use Polynomial regression methods. In fact, many different regressions exist that can be used to fit whatever the dataset looks like, such as quadratic, cubic, and so on, and it can go on and on to infinite degrees.\n",
"\n",
"In essence, we can call all of these, polynomial regression, where the relationship between the independent variable x and the dependent variable y is modeled as an nth degree polynomial in x. Lets say you want to have a polynomial regression (let's make 2 degree polynomial):\n",
"\n",
"\n",
"$y = b + \\theta_1 x + \\theta_2 x^2$\n",
"\n",
"Now, the question is: how we can fit our data on this equation while we have only x values, such as __Engine Size__? \n",
"Well, we can create a few additional features: 1, $x$, and $x^2$.\n",
"\n",
"\n",
"\n",
"__PloynomialFeatures()__ function in Scikit-learn library, drives a new feature sets from the original feature set. That is, a matrix will be generated consisting of all polynomial combinations of the features with degree less than or equal to the specified degree. For example, lets say the original feature set has only one feature, _ENGINESIZE_. Now, if we select the degree of the polynomial to be 2, then it generates 3 features, degree=0, degree=1 and degree=2: "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"button": false,
"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. , 1.5 , 2.25],\n",
" ...,\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 9,
"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": 10,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 49.11601929 -1.31496627]]\n",
"Intercept: [108.3496512]\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": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 11,
"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": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 23.17\n",
"Residual sum of squares (MSE): 902.16\n",
"R2-score: 0.71\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": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 23.37984413 5.92896245 -0.61413357]]\n",
"Intercept: [135.17133455]\n",
"Mean absolute error: 23.17\n",
"Residual sum of squares (MSE): 904.15\n",
"R2-score: 0.71\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# write your code here\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"\n",
"<!-- Your answer is below:\n",
"\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n",
"\n",
"\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2>Want to learn more?</h2>\n",
"\n",
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: <a href=\"http://cocl.us/ML0101EN-SPSSModeler\">SPSS Modeler</a>\n",
"\n",
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at <a href=\"https://cocl.us/ML0101EN_DSX\">Watson Studio</a>\n",
"\n",
"<h3>Thanks for completing this lesson!</h3>\n",
"\n",
"<h4>Author: <a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a></h4>\n",
"<p><a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>, PhD is a Data Scientist in IBM with a track record of developing enterprise level applications that substantially increases clients’ ability to turn data into actionable knowledge. He is a researcher in data mining field and expert in developing advanced analytic methods like machine learning and statistical modelling on large datasets.</p>\n",
"\n",
"<hr>\n",
"\n",
"<p>Copyright &copy; 2018 <a href=\"https://cocl.us/DX0108EN_CC\">Cognitive Class</a>. This notebook and its source code are released under the terms of the <a href=\"https://bigdatauniversity.com/mit-license/\">MIT License</a>.</p>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment