{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Univariate Linear Regression Demo\n",
"\n",
"_Source: 🤖[Homemade Machine Learning](https://github.com/trekhleb/homemade-machine-learning) repository_\n",
"\n",
"> ☝Before moving on with this demo you might want to take a look at:\n",
"> - 📗[Math behind the Linear Regression](https://github.com/trekhleb/homemade-machine-learning/tree/master/homemade/linear_regression)\n",
"> - ⚙️[Linear Regression Source Code](https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/linear_regression/linear_regression.py)\n",
"\n",
"**Linear regression** is a linear model, e.g. a model that assumes a linear relationship between the input variables `(x)` and the single output variable `(y)`. More specifically, that output variable `(y)` can be calculated from a linear combination of the input variables `(x)`.\n",
"\n",
"**Univariate Linear Regression** is a linear regression that has only _one_ input parameter and one output label.\n",
"\n",
"> **Demo Project:** In this demo we will build a model that will predict `Happiness.Score` for the countries based on `Economy.GDP.per.Capita` parameter."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# To make debugging of linear_regression module easier we enable imported modules autoreloading feature.\n",
"# By doing this you may change the code of linear_regression library and all these changes will be available here.\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"# Add project root folder to module loading paths.\n",
"import sys\n",
"sys.path.append('../..')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import Dependencies\n",
"\n",
"- [pandas](https://pandas.pydata.org/) - library that we will use for loading and displaying the data in a table\n",
"- [numpy](http://www.numpy.org/) - library that we will use for linear algebra operations\n",
"- [matplotlib](https://matplotlib.org/) - library that we will use for plotting the data\n",
"- [linear_regression](https://github.com/trekhleb/homemade-machine-learning/blob/master/src/linear_regression/linear_regression.py) - custom implementation of linear regression"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Import 3rd party dependencies.\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Import custom linear regression implementation.\n",
"from homemade.linear_regression import LinearRegression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load the Data\n",
"\n",
"In this demo we will use [World Happindes Dataset](https://www.kaggle.com/unsdsn/world-happiness#2017.csv) for 2017."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Print histograms for each feature to see how they vary.\n",
"histohrams = data.hist(grid=False, figsize=(10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Split the Data Into Training and Test Subsets\n",
"\n",
"In this step we will split our dataset into _training_ and _testing_ subsets (in proportion 80/20%).\n",
"\n",
"Training data set will be used for training of our linear model. Testing dataset will be used for validating of the model. All data from testing dataset will be new to model and we may check how accurate are model predictions."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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9Xud8C61O+qY8OhKgJSU87zltVz/+Grq6vc2tXv946tTbrcQyHmTTjbZvn071dXVVFdX07lzZ7p27dr0ec+ePb7auPTSS1m/fn3MOvfeey8PPvhgOkRm8ODB9OjRg759+9KzZ0+uuuoqdu7cGfOcxsZGpk2blpb+w3n88cdZt25d2ts1CoObnlzbpOxD1O9Vbnpybczz5i2vZdC0hRw28SkGTVvIvOW1zY5PX7C+SdmHqKvfy/QFsf8PiwGb4cegQ4cOrFixAoApU6aw//77c8011zSro6qoKiUl3mPn73//+7j9XHnllakLG8bs2bObBqVrr72W0aNH88ILL0StH1L4EydOTKscjz/+OCUlJfTs2TOt7Rp5yKo58MJU2LkJ2naDIZP4bLd39sjPdtdHbcbP7H3zDu+cNdHKi4mCm+HHG/3TwTvvvEOvXr347ne/S+/evfn4448ZO3YsNTU19O7dm6lTpzbVHTx4MCtWrKChoYGqqiomTpxIv379OP744/n0008BuPHGG7nzzjub6k+cOJGBAwfSo0cPXn31VQC+/PJLzjnnHHr16sW5555LTU1N02AUjdatW/PLX/6SDRs2sHatM2saOXIkRx99NL1792bWLCf3xsSJE9m1axfV1dVcfPHFUes1NDTwve99jz59+nDUUUdx9913A7BhwwaGDRvG0Ucfzbe//W3efvttXn75ZZ5++mnGjx9PdXU1H3zwQZruvpF3rJoDT46DnRsBdf4+OY6zShJNcOZv9t6lqsLz3GjlxURBzfAzabtbt24df/jDH6ipqQFg2rRptG/fnoaGBk4++WTOPfdcevXq1eycnTt3cuKJJzJt2jSuvvpq7r//fs9ZtaqyZMkS5s+fz9SpU3nmmWe455576Ny5M4899hgrV65kwIABvuRs1aoVffv2Zd26dfTu3ZsHHniA9u3bs3v3bmpqajjnnHOYNm0as2bNajaAeNV7++232bZtG6tXO/d0xw4n7evYsWOZNWsWRxxxBIsWLeLHP/4xzz77LGeeeSbnnnsuo0bFynFuFDwvTIX6iNl1fR0TW89h/leDW1Svqoi+N8PP7H3CsB7N9ABARVkpE4b1SFDwwqOgZviZtN0dccQRTcoe4KGHHmLAgAEMGDCAt956izfffLPFORUVFZxxxhkAHH300VFnvaNHj25R55VXXuGCCy4AoF+/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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Split data set on training and test sets with proportions 80/20.\n",
"# Function sample() returns a random sample of items.\n",
"train_data = data.sample(frac=0.8)\n",
"test_data = data.drop(train_data.index)\n",
"\n",
"# Decide what fields we want to process.\n",
"input_param_name = 'Economy..GDP.per.Capita.'\n",
"output_param_name = 'Happiness.Score'\n",
"\n",
"# Split training set input and output.\n",
"x_train = train_data[[input_param_name]].values\n",
"y_train = train_data[[output_param_name]].values\n",
"\n",
"# Split test set input and output.\n",
"x_test = test_data[[input_param_name]].values\n",
"y_test = test_data[[output_param_name]].values\n",
"\n",
"# Plot training data.\n",
"plt.scatter(x_train, y_train, label='Training Dataset')\n",
"plt.scatter(x_test, y_test, label='Test Dataset')\n",
"plt.xlabel(input_param_name)\n",
"plt.ylabel(output_param_name)\n",
"plt.title('Countries Happines')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we may visualize the data sets to see theirs shape."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Init and Train Linear Regression Model\n",
"\n",
"> ☝🏻This is the place where you might want to play with model configuration.\n",
"\n",
"- `polynomial_degree` - this parameter will allow you to add additional polynomial features of certain degree. More features - more curved the line will be.\n",
"- `num_iterations` - this is the number of iterations that gradient descent algorithm will use to find the minimum of a cost function. Low numbers may prevent gradient descent from reaching the minimum. High numbers will make the algorithm work longer without improving its accuracy.\n",
"- `learning_rate` - this is the size of the gradient descent step. Small learning step will make algorithm work longer and will probably require more iterations to reach the minimum of the cost function. Big learning steps may couse missing the minimum and growth of the cost function value with new iterations.\n",
"- `regularization_param` - parameter that will fight overfitting. The higher the parameter, the simplier is the model will be.\n",
"- `polynomial_degree` - the degree of additional polynomial features (`x1^2 * x2, x1^2 * x2^2, ...`). This will allow you to curve the predictions.\n",
"- `sinusoid_degree` - the degree of sinusoid parameter multipliers of additional features (`sin(x), sin(2*x), ...`). This will allow you to curve the predictions by adding sinusoidal component to the prediction curve."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Initial cost: 226677.33\n",
"Optimized cost: 3143.57\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Model Parameters
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
5.419745
\n",
"
\n",
"
\n",
"
1
\n",
"
0.932169
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Model Parameters\n",
"0 5.419745\n",
"1 0.932169"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Set up linear regression parameters.\n",
"num_iterations = 500 # Number of gradient descent iterations.\n",
"regularization_param = 0 # Helps to fight model overfitting.\n",
"learning_rate = 0.01 # The size of the gradient descent step.\n",
"polynomial_degree = 0 # The degree of additional polynomial features.\n",
"sinusoid_degree = 0 # The degree of sinusoid parameter multipliers of additional features.\n",
"\n",
"# Init linear regression instance.\n",
"linear_regression = LinearRegression(x_train, y_train, polynomial_degree, sinusoid_degree)\n",
"\n",
"# Train linear regression.\n",
"(theta, cost_history) = linear_regression.train(\n",
" learning_rate,\n",
" regularization_param,\n",
" num_iterations\n",
")\n",
"\n",
"# Print training results.\n",
"print('Initial cost: {:.2f}'.format(cost_history[0]))\n",
"print('Optimized cost: {:.2f}'.format(cost_history[-1]))\n",
"\n",
"# Print model parameters\n",
"theta_table = pd.DataFrame({'Model Parameters': theta.flatten()})\n",
"theta_table.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Analyze Gradient Descent Progress\n",
"\n",
"The plot below illustrates how the cost function value changes over each iteration. You should see it decreasing. \n",
"\n",
"In case if cost function value increases it may mean that gradient descent missed the cost function minimum and with each step it goes further away from it. In this case you might want to reduce the learning rate parameter (the size of the gradient step).\n",
"\n",
"From this plot you may also get an understanding of how many iterations you need to get an optimal value of the cost function. In current example you may see that there is no much sense to increase the number of gradient descent iterations over 500 since it will not reduce cost function significantly. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot gradient descent progress.\n",
"plt.plot(range(num_iterations), cost_history)\n",
"plt.xlabel('Iterations')\n",
"plt.ylabel('Cost')\n",
"plt.title('Gradient Descent Progress')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plot the Model Predictions\n",
"\n",
"Since our model is trained now we may plot its predictions over the training and test datasets to see how well it fits the data."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Get model predictions for the trainint set.\n",
"predictions_num = 100\n",
"x_predictions = np.linspace(x_train.min(), x_train.max(), predictions_num).reshape(predictions_num, 1);\n",
"y_predictions = linear_regression.predict(x_predictions)\n",
"\n",
"# Plot training data with predictions.\n",
"plt.scatter(x_train, y_train, label='Training Dataset')\n",
"plt.scatter(x_test, y_test, label='Test Dataset')\n",
"plt.plot(x_predictions, y_predictions, 'r', label='Prediction')\n",
"plt.xlabel('Economy..GDP.per.Capita.')\n",
"plt.ylabel('Happiness.Score')\n",
"plt.title('Countries Happines')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Calculate the value of cost function for the training and test data set. The less this value is, the better."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train cost: 3143.57\n",
"Test cost: 311.14\n"
]
}
],
"source": [
"train_cost = linear_regression.get_cost(x_train, y_train, regularization_param)\n",
"test_cost = linear_regression.get_cost(x_test, y_test, regularization_param)\n",
"\n",
"print('Train cost: {:.2f}'.format(train_cost))\n",
"print('Test cost: {:.2f}'.format(test_cost))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's now render the table of prediction values that our trained model does for unknown data (for test dataset). You should see that predicted happiness score should be quite similar to the known happiness score fron the test dataset."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"