Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 38

{

"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model Selection using RFE (Housing Case Study)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Importing and Understanding Data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Supress Warnings\n",
"\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Importing Housing.csv\n",
"housing = pd.read_csv('Housing.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"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>price</th>\n",
" <th>area</th>\n",
" <th>bedrooms</th>\n",
" <th>bathrooms</th>\n",
" <th>stories</th>\n",
" <th>mainroad</th>\n",
" <th>guestroom</th>\n",
" <th>basement</th>\n",
" <th>hotwaterheating</th>\n",
" <th>airconditioning</th>\n",
" <th>parking</th>\n",
" <th>prefarea</th>\n",
" <th>furnishingstatus</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>13300000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>2</td>\n",
" <td>yes</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12250000</td>\n",
" <td>8960</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>3</td>\n",
" <td>no</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12250000</td>\n",
" <td>9960</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>2</td>\n",
" <td>yes</td>\n",
" <td>semi-furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12215000</td>\n",
" <td>7500</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>3</td>\n",
" <td>yes</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11410000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>2</td>\n",
" <td>no</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price area bedrooms bathrooms stories mainroad guestroom basement
\\\n",
"0 13300000 7420 4 2 3 yes no no
\n",
"1 12250000 8960 4 4 4 yes no no
\n",
"2 12250000 9960 3 2 2 yes no yes
\n",
"3 12215000 7500 4 2 2 yes no yes
\n",
"4 11410000 7420 4 1 2 yes yes yes
\n",
"\n",
" hotwaterheating airconditioning parking prefarea furnishingstatus \n",
"0 no yes 2 yes furnished \n",
"1 no yes 3 no furnished \n",
"2 no no 2 yes semi-furnished \n",
"3 no yes 3 yes furnished \n",
"4 no yes 2 no furnished "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Looking at the first five rows\n",
"housing.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data Preparation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# List of variables to map\n",
"\n",
"varlist = ['mainroad', 'guestroom', 'basement', 'hotwaterheating',
'airconditioning', 'prefarea']\n",
"\n",
"# Defining the map function\n",
"def binary_map(x):\n",
" return x.map({'yes': 1, \"no\": 0})\n",
"\n",
"# Applying the function to the housing list\n",
"housing[varlist] = housing[varlist].apply(binary_map)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": 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>price</th>\n",
" <th>area</th>\n",
" <th>bedrooms</th>\n",
" <th>bathrooms</th>\n",
" <th>stories</th>\n",
" <th>mainroad</th>\n",
" <th>guestroom</th>\n",
" <th>basement</th>\n",
" <th>hotwaterheating</th>\n",
" <th>airconditioning</th>\n",
" <th>parking</th>\n",
" <th>prefarea</th>\n",
" <th>furnishingstatus</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>13300000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12250000</td>\n",
" <td>8960</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12250000</td>\n",
" <td>9960</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>semi-furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12215000</td>\n",
" <td>7500</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11410000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>furnished</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price area bedrooms bathrooms stories mainroad guestroom
\\\n",
"0 13300000 7420 4 2 3 1 0 \n",
"1 12250000 8960 4 4 4 1 0 \n",
"2 12250000 9960 3 2 2 1 0 \n",
"3 12215000 7500 4 2 2 1 0 \n",
"4 11410000 7420 4 1 2 1 1 \n",
"\n",
" basement hotwaterheating airconditioning parking prefarea \\\n",
"0 0 0 1 2 1 \n",
"1 0 0 1 3 0 \n",
"2 1 0 0 2 1 \n",
"3 1 0 1 3 1 \n",
"4 1 0 1 2 0 \n",
"\n",
" furnishingstatus \n",
"0 furnished \n",
"1 furnished \n",
"2 semi-furnished \n",
"3 furnished \n",
"4 furnished "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the housing dataframe now\n",
"\n",
"housing.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dummy Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The variable `furnishingstatus` has three levels. We need to convert these
levels into integer as well. For this, we will use something called `dummy
variables`."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"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>furnished</th>\n",
" <th>semi-furnished</th>\n",
" <th>unfurnished</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" furnished semi-furnished unfurnished\n",
"0 1 0 0\n",
"1 1 0 0\n",
"2 0 1 0\n",
"3 1 0 0\n",
"4 1 0 0"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get the dummy variables for the feature 'furnishingstatus' and store it in a
new variable - 'status'\n",
"\n",
"status = pd.get_dummies(housing['furnishingstatus'])\n",
"\n",
"# Check what the dataset 'status' looks like\n",
"status.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, you don't need three columns. You can drop the `furnished` column, as the
type of furnishing can be identified with just the last two columns where — \n",
"- `00` will correspond to `furnished`\n",
"- `01` will correspond to `unfurnished`\n",
"- `10` will correspond to `semi-furnished`"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"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>price</th>\n",
" <th>area</th>\n",
" <th>bedrooms</th>\n",
" <th>bathrooms</th>\n",
" <th>stories</th>\n",
" <th>mainroad</th>\n",
" <th>guestroom</th>\n",
" <th>basement</th>\n",
" <th>hotwaterheating</th>\n",
" <th>airconditioning</th>\n",
" <th>parking</th>\n",
" <th>prefarea</th>\n",
" <th>furnishingstatus</th>\n",
" <th>semi-furnished</th>\n",
" <th>unfurnished</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>13300000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>furnished</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12250000</td>\n",
" <td>8960</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>furnished</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12250000</td>\n",
" <td>9960</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>semi-furnished</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12215000</td>\n",
" <td>7500</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>furnished</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11410000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>furnished</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price area bedrooms bathrooms stories mainroad guestroom
\\\n",
"0 13300000 7420 4 2 3 1 0 \n",
"1 12250000 8960 4 4 4 1 0 \n",
"2 12250000 9960 3 2 2 1 0 \n",
"3 12215000 7500 4 2 2 1 0 \n",
"4 11410000 7420 4 1 2 1 1 \n",
"\n",
" basement hotwaterheating airconditioning parking prefarea \\\n",
"0 0 0 1 2 1 \n",
"1 0 0 1 3 0 \n",
"2 1 0 0 2 1 \n",
"3 1 0 1 3 1 \n",
"4 1 0 1 2 0 \n",
"\n",
" furnishingstatus semi-furnished unfurnished \n",
"0 furnished 0 0 \n",
"1 furnished 0 0 \n",
"2 semi-furnished 1 0 \n",
"3 furnished 0 0 \n",
"4 furnished 0 0 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's drop the first column from status df using 'drop_first = True'\n",
"status = pd.get_dummies(housing['furnishingstatus'], drop_first = True)\n",
"\n",
"# Add the results to the original housing dataframe\n",
"housing = pd.concat([housing, status], axis = 1)\n",
"\n",
"# Now let's see the head of our dataframe.\n",
"housing.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"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>price</th>\n",
" <th>area</th>\n",
" <th>bedrooms</th>\n",
" <th>bathrooms</th>\n",
" <th>stories</th>\n",
" <th>mainroad</th>\n",
" <th>guestroom</th>\n",
" <th>basement</th>\n",
" <th>hotwaterheating</th>\n",
" <th>airconditioning</th>\n",
" <th>parking</th>\n",
" <th>prefarea</th>\n",
" <th>semi-furnished</th>\n",
" <th>unfurnished</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>13300000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12250000</td>\n",
" <td>8960</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12250000</td>\n",
" <td>9960</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12215000</td>\n",
" <td>7500</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11410000</td>\n",
" <td>7420</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price area bedrooms bathrooms stories mainroad guestroom
\\\n",
"0 13300000 7420 4 2 3 1 0 \n",
"1 12250000 8960 4 4 4 1 0 \n",
"2 12250000 9960 3 2 2 1 0 \n",
"3 12215000 7500 4 2 2 1 0 \n",
"4 11410000 7420 4 1 2 1 1 \n",
"\n",
" basement hotwaterheating airconditioning parking prefarea \\\n",
"0 0 0 1 2 1 \n",
"1 0 0 1 3 0 \n",
"2 1 0 0 2 1 \n",
"3 1 0 1 3 1 \n",
"4 1 0 1 2 0 \n",
"\n",
" semi-furnished unfurnished \n",
"0 0 0 \n",
"1 0 0 \n",
"2 1 0 \n",
"3 0 0 \n",
"4 0 0 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Drop 'furnishingstatus' as we have created the dummies for it\n",
"housing.drop(['furnishingstatus'], axis = 1, inplace = True)\n",
"\n",
"housing.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Splitting the Data into Training and Testing Sets"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"# We specify this so that the train and test data set always have the same
rows, respectively\n",
"\n",
"df_train, df_test = train_test_split(housing, train_size = 0.7, test_size =
0.3, random_state = 100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Rescaling the Features \n",
"\n",
"We will use MinMax scaling."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import MinMaxScaler\n",
"scaler = MinMaxScaler()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"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>price</th>\n",
" <th>area</th>\n",
" <th>bedrooms</th>\n",
" <th>bathrooms</th>\n",
" <th>stories</th>\n",
" <th>mainroad</th>\n",
" <th>guestroom</th>\n",
" <th>basement</th>\n",
" <th>hotwaterheating</th>\n",
" <th>airconditioning</th>\n",
" <th>parking</th>\n",
" <th>prefarea</th>\n",
" <th>semi-furnished</th>\n",
" <th>unfurnished</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>359</th>\n",
" <td>0.169697</td>\n",
" <td>0.155227</td>\n",
" <td>0.4</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0.333333</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0.615152</td>\n",
" <td>0.403379</td>\n",
" <td>0.4</td>\n",
" <td>0.5</td>\n",
" <td>0.333333</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.333333</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>159</th>\n",
" <td>0.321212</td>\n",
" <td>0.115628</td>\n",
" <td>0.4</td>\n",
" <td>0.5</td>\n",
" <td>0.000000</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>0.548133</td>\n",
" <td>0.454417</td>\n",
" <td>0.4</td>\n",
" <td>0.5</td>\n",
" <td>1.000000</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.666667</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>0.575758</td>\n",
" <td>0.538015</td>\n",
" <td>0.8</td>\n",
" <td>0.5</td>\n",
" <td>0.333333</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0.666667</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price area bedrooms bathrooms stories mainroad guestroom
\\\n",
"359 0.169697 0.155227 0.4 0.0 0.000000 1 0
\n",
"19 0.615152 0.403379 0.4 0.5 0.333333 1 0
\n",
"159 0.321212 0.115628 0.4 0.5 0.000000 1 1
\n",
"35 0.548133 0.454417 0.4 0.5 1.000000 1 0
\n",
"28 0.575758 0.538015 0.8 0.5 0.333333 1 0
\n",
"\n",
" basement hotwaterheating airconditioning parking prefarea \\\n",
"359 0 0 0 0.333333 0 \n",
"19 0 0 1 0.333333 1 \n",
"159 1 0 1 0.000000 0 \n",
"35 0 0 1 0.666667 0 \n",
"28 1 1 0 0.666667 0 \n",
"\n",
" semi-furnished unfurnished \n",
"359 0 1 \n",
"19 1 0 \n",
"159 0 0 \n",
"35 0 0 \n",
"28 0 1 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Apply scaler() to all the columns except the 'yes-no' and 'dummy'
variables\n",
"num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking','price']\n",
"\n",
"df_train[num_vars] = scaler.fit_transform(df_train[num_vars])\n",
"\n",
"df_train.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dividing into X and Y sets for the model building"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"y_train = df_train.pop('price')\n",
"X_train = df_train"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building our model\n",
"\n",
"This time, we will be using the **LinearRegression function from SciKit
Learn** for its compatibility with RFE (which is a utility from sklearn)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### RFE\n",
"Recursive feature elimination"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Importing RFE and LinearRegression\n",
"from sklearn.feature_selection import RFE\n",
"from sklearn.linear_model import LinearRegression"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# Running RFE with the output number of the variable equal to 10\n",
"lm = LinearRegression()\n",
"lm.fit(X_train, y_train)\n",
"\n",
"rfe = RFE(lm, 10) # running RFE\n",
"rfe = rfe.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('area', True, 1),\n",
" ('bedrooms', True, 1),\n",
" ('bathrooms', True, 1),\n",
" ('stories', True, 1),\n",
" ('mainroad', True, 1),\n",
" ('guestroom', True, 1),\n",
" ('basement', False, 3),\n",
" ('hotwaterheating', True, 1),\n",
" ('airconditioning', True, 1),\n",
" ('parking', True, 1),\n",
" ('prefarea', True, 1),\n",
" ('semi-furnished', False, 4),\n",
" ('unfurnished', False, 2)]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(zip(X_train.columns,rfe.support_,rfe.ranking_))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['area', 'bedrooms', 'bathrooms', 'stories', 'mainroad',
'guestroom',\n",
" 'hotwaterheating', 'airconditioning', 'parking', 'prefarea'],\n",
" dtype='object')"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"col = X_train.columns[rfe.support_]\n",
"col"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['basement', 'semi-furnished', 'unfurnished'], dtype='object')"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.columns[~rfe.support_]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Building model using statsmodel, for the detailed statistics"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# Creating X_test dataframe with RFE selected variables\n",
"X_train_rfe = X_train[col]"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# Adding a constant variable \n",
"import statsmodels.api as sm \n",
"X_train_rfe = sm.add_constant(X_train_rfe)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"lm = sm.OLS(y_train,X_train_rfe).fit() # Running the linear model"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" OLS Regression Results
\n",

"==============================================================================\n",
"Dep. Variable: price R-squared:
0.669\n",
"Model: OLS Adj. R-squared:
0.660\n",
"Method: Least Squares F-statistic:
74.89\n",
"Date: Tue, 09 Oct 2018 Prob (F-statistic): 1.28e-
82\n",
"Time: 13:15:31 Log-Likelihood:
374.65\n",
"No. Observations: 381 AIC:
-727.3\n",
"Df Residuals: 370 BIC:
-683.9\n",
"Df Model: 10
\n",
"Covariance Type: nonrobust
\n",

"==================================================================================
=\n",
" coef std err t P>|t| [0.025
0.975]\n",

"----------------------------------------------------------------------------------
-\n",
"const 0.0027 0.018 0.151 0.880 -0.033
0.038\n",
"area 0.2363 0.030 7.787 0.000 0.177
0.296\n",
"bedrooms 0.0661 0.037 1.794 0.074 -0.006
0.139\n",
"bathrooms 0.1982 0.022 8.927 0.000 0.155
0.242\n",
"stories 0.0977 0.019 5.251 0.000 0.061
0.134\n",
"mainroad 0.0556 0.014 3.848 0.000 0.027
0.084\n",
"guestroom 0.0381 0.013 2.934 0.004 0.013
0.064\n",
"hotwaterheating 0.0897 0.022 4.104 0.000 0.047
0.133\n",
"airconditioning 0.0711 0.011 6.235 0.000 0.049
0.093\n",
"parking 0.0637 0.018 3.488 0.001 0.028
0.100\n",
"prefarea 0.0643 0.012 5.445 0.000 0.041
0.088\n",

"==============================================================================\n",
"Omnibus: 86.105 Durbin-Watson:
2.098\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB):
286.069\n",
"Skew: 0.992 Prob(JB): 7.60e-
63\n",
"Kurtosis: 6.753 Cond. No.
13.2\n",

"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is
correctly specified.\n"
]
}
],
"source": [
"#Let's see the summary of our linear model\n",
"print(lm.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`Bedrooms` is insignificant in presence of other variables; can be dropped"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"X_train_new = X_train_rfe.drop([\"bedrooms\"], axis = 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rebuilding the model without `bedrooms`"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"# Adding a constant variable \n",
"import statsmodels.api as sm \n",
"X_train_lm = sm.add_constant(X_train_new)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"lm = sm.OLS(y_train,X_train_lm).fit() # Running the linear model"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" OLS Regression Results
\n",

"==============================================================================\n",
"Dep. Variable: price R-squared:
0.666\n",
"Model: OLS Adj. R-squared:
0.658\n",
"Method: Least Squares F-statistic:
82.37\n",
"Date: Tue, 09 Oct 2018 Prob (F-statistic): 6.67e-
83\n",
"Time: 13:15:31 Log-Likelihood:
373.00\n",
"No. Observations: 381 AIC:
-726.0\n",
"Df Residuals: 371 BIC:
-686.6\n",
"Df Model: 9
\n",
"Covariance Type: nonrobust
\n",

"==================================================================================
=\n",
" coef std err t P>|t| [0.025
0.975]\n",

