Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save NewDaBai/216893cc0228516f7fe7910ea2a66cf5 to your computer and use it in GitHub Desktop.
Save NewDaBai/216893cc0228516f7fe7910ea2a66cf5 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-08 06:22:18-- 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-08 06:22:18 (1.14 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. , 3.5 , 12.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" [ 1. , 3.5 , 12.25],\n",
" ...,\n",
" [ 1. , 3.2 , 10.24],\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. 48.46596621 -1.25195063]]\n",
"Intercept: [110.80388744]\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.89\n",
"Residual sum of squares (MSE): 826.55\n",
"R2-score: 0.71\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": 20,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "shapes (238,4) and (3,1) not aligned: 4 (dim 1) != 3 (dim 0)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-20-c00f024e1d91>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_x_poly\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrain_y\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mtest_x_poly3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpoly3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_x\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mtest_y_poly3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_x_poly3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Coefficients: '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoef_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Intercept: '\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mclf3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintercept_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/linear_model/base.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[0mReturns\u001b[0m \u001b[0mpredicted\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 212\u001b[0m \"\"\"\n\u001b[0;32m--> 213\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_decision_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 214\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0m_preprocess_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstaticmethod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_preprocess_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/linear_model/base.py\u001b[0m in \u001b[0;36m_decision_function\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[0mX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccept_sparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'csr'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'csc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'coo'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 197\u001b[0m return safe_sparse_dot(X, self.coef_.T,\n\u001b[0;32m--> 198\u001b[0;31m dense_output=True) + self.intercept_\n\u001b[0m\u001b[1;32m 199\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 200\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/conda/envs/python/lib/python3.6/site-packages/sklearn/utils/extmath.py\u001b[0m in \u001b[0;36msafe_sparse_dot\u001b[0;34m(a, b, dense_output)\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 173\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 174\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[0;34m(*args, **kwargs)\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: shapes (238,4) and (3,1) not aligned: 4 (dim 1) != 3 (dim 0)"
]
}
],
"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",
"clf3.fit(train_x_poly, train_y)\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y_poly3 = clf3.predict(test_x_poly3)\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"print(\"R2-score: %.2f\" % r2_score(test_y_poly3 , test_y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"\n",
"<!-- Your answer is below:\n",
"\n",
"poly3 = PolynomialFeatures(degree=3)\n",
"train_x_poly3 = poly3.fit_transform(train_x)\n",
"clf3 = linear_model.LinearRegression()\n",
"train_y3_ = clf3.fit(train_x_poly3, train_y)\n",
"# The coefficients\n",
"print ('Coefficients: ', clf3.coef_)\n",
"print ('Intercept: ',clf3.intercept_)\n",
"plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
"XX = np.arange(0.0, 10.0, 0.1)\n",
"yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)\n",
"plt.plot(XX, yy, '-r' )\n",
"plt.xlabel(\"Engine size\")\n",
"plt.ylabel(\"Emission\")\n",
"test_x_poly3 = poly3.fit_transform(test_x)\n",
"test_y3_ = clf3.predict(test_x_poly3)\n",
"print(\"Mean absolute error: %.2f\" % np.mean(np.absolute(test_y3_ - test_y)))\n",
"print(\"Residual sum of squares (MSE): %.2f\" % np.mean((test_y3_ - test_y) ** 2))\n",
"print(\"R2-score: %.2f\" % r2_score(test_y3_ , test_y) )\n",
"\n",
"\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<h2>Want to learn more?</h2>\n",
"\n",
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: <a href=\"http://cocl.us/ML0101EN-SPSSModeler\">SPSS Modeler</a>\n",
"\n",
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at <a href=\"https://cocl.us/ML0101EN_DSX\">Watson Studio</a>\n",
"\n",
"<h3>Thanks for completing this lesson!</h3>\n",
"\n",
"<h4>Author: <a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a></h4>\n",
"<p><a href=\"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>, PhD is a Data Scientist in IBM with a track record of developing enterprise level applications that substantially increases clients’ ability to turn data into actionable knowledge. He is a researcher in data mining field and expert in developing advanced analytic methods like machine learning and statistical modelling on large datasets.</p>\n",
"\n",
"<hr>\n",
"\n",
"<p>Copyright &copy; 2018 <a href=\"https://cocl.us/DX0108EN_CC\">Cognitive Class</a>. This notebook and its source code are released under the terms of the <a href=\"https://bigdatauniversity.com/mit-license/\">MIT License</a>.</p>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.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