From 14b22db4cc2ce0e16f1a6bcb9f1d7d1471581b68 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 12 Apr 2021 12:32:54 +0530 Subject: [PATCH 01/18] Python implementation done --- ...lary-prediction-linear-regression-py.ipynb | 557 ++++++++++++++++++ 1 file changed, 557 insertions(+) create mode 100644 salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb new file mode 100644 index 00000000..8d31cb79 --- /dev/null +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -0,0 +1,557 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 96, + "id": "e39b001e", + "metadata": {}, + "outputs": [], + "source": [ + "# @file salary-prediction-linear-regression-py.ipynb\n", + "#\n", + "# A simple example usage of Linear Regression applied to Salary dataset" + ] + }, + { + "cell_type": "markdown", + "id": "3f7b74b5", + "metadata": {}, + "source": [ + "### Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "b3be7acf", + "metadata": {}, + "outputs": [], + "source": [ + "import mlpack\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "dbf2f2be", + "metadata": {}, + "source": [ + "### Set Plotting Options" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "776b4e06", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# uncomment below line to enable dark background style sheet\n", + "# plt.style.use('dark_background')" + ] + }, + { + "cell_type": "markdown", + "id": "c4153f6a", + "metadata": {}, + "source": [ + "### Load and Explore the Data" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "30cd5e44", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the salary dataset\n", + "data = pd.read_csv(\"Salary.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "b80ac51d", + "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
11.346205
21.537731
32.043525
42.239891
\n", + "
" + ], + "text/plain": [ + " YearsExperience Salary\n", + "0 1.1 39343\n", + "1 1.3 46205\n", + "2 1.5 37731\n", + "3 2.0 43525\n", + "4 2.2 39891" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# display the first 5 samples from dataframe\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "b8d64e4e", + "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
count35.00000035.000000
mean6.30857183945.600000
std3.61861032162.673003
min1.10000037731.000000
25%3.45000057019.000000
50%5.30000081363.000000
75%9.250000113223.500000
max13.500000139465.000000
\n", + "
" + ], + "text/plain": [ + " YearsExperience Salary\n", + "count 35.000000 35.000000\n", + "mean 6.308571 83945.600000\n", + "std 3.618610 32162.673003\n", + "min 1.100000 37731.000000\n", + "25% 3.450000 57019.000000\n", + "50% 5.300000 81363.000000\n", + "75% 9.250000 113223.500000\n", + "max 13.500000 139465.000000" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# generates basic statistical summary of the dataframe\n", + "data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "50d0aa93", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 35 entries, 0 to 34\n", + "Data columns (total 2 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 YearsExperience 35 non-null float64\n", + " 1 Salary 35 non-null int64 \n", + "dtypes: float64(1), int64(1)\n", + "memory usage: 688.0 bytes\n" + ] + } + ], + "source": [ + "# generates a concise summary of the dataframe\n", + "data.info()" + ] + }, + { + "cell_type": "markdown", + "id": "6bb19595", + "metadata": {}, + "source": [ + "### Exploratory Data Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "464dbd78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# compute pairwise correlation and plots\n", + "# a heatmap of the correlated columns\n", + "sns.heatmap(data.corr())" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "e384ed91", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# \n", + "data.plot(x=\"YearsExperience\", y=\"Salary\",cmap=\"plasma\", \n", + " c=data[\"YearsExperience\"].apply(lambda x: int(x)), \n", + " kind=\"scatter\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5e122754", + "metadata": {}, + "source": [ + "### Train test split" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "e9fd6935", + "metadata": {}, + "outputs": [], + "source": [ + "# Split data into features (X) and targets (y).\n", + "\n", + "targets = data.Salary\n", + "features = data.drop(\"Salary\", axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "57f08701", + "metadata": {}, + "outputs": [], + "source": [ + "# Split the dataset using mlpack's preprocess_split method\n", + "output = mlpack.preprocess_split(input=features, input_labels=targets, test_ratio=0.4, seed=101)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "04fcd9fd", + "metadata": {}, + "outputs": [], + "source": [ + "# preprocess_split returns a dictionary, which we'll unpack into\n", + "# respective variables for clarity of code\n", + "X_train = output[\"training\"]\n", + "y_train = output[\"training_labels\"]\n", + "X_test = output[\"test\"]\n", + "y_test = output[\"test_labels\"]" + ] + }, + { + "cell_type": "markdown", + "id": "114442b5", + "metadata": {}, + "source": [ + "### Training the linear model" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "1e036338", + "metadata": {}, + "outputs": [], + "source": [ + "# Create and train Linear Regression model.\n", + "output = mlpack.linear_regression(training=X_train,\n", + " training_responses=y_train, lambda_=0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "a9ac1c6a", + "metadata": {}, + "outputs": [], + "source": [ + "model = output[\"output_model\"]" + ] + }, + { + "cell_type": "markdown", + "id": "2feeb97e", + "metadata": {}, + "source": [ + "### Making Predcitions on Test set" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "9be6c456", + "metadata": {}, + "outputs": [], + "source": [ + "# Predict the values of the test data.\n", + "output = mlpack.linear_regression(input_model=model, test=X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "4739b0fc", + "metadata": {}, + "outputs": [], + "source": [ + "y_preds = output[\"output_predictions\"].reshape(-1,1)" + ] + }, + { + "cell_type": "markdown", + "id": "30c0e197", + "metadata": {}, + "source": [ + "### Model Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "4fa88ef0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot the linear model\n", + "\n", + "plt.scatter(X_test, y_test, cmap=\"plasma\",c=X_test.astype(\"int\"))\n", + "plt.colorbar()\n", + "plt.xlabel(\"Years of Experience\")\n", + "plt.ylabel(\"Salary in $\")\n", + "plt.plot(X_test, y_preds)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "7253960a", + "metadata": {}, + "outputs": [], + "source": [ + "# utility functions for evaultion metrics\n", + "\n", + "def mae(y_true, y_preds):\n", + " return np.mean(np.abs(y_preds - y_true))\n", + "\n", + "def mse(y_true, y_preds):\n", + " return np.mean(np.power(y_preds - y_true, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "2ca9a3bc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---- Evaluation Metrics ----\n", + "Mean Absoulte Error: 6776.34\n", + "Mean Squared Error: 64688553.98\n", + "Root Mean Squared Error: 8042.92\n" + ] + } + ], + "source": [ + "print(\"---- Evaluation Metrics ----\")\n", + "print(f\"Mean Absoulte Error: {mae(y_test, y_preds):.2f}\")\n", + "print(f\"Mean Squared Error: {mse(y_test, y_preds):.2f}\")\n", + "print(f\"Root Mean Squared Error: {np.sqrt(mse(y_test, y_preds)):.2f}\")" + ] + } + ], + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f0864f7dea336c49d6e6b5d9280be21580b53a8c Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 12 Apr 2021 12:59:03 +0530 Subject: [PATCH 02/18] C++ example WIP --- ...lary-prediction-linear-regression-py.ipynb | 54 +++++++++---------- .../salary_prediction_linear_regression.cc | 40 ++++++++++++++ 2 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index 8d31cb79..5847cc28 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 96, - "id": "e39b001e", + "id": "6ef3dcce", "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "markdown", - "id": "3f7b74b5", + "id": "2dfb76ff", "metadata": {}, "source": [ "### Import Libraries" @@ -23,7 +23,7 @@ { "cell_type": "code", "execution_count": 77, - "id": "b3be7acf", + "id": "1e65f9aa", "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ }, { "cell_type": "markdown", - "id": "dbf2f2be", + "id": "19383bf8", "metadata": {}, "source": [ "### Set Plotting Options" @@ -45,7 +45,7 @@ { "cell_type": "code", "execution_count": 95, - "id": "776b4e06", + "id": "5a975276", "metadata": {}, "outputs": [], "source": [ @@ -56,7 +56,7 @@ }, { "cell_type": "markdown", - "id": "c4153f6a", + "id": "35d20b58", "metadata": {}, "source": [ "### Load and Explore the Data" @@ -65,7 +65,7 @@ { "cell_type": "code", "execution_count": 79, - "id": "30cd5e44", + "id": "83cc80d3", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": 80, - "id": "b80ac51d", + "id": "f396630a", "metadata": {}, "outputs": [ { @@ -156,7 +156,7 @@ { "cell_type": "code", "execution_count": 81, - "id": "b8d64e4e", + "id": "fbefe869", "metadata": {}, "outputs": [ { @@ -254,7 +254,7 @@ { "cell_type": "code", "execution_count": 82, - "id": "50d0aa93", + "id": "9d409b2b", "metadata": {}, "outputs": [ { @@ -280,7 +280,7 @@ }, { "cell_type": "markdown", - "id": "6bb19595", + "id": "d624dbd9", "metadata": {}, "source": [ "### Exploratory Data Analysis" @@ -289,7 +289,7 @@ { "cell_type": "code", "execution_count": 83, - "id": "464dbd78", + "id": "bd2994fc", "metadata": {}, "outputs": [ { @@ -324,7 +324,7 @@ { "cell_type": "code", "execution_count": 84, - "id": "e384ed91", + "id": "f87abdf9", "metadata": {}, "outputs": [ { @@ -350,7 +350,7 @@ }, { "cell_type": "markdown", - "id": "5e122754", + "id": "e8ef048e", "metadata": {}, "source": [ "### Train test split" @@ -359,7 +359,7 @@ { "cell_type": "code", "execution_count": 85, - "id": "e9fd6935", + "id": "6447733f", "metadata": {}, "outputs": [], "source": [ @@ -372,7 +372,7 @@ { "cell_type": "code", "execution_count": 86, - "id": "57f08701", + "id": "71ab1d33", "metadata": {}, "outputs": [], "source": [ @@ -383,7 +383,7 @@ { "cell_type": "code", "execution_count": 87, - "id": "04fcd9fd", + "id": "49e00e31", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "114442b5", + "id": "8ee51cef", "metadata": {}, "source": [ "### Training the linear model" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": 88, - "id": "1e036338", + "id": "67c9d8ff", "metadata": {}, "outputs": [], "source": [ @@ -418,7 +418,7 @@ { "cell_type": "code", "execution_count": 89, - "id": "a9ac1c6a", + "id": "530d2b0e", "metadata": {}, "outputs": [], "source": [ @@ -427,7 +427,7 @@ }, { "cell_type": "markdown", - "id": "2feeb97e", + "id": "fdf47849", "metadata": {}, "source": [ "### Making Predcitions on Test set" @@ -436,7 +436,7 @@ { "cell_type": "code", "execution_count": 90, - "id": "9be6c456", + "id": "539a9130", "metadata": {}, "outputs": [], "source": [ @@ -447,7 +447,7 @@ { "cell_type": "code", "execution_count": 91, - "id": "4739b0fc", + "id": "c53f3197", "metadata": {}, "outputs": [], "source": [ @@ -456,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "30c0e197", + "id": "3e84f83f", "metadata": {}, "source": [ "### Model Evaluation" @@ -465,7 +465,7 @@ { "cell_type": "code", "execution_count": 92, - "id": "4fa88ef0", + "id": "c770596a", "metadata": {}, "outputs": [ { @@ -495,7 +495,7 @@ { "cell_type": "code", "execution_count": 93, - "id": "7253960a", + "id": "32e20f11", "metadata": {}, "outputs": [], "source": [ @@ -511,7 +511,7 @@ { "cell_type": "code", "execution_count": 94, - "id": "2ca9a3bc", + "id": "5cff7f6b", "metadata": {}, "outputs": [ { diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc new file mode 100644 index 00000000..65e5b158 --- /dev/null +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -0,0 +1,40 @@ +/** + * @file salary_prediction_linear_regression.cc + * + * A simple example usage of Linear Regression + * applied to Salary dataset + */ +#include +#include + +// Header file for visualization +#include + +using namespace mlpack; +using namespace mlpack::regression; +namespace plt = matplotlibcpp; + +int main() { + + // Loading data from csv into matrix + arma::mat input; + data::Load("Salary.csv", input); + + // Dropping first row as they represent headers + input.shed_col(0); + + // Print the first 5 rows of the input data + //std::cout< x = arma::conv_to>::from(input.row(0)); + std::vector y = arma::conv_to>::from(input.row(1)); + + plt::scatter(x, y, 5); + plt::show(); + + arma::rowvec targets = arma::conv_to::from(input.row(input.n_rows - 1)); + input.shed_row(input.n_rows - 1); + return 0; +} From fd75d6d50a9323c0501dfa917fca39a2caa27946 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 12 Apr 2021 13:43:59 +0530 Subject: [PATCH 03/18] implemented LR, added plots --- .../salary_prediction_linear_regression.cc | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc index 65e5b158..879ffad2 100644 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -5,7 +5,8 @@ * applied to Salary dataset */ #include -#include +#include +#include // Header file for visualization #include @@ -17,24 +18,45 @@ namespace plt = matplotlibcpp; int main() { // Loading data from csv into matrix - arma::mat input; - data::Load("Salary.csv", input); + arma::mat inputs; + data::Load("Salary.csv", inputs); // Dropping first row as they represent headers - input.shed_col(0); + inputs.shed_col(0); // Print the first 5 rows of the input data - //std::cout< x = arma::conv_to>::from(input.row(0)); - std::vector y = arma::conv_to>::from(input.row(1)); + std::vector x = arma::conv_to>::from(inputs.row(0)); + std::vector y = arma::conv_to>::from(inputs.row(1)); plt::scatter(x, y, 5); plt::show(); - arma::rowvec targets = arma::conv_to::from(input.row(input.n_rows - 1)); - input.shed_row(input.n_rows - 1); + // Split the data into features (X) and target (y) variables + // Labels are the last row + arma::rowvec targets = arma::conv_to::from(inputs.row(inputs.n_rows - 1)); + // Labels are dropped from the originally loaded data to be used as features + inputs.shed_row(inputs.n_rows - 1); + + // Split the dataset using mlpack + //arma::mat Xtrain, Xtest; + //arma::Row Ytrain, Ytest; + //data::Split(inputs, targets, Xtrain, Xtest,Ytrain, Ytest, 0.4); + + // Create and Train Linear Regression model + LinearRegression lr(inputs, targets, 0.5); + + arma::rowvec y_preds; + lr.Predict(inputs, y_preds); + + std::vector y_p = arma::conv_to>::from(y_preds); + + plt::scatter(x, y, 5); + plt::plot(x,y_p); + plt::show(); + return 0; } From eb2d42fd186f278e4d43f1e68b37fda43099614f Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 12 Apr 2021 14:14:17 +0530 Subject: [PATCH 04/18] added train - test splits and model eval visualization --- .../salary_prediction_linear_regression.cc | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc index 879ffad2..3ef8e187 100644 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -25,6 +25,7 @@ int main() { inputs.shed_col(0); // Print the first 5 rows of the input data + std::cout<::from(inputs.row(inputs.n_rows - 1)); + arma::Row targets = arma::conv_to>::from(inputs.row(inputs.n_rows - 1)); // Labels are dropped from the originally loaded data to be used as features inputs.shed_row(inputs.n_rows - 1); // Split the dataset using mlpack - //arma::mat Xtrain, Xtest; - //arma::Row Ytrain, Ytest; - //data::Split(inputs, targets, Xtrain, Xtest,Ytrain, Ytest, 0.4); + arma::mat Xtrain; + arma::mat Xtest; + arma::Row Ytrain; + arma::Row Ytest; + data::Split(inputs, targets, Xtrain, Xtest, Ytrain, Ytest, 0.4); + + arma::rowvec y_train = arma::conv_to::from(Ytrain); + arma::rowvec y_test = arma::conv_to::from(Ytest); // Create and Train Linear Regression model - LinearRegression lr(inputs, targets, 0.5); + LinearRegression lr(Xtrain, y_train, 0.5); arma::rowvec y_preds; - lr.Predict(inputs, y_preds); + lr.Predict(Xtest, y_preds); + std::vector x_test = arma::conv_to>::from(Xtest); + std::vector y_t = arma::conv_to>::from(y_test); std::vector y_p = arma::conv_to>::from(y_preds); - plt::scatter(x, y, 5); - plt::plot(x,y_p); + plt::scatter(x_test, y_t, 5); + plt::plot(x_test,y_p); plt::show(); return 0; From afdbc9acb16786e5741a46261d7fb8dcf40d4669 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 12 Apr 2021 14:33:16 +0530 Subject: [PATCH 05/18] added model evaluation metrics --- .../salary_prediction_linear_regression.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc index 3ef8e187..a5ff7141 100644 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -7,6 +7,7 @@ #include #include #include +#include // Header file for visualization #include @@ -66,5 +67,9 @@ int main() { plt::plot(x_test,y_p); plt::show(); + std::cout<<"Mean Absolute Error: "< Date: Mon, 12 Apr 2021 14:50:45 +0530 Subject: [PATCH 06/18] added inline comments for explanation --- ...lary-prediction-linear-regression-py.ipynb | 54 +++++++++---------- .../salary_prediction_linear_regression.cc | 30 +++++++++-- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index 5847cc28..381785cd 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 96, - "id": "6ef3dcce", + "id": "555ce78e", "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "markdown", - "id": "2dfb76ff", + "id": "7bd90910", "metadata": {}, "source": [ "### Import Libraries" @@ -23,7 +23,7 @@ { "cell_type": "code", "execution_count": 77, - "id": "1e65f9aa", + "id": "449a2f52", "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ }, { "cell_type": "markdown", - "id": "19383bf8", + "id": "8ee28540", "metadata": {}, "source": [ "### Set Plotting Options" @@ -45,7 +45,7 @@ { "cell_type": "code", "execution_count": 95, - "id": "5a975276", + "id": "786e154b", "metadata": {}, "outputs": [], "source": [ @@ -56,7 +56,7 @@ }, { "cell_type": "markdown", - "id": "35d20b58", + "id": "e32c8a94", "metadata": {}, "source": [ "### Load and Explore the Data" @@ -65,7 +65,7 @@ { "cell_type": "code", "execution_count": 79, - "id": "83cc80d3", + "id": "9c7de4da", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": 80, - "id": "f396630a", + "id": "1d59786b", "metadata": {}, "outputs": [ { @@ -156,7 +156,7 @@ { "cell_type": "code", "execution_count": 81, - "id": "fbefe869", + "id": "5a3a26af", "metadata": {}, "outputs": [ { @@ -254,7 +254,7 @@ { "cell_type": "code", "execution_count": 82, - "id": "9d409b2b", + "id": "8d8410cd", "metadata": {}, "outputs": [ { @@ -280,7 +280,7 @@ }, { "cell_type": "markdown", - "id": "d624dbd9", + "id": "78f2eea6", "metadata": {}, "source": [ "### Exploratory Data Analysis" @@ -289,7 +289,7 @@ { "cell_type": "code", "execution_count": 83, - "id": "bd2994fc", + "id": "34e12607", "metadata": {}, "outputs": [ { @@ -324,7 +324,7 @@ { "cell_type": "code", "execution_count": 84, - "id": "f87abdf9", + "id": "ef71b4dc", "metadata": {}, "outputs": [ { @@ -350,7 +350,7 @@ }, { "cell_type": "markdown", - "id": "e8ef048e", + "id": "94e0f415", "metadata": {}, "source": [ "### Train test split" @@ -359,7 +359,7 @@ { "cell_type": "code", "execution_count": 85, - "id": "6447733f", + "id": "2cd31a2a", "metadata": {}, "outputs": [], "source": [ @@ -372,7 +372,7 @@ { "cell_type": "code", "execution_count": 86, - "id": "71ab1d33", + "id": "9e82b675", "metadata": {}, "outputs": [], "source": [ @@ -383,7 +383,7 @@ { "cell_type": "code", "execution_count": 87, - "id": "49e00e31", + "id": "26caf3cc", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "8ee51cef", + "id": "91e0b6b8", "metadata": {}, "source": [ "### Training the linear model" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": 88, - "id": "67c9d8ff", + "id": "5a642645", "metadata": {}, "outputs": [], "source": [ @@ -418,7 +418,7 @@ { "cell_type": "code", "execution_count": 89, - "id": "530d2b0e", + "id": "8b2e2bb4", "metadata": {}, "outputs": [], "source": [ @@ -427,7 +427,7 @@ }, { "cell_type": "markdown", - "id": "fdf47849", + "id": "bf6ce883", "metadata": {}, "source": [ "### Making Predcitions on Test set" @@ -436,7 +436,7 @@ { "cell_type": "code", "execution_count": 90, - "id": "539a9130", + "id": "e41657ad", "metadata": {}, "outputs": [], "source": [ @@ -447,7 +447,7 @@ { "cell_type": "code", "execution_count": 91, - "id": "c53f3197", + "id": "d3734f1a", "metadata": {}, "outputs": [], "source": [ @@ -456,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "3e84f83f", + "id": "53843549", "metadata": {}, "source": [ "### Model Evaluation" @@ -465,7 +465,7 @@ { "cell_type": "code", "execution_count": 92, - "id": "c770596a", + "id": "531b842d", "metadata": {}, "outputs": [ { @@ -495,7 +495,7 @@ { "cell_type": "code", "execution_count": 93, - "id": "32e20f11", + "id": "c26ee546", "metadata": {}, "outputs": [], "source": [ @@ -511,7 +511,7 @@ { "cell_type": "code", "execution_count": 94, - "id": "5cff7f6b", + "id": "8ad80db1", "metadata": {}, "outputs": [ { diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc index a5ff7141..fcc9e3d2 100644 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -19,13 +19,16 @@ namespace plt = matplotlibcpp; int main() { // Loading data from csv into matrix + arma::mat inputs; data::Load("Salary.csv", inputs); // Dropping first row as they represent headers + inputs.shed_col(0); // Print the first 5 rows of the input data + std::cout< x = arma::conv_to>::from(inputs.row(0)); std::vector y = arma::conv_to>::from(inputs.row(1)); - plt::scatter(x, y, 5); + plt::scatter(x, y, 12, {{"color", "coral"}}); + plt::xlabel("Years of Experience"); + plt::ylabel("Salary in $"); + plt::title("Experience vs. Salary"); plt::show(); // Split the data into features (X) and target (y) variables - // Labels are the last row + // targets are the last row + arma::Row targets = arma::conv_to>::from(inputs.row(inputs.n_rows - 1)); + // Labels are dropped from the originally loaded data to be used as features + inputs.shed_row(inputs.n_rows - 1); // Split the dataset using mlpack + arma::mat Xtrain; arma::mat Xtest; arma::Row Ytrain; arma::Row Ytest; data::Split(inputs, targets, Xtrain, Xtest, Ytrain, Ytest, 0.4); + // Convert armadillo Rows into rowvec. (Required by LinearRegression API in this format) + arma::rowvec y_train = arma::conv_to::from(Ytrain); arma::rowvec y_test = arma::conv_to::from(Ytest); // Create and Train Linear Regression model + LinearRegression lr(Xtrain, y_train, 0.5); + // Make predictions for test data points + arma::rowvec y_preds; lr.Predict(Xtest, y_preds); + // convert armadillo vectors and matrices to vector for plotting + std::vector x_test = arma::conv_to>::from(Xtest); std::vector y_t = arma::conv_to>::from(y_test); std::vector y_p = arma::conv_to>::from(y_preds); - plt::scatter(x_test, y_t, 5); + // Visualizing Predicted datapoints + + plt::scatter(x_test, y_t, 12, {{"color", "coral"}}); plt::plot(x_test,y_p); + plt::xlabel("Years of Experience"); + plt::ylabel("Salary in $"); + plt::title("Predicted Experience vs. Salary"); plt::show(); + // Model evaluation metrics + std::cout<<"Mean Absolute Error: "< Date: Sun, 25 Apr 2021 10:16:21 +0530 Subject: [PATCH 07/18] Update salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc Co-authored-by: Ryan Curtin --- .../salary_prediction_linear_regression.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc index fcc9e3d2..3ed2f1ea 100644 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc @@ -4,10 +4,10 @@ * A simple example usage of Linear Regression * applied to Salary dataset */ -#include -#include -#include -#include +#include +#include +#include +#include // Header file for visualization #include From ef31601313b3b023205ea674e4f3d15111e5e3a9 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Thu, 29 Apr 2021 08:36:52 +0530 Subject: [PATCH 08/18] converted standalone cpp program into ipynb --- ...ary-prediction-linear-regression-cpp.ipynb | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb new file mode 100644 index 00000000..dad9f6c3 --- /dev/null +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb @@ -0,0 +1,261 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "behavioral-cycling", + "metadata": {}, + "outputs": [], + "source": [ + "// Import necessary library headers\n", + "\n", + "#include \n", + "#include \n", + "#include \n", + "#include " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "stupid-permission", + "metadata": {}, + "outputs": [], + "source": [ + "#define WITHOUT_NUMPY 1\n", + "#include \"matplotlibcpp.h\"\n", + "#include \"xwidgets/ximage.hpp\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "indian-prairie", + "metadata": {}, + "outputs": [], + "source": [ + "using namespace mlpack;\n", + "using namespace mlpack::regression;\n", + "namespace plt = matplotlibcpp;" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "victorian-donna", + "metadata": {}, + "outputs": [], + "source": [ + "// Load the dataset into armadillo matrix\n", + "\n", + "arma::mat inputs;\n", + "data::Load(\"Salary_Data.csv\", inputs);" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "deluxe-present", + "metadata": {}, + "outputs": [], + "source": [ + "// Drop the first row as they represent header\n", + "\n", + "inputs.shed_col(0);" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "desirable-experience", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Years Of Experience Salary\n", + " 1.1000e+00 3.9343e+04\n", + " 1.3000e+00 4.6205e+04\n", + " 1.5000e+00 3.7731e+04\n", + " 2.0000e+00 4.3525e+04\n", + " 2.2000e+00 3.9891e+04\n", + " 2.9000e+00 5.6642e+04\n", + "\n" + ] + } + ], + "source": [ + "// Display the first 5 rows of the input data\n", + "\n", + "std::cout< x = arma::conv_to>::from(inputs.row(0));\n", + "std::vector y = arma::conv_to>::from(inputs.row(1));\n", + "\n", + "plt::scatter(x, y, 12, {{\"color\", \"coral\"}});\n", + "plt::xlabel(\"Years of Experience\");\n", + "plt::ylabel(\"Salary in $\");\n", + "plt::title(\"Experience vs. Salary\");\n", + "\n", + "plt::save(\"./scatter1.png\");\n", + "auto img = xw::image_from_file(\"scatter.png\").finalize();\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "coordinate-canvas", + "metadata": {}, + "outputs": [], + "source": [ + "// Split the data into features (X) and target (y) variables\n", + "// targets are the last row\n", + "\n", + "arma::Row targets = arma::conv_to>::from(inputs.row(inputs.n_rows - 1));" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "blank-mexican", + "metadata": {}, + "outputs": [], + "source": [ + "// Labels are dropped from the originally loaded data to be used as features\n", + "\n", + "inputs.shed_row(inputs.n_rows - 1);" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "mechanical-laundry", + "metadata": {}, + "outputs": [], + "source": [ + "// Split the dataset into train and test sets using mlpack\n", + "\n", + "arma::mat Xtrain;\n", + "arma::mat Xtest;\n", + "arma::Row Ytrain;\n", + "arma::Row Ytest;\n", + "data::Split(inputs, targets, Xtrain, Xtest, Ytrain, Ytest, 0.4);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "friendly-petersburg", + "metadata": {}, + "outputs": [], + "source": [ + "// Convert armadillo Rows into rowvec. (Required by mlpacks' LinearRegression API in this format)\n", + "\n", + "arma::rowvec y_train = arma::conv_to::from(Ytrain);\n", + "arma::rowvec y_test = arma::conv_to::from(Ytest);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "published-illustration", + "metadata": {}, + "outputs": [], + "source": [ + "// Create and Train Linear Regression model\n", + "\n", + "regression::LinearRegression lr(Xtrain, y_train, 0.5);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "detailed-mystery", + "metadata": {}, + "outputs": [], + "source": [ + "// Make predictions for test data points\n", + "\n", + "arma::rowvec y_preds;\n", + "lr.Predict(Xtest, y_preds);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "indian-ambassador", + "metadata": {}, + "outputs": [], + "source": [ + "// convert armadillo vectors and matrices to vector for plotting purpose\n", + "\n", + "std::vector x_test = arma::conv_to>::from(Xtest);\n", + "std::vector y_t = arma::conv_to>::from(y_test);\n", + "std::vector y_p = arma::conv_to>::from(y_preds);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "related-approach", + "metadata": {}, + "outputs": [], + "source": [ + "// Visualize Predicted datapoints\n", + "\n", + "plt::scatter(x_test, y_t, 12, {{\"color\", \"coral\"}});\n", + "plt::plot(x_test,y_p);\n", + "plt::xlabel(\"Years of Experience\");\n", + "plt::ylabel(\"Salary in $\");\n", + "plt::title(\"Predicted Experience vs. Salary\");\n", + "\n", + "plt::save(\"./scatter1.png\");\n", + "auto img = xw::image_from_file(\"scatter.png\").finalize();\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "british-moment", + "metadata": {}, + "outputs": [], + "source": [ + "// Model evaluation metrics\n", + "\n", + "std::cout<<\"Mean Absolute Error: \"< Date: Thu, 29 Apr 2021 08:37:20 +0530 Subject: [PATCH 09/18] removed standalone cpp program --- .../salary_prediction_linear_regression.cc | 99 ------------------- 1 file changed, 99 deletions(-) delete mode 100644 salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc diff --git a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc b/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc deleted file mode 100644 index 3ed2f1ea..00000000 --- a/salary_prediction_with_linear_regression/salary_prediction_linear_regression.cc +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file salary_prediction_linear_regression.cc - * - * A simple example usage of Linear Regression - * applied to Salary dataset - */ -#include -#include -#include -#include - -// Header file for visualization -#include - -using namespace mlpack; -using namespace mlpack::regression; -namespace plt = matplotlibcpp; - -int main() { - - // Loading data from csv into matrix - - arma::mat inputs; - data::Load("Salary.csv", inputs); - - // Dropping first row as they represent headers - - inputs.shed_col(0); - - // Print the first 5 rows of the input data - - std::cout< x = arma::conv_to>::from(inputs.row(0)); - std::vector y = arma::conv_to>::from(inputs.row(1)); - - plt::scatter(x, y, 12, {{"color", "coral"}}); - plt::xlabel("Years of Experience"); - plt::ylabel("Salary in $"); - plt::title("Experience vs. Salary"); - plt::show(); - - // Split the data into features (X) and target (y) variables - // targets are the last row - - arma::Row targets = arma::conv_to>::from(inputs.row(inputs.n_rows - 1)); - - // Labels are dropped from the originally loaded data to be used as features - - inputs.shed_row(inputs.n_rows - 1); - - // Split the dataset using mlpack - - arma::mat Xtrain; - arma::mat Xtest; - arma::Row Ytrain; - arma::Row Ytest; - data::Split(inputs, targets, Xtrain, Xtest, Ytrain, Ytest, 0.4); - - // Convert armadillo Rows into rowvec. (Required by LinearRegression API in this format) - - arma::rowvec y_train = arma::conv_to::from(Ytrain); - arma::rowvec y_test = arma::conv_to::from(Ytest); - - // Create and Train Linear Regression model - - LinearRegression lr(Xtrain, y_train, 0.5); - - // Make predictions for test data points - - arma::rowvec y_preds; - lr.Predict(Xtest, y_preds); - - // convert armadillo vectors and matrices to vector for plotting - - std::vector x_test = arma::conv_to>::from(Xtest); - std::vector y_t = arma::conv_to>::from(y_test); - std::vector y_p = arma::conv_to>::from(y_preds); - - // Visualizing Predicted datapoints - - plt::scatter(x_test, y_t, 12, {{"color", "coral"}}); - plt::plot(x_test,y_p); - plt::xlabel("Years of Experience"); - plt::ylabel("Salary in $"); - plt::title("Predicted Experience vs. Salary"); - plt::show(); - - // Model evaluation metrics - - std::cout<<"Mean Absolute Error: "< Date: Thu, 29 Apr 2021 09:15:44 +0530 Subject: [PATCH 10/18] modified ipynb notebook based on suggestions --- ...lary-prediction-linear-regression-py.ipynb | 246 ++++++++---------- 1 file changed, 105 insertions(+), 141 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index 381785cd..af83374d 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -1,32 +1,22 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 96, - "id": "555ce78e", - "metadata": {}, - "outputs": [], - "source": [ - "# @file salary-prediction-linear-regression-py.ipynb\n", - "#\n", - "# A simple example usage of Linear Regression applied to Salary dataset" - ] - }, { "cell_type": "markdown", - "id": "7bd90910", + "id": "technical-identification", "metadata": {}, "source": [ - "### Import Libraries" + "## A simple example usage of Linear Regression applied to Salary dataset" ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 23, "id": "449a2f52", "metadata": {}, "outputs": [], "source": [ + "# Import Libraries.\n", + "\n", "import mlpack\n", "import numpy as np\n", "import pandas as pd\n", @@ -44,38 +34,30 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 24, "id": "786e154b", "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", - "# uncomment below line to enable dark background style sheet\n", + "# Uncomment below line to enable dark background style sheet.\n", "# plt.style.use('dark_background')" ] }, - { - "cell_type": "markdown", - "id": "e32c8a94", - "metadata": {}, - "source": [ - "### Load and Explore the Data" - ] - }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 25, "id": "9c7de4da", "metadata": {}, "outputs": [], "source": [ - "# Load the salary dataset\n", - "data = pd.read_csv(\"Salary.csv\")" + "# Load the salary dataset.\n", + "data = pd.read_csv(\"Salary_Data.csv\")" ] }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 26, "id": "1d59786b", "metadata": {}, "outputs": [ @@ -108,54 +90,54 @@ " \n", " 0\n", " 1.1\n", - " 39343\n", + " 39343.0\n", " \n", " \n", " 1\n", " 1.3\n", - " 46205\n", + " 46205.0\n", " \n", " \n", " 2\n", " 1.5\n", - " 37731\n", + " 37731.0\n", " \n", " \n", " 3\n", " 2.0\n", - " 43525\n", + " 43525.0\n", " \n", " \n", " 4\n", " 2.2\n", - " 39891\n", + " 39891.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " YearsExperience Salary\n", - "0 1.1 39343\n", - "1 1.3 46205\n", - "2 1.5 37731\n", - "3 2.0 43525\n", - "4 2.2 39891" + " 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": 80, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# display the first 5 samples from dataframe\n", + "# Display the first 5 samples from dataframe.\n", "data.head()" ] }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 27, "id": "5a3a26af", "metadata": {}, "outputs": [ @@ -187,18 +169,18 @@ " \n", " \n", " count\n", - " 35.000000\n", - " 35.000000\n", + " 30.000000\n", + " 30.000000\n", " \n", " \n", " mean\n", - " 6.308571\n", - " 83945.600000\n", + " 5.313333\n", + " 76003.000000\n", " \n", " \n", " std\n", - " 3.618610\n", - " 32162.673003\n", + " 2.837888\n", + " 27414.429785\n", " \n", " \n", " min\n", @@ -207,23 +189,23 @@ " \n", " \n", " 25%\n", - " 3.450000\n", - " 57019.000000\n", + " 3.200000\n", + " 56720.750000\n", " \n", " \n", " 50%\n", - " 5.300000\n", - " 81363.000000\n", + " 4.700000\n", + " 65237.000000\n", " \n", " \n", " 75%\n", - " 9.250000\n", - " 113223.500000\n", + " 7.700000\n", + " 100544.750000\n", " \n", " \n", " max\n", - " 13.500000\n", - " 139465.000000\n", + " 10.500000\n", + " 122391.000000\n", " \n", " \n", "\n", @@ -231,29 +213,29 @@ ], "text/plain": [ " YearsExperience Salary\n", - "count 35.000000 35.000000\n", - "mean 6.308571 83945.600000\n", - "std 3.618610 32162.673003\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.450000 57019.000000\n", - "50% 5.300000 81363.000000\n", - "75% 9.250000 113223.500000\n", - "max 13.500000 139465.000000" + "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": 81, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# generates basic statistical summary of the dataframe\n", + "# Generates basic statistical summary of the dataframe.\n", "data.describe()" ] }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 28, "id": "8d8410cd", "metadata": {}, "outputs": [ @@ -262,19 +244,19 @@ "output_type": "stream", "text": [ "\n", - "RangeIndex: 35 entries, 0 to 34\n", + "RangeIndex: 30 entries, 0 to 29\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", - " 0 YearsExperience 35 non-null float64\n", - " 1 Salary 35 non-null int64 \n", - "dtypes: float64(1), int64(1)\n", - "memory usage: 688.0 bytes\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": [ - "# generates a concise summary of the dataframe\n", + "# Generates a concise summary of the dataframe.\n", "data.info()" ] }, @@ -288,50 +270,15 @@ }, { "cell_type": "code", - "execution_count": 83, - "id": "34e12607", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# compute pairwise correlation and plots\n", - "# a heatmap of the correlated columns\n", - "sns.heatmap(data.corr())" - ] - }, - { - "cell_type": "code", - "execution_count": 84, + "execution_count": 29, "id": "ef71b4dc", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -341,10 +288,10 @@ } ], "source": [ - "# \n", - "data.plot(x=\"YearsExperience\", y=\"Salary\",cmap=\"plasma\", \n", - " c=data[\"YearsExperience\"].apply(lambda x: int(x)), \n", - " kind=\"scatter\")\n", + "# Scatter plot of Experience vs Salary.\n", + "data.plot(x=\"YearsExperience\", y=\"Salary\",\n", + " kind=\"scatter\", title=\"Experience vs Salary\")\n", + "plt.xlabel(\"Years of Experience\")\n", "plt.show()" ] }, @@ -358,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 30, "id": "2cd31a2a", "metadata": {}, "outputs": [], @@ -371,24 +318,24 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 31, "id": "9e82b675", "metadata": {}, "outputs": [], "source": [ - "# Split the dataset using mlpack's preprocess_split method\n", + "# Split the dataset using mlpack's preprocess_split method.\n", "output = mlpack.preprocess_split(input=features, input_labels=targets, test_ratio=0.4, seed=101)" ] }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 32, "id": "26caf3cc", "metadata": {}, "outputs": [], "source": [ - "# preprocess_split returns a dictionary, which we'll unpack into\n", - "# respective variables for clarity of code\n", + "# Preprocess_split returns a dictionary, which we'll unpack into\n", + "# respective variables for clarity of code.\n", "X_train = output[\"training\"]\n", "y_train = output[\"training_labels\"]\n", "X_test = output[\"test\"]\n", @@ -405,19 +352,20 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 42, "id": "5a642645", "metadata": {}, "outputs": [], "source": [ "# Create and train Linear Regression model.\n", "output = mlpack.linear_regression(training=X_train,\n", - " training_responses=y_train, lambda_=0.5)" + " training_responses=y_train, \n", + " lambda_=0.5, verbose=True)" ] }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 43, "id": "8b2e2bb4", "metadata": {}, "outputs": [], @@ -430,12 +378,12 @@ "id": "bf6ce883", "metadata": {}, "source": [ - "### Making Predcitions on Test set" + "### Making Predictions on Test set" ] }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 44, "id": "e41657ad", "metadata": {}, "outputs": [], @@ -446,12 +394,12 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 45, "id": "d3734f1a", "metadata": {}, "outputs": [], "source": [ - "y_preds = output[\"output_predictions\"].reshape(-1,1)" + "y_preds = output[\"output_predictions\"].reshape(-1, 1)" ] }, { @@ -464,15 +412,15 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 46, "id": "531b842d", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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7px99tkALFy4kL/+9a/88Y9/zHicPn368OMf/5iysjJGjRrFiBEjuPXWW4EoEb333nu8//77rF69muOOO46ePXsybdo0Fi5cyNy5c1mxYgWdO3fm0ksvpaSkhJ/97Gc8//zzNGvWjNGjR3PjjTfy6KPV0ifEOZfksy83szRDi6egfl0G963SDPTVyhPPbiDR8ujatStFRUUATJo0iTlz5pRfK1m/fj0fffQRrVu35oYbbuD111+nTp06LF26lBUrVgBw8MEH0717xU3uunXrcsIJJzB69Gg2btxI8mjeb775JhdeeCF169alefPm9OrVi3feeYfXX3+9vLxly5acdNJJQJTk5s2bxymnnAJELbQWLVpU91vjXK138z/m89e3isqXmzdqwMovNsfaq80TTxVVR8skWxo0aABEiaG0NBqD1cz4wx/+QN++fVO2feyxx1i1ahWzZs2ifv36tG3btnxkhr322mu7xxo4cCDnnHMOw4YNSymvbJTzTN2gzYwuXbowbdq07R7TObfjPlj+Oafd/0b58i9P7chVJ3WIMaKt/BrPbqpv37489NBDlJSUAPDhhx+yYcMG1q9fzwEHHED9+vV55ZVX+OSTT3ZovyeeeCJDhw7lwgtTb9Pq2bMno0ePpqysjFWrVvH666/TrVs3evbsyahRoygrK2P58uW88sorAHTq1IlVq1aVJ56SkhLmz59fDa/cuex4bvZSegyfSrshE+gxfCrPzV4ad0gZlW0x+v/fW+VJp14dMe/mvnmTdMBbPHnvq6++onXrrcPVXXfddVWq96Mf/YiioiKOPfZYzIxmzZrx3HPP8T//8z+cddZZFBYWcvTRR3PooYfuUDyS+OUvf7lN+TnnnMO0adM46qijkMRvf/tbDjzwQM455xymTp3KEUccQceOHenVqxcAe+yxB2PHjuXqq69m/fr1lJaWcu2119KlS/62LF3tlbgHJtEdOXEPDBDLqaqKvDRvOZf/7d3y5YcvKuSUzs1jjCizrE0EV9Nkmgjugw8+4LDDDospIpeJfyYuDj2GT814cb5V0wLeGnJSDBGl+nxTCUcOm1S+3K3tvoy6rDt16mR/tI+dmQjOWzzOObcdFd0DU9m9Mbly7+QPeWDKR+XLk37ek47NG1WpblxD6Hjicc657WjZtCBji6eie2Ny4eNVX3LS714rX/5Jz0MYenrV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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -482,24 +430,40 @@ } ], "source": [ - "# plot the linear model\n", + "# Plot the linear model.\n", "\n", - "plt.scatter(X_test, y_test, cmap=\"plasma\",c=X_test.astype(\"int\"))\n", - "plt.colorbar()\n", + "plt.scatter(X_test, y_test)\n", "plt.xlabel(\"Years of Experience\")\n", "plt.ylabel(\"Salary in $\")\n", + "plt.title(\"Experience vs Salary (Predictions)\")\n", "plt.plot(X_test, y_preds)\n", + "plt.legend([\"Linear Model\"])\n", "plt.show()" ] }, + { + "cell_type": "markdown", + "id": "twenty-qualification", + "metadata": {}, + "source": [ + "## Evaluation Metrics for Regression model\n", + "\n", + "* Mean Absolute Error (MAE) is the sum of absolute differences between actual and predicted values, without considering the direction.\n", + "$$ MAE = \\frac{\\sum_{i=1}^n\\lvert y_{i} - \\hat{y_{i}}\\rvert} {n} $$\n", + "* Mean Squared Error (MSE) is calculated as the mean or average of the squared differences between predicted and expected target values in a dataset, a lower value is better\n", + "$$ MSE = \\frac {1}{n} \\sum_{i=1}^n (y_{i} - \\hat{y_{i}})^2 $$\n", + "* Root Mean Squared Error (RMSE), Square root of MSE yields root mean square error (RMSE) it indicates the spread of the residual errors. It is always positive, and a lower value indicates better performance.\n", + "$$ RMSE = \\sqrt{\\frac {1}{n} \\sum_{i=1}^n (y_{i} - \\hat{y_{i}})^2} $$" + ] + }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 38, "id": "c26ee546", "metadata": {}, "outputs": [], "source": [ - "# utility functions for evaultion metrics\n", + "# Utility functions for evaulation metrics.\n", "\n", "def mae(y_true, y_preds):\n", " return np.mean(np.abs(y_preds - y_true))\n", @@ -510,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 39, "id": "8ad80db1", "metadata": {}, "outputs": [ @@ -519,9 +483,9 @@ "output_type": "stream", "text": [ "---- Evaluation Metrics ----\n", - "Mean Absoulte Error: 6776.34\n", - "Mean Squared Error: 64688553.98\n", - "Root Mean Squared Error: 8042.92\n" + "Mean Absoulte Error: 5341.51\n", + "Mean Squared Error: 38284079.88\n", + "Root Mean Squared Error: 6187.41\n" ] } ], @@ -549,7 +513,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.7.10" } }, "nbformat": 4, From f401c132f394c1de3d40903ee502493542c6521f Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Sun, 30 May 2021 09:43:53 +0530 Subject: [PATCH 11/18] added markdown explaining the dataset & approach --- ...ary-prediction-linear-regression-cpp.ipynb | 82 +++++++++++-------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb index dad9f6c3..7dccda57 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb @@ -1,8 +1,26 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "94323844", + "metadata": {}, + "source": [ + "## Predicting Salary using Linear Regression\n", + "\n", + "### Objective\n", + "* We have to predict the salary of an employee given how many years of experience they have.\n", + "\n", + "### Dataset\n", + "* Salary_Data.csv has 2 columns — “Years of Experience” and “Salary” for 30 employees in a company\n", + "\n", + "### Approach\n", + "* So in this example, we will train a Linear Regression model to learn the correlation between the number of years of experience of each employee and their respective salary. \n", + "* Once the model is trained, we will be able to do some sample predictions." + ] + }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "behavioral-cycling", "metadata": {}, "outputs": [], @@ -17,31 +35,32 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "stupid-permission", + "execution_count": null, + "id": "db43325d", "metadata": {}, "outputs": [], "source": [ "#define WITHOUT_NUMPY 1\n", "#include \"matplotlibcpp.h\"\n", - "#include \"xwidgets/ximage.hpp\"" + "#include \"xwidgets/ximage.hpp\"\n", + "\n", + "namespace plt = matplotlibcpp;" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "indian-prairie", + "execution_count": null, + "id": "9065ebb1", "metadata": {}, "outputs": [], "source": [ "using namespace mlpack;\n", - "using namespace mlpack::regression;\n", - "namespace plt = matplotlibcpp;" + "using namespace mlpack::regression;" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "victorian-donna", "metadata": {}, "outputs": [], @@ -54,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "deluxe-present", "metadata": {}, "outputs": [], @@ -66,25 +85,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "desirable-experience", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Years Of Experience Salary\n", - " 1.1000e+00 3.9343e+04\n", - " 1.3000e+00 4.6205e+04\n", - " 1.5000e+00 3.7731e+04\n", - " 2.0000e+00 4.3525e+04\n", - " 2.2000e+00 3.9891e+04\n", - " 2.9000e+00 5.6642e+04\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "// Display the first 5 rows of the input data\n", "\n", @@ -104,19 +108,19 @@ "std::vector x = arma::conv_to>::from(inputs.row(0));\n", "std::vector y = arma::conv_to>::from(inputs.row(1));\n", "\n", - "plt::scatter(x, y, 12, {{\"color\", \"coral\"}});\n", + "matplotlibcpp::scatter(x, y, 12, {{\"color\", \"coral\"}});\n", "plt::xlabel(\"Years of Experience\");\n", "plt::ylabel(\"Salary in $\");\n", "plt::title(\"Experience vs. Salary\");\n", "\n", - "plt::save(\"./scatter1.png\");\n", + "matplotlibcpp::save(\"./scatter1.png\");\n", "auto img = xw::image_from_file(\"scatter.png\").finalize();\n", "img" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "coordinate-canvas", "metadata": {}, "outputs": [], @@ -129,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "blank-mexican", "metadata": {}, "outputs": [], @@ -141,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "mechanical-laundry", "metadata": {}, "outputs": [], @@ -168,6 +172,14 @@ "arma::rowvec y_test = arma::conv_to::from(Ytest);" ] }, + { + "cell_type": "markdown", + "id": "99955e22", + "metadata": {}, + "source": [ + "## Linear Model" + ] + }, { "cell_type": "code", "execution_count": null, @@ -236,9 +248,9 @@ "source": [ "// Model evaluation metrics\n", "\n", - "std::cout<<\"Mean Absolute Error: \"< Date: Wed, 2 Jun 2021 08:04:40 +0530 Subject: [PATCH 12/18] added various markdown sections & fixed styling --- ...ary-prediction-linear-regression-cpp.ipynb | 217 +++++++++++++----- 1 file changed, 165 insertions(+), 52 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb index 7dccda57..d7ebb112 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb @@ -11,7 +11,7 @@ "* We have to predict the salary of an employee given how many years of experience they have.\n", "\n", "### Dataset\n", - "* Salary_Data.csv has 2 columns — “Years of Experience” and “Salary” for 30 employees in a company\n", + "* Salary_Data.csv has 2 columns — “Years of Experience” (feature) and “Salary” (target) for 30 employees in a company\n", "\n", "### Approach\n", "* So in this example, we will train a Linear Regression model to learn the correlation between the number of years of experience of each employee and their respective salary. \n", @@ -20,12 +20,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "id": "behavioral-cycling", "metadata": {}, "outputs": [], "source": [ - "// Import necessary library headers\n", + "// Import necessary library header.\n", + "#include \n", "\n", "#include \n", "#include \n", @@ -35,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "id": "db43325d", "metadata": {}, "outputs": [], @@ -49,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "id": "9065ebb1", "metadata": {}, "outputs": [], @@ -60,12 +61,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "id": "victorian-donna", "metadata": {}, "outputs": [], "source": [ - "// Load the dataset into armadillo matrix\n", + "// Load the dataset into armadillo matrix.\n", "\n", "arma::mat inputs;\n", "data::Load(\"Salary_Data.csv\", inputs);" @@ -73,24 +74,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "id": "deluxe-present", "metadata": {}, "outputs": [], "source": [ - "// Drop the first row as they represent header\n", + "// Drop the first row as they represent header.\n", "\n", "inputs.shed_col(0);" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "id": "desirable-experience", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Years Of Experience Salary\n", + " 1.1000e+00 3.9343e+04\n", + " 1.3000e+00 4.6205e+04\n", + " 1.5000e+00 3.7731e+04\n", + " 2.0000e+00 4.3525e+04\n", + " 2.2000e+00 3.9891e+04\n", + " 2.9000e+00 5.6642e+04\n", + "\n" + ] + } + ], "source": [ - "// Display the first 5 rows of the input data\n", + "// Display the first 5 rows of the input data.\n", "\n", "std::cout< x = arma::conv_to>::from(inputs.row(0));\n", "std::vector y = arma::conv_to>::from(inputs.row(1));\n", "\n", - "matplotlibcpp::scatter(x, y, 12, {{\"color\", \"coral\"}});\n", + "plt::figure_size(800, 800);\n", + "\n", + "plt::scatter(x, y, 12, {{\"color\",\"coral\"}});\n", "plt::xlabel(\"Years of Experience\");\n", "plt::ylabel(\"Salary in $\");\n", "plt::title(\"Experience vs. Salary\");\n", "\n", - "matplotlibcpp::save(\"./scatter1.png\");\n", + "plt::save(\"./scatter.png\");\n", "auto img = xw::image_from_file(\"scatter.png\").finalize();\n", "img" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "id": "coordinate-canvas", "metadata": {}, "outputs": [], "source": [ "// Split the data into features (X) and target (y) variables\n", - "// targets are the last row\n", + "// targets are the last row.\n", "\n", "arma::Row targets = arma::conv_to>::from(inputs.row(inputs.n_rows - 1));" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "id": "blank-mexican", "metadata": {}, "outputs": [], "source": [ - "// Labels are dropped from the originally loaded data to be used as features\n", + "// Labels are dropped from the originally loaded data to be used as features.\n", "\n", "inputs.shed_row(inputs.n_rows - 1);" ] }, + { + "cell_type": "markdown", + "id": "8da116b5-83f2-4acd-8ac3-0d68adbd83ca", + "metadata": {}, + "source": [ + "### Train Test Split\n", + "The dataset has to be split into a training set and a test set.\n", + "This can be done using the `data::Split()` api from mlpack.\n", + "Here the dataset has 30 observations and the `testRatio` is taken as 40% of the total observations.\n", + "This indicates the test set should have 40% * 30 = 12 observations and training test should have 18 observations respectively." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, "id": "mechanical-laundry", "metadata": {}, "outputs": [], "source": [ - "// Split the dataset into train and test sets using mlpack\n", + "// Split the dataset into train and test sets using mlpack.\n", "\n", "arma::mat Xtrain;\n", "arma::mat Xtest;\n", @@ -161,15 +207,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 96, "id": "friendly-petersburg", "metadata": {}, "outputs": [], "source": [ - "// Convert armadillo Rows into rowvec. (Required by mlpacks' LinearRegression API in this format)\n", + "// Convert armadillo Rows into rowvec. (Required by mlpacks' LinearRegression API in this format).\n", "\n", - "arma::rowvec y_train = arma::conv_to::from(Ytrain);\n", - "arma::rowvec y_test = arma::conv_to::from(Ytest);" + "arma::rowvec yTrain = arma::conv_to::from(Ytrain);\n", + "arma::rowvec yTest = arma::conv_to::from(Ytest);" ] }, { @@ -177,80 +223,147 @@ "id": "99955e22", "metadata": {}, "source": [ - "## Linear Model" + "## Linear Model\n", + "\n", + "Regression analysis is the most widely used method of prediction. Linear regression is used when the dataset has a linear correlation and as the name suggests, \n", + "simple linear regression has one independent variable (predictor) and one dependent variable(response).\n", + "\n", + "The simple linear regression equation is represented as $y = a+bx$ where $x$ is the explanatory variable, $y$ is the dependent variable, $b$ is coefficient and $a$ is the intercept\n", + "\n", + "To perform linear regression we'll be using `LinearRegression()` api from mlpack." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 97, "id": "published-illustration", "metadata": {}, "outputs": [], "source": [ - "// Create and Train Linear Regression model\n", + "// Create and Train Linear Regression model.\n", "\n", - "regression::LinearRegression lr(Xtrain, y_train, 0.5);" + "regression::LinearRegression lr(Xtrain, yTrain, 0.5);" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "id": "detailed-mystery", "metadata": {}, "outputs": [], "source": [ - "// Make predictions for test data points\n", + "// Make predictions for test data points.\n", "\n", - "arma::rowvec y_preds;\n", - "lr.Predict(Xtest, y_preds);" + "arma::rowvec yPreds;\n", + "lr.Predict(Xtest, yPreds);" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 99, "id": "indian-ambassador", "metadata": {}, "outputs": [], "source": [ - "// convert armadillo vectors and matrices to vector for plotting purpose\n", + "// Convert armadillo vectors and matrices to vector for plotting purpose.\n", "\n", - "std::vector x_test = arma::conv_to>::from(Xtest);\n", - "std::vector y_t = arma::conv_to>::from(y_test);\n", - "std::vector y_p = arma::conv_to>::from(y_preds);" + "std::vector XtestPlot = arma::conv_to>::from(Xtest);\n", + "std::vector yTestPlot = arma::conv_to>::from(yTest);\n", + "std::vector yPredsPlot = arma::conv_to>::from(yPreds);" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 100, "id": "related-approach", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c801c911f58343879350d4e837eb8e1b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "A Jupyter widget with unique id: c801c911f58343879350d4e837eb8e1b" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "// Visualize Predicted datapoints\n", + "// Visualize Predicted datapoints.\n", + "plt::figure_size(800, 800);\n", "\n", - "plt::scatter(x_test, y_t, 12, {{\"color\", \"coral\"}});\n", - "plt::plot(x_test,y_p);\n", + "plt::scatter(XtestPlot, yTestPlot, 12, {{\"color\", \"coral\"}});\n", + "plt::plot(XtestPlot,yPredsPlot);\n", "plt::xlabel(\"Years of Experience\");\n", "plt::ylabel(\"Salary in $\");\n", "plt::title(\"Predicted Experience vs. Salary\");\n", "\n", "plt::save(\"./scatter1.png\");\n", - "auto img = xw::image_from_file(\"scatter.png\").finalize();\n", + "auto img = xw::image_from_file(\"scatter1.png\").finalize();\n", "img" ] }, + { + "cell_type": "markdown", + "id": "0a10abbb-6b3a-423f-a573-1c650ac60b85", + "metadata": {}, + "source": [ + "Test data is visualized with `XtestPlot` and `yPredsPlot`, the coral points indicates the data points and the blue line indicates the regression line or best fit line." + ] + }, + { + "cell_type": "markdown", + "id": "c24be191-959f-4244-8921-c1ee0ea98b3b", + "metadata": {}, + "source": [ + "## Evaluation Metrics for Regression model\n", + "\n", + "In the Previous cell we have visualized our model performance by plotting the best fit line. Now we will use various evaluation metrics to understand how well our model has performed.\n", + "\n", + "* Mean Absolute Error (MAE) is the sum of absolute differences between actual and predicted values, without considering the direction.\n", + "$$ MAE = \\frac{\\sum_{i=1}^n\\lvert y_{i} - \\hat{y_{i}}\\rvert} {n} $$\n", + "* Mean Squared Error (MSE) is calculated as the mean or average of the squared differences between predicted and expected target values in a dataset, a lower value is better\n", + "$$ MSE = \\frac {1}{n} \\sum_{i=1}^n (y_{i} - \\hat{y_{i}})^2 $$\n", + "* Root Mean Squared Error (RMSE), Square root of MSE yields root mean square error (RMSE) it indicates the spread of the residual errors. It is always positive, and a lower value indicates better performance.\n", + "$$ RMSE = \\sqrt{\\frac {1}{n} \\sum_{i=1}^n (y_{i} - \\hat{y_{i}})^2} $$" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 101, "id": "british-moment", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean Absolute Error: 5753.06\n", + "Mean Squared Error: 3.9482e+07\n", + "Root Mean Squared Error: 6283.47\n" + ] + } + ], "source": [ - "// Model evaluation metrics\n", + "// Model evaluation metrics.\n", "\n", - "std::cout << \"Mean Absolute Error: \" << arma::mean(arma::abs(y_preds - y_test)) << std::endl;\n", - "std::cout << \"Mean Squared Error: \" << arma::mean(arma::pow(y_preds - y_test,2)) << std::endl;\n", - "std::cout << \"Root Mean Squared Error: \" << sqrt(arma::mean(arma::pow(y_preds - y_test,2))) << std::endl;" + "std::cout << \"Mean Absolute Error: \" << arma::mean(arma::abs(yPreds - yTest)) << std::endl;\n", + "std::cout << \"Mean Squared Error: \" << arma::mean(arma::pow(yPreds - yTest,2)) << std::endl;\n", + "std::cout << \"Root Mean Squared Error: \" << sqrt(arma::mean(arma::pow(yPreds - yTest,2))) << std::endl;" + ] + }, + { + "cell_type": "markdown", + "id": "17cd38d7-214a-4f5a-8c4d-0517f834e804", + "metadata": {}, + "source": [ + "From the above metrics we can notice that our model MAE is ~5K, which is relatively small compared to our average salary of $76003, from this we can conclude our model is resonably good fit." ] } ], From 006a9065980214f88d1db75ddedc9b617ce96ca4 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Wed, 2 Jun 2021 08:21:28 +0530 Subject: [PATCH 13/18] added various markdown sections to py nb & fixed styling --- ...lary-prediction-linear-regression-py.ipynb | 131 +++++++++--------- 1 file changed, 69 insertions(+), 62 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index af83374d..e1652efa 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -5,12 +5,22 @@ "id": "technical-identification", "metadata": {}, "source": [ - "## A simple example usage of Linear Regression applied to Salary dataset" + "## Predicting Salary using Linear Regression\n", + "\n", + "### Objective\n", + "* We have to predict the salary of an employee given how many years of experience they have.\n", + "\n", + "### Dataset\n", + "* Salary_Data.csv has 2 columns — “Years of Experience” and “Salary” for 30 employees in a company\n", + "\n", + "### Approach\n", + "* So in this example, we will train a Linear Regression model to learn the correlation between the number of years of experience of each employee and their respective salary. \n", + "* Once the model is trained, we will be able to do some sample predictions." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 1, "id": "449a2f52", "metadata": {}, "outputs": [], @@ -24,17 +34,9 @@ "import matplotlib.pyplot as plt" ] }, - { - "cell_type": "markdown", - "id": "8ee28540", - "metadata": {}, - "source": [ - "### Set Plotting Options" - ] - }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 2, "id": "786e154b", "metadata": {}, "outputs": [], @@ -46,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 3, "id": "9c7de4da", "metadata": {}, "outputs": [], @@ -57,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "id": "1d59786b", "metadata": {}, "outputs": [ @@ -125,7 +127,7 @@ "4 2.2 39891.0" ] }, - "execution_count": 26, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -137,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 5, "id": "5a3a26af", "metadata": {}, "outputs": [ @@ -223,7 +225,7 @@ "max 10.500000 122391.000000" ] }, - "execution_count": 27, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -235,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "id": "8d8410cd", "metadata": {}, "outputs": [ @@ -270,13 +272,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 8, "id": "ef71b4dc", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -297,15 +299,19 @@ }, { "cell_type": "markdown", - "id": "94e0f415", + "id": "739be4d1-2a46-49f1-9bc5-b07d598cbe28", "metadata": {}, "source": [ - "### Train test split" + "### Train Test Split\n", + "The dataset has to be split into a training set and a test set.\n", + "This can be done using the `preprocess_split()` api from mlpack.\n", + "Here the dataset has 30 observations and the `testRatio` is taken as 40% of the total observations.\n", + "This indicates the test set should have 40% * 30 = 12 observations and training test should have 18 observations respectively." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 9, "id": "2cd31a2a", "metadata": {}, "outputs": [], @@ -318,28 +324,13 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 10, "id": "9e82b675", "metadata": {}, "outputs": [], "source": [ "# Split the dataset using mlpack's preprocess_split method.\n", - "output = mlpack.preprocess_split(input=features, input_labels=targets, test_ratio=0.4, seed=101)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "26caf3cc", - "metadata": {}, - "outputs": [], - "source": [ - "# Preprocess_split returns a dictionary, which we'll unpack into\n", - "# respective variables for clarity of code.\n", - "X_train = output[\"training\"]\n", - "y_train = output[\"training_labels\"]\n", - "X_test = output[\"test\"]\n", - "y_test = output[\"test_labels\"]" + "splitData = mlpack.preprocess_split(input=features, input_labels=targets, test_ratio=0.4, seed=101)" ] }, { @@ -347,25 +338,31 @@ "id": "91e0b6b8", "metadata": {}, "source": [ - "### Training the linear model" + "### Training the linear model\n", + "\n", + "Regression analysis is the most widely used method of prediction. Linear regression is used when the dataset has a linear correlation and as the name suggests, simple linear regression has one independent variable (predictor) and one dependent variable(response).\n", + "\n", + "The simple linear regression equation is represented as y = a+bx where x is the explanatory variable, y is the dependent variable, b is coefficient and a is the intercept\n", + "\n", + "To perform linear regression we'll be using `LinearRegression()` api from mlpack." ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 11, "id": "5a642645", "metadata": {}, "outputs": [], "source": [ "# Create and train Linear Regression model.\n", - "output = mlpack.linear_regression(training=X_train,\n", - " training_responses=y_train, \n", + "output = mlpack.linear_regression(training=splitData[\"training\"],\n", + " training_responses=splitData[\"training_labels\"], \n", " lambda_=0.5, verbose=True)" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 12, "id": "8b2e2bb4", "metadata": {}, "outputs": [], @@ -383,23 +380,23 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 13, "id": "e41657ad", "metadata": {}, "outputs": [], "source": [ "# Predict the values of the test data.\n", - "output = mlpack.linear_regression(input_model=model, test=X_test)" + "predictions = mlpack.linear_regression(input_model=model, test=splitData[\"test\"])" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 14, "id": "d3734f1a", "metadata": {}, "outputs": [], "source": [ - "y_preds = output[\"output_predictions\"].reshape(-1, 1)" + "yPreds = predictions[\"output_predictions\"].reshape(-1, 1)" ] }, { @@ -407,18 +404,19 @@ "id": "53843549", "metadata": {}, "source": [ - "### Model Evaluation" + "### Model Evaluation\n", + "Test data is visualized with `splitData[\"test\"]` and `yPreds`, the coral points indicates the data points and the blue line indicates the regression line or best fit line." ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 22, "id": "531b842d", "metadata": {}, "outputs": [ { "data": { - "image/png": "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7px99tkALFy4kL/+9a/88Y9/zHicPn368OMf/5iysjJGjRrFiBEjuPXWW4EoEb333nu8//77rF69muOOO46ePXsybdo0Fi5cyNy5c1mxYgWdO3fm0ksvpaSkhJ/97Gc8//zzNGvWjNGjR3PjjTfy6KPV0ifEOZfksy83szRDi6egfl0G963SDPTVyhPPbiDR8ujatStFRUUATJo0iTlz5pRfK1m/fj0fffQRrVu35oYbbuD111+nTp06LF26lBUrVgBw8MEH0717xU3uunXrcsIJJzB69Gg2btxI8mjeb775JhdeeCF169alefPm9OrVi3feeYfXX3+9vLxly5acdNJJQJTk5s2bxymnnAJELbQWLVpU91vjXK138z/m89e3isqXmzdqwMovNsfaq80TTxVVR8skWxo0aABEiaG0NBqD1cz4wx/+QN++fVO2feyxx1i1ahWzZs2ifv36tG3btnxkhr322mu7xxo4cCDnnHMOw4YNSymvbJTzTN2gzYwuXbowbdq07R7TObfjPlj+Oafd/0b58i9P7chVJ3WIMaKt/BrPbqpv37489NBDlJSUAPDhhx+yYcMG1q9fzwEHHED9+vV55ZVX+OSTT3ZovyeeeCJDhw7lwgtTb9Pq2bMno0ePpqysjFWrVvH666/TrVs3evbsyahRoygrK2P58uW88sorAHTq1IlVq1aVJ56SkhLmz59fDa/cuex4bvZSegyfSrshE+gxfCrPzV4ad0gZlW0x+v/fW+VJp14dMe/mvnmTdMBbPHnvq6++onXrrcPVXXfddVWq96Mf/YiioiKOPfZYzIxmzZrx3HPP8T//8z+cddZZFBYWcvTRR3PooYfuUDyS+OUvf7lN+TnnnMO0adM46qijkMRvf/tbDjzwQM455xymTp3KEUccQceOHenVqxcAe+yxB2PHjuXqq69m/fr1lJaWcu2119KlS/62LF3tlbgHJtEdOXEPDBDLqaqKvDRvOZf/7d3y5YcvKuSUzs1jjCizrE0EV9Nkmgjugw8+4LDDDospIpeJfyYuDj2GT814cb5V0wLeGnJSDBGl+nxTCUcOm1S+3K3tvoy6rDt16mR/tI+dmQjOWzzOObcdFd0DU9m9Mbly7+QPeWDKR+XLk37ek47NG1WpblxD6Hjicc657WjZtCBji6eie2Ny4eNVX3LS714rX/5Jz0MYenrV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\n", + "image/png": "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h38WzmUXTzDOOVdPffPdRm6dPI/lX6emZcATTC234447blZ211138dBDVT0+o+b16tWLtm3bEjt2Xf/+/ZPGV5Wf//znjB07druXcc5tnwdeW0iXayfx9ykLmFW8LU+k3jLv5M9Cv/nNb1K6fTPDzGjQIP73R4sWLXjttdfo0aMHq1evZunSpSmNwzlX81at3cChw75/GOfZ3ffkhANapWRfXoPJQkOHDuWWW6IHJvbq1Ysrr7ySbt26se+++/LKK68AUFZWxsCBAznssMM48MADufvuuwH45ptv6N27N4ceeigHHHAAEyZMAKC4uJj999+f3/72txx66KEsWrRos/0OGDCA0aNHAzBu3DhOO+20inlmxsCBA+nSpQsHHHAAY8aMqSi/+OKL6dSpE/369WP58uUV68yaNYujjz6arl27UlRU5AnLuRS7dfK8uOQybfAxDOvfJWX78xpMNV33v7m8v2SLz2jaKp1aN+fakzpv93Y2btzIjBkzeOaZZ7juuut4/vnnuffee9lpp5148803+e677zjyyCM5/vjjadOmDU888QTNmzdn5cqVdO/enZNPPhmAefPmcf/993PHHXck3U/v3r351a9+RVlZGaNHj2bUqFEMGzYMiBLO22+/zTvvvMPKlSs57LDD6NmzJ9OmTWPevHnMmTOHZcuW0alTJ8477zxKS0u55JJLmDBhAi1btmTMmDEMGTKE++67b7vPh3Mu3pLV6zhixJSK6cuO7cBlx+6b8v16gqkDymsSXbt2pbi4GIDJkyfz7rvvVvRlrFmzhvnz51NQUMBVV13F1KlTadCgAYsXL2bZsmUA7LnnnnTv3r3S/eTk5NCjRw/GjBnDunXriB19+tVXX+XMM88kJyeHPfbYg6OPPpo333yTqVOnVpS3bt2aY445BoiS2Xvvvcdxxx0HRDWuVq1SU013rj676ok5/Hv6ZxXTs68+jp2bNkrLvj3BVFNN1DRSpXHjxkCUADZu3AhETVO33347RUVFccs+8MADrFixglmzZpGbm0u7du0q7i1p2rTpFvc1YMAATj31VIYOHRpXXtWD65JdXmxmdO7cmWnTpm1xn865rbdg+dcce+vUiulhp3Tm7B+2i1tm/OzFjJw0jyWr19G6RR4DizrS/5D8GovB+2DqqKKiIu68805KS0sB+Oijj1i7di1r1qxh9913Jzc3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\n", "text/plain": [ "
" ] @@ -431,12 +429,11 @@ ], "source": [ "# Plot the linear model.\n", - "\n", - "plt.scatter(X_test, y_test)\n", + "plt.scatter(splitData[\"test\"], splitData[\"test_labels\"])\n", "plt.xlabel(\"Years of Experience\")\n", "plt.ylabel(\"Salary in $\")\n", "plt.title(\"Experience vs Salary (Predictions)\")\n", - "plt.plot(X_test, y_preds)\n", + "plt.plot(splitData[\"test\"], yPreds)\n", "plt.legend([\"Linear Model\"])\n", "plt.show()" ] @@ -448,6 +445,8 @@ "source": [ "## Evaluation Metrics for Regression model\n", "\n", + "In the Previous cell we have visualized our model performance by plotting the best fit line. Now we will use various evaluation metrics to understand how well our model has performed.\n", + "\n", "* Mean Absolute Error (MAE) is the sum of absolute differences between actual and predicted values, without considering the direction.\n", "$$ MAE = \\frac{\\sum_{i=1}^n\\lvert y_{i} - \\hat{y_{i}}\\rvert} {n} $$\n", "* Mean Squared Error (MSE) is calculated as the mean or average of the squared differences between predicted and expected target values in a dataset, a lower value is better\n", @@ -458,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 23, "id": "c26ee546", "metadata": {}, "outputs": [], @@ -483,17 +482,25 @@ "output_type": "stream", "text": [ "---- Evaluation Metrics ----\n", - "Mean Absoulte Error: 5341.51\n", - "Mean Squared Error: 38284079.88\n", - "Root Mean Squared Error: 6187.41\n" + "Mean Absoulte Error: 4136.06\n", + "Mean Squared Error: 24922668.74\n", + "Root Mean Squared Error: 4992.26\n" ] } ], "source": [ "print(\"---- Evaluation Metrics ----\")\n", - "print(f\"Mean Absoulte Error: {mae(y_test, y_preds):.2f}\")\n", - "print(f\"Mean Squared Error: {mse(y_test, y_preds):.2f}\")\n", - "print(f\"Root Mean Squared Error: {np.sqrt(mse(y_test, y_preds)):.2f}\")" + "print(f\"Mean Absoulte Error: {mae(splitData['test_labels'], yPreds):.2f}\")\n", + "print(f\"Mean Squared Error: {mse(splitData['test_labels'], yPreds):.2f}\")\n", + "print(f\"Root Mean Squared Error: {np.sqrt(mse(splitData['test_labels'], yPreds)):.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "9f0899be-5069-432a-a3d3-b5c7f33c8417", + "metadata": {}, + "source": [ + "From the above metrics we can notice that our model MAE is ~4K, which is relatively small compared to our average salary of $76003, from this we can conclude our model is resonably good fit." ] } ], @@ -513,7 +520,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.7.8" } }, "nbformat": 4, From 470f6e1b4373fa39f9032b413dc370c3674fa9ec Mon Sep 17 00:00:00 2001 From: David Port Louis Date: Mon, 7 Jun 2021 07:16:56 +0530 Subject: [PATCH 14/18] fixed minor grammer mistakes in markdown Co-authored-by: Marcus Edel --- .../salary-prediction-linear-regression-py.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index e1652efa..2740c079 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -500,7 +500,7 @@ "id": "9f0899be-5069-432a-a3d3-b5c7f33c8417", "metadata": {}, "source": [ - "From the above metrics we can notice that our model MAE is ~4K, which is relatively small compared to our average salary of $76003, from this we can conclude our model is resonably good fit." + "From the above metrics, we can notice that our model MAE is ~4K, which is relatively small compared to our average salary of $76003, from this we can conclude our model is a reasonably good fit." ] } ], From 162523532625ff1356fab99277907940d96f750a Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Mon, 7 Jun 2021 22:27:45 +0530 Subject: [PATCH 15/18] included function to download dataset --- tools/download_data_set.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/download_data_set.py b/tools/download_data_set.py index 51a22ec7..260a369c 100755 --- a/tools/download_data_set.py +++ b/tools/download_data_set.py @@ -133,6 +133,11 @@ def iris_dataset(): tar.extractall() tar.close() clean() + +def salary_dataset(): + print("Downloading salary dataset...") + salary = requests.get("http://mlpack.org/datasets/Salary_Data.csv") + progress_bar("Salary_Data.csv", salary) def all_datasets(): mnist_dataset() @@ -140,6 +145,7 @@ def all_datasets(): stock_exchange_dataset() iris_dataset() body_fat_dataset() + salary_dataset() if __name__ == '__main__': @@ -161,6 +167,7 @@ def all_datasets(): stock : will download stock_exchange dataset iris : will downlaod the iris dataset bodyFat : will download the bodyFat dataset + salary: will download the salary dataset all : will download all datasets for all examples ''')) @@ -187,6 +194,9 @@ def all_datasets(): elif args.dataset_name == "bodyFat": create_dataset_dir() body_fat_dataset() + elif args.dataset_name == "salary": + create_dataset_dir() + salary_dataset() elif args.dataset_name == "all": create_dataset_dir() all_datasets() From cecf53af158d58574d0dd01f0887fcb5e87b12aa Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Tue, 8 Jun 2021 08:10:09 +0530 Subject: [PATCH 16/18] added url to fetch dataset --- ...ary-prediction-linear-regression-cpp.ipynb | 52 +++++++++++-------- ...lary-prediction-linear-regression-py.ipynb | 2 +- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb index d7ebb112..2cf55ab8 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb @@ -20,7 +20,17 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 1, + "id": "189dc5ff-22c4-4502-89a8-75e5ce51f3e1", + "metadata": {}, + "outputs": [], + "source": [ + "!wget -q https://mlpack.org/datasets/Salary_Data.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "behavioral-cycling", "metadata": {}, "outputs": [], @@ -36,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 3, "id": "db43325d", "metadata": {}, "outputs": [], @@ -50,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 4, "id": "9065ebb1", "metadata": {}, "outputs": [], @@ -61,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 5, "id": "victorian-donna", "metadata": {}, "outputs": [], @@ -74,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 6, "id": "deluxe-present", "metadata": {}, "outputs": [], @@ -86,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 7, "id": "desirable-experience", "metadata": {}, "outputs": [ @@ -114,22 +124,22 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 8, "id": "associate-fifteen", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "863dbaf827314170867bda7c7092f00b", + "model_id": "912d932e54c14571a0ac726764dac35f", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "A Jupyter widget with unique id: 863dbaf827314170867bda7c7092f00b" + "A Jupyter widget with unique id: 912d932e54c14571a0ac726764dac35f" ] }, - "execution_count": 92, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -154,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 9, "id": "coordinate-canvas", "metadata": {}, "outputs": [], @@ -167,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 10, "id": "blank-mexican", "metadata": {}, "outputs": [], @@ -191,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 11, "id": "mechanical-laundry", "metadata": {}, "outputs": [], @@ -207,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 12, "id": "friendly-petersburg", "metadata": {}, "outputs": [], @@ -235,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 13, "id": "published-illustration", "metadata": {}, "outputs": [], @@ -247,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 14, "id": "detailed-mystery", "metadata": {}, "outputs": [], @@ -260,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 15, "id": "indian-ambassador", "metadata": {}, "outputs": [], @@ -274,22 +284,22 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 16, "id": "related-approach", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c801c911f58343879350d4e837eb8e1b", + "model_id": "88f7de7663bd431382ce760f7f8a08a0", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "A Jupyter widget with unique id: c801c911f58343879350d4e837eb8e1b" + "A Jupyter widget with unique id: 88f7de7663bd431382ce760f7f8a08a0" ] }, - "execution_count": 100, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb index 2740c079..20a66613 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-py.ipynb @@ -54,7 +54,7 @@ "outputs": [], "source": [ "# Load the salary dataset.\n", - "data = pd.read_csv(\"Salary_Data.csv\")" + "data = pd.read_csv(\"https://mlpack.org/datasets/Salary_Data.csv\")" ] }, { From 41a1dab4e19f28a0c002446df18b837944e0be88 Mon Sep 17 00:00:00 2001 From: davidportlouis Date: Wed, 9 Jun 2021 07:41:33 +0530 Subject: [PATCH 17/18] fixed minor style issues --- .../salary-prediction-linear-regression-cpp.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb index 2cf55ab8..fd8f62f4 100644 --- a/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb +++ b/salary_prediction_with_linear_regression/salary-prediction-linear-regression-cpp.ipynb @@ -118,8 +118,8 @@ "source": [ "// Display the first 5 rows of the input data.\n", "\n", - "std::cout< Date: Fri, 11 Jun 2021 07:43:50 +0530 Subject: [PATCH 18/18] modified download_data_set.py --- tools/download_data_set.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/download_data_set.py b/tools/download_data_set.py index 260a369c..01fcb57b 100755 --- a/tools/download_data_set.py +++ b/tools/download_data_set.py @@ -144,8 +144,9 @@ def all_datasets(): electricity_consumption_dataset() stock_exchange_dataset() iris_dataset() - body_fat_dataset() salary_dataset() + body_fat_dataset() + if __name__ == '__main__':