Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save shangbaba/8ec23afc777446e14ccbb06c101cd952 to your computer and use it in GitHub Desktop.
Save shangbaba/8ec23afc777446e14ccbb06c101cd952 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-01-15 18:22:34-- 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.06s \n",
"\n",
"2020-01-15 18:22:35 (1.10 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": 7,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1. , 2. , 4. ],\n",
" [ 1. , 1.5 , 2.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3. , 9. ]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn import linear_model\n",
"train_x = np.asanyarray(train[['ENGINESIZE']])\n",
"train_y = np.asanyarray(train[['CO2EMISSIONS']])\n",
"\n",
"test_x = np.asanyarray(test[['ENGINESIZE']])\n",
"test_y = np.asanyarray(test[['CO2EMISSIONS']])\n",
"\n",
"\n",
"poly = PolynomialFeatures(degree=2)\n",
"train_x_poly = poly.fit_transform(train_x)\n",
"train_x_poly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**fit_transform** takes our x values, and output a list of our data raised from power of 0 to power of 2 (since we set the degree of our polynomial to 2).\n",
"\n",
"$\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": 21,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 50.08431336 -1.44850077]]\n",
"Intercept: [107.99571439]\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: 21.14\n",
"Residual sum of squares (MSE): 757.52\n",
"R2-score: 0.75\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": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficient: [[ 0. 28.33726396 4.68468292 -0.52945502]]\n",
"Intercept: [130.7413661]\n",
"Mean absolute error: 24.18\n",
"Residual sum of squares (MSE): 997.11\n",
"R2-score: 0.77\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",
"from sklearn.metrics import r2_score\n",
"\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"\n",
"train_x_trans = poly3.fit_transform(train_x)\n",
"\n",
"print(\"Coefficient: \", clf3.coef_)\n",
"print(\"Intercept: \", clf3.intercept_)\n",
"\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",
"\n",
"plt.xlabel(\"Engine Size\")\n",
"plt.ylabel(\"CO2 Emissions\")\n",
"\n",
"clf3 = linear_model.LinearRegression()\n",
"clf3.fit(train_x_trans, train_y)\n",
"\n",
"test_x_trans = poly3.fit_transform(test_x)\n",
"test_y_hat = clf3.predict(test_x_trans)\n",
"\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y - test_y_hat)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y - test_y_hat)**2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y, test_y_hat))"
]
},
{
"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