You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1072 lines
67 KiB
1072 lines
67 KiB
2 years ago
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"___\n",
|
||
|
"\n",
|
||
|
"<a href='http://www.pieriandata.com'><img src='../Pierian_Data_Logo.png'/></a>\n",
|
||
|
"___\n",
|
||
|
"<center><em>Copyright by Pierian Data Inc.</em></center>\n",
|
||
|
"<center><em>For more information, visit us at <a href='http://www.pieriandata.com'>www.pieriandata.com</a></em></center>"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"# Linear Regression with SciKit-Learn\n",
|
||
|
"\n",
|
||
|
"We saw how to create a very simple best fit line, but now let's greatly expand our toolkit to start thinking about the considerations of overfitting, underfitting, model evaluation, as well as multiple features!"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Imports"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stderr",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\statsmodels\\tools\\_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
|
||
|
" import pandas.util.testing as tm\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"import numpy as np\n",
|
||
|
"import pandas as pd\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"import seaborn as sns"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Sample Data\n",
|
||
|
"\n",
|
||
|
"This sample data is from ISLR. It displays sales (in thousands of units) for a particular product as a function of advertising budgets (in thousands of dollars) for TV, radio, and newspaper media."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 3,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"df = pd.read_csv(\"Advertising.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>TV</th>\n",
|
||
|
" <th>radio</th>\n",
|
||
|
" <th>newspaper</th>\n",
|
||
|
" <th>sales</th>\n",
|
||
|
" </tr>\n",
|
||
|
" </thead>\n",
|
||
|
" <tbody>\n",
|
||
|
" <tr>\n",
|
||
|
" <th>0</th>\n",
|
||
|
" <td>230.1</td>\n",
|
||
|
" <td>37.8</td>\n",
|
||
|
" <td>69.2</td>\n",
|
||
|
" <td>22.1</td>\n",
|
||
|
" </tr>\n",
|
||
|
" <tr>\n",
|
||
|
" <th>1</th>\n",
|
||
|
" <td>44.5</td>\n",
|
||
|
" <td>39.3</td>\n",
|
||
|
" <td>45.1</td>\n",
|
||
|
" <td>10.4</td>\n",
|
||
|
" </tr>\n",
|
||
|
" <tr>\n",
|
||
|
" <th>2</th>\n",
|
||
|
" <td>17.2</td>\n",
|
||
|
" <td>45.9</td>\n",
|
||
|
" <td>69.3</td>\n",
|
||
|
" <td>9.3</td>\n",
|
||
|
" </tr>\n",
|
||
|
" <tr>\n",
|
||
|
" <th>3</th>\n",
|
||
|
" <td>151.5</td>\n",
|
||
|
" <td>41.3</td>\n",
|
||
|
" <td>58.5</td>\n",
|
||
|
" <td>18.5</td>\n",
|
||
|
" </tr>\n",
|
||
|
" <tr>\n",
|
||
|
" <th>4</th>\n",
|
||
|
" <td>180.8</td>\n",
|
||
|
" <td>10.8</td>\n",
|
||
|
" <td>58.4</td>\n",
|
||
|
" <td>12.9</td>\n",
|
||
|
" </tr>\n",
|
||
|
" </tbody>\n",
|
||
|
"</table>\n",
|
||
|
"</div>"
|
||
|
],
|
||
|
"text/plain": [
|
||
|
" TV radio newspaper sales\n",
|
||
|
"0 230.1 37.8 69.2 22.1\n",
|
||
|
"1 44.5 39.3 45.1 10.4\n",
|
||
|
"2 17.2 45.9 69.3 9.3\n",
|
||
|
"3 151.5 41.3 58.5 18.5\n",
|
||
|
"4 180.8 10.8 58.4 12.9"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 4,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"df.head()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Everything BUT the sales column\n",
|
||
|
"X = df.drop('sales',axis=1)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"y = df['sales']"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## SciKit Learn \n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Polynomial Regression"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**From Preprocessing, import PolynomialFeatures, which will help us transform our original data set by adding polynomial features**\n",
|
||
|
"\n",
|
||
|
"We will go from the equation in the form (shown here as if we only had one x feature):\n",
|
||
|
"\n",
|
||
|
"$$\\hat{y} = \\beta_0 + \\beta_1x_1 + \\epsilon $$\n",
|
||
|
"\n",
|
||
|
"and create more features from the original x feature for some *d* degree of polynomial.\n",
|
||
|
"\n",
|
||
|
"$$\\hat{y} = \\beta_0 + \\beta_1x_1 + \\beta_1x^2_1 + ... + \\beta_dx^d_1 + \\epsilon$$\n",
|
||
|
"\n",
|
||
|
"Then we can call the linear regression model on it, since in reality, we're just treating these new polynomial features x^2, x^3, ... x^d as new features. Obviously we need to be careful about choosing the correct value of *d* , the degree of the model. Our metric results on the test set will help us with this!\n",
|
||
|
"\n",
|
||
|
"**The other thing to note here is we have multiple X features, not just a single one as in the formula above, so in reality, the PolynomialFeatures will also take *interaction* terms into account for example, if an input sample is two dimensional and of the form [a, b], the degree-2 polynomial features are [1, a, b, a^2, ab, b^2].**"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 7,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from sklearn.preprocessing import PolynomialFeatures"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 8,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"polynomial_converter = PolynomialFeatures(degree=2,include_bias=False)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 9,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Converter \"fits\" to data, in this case, reads in every X column\n",
|
||
|
"# Then it \"transforms\" and ouputs the new polynomial data\n",
|
||
|
"poly_features = polynomial_converter.fit_transform(X)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 10,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"(200, 9)"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 10,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"poly_features.shape"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 11,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"(200, 3)"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 11,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"X.shape"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 12,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"TV 230.1\n",
|
||
|
"radio 37.8\n",
|
||
|
"newspaper 69.2\n",
|
||
|
"Name: 0, dtype: float64"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 12,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"X.iloc[0]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 13,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"array([2.301000e+02, 3.780000e+01, 6.920000e+01, 5.294601e+04,\n",
|
||
|
" 8.697780e+03, 1.592292e+04, 1.428840e+03, 2.615760e+03,\n",
|
||
|
" 4.788640e+03])"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 13,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"poly_features[0]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 14,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"array([230.1, 37.8, 69.2])"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 14,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"poly_features[0][:3]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 15,
|
||
|
"metadata": {
|
||
|
"scrolled": true
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"array([52946.01, 1428.84, 4788.64])"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 15,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"poly_features[0][:3]**2"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"The interaction terms $$x_1 \\cdot x_2 \\text{ and } x_1 \\cdot x_3 \\text{ and } x_2 \\cdot x_3 $$"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 16,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"8697.779999999999"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 16,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"230.1*37.8"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 17,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"15922.92"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 17,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"230.1*69.2"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 18,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"2615.7599999999998"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 18,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"37.8*69.2"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Train | Test Split\n",
|
||
|
"\n",
|
||
|
"Make sure you have watched the Machine Learning Overview videos on Supervised Learning to understand why we do this step"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 19,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from sklearn.model_selection import train_test_split"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 20,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# random_state: \n",
|
||
|
"# https://stackoverflow.com/questions/28064634/random-state-pseudo-random-number-in-scikit-learn\n",
|
||
|
"X_train, X_test, y_train, y_test = train_test_split(poly_features, y, test_size=0.3, random_state=101)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Model for fitting on Polynomial Data\n",
|
||
|
"\n",
|
||
|
"#### Create an instance of the model with parameters"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 22,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from sklearn.linear_model import LinearRegression"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 23,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"model = LinearRegression(fit_intercept=True)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Fit/Train the Model on the training data\n",
|
||
|
"\n",
|
||
|
"**Make sure you only fit to the training data, in order to fairly evaluate your model's performance on future data**"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 24,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 24,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"model.fit(X_train,y_train)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"\n",
|
||
|
"-----\n",
|
||
|
"\n",
|
||
|
"## Evaluation on the Test Set"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Calculate Performance on Test Set\n",
|
||
|
"\n",
|
||
|
"We want to fairly evaluate our model, so we get performance metrics on the test set (data the model has never seen before)."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 25,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"test_predictions = model.predict(X_test)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 26,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from sklearn.metrics import mean_absolute_error,mean_squared_error"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 27,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"MAE = mean_absolute_error(y_test,test_predictions)\n",
|
||
|
"MSE = mean_squared_error(y_test,test_predictions)\n",
|
||
|
"RMSE = np.sqrt(MSE)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 28,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"0.489679804480361"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 28,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"MAE"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 29,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"0.4417505510403426"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 29,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"MSE"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 30,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"0.6646431757269028"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 30,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"RMSE"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 31,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"14.022500000000003"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 31,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"df['sales'].mean()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Comparison with Simple Linear Regression\n",
|
||
|
"\n",
|
||
|
"**Results on the Test Set (Note: Use the same Random Split to fairly compare!)**\n",
|
||
|
"\n",
|
||
|
"* Simple Linear Regression:\n",
|
||
|
" * MAE: 1.213\n",
|
||
|
" * RMSE: 1.516\n",
|
||
|
"\n",
|
||
|
"* Polynomial 2-degree:\n",
|
||
|
" * MAE: 0.4896\n",
|
||
|
" * RMSE: 0.664"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"---\n",
|
||
|
"---\n",
|
||
|
"## Choosing a Model\n",
|
||
|
"\n",
|
||
|
"### Adjusting Parameters\n",
|
||
|
"\n",
|
||
|
"Are we satisfied with this performance? Perhaps a higher order would improve performance even more! But how high is too high? It is now up to us to possibly go back and adjust our model and parameters, let's explore higher order Polynomials in a loop and plot out their error. This will nicely lead us into a discussion on Overfitting.\n",
|
||
|
"\n",
|
||
|
"Let's use a for loop to do the following:\n",
|
||
|
"\n",
|
||
|
"1. Create different order polynomial X data\n",
|
||
|
"2. Split that polynomial data for train/test\n",
|
||
|
"3. Fit on the training data\n",
|
||
|
"4. Report back the metrics on *both* the train and test results\n",
|
||
|
"5. Plot these results and explore overfitting"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 32,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# TRAINING ERROR PER DEGREE\n",
|
||
|
"train_rmse_errors = []\n",
|
||
|
"# TEST ERROR PER DEGREE\n",
|
||
|
"test_rmse_errors = []\n",
|
||
|
"\n",
|
||
|
"for d in range(1,10):\n",
|
||
|
" \n",
|
||
|
" # CREATE POLY DATA SET FOR DEGREE \"d\"\n",
|
||
|
" polynomial_converter = PolynomialFeatures(degree=d,include_bias=False)\n",
|
||
|
" poly_features = polynomial_converter.fit_transform(X)\n",
|
||
|
" \n",
|
||
|
" # SPLIT THIS NEW POLY DATA SET\n",
|
||
|
" X_train, X_test, y_train, y_test = train_test_split(poly_features, y, test_size=0.3, random_state=101)\n",
|
||
|
" \n",
|
||
|
" # TRAIN ON THIS NEW POLY SET\n",
|
||
|
" model = LinearRegression(fit_intercept=True)\n",
|
||
|
" model.fit(X_train,y_train)\n",
|
||
|
" \n",
|
||
|
" # PREDICT ON BOTH TRAIN AND TEST\n",
|
||
|
" train_pred = model.predict(X_train)\n",
|
||
|
" test_pred = model.predict(X_test)\n",
|
||
|
" \n",
|
||
|
" # Calculate Errors\n",
|
||
|
" \n",
|
||
|
" # Errors on Train Set\n",
|
||
|
" train_RMSE = np.sqrt(mean_squared_error(y_train,train_pred))\n",
|
||
|
" \n",
|
||
|
" # Errors on Test Set\n",
|
||
|
" test_RMSE = np.sqrt(mean_squared_error(y_test,test_pred))\n",
|
||
|
"\n",
|
||
|
" # Append errors to lists for plotting later\n",
|
||
|
" \n",
|
||
|
" \n",
|
||
|
" train_rmse_errors.append(train_RMSE)\n",
|
||
|
" test_rmse_errors.append(test_RMSE)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 33,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"<matplotlib.legend.Legend at 0x168c0d109c8>"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 33,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"plt.plot(range(1,6),train_rmse_errors[:5],label='TRAIN')\n",
|
||
|
"plt.plot(range(1,6),test_rmse_errors[:5],label='TEST')\n",
|
||
|
"plt.xlabel(\"Polynomial Complexity\")\n",
|
||
|
"plt.ylabel(\"RMSE\")\n",
|
||
|
"plt.legend()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 34,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"<matplotlib.legend.Legend at 0x168c1d7df08>"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 34,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"plt.plot(range(1,10),train_rmse_errors,label='TRAIN')\n",
|
||
|
"plt.plot(range(1,10),test_rmse_errors,label='TEST')\n",
|
||
|
"plt.xlabel(\"Polynomial Complexity\")\n",
|
||
|
"plt.ylabel(\"RMSE\")\n",
|
||
|
"plt.legend()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 35,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"<matplotlib.legend.Legend at 0x168c41e5a88>"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 35,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"plt.plot(range(1,10),train_rmse_errors,label='TRAIN')\n",
|
||
|
"plt.plot(range(1,10),test_rmse_errors,label='TEST')\n",
|
||
|
"plt.xlabel(\"Polynomial Complexity\")\n",
|
||
|
"plt.ylabel(\"RMSE\")\n",
|
||
|
"plt.ylim(0,100)\n",
|
||
|
"plt.legend()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Finalizing Model Choice\n",
|
||
|
"\n",
|
||
|
"There are now 2 things we need to save, the Polynomial Feature creator AND the model itself. Let's explore how we would proceed from here:\n",
|
||
|
"\n",
|
||
|
"1. Choose final parameters based on test metrics\n",
|
||
|
"2. Retrain on all data\n",
|
||
|
"3. Save Polynomial Converter object\n",
|
||
|
"4. Save model"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 42,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Based on our chart, could have also been degree=4, but \n",
|
||
|
"# it is better to be on the safe side of complexity\n",
|
||
|
"final_poly_converter = PolynomialFeatures(degree=3,include_bias=False)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 43,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"final_model = LinearRegression()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 45,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 45,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"final_model.fit(final_poly_converter.fit_transform(X),y)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Saving Model and Converter"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 46,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from joblib import dump, load"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 49,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"['sales_poly_model.joblib']"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 49,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"dump(final_model, 'sales_poly_model.joblib') "
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 50,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"['poly_converter.joblib']"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 50,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"dump(final_poly_converter,'poly_converter.joblib')"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Deployment and Predictions"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Prediction on New Data\n",
|
||
|
"\n",
|
||
|
"Recall that we will need to **convert** any incoming data to polynomial data, since that is what our model is trained on. We simply load up our saved converter object and only call **.transform()** on the new data, since we're not refitting to a new data set.\n",
|
||
|
"\n",
|
||
|
"**Our next ad campaign will have a total spend of 149k on TV, 22k on Radio, and 12k on Newspaper Ads, how many units could we expect to sell as a result of this?**"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 62,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"loaded_poly = load('poly_converter.joblib')\n",
|
||
|
"loaded_model = load('sales_poly_model.joblib')"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 63,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"campaign = [[149,22,12]]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 64,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"campaign_poly = loaded_poly.transform(campaign)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 65,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"array([[1.490000e+02, 2.200000e+01, 1.200000e+01, 2.220100e+04,\n",
|
||
|
" 3.278000e+03, 1.788000e+03, 4.840000e+02, 2.640000e+02,\n",
|
||
|
" 1.440000e+02, 3.307949e+06, 4.884220e+05, 2.664120e+05,\n",
|
||
|
" 7.211600e+04, 3.933600e+04, 2.145600e+04, 1.064800e+04,\n",
|
||
|
" 5.808000e+03, 3.168000e+03, 1.728000e+03]])"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 65,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"campaign_poly"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 67,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"array([14.64501014])"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 67,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"final_model.predict(campaign_poly)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"-----\n",
|
||
|
"---"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"anaconda-cloud": {},
|
||
|
"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.4"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 1
|
||
|
}
|