Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mcmasterml/0200b12730addfb1380bc1136e9992f0 to your computer and use it in GitHub Desktop.
Save mcmasterml/0200b12730addfb1380bc1136e9992f0 to your computer and use it in GitHub Desktop.
Created on Skills Network 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-07-28 20:34:32-- https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv\n",
"Resolving s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)... 67.228.254.196\n",
"Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|67.228.254.196|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 72629 (71K) [text/csv]\n",
"Saving to: ‘FuelConsumption.csv’\n",
"\n",
"FuelConsumption.csv 100%[===================>] 70.93K --.-KB/s in 0.04s \n",
"\n",
"2020-07-28 20:34:32 (1.83 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. , 2.4 , 5.76],\n",
" [ 1. , 1.5 , 2.25],\n",
" ...,\n",
" [ 1. , 3. , 9. ],\n",
" [ 1. , 3.2 , 10.24],\n",
" [ 1. , 3.2 , 10.24]])"
]
},
"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": 8,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 51.07022494 -1.59616134]]\n",
"Intercept: [106.70168075]\n"
]
}
],
"source": [
"clf = linear_model.LinearRegression()\n",
"train_y_ = clf.fit(train_x_poly, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf.coef_)\n",
"print ('Intercept: ',clf.intercept_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As mentioned before, __Coefficient__ and __Intercept__ , are the parameters of the fit curvy line. \n",
"Given that it is a typical multiple linear regression, with 3 parameters, and knowing that the parameters are the intercept and coefficients of hyperplane, sklearn has estimated them from our new set of feature sets. Lets plot it:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf.intercept_[0]+ clf.coef_[0][1]*XX+ clf.coef_[0][2]*np.power(XX, 2)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 23.80\n",
"Residual sum of squares (MSE): 1016.89\n",
"R2-score: 0.67\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": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Intercept: [126.35324694]\n",
"Coefficients: [[ 0. 32.73063287 3.41173716 -0.41136476]]\n"
]
}
],
"source": [
"# write your code here\n",
"poly1 = PolynomialFeatures(degree=3)\n",
"x_poly1_train = poly1.fit_transform(train_x)\n",
"\n",
"regression = linear_model.LinearRegression()\n",
"regression.fit(x_poly1_train, train_y)\n",
"\n",
"print(\"Intercept: \", regression.intercept_)\n",
"print(\"Coefficients: \", regression.coef_)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'CO2EMISSIONS')"
]
},
"execution_count": 19,
"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",
"\n",
"XXX = np.arange(0.0, 10.0, 0.1)\n",
"yyy = regression.intercept_[0]+(regression.coef_[0][1]*XXX)+(regression.coef_[0][2]*(np.power(XXX,2)))+(regression.coef_[0][3]*(np.power(XXX,3)))\n",
" \n",
"plt.plot(XXX, yyy, '-r')\n",
"plt.xlabel(\"ENGINESIZE\")\n",
"plt.ylabel(\"CO2EMISSIONS\")\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean Absolute Error: 23.7125\n",
"Mean Squared Error: 1010.4782\n",
"R^2 score: 0.6783\n"
]
}
],
"source": [
"x_poly1_test = poly1.fit_transform(test_x)\n",
"test_y_ = regression.predict(x_poly1_test)\n",
"\n",
"print(\"Mean Absolute Error: %.4f\" % np.mean(np.absolute(test_y_ - test_y)))\n",
"print(\"Mean Squared Error: %.4f\" % np.mean((test_y_ - test_y) ** 2))\n",
"print(\"R^2 score: %.4f\" % 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>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.11"
},
"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