Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Alois-star/a25588b8a1b7a4c021fa3c3cf48b975d to your computer and use it in GitHub Desktop.
Save Alois-star/a25588b8a1b7a4c021fa3c3cf48b975d 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-06-20 13:17:31-- 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-06-20 13:17:32 (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 , 5.76],\n",
" [ 1. , 3.5 , 12.25],\n",
" [ 1. , 3.5 , 12.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": 9,
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 49.92455021 -1.45119712]]\n",
"Intercept: [108.40126088]\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": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Emission')"
]
},
"execution_count": 10,
"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": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean absolute error: 23.05\n",
"Residual sum of squares (MSE): 915.00\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": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coefficients: [[ 0. 33.41907515 3.18856931 -0.39297507]]\n",
"Intercept: [125.63364327]\n",
"Mean absolute error: 22.85\n",
"Residual sum of squares (MSE): 904.10\n",
"R2-score: 0.73\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) )\n"
]
},
{
"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.10"
},
"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