"----------------------------------------------------------------------------------
-\n",
"const 0.0242 0.013 1.794 0.074 -0.002
0.051\n",
"area 0.2367 0.030 7.779 0.000 0.177
0.297\n",
"bathrooms 0.2070 0.022 9.537 0.000 0.164
0.250\n",
"stories 0.1096 0.017 6.280 0.000 0.075
0.144\n",
"mainroad 0.0536 0.014 3.710 0.000 0.025
0.082\n",
"guestroom 0.0390 0.013 2.991 0.003 0.013
0.065\n",
"hotwaterheating 0.0921 0.022 4.213 0.000 0.049
0.135\n",
"airconditioning 0.0710 0.011 6.212 0.000 0.049
0.094\n",
"parking 0.0669 0.018 3.665 0.000 0.031
0.103\n",
"prefarea 0.0653 0.012 5.513 0.000 0.042
0.089\n",

"==============================================================================\n",
"Omnibus: 91.542 Durbin-Watson:
2.107\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB):
315.402\n",
"Skew: 1.044 Prob(JB): 3.25e-
69\n",
"Kurtosis: 6.938 Cond. No.
10.0\n",

"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is
correctly specified.\n"
]
}
],
"source": [
"#Let's see the summary of our linear model\n",
"print(lm.summary())"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['const', 'area', 'bathrooms', 'stories', 'mainroad',
'guestroom',\n",
" 'hotwaterheating', 'airconditioning', 'parking', 'prefarea'],\n",
" dtype='object')"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train_new.columns"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"X_train_new = X_train_new.drop(['const'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"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>Features</th>\n",
" <th>VIF</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>area</td>\n",
" <td>4.52</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>mainroad</td>\n",
" <td>4.26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>stories</td>\n",
" <td>2.12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>parking</td>\n",
" <td>2.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>airconditioning</td>\n",
" <td>1.75</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bathrooms</td>\n",
" <td>1.58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>prefarea</td>\n",
" <td>1.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>guestroom</td>\n",
" <td>1.30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>hotwaterheating</td>\n",
" <td>1.12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Features VIF\n",
"0 area 4.52\n",
"3 mainroad 4.26\n",
"2 stories 2.12\n",
"7 parking 2.10\n",
"6 airconditioning 1.75\n",
"1 bathrooms 1.58\n",
"8 prefarea 1.47\n",
"4 guestroom 1.30\n",
"5 hotwaterheating 1.12"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Calculate the VIFs for the new model\n",
"from statsmodels.stats.outliers_influence import variance_inflation_factor\n",
"\n",
"vif = pd.DataFrame()\n",
"X = X_train_new\n",
"vif['Features'] = X.columns\n",
"vif['VIF'] = [variance_inflation_factor(X.values, i) for i in
range(X.shape[1])]\n",
"vif['VIF'] = round(vif['VIF'], 2)\n",
"vif = vif.sort_values(by = \"VIF\", ascending = False)\n",
"vif"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Residual Analysis of the train data\n",
"\n",
"So, now to check if the error terms are also normally distributed (which is
infact, one of the major assumptions of linear regression), let us plot the
histogram of the error terms and see what it looks like."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"y_train_price = lm.predict(X_train_lm)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# Importing the required libraries for plots.\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\admin\\Anaconda3\\lib\\site-
packages\\matplotlib\\axes\\_axes.py:6462: UserWarning: The 'normed' kwarg is
deprecated, and has been replaced by the 'density' kwarg.\n",
" warnings.warn(\"The 'normed' kwarg is deprecated, and has been \"\n"
]
},
{
"data": {
"text/plain": [
"Text(0.5,0,'Errors')"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAW4AAAErCAYAAAD+N2lQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEg
AACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0c
GxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl8XFed5/3Pr6q076tly5bkLY4TO3FsJSYrYQkkTROgYQYI
0ITOvDIz0A/D0z0PSw/THbqnG2aafpqenl5Iszch7B0CCZAQsod43+14t2R5kyyV9rVUZ/6oklEcLSVbVbd
u1ff9etVLUt2re3+6lr8+Pvfcc8w5h4iI+EfA6wJERGRuFNwiIj6j4BYR8RkFt4iIzyi4RUR8RsEtIuIzCm
4REZ9RcGchM3MJvG73us65MrNvJPizTbye8bpmkUsR8roA8dTnZth2IlVFzKNHeG3dtwOvB54Fnrlo28X7i
viC6cnJ7GNmDsA5Z17Xkmxm9gDwZ8DnnHMPeFuNyPxQV4nMyswemOg+MbN7zGyTmfWb2Yn49qb49m+Y2RVm
9j0zazez6OQuFzNbaWbfMrNTZjZqZqfjX6+c6zmT8DOamd1rZs+ZWbeZDZvZXjP7lJnlXLRvcby2n5nZEjP
7ppmdMbNxM3tPfJ8fxvepNbM/NrNX4sc8amZ/POlYHzSz7WY2aGZnzexvLj5ffL83mdnP49duJH6+F83sU8
m4HpLe1FUic/HHwB3AT4GngbKLti8HNgGHgIeAAqAXwMyuB34FlACPAvuBK4EPAO8wszc557Zewjkvm5kZ8
DDwXmLdJz8A+oBbgC8At5nZ251z0Yu+tY7Yz9se/54A0HnRPv8E3Ar8DHgCeCfwxfg5c4HPAD8h1o1zF/BH
QBT4/ybV927gh/FjPwqcBaqBq4D/CPzPy7sC4jcK7iwW70aYyrBz7gtTvP9G4Ebn3I5pvu8W4PPOuT+56Dw
GfAsoBT7onHto0rb3At8Fvm1mV00RjrOdcz58jFhoPwTc55wbmVT3/wL+K/AR4KsXfd8G4MvAR6eoe8LVwB
rnXHv8mP8DOAL8KTAIrHPOHY1v+yywD/iomf2Fc643foz74x9f55w7MvngZlZ9aT+y+JpzTq8sewFullf3R
fs/EH//b6c5XlN8+1kgb4rtN8e3vzTN9z8f335bouecw886cZwHZtjnMDAAFE6xLTe+7deT3iuOH7MfKJvm
mD+M7/PeKbZ9P77tk1Ns+
+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
wyNjSe1m2TCitoSbl1Zzb/
+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
sLeavHj/A8Ni41+VIllJwp4Gx8Sh/
+fgBltUUccNSzUmSzkLBAJ+7+2pauwb5Rz2UIx5RcKeBhze3cqxjgD+5azVBzUmS9m5aUc071y3in589xrG
Ofq/LkSyk4PZY18Aof/PEIW5aXsWbVtd6XY4k6E/etpq
8nAB/
+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
XlcU1/G1fVlrI2/FpS+
+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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot the histogram of the error terms\n",
"fig = plt.figure()\n",
"sns.distplot((y_train - y_train_price), bins = 20)\n",
"fig.suptitle('Error Terms', fontsize = 20) # Plot heading
\n",
"plt.xlabel('Errors', fontsize = 18) # X-label"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Making Predictions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Applying the scaling on the test sets"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking','price']\n",
"\n",
"df_test[num_vars] = scaler.transform(df_test[num_vars])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Dividing into X_test and y_test"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"y_test = df_test.pop('price')\n",
"X_test = df_test"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"# Now let's use our model to make predictions.\n",
"\n",
"# Creating X_test_new dataframe by dropping variables from X_test\n",
"X_test_new = X_test[X_train_new.columns]\n",
"\n",
"# Adding a constant variable \n",
"X_test_new = sm.add_constant(X_test_new)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Making predictions\n",
"y_pred = lm.predict(X_test_new)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'y_pred')"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAAYsAAAErCAYAAAAv/K9lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEg
AACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0c
GxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XuYHGWZ9/HvnWECE1QGJR4YCIkrREFcsoyAiwfAQ1A0ZAWF
iK64rLi6LIKY3bC6EFgP0bwK6rJoRN8gKgQEY9DsFVcBDxHYDAbEAIEAgWSia4QEX8mQTJL7/aOqQ6Wnqqu
qp7qre/r3ua65ZrqquuqZTqbueu7nZO6OiIhILePKLoCIiLQ+BQsREUmlYCEiIqkULEREJJWChYiIpFKwEB
GRVAoWIlI6M1trZmvLLockU7CQhjOzyWbmZrawhGvPDa99XLOvLTKWKFiIiEgqBQsREUmlYCEAmNnLw3TNL
TWOudfMhs3sxTnOOxd4NHz5/vAala8zq46dbmZLzeyPZrbVzB42s/lm1htz3leZ2bVhrnurmW00s1+b2eVm
1h0esxa4OHzLrdFrp5R5VnjcFxP272lmm8zs92a2R7htvJmdG5Zhk5ltCcv2AzN7U4bP6brwmq9P2H9quP8
raeeKee/C8L0vNbOPmdkDZvaMma03s8vM7Hkx71kbfj3PzL4Y/jwc/ntWjtnDzD5iZneY2Z/C33mlmZ1jZi
PuLRY4x8xWhdcfNLP/MLN98v5O0nx7lF0AaQ3u/oCZ3Qocb2aHuPuD0f1m9tfAK4Eb3f33OU59G9ALfBS4B
1gc2Xd35PwXAZcATwI/BP4AvAr4OPA2M3uNu/8pPPZVwJ2AA0sIgtHzgJcBHwE+CQwDlwMzgTcAVwNrM5b5
+8BTwBlm9s/uvr1q/8nh7/SFyL6FwCzgt8C3gCFgf+C1wInAT1Ku+Z/AacCHgJ/H7D87/L4g4+8Q5zLg9cD
1wA+A6cB5wOvM7LXu/kzV8eOBW4DnAz8G/kQY+MOAfHN4jtXAd4FngOOBrwBHA+
+rOt/lwLnA78LfY5jgszw6vNa2Ufxu0mjuri994e4ApxLcgP9PzL6F4b4313HeyeF7FybsPz7c/yugt2rfm
eG+yyLbvhBuOznmXPsC4yKv54bHHpezzF8L3/f2mH0/CvcdHr7eB9gJDABdMce/IOM1f0tww92vavuU8PzL
6/x3rfzb/RE4KLJ9HHBjuO/fqt6zNtz+E2DvmHNWPtevRH9noAv4RvW/D/DX4bY1wPMj2/cCbg/3rS37b0B
fyV9KQ0nUYmADcKaZ7VnZGKaB3g08TPoTcj3ODb9/0N03R3e4+0KCGsgZMe8bqt7g7pvcfWcBZbo6/P7+6M
YwBTcdWOnu91YuCxiwleCmXl2mJzJe80pgz+prEtQqjCCAjcaX3P2xSLl2ArMJyvx3Ce+5wN2fjm4IU0znA
L8Hznf3HZFz7gAuIPhMov9mHwi/f9rdn4wc/wxwYd2/kTSN0lCyi7tvN7OrgIuAUwhSCxCkE3qABR4+Dhbs
NQQpiXeZ2bti9o8HJprZC8Ib7yKCtNZiM/seQQBb7u4PF1Ugd/
+VmT0IvMPM9nX3TeGuMwienhdGjv2Tmd0MvAO428xuBH4B3OnuW3Jc9lvAPILg8AXYle45E9hEkD4ajZ9Vb
3D3R8xsHTDZzHqrgvUzwG9iznMI8ALgIeCTZhZ3rSHgFZHXf5VUBoLPqjrVJ62m7KqNvlrrC+gjuHH/LLLt
XoKn5ol1nnMytdNQw+H+tK+DIu95DUHbxpbI/geAWVXnnksdaajwvf8avvfDkW2/IcitT6w6tie81oOR8gw
B1wAvynHNK8P3Hh+
+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
/
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
CePlpR+w6f62R5N+
+4/Fd04TscOfbdzzOJxffm/E3LIYmCBSpTxnBYgVwsJlNMbPxwOnAkugBZjYN+BpBoPhDCWVsmHry+Vnek/
UmuHjlYGzVLioph/
+pmYenTtuR9wn92jvXpR9UIE1LIVIf84zz/BR6UbO3AZcTdJ39prt/2swuBQbcfYmZ/QQ4HPhd+JbH3X1Gr
XP29/f7wMBAQ8udRVK3zMUrB7nk5lW7RmRX9HR31bxZxQ3W6+nu4pQj+7j1gY27XQfSZ0k9dt4tmXpdGfDo
vJNy/vbJ5a3VnrK2juuISDHM7C537087rpRxFu6+FFhate2iyM9vanqhCpDULXPgsScTp/ZOG5uQ1AbwnTs
eH7GO9ilHpj8d5+nVVI+kqU+SZqrtsrR6joi0Ak33UaDEG/udj1OrAlfrBp60r/p0SQEEGJEmSqtZjDaHH9
dQP/DYk3z7jsdHHDvr6ANHbBOR1qPpPgqUeGNPyfTt09Od2CaR5wk/LoBUtz3EtW10dxm9Pd27cvinHNnH/
GWrCx0n8amZh/PeYybtqkl0mfHeYyY1vTeUiNRHNYsCZR2FHdU9znh62/Zd02dU1wiyrJ9dS3V50mbIbeQI
50/NPFzBQaRNKVgUaPb0qZy36O7Mx/f2dGPGiEbvaDtG5Qad57xRcS0CtcZz5FlxT0Q6h9JQBZo5rY/enu7
YfftO6N6tu+blpx3B3Re/hc1bRk7IB7untGZO60ucSTZN3r5uGuEsInFUswgVNRPp3BmHxXYdvfgd8QsDZR
lRvHjlIFsi04FXVK9rXQSNcBaROKpZMHISvtHMZ5R30FfaYLpK2apTVb093ZkCRd6eqRrhLCJxVLOg+Dx9n
jme0hqckyYI3HvPPdh7zz1SG9Tdg4BTVHlEpDMpWFB+nr5WcKlVtjOOmbTb2IokSb2ZklJvo5nQUETGJqWh
SM7HF5mnr3eNh6Qy9E7o5sa7BjOlooaGd3DJzatGlKeVpxIXkdaiYEHj8/SjuTEnlc2dXGMvNm0Z3u16WgR
IRPJQsCBbo/RoVn8bzY05qWxPxayBnaUcFXlTb628+p2INJ7aLEK18vSjHdVca42HKXN+lNqIHFe2+ctW5x
4tXinH4pWDjDOLndgvLu2ldatFRDWLDJJqBhdcf0+mJ+3eCfED9YDd0lKfXHxv5qf32dOnpq5LUa2yPvaFN
90bGyiSUm9KWYmIahZV4noIJdUMKjfc6JM2jOx2ujVD20LSrLEDjz05Yt2KSk0j7xQgT2/dziU3r4pt6+gy
SxwPUnZvMREpn4JFxOKVg8y+4R6Gdz4bBGbfcA+9E7pHDIqrVulx9MzwzhHpmqHhnZmun3fa8d6e7l0TEMY
ZZ7AzctJax+50T0wpaVS3iCgNFTF3yapdgaJieKfzzPCOET2S4mzaMhybrhmNWtOO1xqdbcDz9kpOf1Wrde
PXqG4RKSVYmNmJZrbazNaY2ZyY/a83s1+b2XYzO7VZ5Up68h4a3rlbj6RGrO6W54yV9E/SJIQAf/0Xz8/cY
yrtxq91q0Wk6WkoM+sCrgDeDKwHVpjZEne/L3LY48CZwMebXb4k0R5JSetM77nHuNiAs+
+Ebp7aMkx1MmrfCd1s3jLM/r09HP/yiSxasY7hHenD7Cq1gFrrZ/z68aeYML6Lp7eNrNlM6B7HvnvvmWs6j
0aM6i5q8kYRabwy2iyOAta4+yMAZnYdcDKwK1i4+9pwX7Zkf0H2TWibGGe7z6+UNH8SEBtETnrVS1i0Yh07
I4Ggu8t2m4l28cpBFv3PutQyRmsBtRZGGhrekVhbGb9HF8vnnJB6rUZSd1yR9lJGsOgDonfF9cDRJZRjhIv
fcRizv3fPiKf7nT5yfqW0BYSiQWT+stUjzjm8w3ebqHD+stUj2kuq9VU9factjJR0tnoG9BVNiyyJtJcygk
XcA29dyzKY2dnA2QCTJk0aTZmAZ2+
+F1x/z4hxCFlvZHFB5PyEm3m062mWbqjVtYFKGidJV46Bd82m7rgi7aWMBu71wIGR1wcAG+o5kbsvcPd+d+
+fOHFiIYWbOa2PnTE3WKj/RpZlosK0G3h1o3p0vqk4Pd1dzDr6wJbtxdSMyRtFpDhlBIsVwMFmNsXMxgOnA
0tKKEeiom9kWbqexh0TVV1DSFrnAoKFkfbqHsd37nicvbrHBWt901q9mNQdV6S9ND1YuPt24BxgGXA/cL27
rzKzS81sBoCZvdrM1gPvAr5mZquSz1i8om9kWbqeVo5J6pZbvQZ3rVrO1u072bRlGCcY+7F1+04uO+0Ils8
5oSUCBag7rki7MU9IubSb/v5+HxgYKOx8ZXXrTOqWW30jPXbeLbEpqKR2ir7ensQeUOrCKtK5zOwud+9PO0
7TfSQoa7W4aO+owc1DdJntNmq7sj+u22xPd1diaqrW1OPqwioiaTTdRwuaOa1vVyqserLCyky0SWmc6nRVR
VJ7S54ZZbWmhUjnUs2iRWUZh5BU+4mrcSS1t2TtwqoaiEhnU82iRdVaMKnWE33ehuOsPb+0poVIZ1PNokXV
mvcp7Yk+T3tLUttHdU1Eg+hEOptqFk1QT66/1riLIp/os9ZENIhOpLOpZtFg9eb60+Z9KvKJPktNJGsNRET
GJtUsGmw0uf6Z0/py925qFA2iE+lsqlk02Ghz/a30RF/W2BMRKZ9qFg022ly/nuhFpBWoZtFgRdQM9EQvIm
VTsGiwpFX1dPMXkXaiYNEEqhmISLtTm4WIiKRSsBARkVQKFiIikkrBQkREUpUSLMzsRDNbbWZrzGxOzP49z
WxRuP9OM5vc/FKKiEhF04OFmXUBVwBvBQ4FZpnZoVWHnQVscveXAZcBn2tuKUVEJKqMmsVRwBp3f8TdtwHX
ASdXHXMycHX48/eAN5qZNbGMIiISUUaw6APWRV6vD7fFHuPu24GngBdUn8jMzjazATMb2LhxY4OKKyIiZQS
LuBqC13EM7r7A3fvdvX/ixImFFE5EREYqYwT3euDAyOsDgA0Jx6w3sz2AfYAna530rrvu+qOZPTaKcu0H/H
EU7x9L9FkE9DkE9DkExurncFCWg8oIFiuAg81sCjAInA68p+qYJcD7gduBU4Fb3H1EzSLK3UdVtTCzAXfvH
805xgp9FgF9DgF9DoFO/xyaHizcfbuZnQMsA7qAb7r7KjO7FBhw9yXAN4BrzGwNQY3i9GaXU0REnlXKRILu
vhRYWrXtosjPzwDvana5REQknkZwP2tB2QVoIfosAvocAvocAh39OVhKU4CIiIhqFiIikq7jgoXmpQpk+Bw
+Zmb3mdlvzOynZpape127SfscIsedamZuZmOyN0yWz8HM3h3+n1hlZt9tdhmbJcPfxiQzu9XMVoZ/H28ro5
xN5+4d80XQ+
+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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting y_test and y_pred to understand the spread.\n",
"fig = plt.figure()\n",
"plt.scatter(y_test,y_pred)\n",
"fig.suptitle('y_test vs y_pred', fontsize=20) # Plot heading \n",
"plt.xlabel('y_test', fontsize=18) # X-label\n",
"plt.ylabel('y_pred', fontsize=16) # Y-label"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

You might also like