{ "cells": [ { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: jsonschema 3.2.0 does not provide the extra 'format-nongpl'\n" ] } ], "source": [ "# Install the necessary dependencies\n", "\n", "import os\n", "import sys\n", "!{sys.executable} -m pip install --quiet pandas scikit-learn numpy matplotlib jupyterlab_myst ipython" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "license:\n", " code: MIT\n", " content: CC-BY-4.0\n", "github: https://github.com/ocademy-ai/machine-learning\n", "venue: By Ocademy\n", "open_access: true\n", "bibliography:\n", " - https://raw.githubusercontent.com/ocademy-ai/machine-learning/main/open-machine-learning-jupyter-book/references.bib\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Univariate linear regression\n", "\n", "## Introduction\n", "\n", ":::{figure} https://static-1300131294.cos.ap-shanghai.myqcloud.com/images/ml-regression/Univariate-linear-regression-intro.png\n", "---\n", "name: 'Univariate linear regression infographic'\n", "width: 90%\n", "---\n", "Infographic by [Tavishi](https://medium.com/@tavishi.1402/linear-regression-in-ml-56107a59be03)\n", ":::\n", "\n", "Regression is a statistical technique used in machine learning and statistical modeling to analyze the relationship between a dependent variable and one or more independent variables, It aims to find a mathematical equation or model that best represents the relationship between the variables.\n", "\n", "## Definition\n", "\n", "In the field of machine learning, Linear Regression is one of the fundamental algorithms used for predictive modeling. It is a supervised learning technique that establish a Linear relationship between a dependent variable and one or more independent variables. In this blog post, we will delve into the concept of Linear Regression, its underlying principles, and provide a step-by-step guide to implementing it with code.\n", "\n", ":::{figure} https://static-1300131294.cos.ap-shanghai.myqcloud.com/images/ml-regression/Univariate-linear-regression-defi.png\n", "---\n", "name: 'Linear regression definition infographic'\n", "width: 90%\n", "---\n", "Infographic by [Tavishi](https://medium.com/@tavishi.1402/linear-regression-in-ml-56107a59be03)\n", ":::\n", "\n", "Understanding Linear Regression: Linear Regression is a statistical approach that assumes a linear relationship between the input variables (independent variables) and the output variable (dependent variable). It predicts the value of the dependent variable based on the given set of independent variables. The goal is to find the best-fit line that minimizes the sum of squared errors between the predicted and actual values.\n", "\n", "The equation of a simple linear regression model can be represented as: `y = mx + c`\n", "\n", "Where:\n", "\n", "* `y` is the dependent variable (target variable)\n", "* `x` is the independent variable (input variable)\n", "* `m` is the slope of the line (coefficient)\n", "* `c` is the y-intercept (constant term)\n", "\n", "Let's build model using Linear regression.\n", "\n", "Linear regression is a supervised learining algorithm used when target / dependent variable continues real number. It establishes relationship between dependent variable and one or more independent variable x using best fit line. It work on the principle of ordinary least square (OLS)/ Mean square errror (MSE). In statistics ols is method to estimated unkown parameter of linear regression function, it's goal is to minimize sum of square difference between observed dependent variable in the given data set and those predicted by linear regression fuction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build a simple linear regression\n", "\n", "In this section, we will use a dataset containing real-life information about years of work experience and corresponding salaries. We will step-by-step explore the potential relationship between the data and eventually attempt a simple linear regression on it.\n", "\n", "### Import some libraries and the dataset." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import pandas as pd\n", "\n", "salary_dataset = pd.read_csv(\"https://static-1300131294.cos.ap-shanghai.myqcloud.com/data/Salary_Data.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Understand the basic information and structure of the dataset." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
YearsExperienceSalary
01.139343.0
11.346205.0
21.537731.0
32.043525.0
42.239891.0
\n", "
" ], "text/plain": [ " YearsExperience Salary\n", "0 1.1 39343.0\n", "1 1.3 46205.0\n", "2 1.5 37731.0\n", "3 2.0 43525.0\n", "4 2.2 39891.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# It displays the top 5 rows of the data\n", "salary_dataset.head()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 30 entries, 0 to 29\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 YearsExperience 30 non-null float64\n", " 1 Salary 30 non-null float64\n", "dtypes: float64(2)\n", "memory usage: 608.0 bytes\n" ] } ], "source": [ "# It provides some information regarding the columns in the data\n", "salary_dataset.info()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
YearsExperienceSalary
count30.00000030.000000
mean5.31333376003.000000
std2.83788827414.429785
min1.10000037731.000000
25%3.20000056720.750000
50%4.70000065237.000000
75%7.700000100544.750000
max10.500000122391.000000
\n", "
" ], "text/plain": [ " YearsExperience Salary\n", "count 30.000000 30.000000\n", "mean 5.313333 76003.000000\n", "std 2.837888 27414.429785\n", "min 1.100000 37731.000000\n", "25% 3.200000 56720.750000\n", "50% 4.700000 65237.000000\n", "75% 7.700000 100544.750000\n", "max 10.500000 122391.000000" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# It provides basic statistical characteristics of the dataset.\n", "salary_dataset.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most of the time, it is difficult to identify correlations between data if we merely rely on viewing tables. Therefore, we need to make the dataset more visually intuitive and vivid!\n", "\n", "### Visualize the salary dataset." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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kpOTzVtvvWX27NljfvjDH5rMzEzz7bffBmoKCgrMqFGjTGVlpdm+fbu55pprTFFRUeD8sWPHTFpamrnnnntMbW2tef31181ll11mXn755UDNjh07TFxcnHnmmWfM/v37TXFxsRkwYIDZu3dvl+7F4/EYScbj8YTgmwEAAH2hO7/fIQ9CXq/XzJkzx1x99dXGbreb73znO+bxxx83p06dCtT4fD6zcOFCk5aWZhISEsyECRNMfX190OccOXLEFBUVmcsvv9wkJSWZ++67zxw/fjyo5uOPPzbjx483CQkJ5sorrzTLli1r155169aZa6+91sTHx5sbbrjBbNq0qcv3QhACACD6dOf3O+TrCPUnrCMEAED0Ces6QgAAANGCIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACyLIAQAACwrLtwNANA/tPqMqhqadfh4i1IH2TU2M0WxMbZwNwsALoggBOCSldc2aklZnRo9LYFjLoddxYVZKsh2hbFlAHBhdI0BuCTltY2auaY6KARJktvToplrqlVe2ximlgHAxRGEAPRYq89oSVmdTAfn/MeWlNWp1ddRBQCEH0EIQI9VNTS3exLUlpHU6GlRVUNz3zUKALqBIASgxw4f7zwE9aQOAPoaQQhAj6UOsoe0DgD6GrPGAPTY2MwUuRx2uT0tHY4TsklyOs5Opfdjmj2ASEIQAtBjsTE2FRdmaeaaatmkoDDkjzbFhVmBoMM0ewCRhq4xAJekINul0mmj5XQEd385HXaVThsdCDhMswcQiXgiBOCSFWS7dFuWs9Mur4tNs7fp7DT727KcdJMB6FMEIQAhERtjU+6wIR2e6840+84+AwB6A11jAHod0+wBRCqeCAFiJlNvY5o9gEhFEILlMZOp9/Vkmj0A9AW6xmBpzGTqG/5p9tK5afV+HU2zB4C+QhCCZbFhaN/q6jR7AOhLdI3BspjJ1Pcu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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# These Plots help to explain the values and how they are scattered.\n", "year = salary_dataset.YearsExperience\n", "salary = salary_dataset.Salary\n", "plt.scatter(year, salary)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is obvious that we can fit these scattered points with a straight line. In the next step, we proceed with univariate linear regression.\n", "\n", "### Split the dataset into the Training set and Test set.\n", "\n", "First, extract the data for years of experience and salary from the dataset separately." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# get a copy of dataset exclude last column\n", "X = salary_dataset.iloc[:, :-1].values\n", "\n", "# get array of dataset in column 1st\n", "y = salary_dataset.iloc[:, 1].values\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`X` : the first column which contains Years Experience array\n", "\n", "`y`: the last column which contains Salary array" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* `test_size=1/3`: we will split our dataset (30 observations) into 2 parts (training set, test set) and the ratio of **test set** compare to dataset is 1/3 (10 observations) will be put into the **test set**. You can put it 1/2 to get 50% or 0.5, they are the same. We should not let the test set too big; if it’s too big, we will lack of data to train. Normally, we should pick around 5% to 30%.\n", "\n", "* `train_size`: if we use the test_size already, the rest of data will automatically be assigned to `train_size`.\n", "\n", "* `random_state`: this is the seed for the random number generator. We can put an instance of the **RandomState** class as well. If we leave it blank or 0, the **RandomState** instance used by **np.random** will be used instead." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Build the regression model" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LinearRegression()" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fitting Simple Linear Regression to the Training set\n", "from sklearn.linear_model import LinearRegression\n", "regressor = LinearRegression()\n", "regressor.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`regressor = LinearRegression()`: our training model which will implement the Linear Regression.\n", "\n", "`regressor.fit`: in this line, we pass the `X_train` which contains value of Year Experience and `y_train` which contains values of particular Salary to form up the model. This is the training process." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# Predicting the Salary for the Test values\n", "y_pred = regressor.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize our training model and testing model" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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P/zwg9GxElVkTKqIyKSioqLQvn179OvXDwsWLMDZs2exePFivPrqqwgMDMSxY8ewfft2pKamokePHtJ1Dx8+xMcff4xjx45h165dsLKyQrdu3aDRaGT3Hz16NIYNG4aEhASDXY0ajQYRERG4d+8e9u7di5iYGPz11194++23AQBvv/02fv/9dwDAkSNHcOvWLfj4+BTrvc6bNw8PHz7E6NGjAQBjx45FWloaFixYIKv36aef4pNPPsHJkycRHByMLl264O7duwCAtLS0Qj8bAFixYgVsbW1x8OBBLFq0SC+W3NxchIeHo1KlSti/fz8OHjwIJycndOzYETk5OVK92NhYXLlyBbGxsVixYgWWL1+O5cuXS+ffe+89rF69GvPmzUNCQgIWL14MJyenIsVKVGGZczdnIiqfUlNTRbVq1YSVlZXYtGmTmDx5sujQoYOsTlJSkgBQ4O70f//9twAgzpw5I4QQIjExUQAQc+bMeeazd+7cKZRKpbh+/bpU9ueffwoA4siRI0IIIU6ePCkAiMTExGfeC4Cws7MTjo6Oste1a9ekOocOHRI2NjZi3LhxwtraWuzfv186p4t52rRpUllubq7w9vYW06dPF0IIoz6b0NBQERgYaDC+TZs2CSGE+N///ifq1asnNBqNdD47O1vY29uLHTt2CCGEiIqKEr6+viIvL0+q869//Uu8/fbbQgghLly4IACImJgYg59Hcf4eiSoSazPlckRUjrm5uWHQoEHYvHkzunbtipUrVyI2NlZq8cjvypUrqFu3Li5duoTx48cjLi4Od+7ckVqorl+/jsaNG0v1g4KCnvnshIQE+Pj4yFqfGjZsCFdXVyQkJODFF18s0nv55ptvEBYWJivz8vKS/hwcHIyRI0di8uTJGDVqFNq0aaN3j+DgYOnP1tbWCAoKQkJCAgDg1KlThX42ANCiRYtnxnnq1ClcvnwZlSpVkpVnZWXJulEbNWoEpVIpHXt6euLMmTMAgPj4eCiVSoSGhhb4DGNiJaqomFQRUYmwtraGtbX2PzGZmZno0qULpk+frlfP09MTANClSxf4+vpi6dKl8PLygkajQePGjWVdVwDg6OhY8sHn4+HhgRdeeKHA8xqNBgcPHoRSqcTly5eLfH9jPhug8PedmZmJFi1aGBxnVr16denPTw/sVygUUgJrb29vkliJKiomVURU4po3b46NGzfCz89PSrTyu3v3Li5cuIClS5ciJCQEAHDgwIFiPatBgwZISkpCUlKS1Fp17tw5pKWloWHDhsV/EwWYOXMmzp8/j7179yI8PBzLli1D3759ZXX++OMPvPLKKwCAvLw8HD9+HEOGDAFQ+GdjrObNm2Pt2rVwc3ODs7Nzse4REBAAjUaDvXv36rXOmTJWovKKA9WJqMQNHjwY9+7dQ8+ePXH06FFcuXIFO3bsQN++faFWq1G5cmVUrVoVS5YsweXLl7F79258/PHHxXpWWFgYAgIC0Lt3b5w4cQJHjhzBe++9h9DQ0EK7Dg1JS0tDSkqK7PXw4UMAwMmTJzF+/Hh8//33aN26NWbPno1hw4bhr7/+kt3j22+/xaZNm3D+/HkMHjwY9+/fR79+/Yz6bIzVu3dvVKtWDREREdi/fz8SExOxZ88eDB061Oj1wfz8/BAVFYV+/fph8+bN0j3WrVtn0liJyismVURU4ry8vHDw4EGo1Wp06NABAQEBGD58OFxdXWFlZQUrKyusWbMGx48fR+PGjTFixAjMnDmzWM9SKBTYsmULKleujFdeeQVhYWGoVasW1q5dW6z79e3bF56enrLX/PnzkZWVhXfffRfvv/8+unTpAgAYOHAg2rVrhz59+siSjGnTpmHatGlo2rQpDhw4gJ9//hnVqlUz6rMxloODA/bt24eaNWsiMjISDRo0QP/+/ZGVlVWklquFCxeie/fu+PDDD1G/fn0MGDBASiJNFStRecXFP4mISsjVq1fh7++PkydPolmzZuYOh4hKGP/XgoiIiMgEmFQRERERmQC7/4iIiIhMgC1VRERERCbApIqIiIjIBJhUEREREZkAkyoiIiIiE2BSRURERGQCTKqIiIiITIBJFREREZEJMKkiIiIiMgEmVUREREQm8P8vyMP6WN6ftQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(X_train, y_train, color='red', label='Training data')\n", "plt.scatter(X_test, y_test, color='blue', label='Test data')\n", "plt.plot(X_train, regressor.predict(X_train), color='green')\n", "plt.title('Salary VS Experience')\n", "plt.xlabel('Year of Experience')\n", "plt.ylabel('Salary')\n", "plt.legend() \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The linear regression line is generated from the `Training data`. \n", "\n", "The red points in the graph represent the `Training data`, while the blue points represent the `Test data`.\n", "\n", "It seems like our trained model performs well accroding to the plot. However, in most cases, it is necessary to quantitatively calculate the extent of error when using this model for predictions.\n", "\n", "### Evaluate the model\n", "\n", "**Mean square error** (MSE) metrics, which is the mean of all squared differences between expected and predicted values, is a commonly used metric for evaluating model performance in regression problems." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean error: 3.03e+07 (3.53e+04%)\n" ] } ], "source": [ "from sklearn.metrics import mean_squared_error,r2_score\n", "mse = mean_squared_error(y_test,y_pred)\n", "\n", "# calculate Mean square error\n", "mse = mean_squared_error(y_test,y_pred)\n", "print(f\"Mean error: {mse:3.3} ({mse/np.mean(y_pred)*100:3.3}%)\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another indicator of model quality is `r2_score`, which represents the degree to which the model explains the variance of the target variable. The **R² score** ranges from 0 to 1, where a value closer to 1 indicates a better fit of the model to the data." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model determination: 0.9627668685473266\n" ] } ], "source": [ "score = r2_score(y_test,y_pred)\n", "print(\"Model determination: \", score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Obtain the regression line" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Intercept of the model: 25202.887786154868\n", "Coefficient of the line: [9731.20383825]\n" ] } ], "source": [ "# Intecept and coeff of the line\n", "print('Intercept of the model:',regressor.intercept_)\n", "print('Coefficient of the line:',regressor.coef_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your turn! 🚀\n", "\n", "tbd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Acknowledgments\n", "\n", "Thanks to [Tavishi](https://medium.com/@tavishi.1402) and [Barath](https://www.kaggle.com/vivinbarath) for creating the open-source course [Linear Regression in Machine Learning](https://medium.com/@tavishi.1402/linear-regression-in-ml-56107a59be03) and [Simple Linear Regression for Salary Data](https://www.kaggle.com/code/vivinbarath/simple-linear-regression-for-salary-data). It inspires the majority of the content in this chapter.\n" ] } ], "metadata": { "kernelspec": { "display_name": "open-machine-learning-jupyter-book", "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.9.18" } }, "nbformat": 4, "nbformat_minor": 2 }