Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Moloi-Mokete/f2f33334b42a7488f89689dad70f5810 to your computer and use it in GitHub Desktop.
Save Moloi-Mokete/f2f33334b42a7488f89689dad70f5810 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,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import pylab as pl\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"download_data\">Downloading Data</h2>\n",
"To download the data, we will use !wget to download it from IBM Object Storage."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2019-04-03 18:03:51-- https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv\n",
"Resolving s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)... 67.228.254.193\n",
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|67.228.254.193|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 72629 (71K) [text/csv]\n",
"Saving to: ‘FuelConsumption.csv’\n",
"\n",
"FuelConsumption.csv 100%[=====================>] 70.93K --.-KB/s in 0.04s \n",
"\n",
"2019-04-03 18:03:51 (1.63 MB/s) - ‘FuelConsumption.csv’ saved [72629/72629]\n",
"\n"
]
}
],
"source": [
"!wget -O FuelConsumption.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__Did you know?__ When it comes to Machine Learning, you will likely be working with large datasets. As a business, where can you host your data? IBM is offering a unique opportunity for businesses, with 10 Tb of IBM Cloud Object Storage: [Sign up now for free](http://cocl.us/ML0101EN-IBM-Offer-CC)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"\n",
"## Understanding the Data\n",
"\n",
"### `FuelConsumption.csv`:\n",
"We have downloaded a fuel consumption dataset, **`FuelConsumption.csv`**, which contains model-specific fuel consumption ratings and estimated carbon dioxide emissions for new light-duty vehicles for retail sale in Canada. [Dataset source](http://open.canada.ca/data/en/dataset/98f1a129-f628-4ce4-b24d-6f16bf24dd64)\n",
"\n",
"- **MODELYEAR** e.g. 2014\n",
"- **MAKE** e.g. Acura\n",
"- **MODEL** e.g. ILX\n",
"- **VEHICLE CLASS** e.g. SUV\n",
"- **ENGINE SIZE** e.g. 4.7\n",
"- **CYLINDERS** e.g 6\n",
"- **TRANSMISSION** e.g. A6\n",
"- **FUEL CONSUMPTION in CITY(L/100 km)** e.g. 9.9\n",
"- **FUEL CONSUMPTION in HWY (L/100 km)** e.g. 8.9\n",
"- **FUEL CONSUMPTION COMB (L/100 km)** e.g. 9.2\n",
"- **CO2 EMISSIONS (g/km)** e.g. 182 --> low --> 0\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Reading the data in"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>MODELYEAR</th>\n",
" <th>MAKE</th>\n",
" <th>MODEL</th>\n",
" <th>VEHICLECLASS</th>\n",
" <th>ENGINESIZE</th>\n",
" <th>CYLINDERS</th>\n",
" <th>TRANSMISSION</th>\n",
" <th>FUELTYPE</th>\n",
" <th>FUELCONSUMPTION_CITY</th>\n",
" <th>FUELCONSUMPTION_HWY</th>\n",
" <th>FUELCONSUMPTION_COMB</th>\n",
" <th>FUELCONSUMPTION_COMB_MPG</th>\n",
" <th>CO2EMISSIONS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX</td>\n",
" <td>COMPACT</td>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>AS5</td>\n",
" <td>Z</td>\n",
" <td>9.9</td>\n",
" <td>6.7</td>\n",
" <td>8.5</td>\n",
" <td>33</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX</td>\n",
" <td>COMPACT</td>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>M6</td>\n",
" <td>Z</td>\n",
" <td>11.2</td>\n",
" <td>7.7</td>\n",
" <td>9.6</td>\n",
" <td>29</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>ILX HYBRID</td>\n",
" <td>COMPACT</td>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>AV7</td>\n",
" <td>Z</td>\n",
" <td>6.0</td>\n",
" <td>5.8</td>\n",
" <td>5.9</td>\n",
" <td>48</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>MDX 4WD</td>\n",
" <td>SUV - SMALL</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>AS6</td>\n",
" <td>Z</td>\n",
" <td>12.7</td>\n",
" <td>9.1</td>\n",
" <td>11.1</td>\n",
" <td>25</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2014</td>\n",
" <td>ACURA</td>\n",
" <td>RDX AWD</td>\n",
" <td>SUV - SMALL</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>AS6</td>\n",
" <td>Z</td>\n",
" <td>12.1</td>\n",
" <td>8.7</td>\n",
" <td>10.6</td>\n",
" <td>27</td>\n",
" <td>244</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" MODELYEAR MAKE MODEL VEHICLECLASS ENGINESIZE CYLINDERS \\\n",
"0 2014 ACURA ILX COMPACT 2.0 4 \n",
"1 2014 ACURA ILX COMPACT 2.4 4 \n",
"2 2014 ACURA ILX HYBRID COMPACT 1.5 4 \n",
"3 2014 ACURA MDX 4WD SUV - SMALL 3.5 6 \n",
"4 2014 ACURA RDX AWD SUV - SMALL 3.5 6 \n",
"\n",
" TRANSMISSION FUELTYPE FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY \\\n",
"0 AS5 Z 9.9 6.7 \n",
"1 M6 Z 11.2 7.7 \n",
"2 AV7 Z 6.0 5.8 \n",
"3 AS6 Z 12.7 9.1 \n",
"4 AS6 Z 12.1 8.7 \n",
"\n",
" FUELCONSUMPTION_COMB FUELCONSUMPTION_COMB_MPG CO2EMISSIONS \n",
"0 8.5 33 196 \n",
"1 9.6 29 221 \n",
"2 5.9 48 136 \n",
"3 11.1 25 255 \n",
"4 10.6 27 244 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"FuelConsumption.csv\")\n",
"\n",
"# take a look at the dataset\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets select some features that we want to use for regression."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ENGINESIZE</th>\n",
" <th>CYLINDERS</th>\n",
" <th>FUELCONSUMPTION_COMB</th>\n",
" <th>CO2EMISSIONS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>8.5</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>9.6</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>5.9</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.6</td>\n",
" <td>244</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.0</td>\n",
" <td>230</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.1</td>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.6</td>\n",
" <td>267</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ENGINESIZE CYLINDERS FUELCONSUMPTION_COMB CO2EMISSIONS\n",
"0 2.0 4 8.5 196\n",
"1 2.4 4 9.6 221\n",
"2 1.5 4 5.9 136\n",
"3 3.5 6 11.1 255\n",
"4 3.5 6 10.6 244\n",
"5 3.5 6 10.0 230\n",
"6 3.5 6 10.1 232\n",
"7 3.7 6 11.1 255\n",
"8 3.7 6 11.6 267"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']]\n",
"cdf.head(9)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets plot Emission values with respect to Engine size:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"#### Creating train and test dataset\n",
"Train/Test Split involves splitting the dataset into training and testing sets respectively, which are mutually exclusive. After which, you train with the training set and test with the testing set."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"collapsed": true,
"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": 11,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1. , 2.4 , 5.76 , 13.824],\n",
" [ 1. , 1.5 , 2.25 , 3.375],\n",
" [ 1. , 3.5 , 12.25 , 42.875],\n",
" ...,\n",
" [ 1. , 3. , 9. , 27. ],\n",
" [ 1. , 3.2 , 10.24 , 32.768],\n",
" [ 1. , 3.2 , 10.24 , 32.768]])"
]
},
"execution_count": 11,
"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": 12,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 30.88078112 3.85870642 -0.4383856 ]]\n",
"Intercept: [128.13139153]\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": 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,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 26.79\n",
"Residual sum of squares (MSE): 1154.95\n",
"R2-score: 0.63\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": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 30.88078112 3.85870642 -0.4383856 ]]\n",
"Intercept: [128.13139153]\n",
"Mean absolute error: 26.71\n",
"Residual sum of squares (MSE): 1150.46\n",
"R2-score: 0.64\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# write your code here\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn import linear_model\n",
"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",
"\n",
"#use Linear regression\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",
"#Plot the fitted data\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XXX = np.arange(0.0, 10.0, 0.1)\n",
"yyy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XXX, 2) + clf.coef_[0][3]*np.power(XXX, 3)\n",
"plt.plot(XXX, yyy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"\n",
"#evaluate model\n",
"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": [
"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 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment