Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save STHITAPRAJNAS/6ee00df0d151f733a4c6e409bda6e318 to your computer and use it in GitHub Desktop.
Save STHITAPRAJNAS/6ee00df0d151f733a4c6e409bda6e318 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": [
"--2019-09-07 19:38:08-- 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-09-07 19:38:08 (1.65 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",
" <td>0</td>\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",
" <td>1</td>\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",
" <td>2</td>\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",
" <td>3</td>\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",
" <td>4</td>\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",
" <td>0</td>\n",
" <td>2.0</td>\n",
" <td>4</td>\n",
" <td>8.5</td>\n",
" <td>196</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>2.4</td>\n",
" <td>4</td>\n",
" <td>9.6</td>\n",
" <td>221</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1.5</td>\n",
" <td>4</td>\n",
" <td>5.9</td>\n",
" <td>136</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.6</td>\n",
" <td>244</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.0</td>\n",
" <td>230</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>3.5</td>\n",
" <td>6</td>\n",
" <td>10.1</td>\n",
" <td>232</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>3.7</td>\n",
" <td>6</td>\n",
" <td>11.1</td>\n",
" <td>255</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\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": 6,
"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": 10,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1. , 2.4 , 5.76],\n",
" [ 1. , 1.5 , 2.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 10,
"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",
"#print(train_x)\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": 13,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 52.48211807 -1.71910423]]\n",
"Intercept: [102.90455971]\n"
]
}
],
"source": [
"clf = linear_model.LinearRegression()\n",
"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": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2,\n",
" 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5,\n",
" 2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8,\n",
" 3.9, 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1,\n",
" 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2, 6.3, 6.4,\n",
" 6.5, 6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7,\n",
" 7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9. ,\n",
" 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9])"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.arange(0.0, 10.0, 0.1)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 14,
"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": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 23.23\n",
"Residual sum of squares (MSE): 929.19\n",
"R2-score: 0.70\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": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 25.34570198 5.75105341 -0.61851854]]\n",
"Intercept: [131.71161676]\n",
"Mean absolute error: 23.32\n",
"Residual sum of squares (MSE): 939.90\n",
"R2-score: 0.70\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) )"
]
},
{
"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