{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Regression: Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This Notebook contain example of Regression problem, using Boston House Price dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:01.126902Z", "start_time": "2021-01-28T06:09:55.903195Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.datasets import load_boston\n", "np.set_printoptions(suppress=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:03.338368Z", "start_time": "2021-01-28T06:10:03.281968Z" } }, "outputs": [], "source": [ "data = load_boston(return_X_y=False)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:12.476775Z", "start_time": "2021-01-28T06:10:12.469213Z" } }, "outputs": [], "source": [ "X = data['data']\n", "y = data['target']\n", "feature_names = data['feature_names']\n", "DSC = data['DESCR']" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:21.184246Z", "start_time": "2021-01-28T06:10:21.180218Z" } }, "outputs": [], "source": [ "#print(DSC)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:28.891868Z", "start_time": "2021-01-28T06:10:28.885885Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of features: 13\n", "Number of examples: 506\n" ] } ], "source": [ "print('Number of features:',X.shape[1])\n", "print('Number of examples:',X.shape[0])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:10:40.132042Z", "start_time": "2021-01-28T06:10:40.121717Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CRIM\t0.00632\n", "ZN\t18.0\n", "INDUS\t2.31\n", "CHAS\t0.0\n", "NOX\t0.538\n", "RM\t6.575\n", "AGE\t65.2\n", "DIS\t4.09\n", "RAD\t1.0\n", "TAX\t296.0\n", "PTRATIO\t15.3\n", "B\t396.9\n", "LSTAT\t4.98\n", "--------\n", "target : 24.0\n" ] } ], "source": [ "n=0\n", "for i in range(X[n].shape[0]):\n", " print(feature_names[i],X[n][i],sep='\\t')\n", "print('--------')\n", "print('target : ',y[n])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# A simpler problem\n", "## Only two features" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:11:03.664744Z", "start_time": "2021-01-28T06:11:03.657821Z" } }, "outputs": [], "source": [ "X = X[:,[5,12]]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:11:05.338142Z", "start_time": "2021-01-28T06:11:05.326169Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x1 \t x2 \t| y\n", "______________________________\n", "6.575 \t 4.98 \t| 24.0\n", "6.421 \t 9.14 \t| 21.6\n", "7.185 \t 4.03 \t| 34.7\n", "6.998 \t 2.94 \t| 33.4\n", "7.147 \t 5.33 \t| 36.2\n", "6.43 \t 5.21 \t| 28.7\n", "6.012 \t 12.43 \t| 22.9\n", "6.172 \t 19.15 \t| 27.1\n", "5.631 \t 29.93 \t| 16.5\n", "6.004 \t 17.1 \t| 18.9\n" ] } ], "source": [ "print(' x1 \\t x2 \\t| y')\n", "print('_'*30)\n", "for xi,yi in zip(X[:10], y[:10]):\n", " print(xi[0],'\\t',xi[1],'\\t|',yi)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:11:10.362751Z", "start_time": "2021-01-28T06:11:10.066960Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(X[:,0],y,'.',alpha=0.5)\n", "plt.xlabel('input: x')\n", "plt.ylabel('output: y')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#y = x1w1 + x2w2 + .." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Least Square\n", "\n", "$$y' = Xw$$\n", "$.$\n", "$$min_w ||y-Xw||_2^2 $$\n", "$.$\n", "$$w = (X^{T}X)^{-1}X^{T}y$$" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:12:28.395668Z", "start_time": "2021-01-28T06:12:28.386460Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(506, 2) (506,)\n" ] } ], "source": [ "X = data['data'][:,[5,12]]\n", "y = data['target']\n", "print(X.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:12:57.960382Z", "start_time": "2021-01-28T06:12:57.950149Z" } }, "outputs": [ { "data": { "text/plain": [ "((506, 3), (506,))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X1 = np.c_[np.ones(len(X)), X]\n", "X1.shape, y.shape" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:13:00.522286Z", "start_time": "2021-01-28T06:13:00.514925Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 6.575, 4.98 ],\n", " [1. , 6.421, 9.14 ],\n", " [1. , 7.185, 4.03 ],\n", " ...,\n", " [1. , 6.976, 5.64 ],\n", " [1. , 6.794, 6.48 ],\n", " [1. , 6.03 , 7.88 ]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fitting (training)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:13:18.599468Z", "start_time": "2021-01-28T06:13:18.591457Z" } }, "outputs": [ { "data": { "text/plain": [ "array([64.49064447, 10.33577397, 4.81400466])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(((X1.T@X1)**(-1))@X1.T)@y" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:14:09.855105Z", "start_time": "2021-01-28T06:14:09.843281Z" } }, "outputs": [ { "data": { "text/plain": [ "array([-1.35827281, 5.09478798, -0.64235833])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.pinv(X1)@y" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:14:18.589772Z", "start_time": "2021-01-28T06:14:18.579799Z" } }, "outputs": [ { "data": { "text/plain": [ "array([-1.35827281, 5.09478798, -0.64235833])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = np.linalg.pinv(X1)@y\n", "w" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:14:32.086328Z", "start_time": "2021-01-28T06:14:32.075907Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 6.575, 4.98 ],\n", " [1. , 6.421, 9.14 ],\n", " [1. , 7.185, 4.03 ],\n", " ...,\n", " [1. , 6.976, 5.64 ],\n", " [1. , 6.794, 6.48 ],\n", " [1. , 6.03 , 7.88 ]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X1" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:14:37.220575Z", "start_time": "2021-01-28T06:14:37.210052Z" } }, "outputs": [ { "data": { "text/plain": [ "array([-1.35827281, 5.09478798, -0.64235833])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:15:08.171512Z", "start_time": "2021-01-28T06:15:08.162573Z" } }, "outputs": [ { "data": { "text/plain": [ "24.0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y[0]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:14:53.285065Z", "start_time": "2021-01-28T06:14:53.281534Z" } }, "outputs": [], "source": [ "yp = X1@w" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:15:02.133214Z", "start_time": "2021-01-28T06:15:02.125231Z" } }, "outputs": [ { "data": { "text/plain": [ "28.941013680602513" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yp[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mean Square Error" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:15:37.420670Z", "start_time": "2021-01-28T06:15:37.409672Z" } }, "outputs": [ { "data": { "text/plain": [ "30.51246877729947" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean((y - yp)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mean Absolute Error" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:15:54.894509Z", "start_time": "2021-01-28T06:15:54.884621Z" } }, "outputs": [ { "data": { "text/plain": [ "3.952580067119268" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(np.abs(y - yp))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Sckit Learn Library" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:16:25.036090Z", "start_time": "2021-01-28T06:16:24.600035Z" } }, "outputs": [], "source": [ "from sklearn import linear_model" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:16:26.953252Z", "start_time": "2021-01-28T06:16:26.945257Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(506, 2) (506,)\n" ] } ], "source": [ "X = data['data'][:,[5,12]]\n", "y = data['target']\n", "print(X.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:16:38.633091Z", "start_time": "2021-01-28T06:16:38.628107Z" } }, "outputs": [], "source": [ "model = linear_model.LinearRegression()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:17:06.666126Z", "start_time": "2021-01-28T06:17:06.661212Z" } }, "outputs": [], "source": [ "#help(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fitting (training)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:17:19.510856Z", "start_time": "2021-01-28T06:17:19.499027Z" } }, "outputs": [ { "data": { "text/plain": [ "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(X,y)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:17:29.190763Z", "start_time": "2021-01-28T06:17:29.181926Z" } }, "outputs": [ { "data": { "text/plain": [ "(-1.3582728118744818, array([ 5.09478798, -0.64235833]))" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.intercept_, model.coef_" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:17:54.766831Z", "start_time": "2021-01-28T06:17:54.761917Z" } }, "outputs": [], "source": [ "yp = model.predict(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mean Square & Abosolute Error" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:07.871787Z", "start_time": "2021-01-28T06:18:07.863851Z" } }, "outputs": [ { "data": { "text/plain": [ "30.51246877729947" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean((y-yp)**2)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:10.915228Z", "start_time": "2021-01-28T06:18:10.907219Z" } }, "outputs": [ { "data": { "text/plain": [ "3.952580067119271" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(np.abs((y-yp)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's use all the features" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:22.396248Z", "start_time": "2021-01-28T06:18:22.389141Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(506, 13) (506,)\n" ] } ], "source": [ "X = data['data']\n", "y = data['target']\n", "print(X.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:30.585057Z", "start_time": "2021-01-28T06:18:30.580027Z" } }, "outputs": [], "source": [ "model = linear_model.LinearRegression()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fitting (training)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:32.650280Z", "start_time": "2021-01-28T06:18:32.641036Z" } }, "outputs": [ { "data": { "text/plain": [ "(36.45948838509001,\n", " array([ -0.10801136, 0.04642046, 0.02055863, 2.68673382,\n", " -17.76661123, 3.80986521, 0.00069222, -1.47556685,\n", " 0.30604948, -0.01233459, -0.95274723, 0.00931168,\n", " -0.52475838]))" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(X,y)\n", "model.intercept_, model.coef_" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:38.253878Z", "start_time": "2021-01-28T06:18:38.247531Z" } }, "outputs": [], "source": [ "yp = model.predict(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mean Square & Abosolute Error" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:40.145221Z", "start_time": "2021-01-28T06:18:40.137243Z" } }, "outputs": [ { "data": { "text/plain": [ "21.894831181729206" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean((y-yp)**2)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:18:49.397039Z", "start_time": "2021-01-28T06:18:49.388902Z" } }, "outputs": [ { "data": { "text/plain": [ "3.270862810900317" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(np.abs((y-yp)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Training & Testing" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:26:40.844901Z", "start_time": "2021-01-28T06:26:40.841254Z" } }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:26:42.527737Z", "start_time": "2021-01-28T06:26:42.517294Z" } }, "outputs": [ { "data": { "text/plain": [ "((354, 13), (354,), (152, 13), (152,))" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Xt, Xs, yt, ys = train_test_split(X,y,test_size=0.3)\n", "\n", "Xt.shape, yt.shape, Xs.shape, ys.shape" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:27:07.351160Z", "start_time": "2021-01-28T06:27:07.347460Z" } }, "outputs": [], "source": [ "model = linear_model.LinearRegression()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:27:16.725539Z", "start_time": "2021-01-28T06:27:16.716635Z" } }, "outputs": [ { "data": { "text/plain": [ "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(Xt,yt)\n", "#model.intercept_, model.coef_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Testing & Predicting" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:27:32.602435Z", "start_time": "2021-01-28T06:27:32.597413Z" } }, "outputs": [], "source": [ "ytp = model.predict(Xt)\n", "ysp = model.predict(Xs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mean Square & Abosolute Error" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:27:43.440032Z", "start_time": "2021-01-28T06:27:43.430535Z" } }, "outputs": [ { "data": { "text/plain": [ "22.039530375706953" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean((yt-ytp)**2)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:27:54.612372Z", "start_time": "2021-01-28T06:27:54.602247Z" } }, "outputs": [ { "data": { "text/plain": [ "22.550610525430503" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean((ys-ysp)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Actual Prediction" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:28:07.618048Z", "start_time": "2021-01-28T06:28:07.610032Z" } }, "outputs": [ { "data": { "text/plain": [ "50.0" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yt[0]" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:28:12.133665Z", "start_time": "2021-01-28T06:28:12.126720Z" } }, "outputs": [ { "data": { "text/plain": [ "40.489586293051204" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ytp[0]" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:28:22.853913Z", "start_time": "2021-01-28T06:28:22.846262Z" } }, "outputs": [ { "data": { "text/plain": [ "24.3" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ys[0]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "ExecuteTime": { "end_time": "2021-01-28T06:28:29.640278Z", "start_time": "2021-01-28T06:28:29.631561Z" } }, "outputs": [ { "data": { "text/plain": [ "29.198709476914402" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ysp[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Regression: Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }