Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bnwiran/77f776935deb4513c3a4c65bbb96b067 to your computer and use it in GitHub Desktop.
Save bnwiran/77f776935deb4513c3a4c65bbb96b067 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-07-12 13:24:58-- 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-07-12 13:24:59 (1.64 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": 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": 13,
"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. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"execution_count": 13,
"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": 8,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 50.23053106 -1.46703236]]\n",
"Intercept: [107.52159512]\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: 22.79\n",
"Residual sum of squares (MSE): 872.61\n",
"R2-score: 0.72\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": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 27.42398104 4.94381751 -0.54383287]]\n",
"Intercept: [131.35091581]\n",
"Mean absolute error: 22.63\n",
"Residual sum of squares (MSE): 869.91\n",
"R2-score: 0.72\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",
"poly = PolynomialFeatures(degree=3)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"\n",
"regr = linear_model.LinearRegression()\n",
"regr.fit(train_x_poly, train_y)\n",
"\n",
"print ('Coefficients: ', regr.coef_)\n",
"print ('Intercept: ', regr.intercept_)\n",
"\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = regr.intercept_[0]+ regr.coef_[0][1]*XX + regr.coef_[0][2]*np.power(XX, 2) + regr.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"\n",
"test_x_poly = poly.fit_transform(test_x)\n",
"test_y_ = regr.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.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