278 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			52 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
{
 | 
						|
 "cells": [
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "# Optional Lab: Linear Regression using Scikit-Learn"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "There is an open-source, commercially usable machine learning toolkit called [scikit-learn](https://scikit-learn.org/stable/index.html). This toolkit contains implementations of many of the algorithms that you will work with in this course.\n",
 | 
						|
    "\n"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "## Goals\n",
 | 
						|
    "In this lab you will:\n",
 | 
						|
    "- Utilize  scikit-learn to implement linear regression using Gradient Descent"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "## Tools\n",
 | 
						|
    "You will utilize functions from scikit-learn as well as matplotlib and NumPy. "
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 1,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [],
 | 
						|
   "source": [
 | 
						|
    "import numpy as np\n",
 | 
						|
    "import matplotlib.pyplot as plt\n",
 | 
						|
    "from sklearn.linear_model import SGDRegressor\n",
 | 
						|
    "from sklearn.preprocessing import StandardScaler\n",
 | 
						|
    "from lab_utils_multi import  load_house_data\n",
 | 
						|
    "from lab_utils_common import dlc\n",
 | 
						|
    "np.set_printoptions(precision=2)\n",
 | 
						|
    "plt.style.use('./deeplearning.mplstyle')"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "# Gradient Descent\n",
 | 
						|
    "Scikit-learn has a gradient descent regression model [sklearn.linear_model.SGDRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor.html#examples-using-sklearn-linear-model-sgdregressor).  Like your previous implementation of gradient descent, this model performs best with normalized inputs. [sklearn.preprocessing.StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler) will perform z-score normalization as in a previous lab. Here it is referred to as 'standard score'."
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### Load the data set"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 2,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [],
 | 
						|
   "source": [
 | 
						|
    "X_train, y_train = load_house_data()\n",
 | 
						|
    "X_features = ['size(sqft)','bedrooms','floors','age']"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### Scale/normalize the training data"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 3,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [
 | 
						|
    {
 | 
						|
     "name": "stdout",
 | 
						|
     "output_type": "stream",
 | 
						|
     "text": [
 | 
						|
      "Peak to Peak range by column in Raw        X:[2.41e+03 4.00e+00 1.00e+00 9.50e+01]\n",
 | 
						|
      "Peak to Peak range by column in Normalized X:[5.85 6.14 2.06 3.69]\n"
 | 
						|
     ]
 | 
						|
    }
 | 
						|
   ],
 | 
						|
   "source": [
 | 
						|
    "scaler = StandardScaler()\n",
 | 
						|
    "X_norm = scaler.fit_transform(X_train)\n",
 | 
						|
    "print(f\"Peak to Peak range by column in Raw        X:{np.ptp(X_train,axis=0)}\")   \n",
 | 
						|
    "print(f\"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}\")"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### Create and fit the regression model"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 4,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [
 | 
						|
    {
 | 
						|
     "name": "stdout",
 | 
						|
     "output_type": "stream",
 | 
						|
     "text": [
 | 
						|
      "SGDRegressor(alpha=0.0001, average=False, early_stopping=False, epsilon=0.1,\n",
 | 
						|
      "             eta0=0.01, fit_intercept=True, l1_ratio=0.15,\n",
 | 
						|
      "             learning_rate='invscaling', loss='squared_loss', max_iter=1000,\n",
 | 
						|
      "             n_iter_no_change=5, penalty='l2', power_t=0.25, random_state=None,\n",
 | 
						|
      "             shuffle=True, tol=0.001, validation_fraction=0.1, verbose=0,\n",
 | 
						|
      "             warm_start=False)\n",
 | 
						|
      "number of iterations completed: 135, number of weight updates: 13366.0\n"
 | 
						|
     ]
 | 
						|
    }
 | 
						|
   ],
 | 
						|
   "source": [
 | 
						|
    "sgdr = SGDRegressor(max_iter=1000)\n",
 | 
						|
    "sgdr.fit(X_norm, y_train)\n",
 | 
						|
    "print(sgdr)\n",
 | 
						|
    "print(f\"number of iterations completed: {sgdr.n_iter_}, number of weight updates: {sgdr.t_}\")"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### View parameters\n",
 | 
						|
    "Note, the parameters are associated with the *normalized* input data. The fit parameters are very close to those found in the previous lab with this data."
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 5,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [
 | 
						|
    {
 | 
						|
     "name": "stdout",
 | 
						|
     "output_type": "stream",
 | 
						|
     "text": [
 | 
						|
      "model parameters:                   w: [110.29 -21.12 -32.54 -38.03], b:[363.17]\n",
 | 
						|
      "model parameters from previous lab: w: [110.56 -21.27 -32.71 -37.97], b: 363.16\n"
 | 
						|
     ]
 | 
						|
    }
 | 
						|
   ],
 | 
						|
   "source": [
 | 
						|
    "b_norm = sgdr.intercept_\n",
 | 
						|
    "w_norm = sgdr.coef_\n",
 | 
						|
    "print(f\"model parameters:                   w: {w_norm}, b:{b_norm}\")\n",
 | 
						|
    "print( \"model parameters from previous lab: w: [110.56 -21.27 -32.71 -37.97], b: 363.16\")"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### Make predictions\n",
 | 
						|
    "Predict the targets of the training data. Use both the `predict` routine and compute using $w$ and $b$."
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 6,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [
 | 
						|
    {
 | 
						|
     "name": "stdout",
 | 
						|
     "output_type": "stream",
 | 
						|
     "text": [
 | 
						|
      "prediction using np.dot() and sgdr.predict match: True\n",
 | 
						|
      "Prediction on training set:\n",
 | 
						|
      "[295.18 485.97 389.61 492.14]\n",
 | 
						|
      "Target values \n",
 | 
						|
      "[300.  509.8 394.  540. ]\n"
 | 
						|
     ]
 | 
						|
    }
 | 
						|
   ],
 | 
						|
   "source": [
 | 
						|
    "# make a prediction using sgdr.predict()\n",
 | 
						|
    "y_pred_sgd = sgdr.predict(X_norm)\n",
 | 
						|
    "# make a prediction using w,b. \n",
 | 
						|
    "y_pred = np.dot(X_norm, w_norm) + b_norm  \n",
 | 
						|
    "print(f\"prediction using np.dot() and sgdr.predict match: {(y_pred == y_pred_sgd).all()}\")\n",
 | 
						|
    "\n",
 | 
						|
    "print(f\"Prediction on training set:\\n{y_pred[:4]}\" )\n",
 | 
						|
    "print(f\"Target values \\n{y_train[:4]}\")"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "### Plot Results\n",
 | 
						|
    "Let's plot the predictions versus the target values."
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": 7,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [
 | 
						|
    {
 | 
						|
     "data": {
 | 
						|
      "image/png": "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27fr1rl58yYDwH777TfB/Tekgf3iiy/WWZ74GtgeHh66csUYY5999hlr166d7vXTTz/NaawwxtjcuXPrbGDXVFFRwQYNGsQGDBjA2U9tO3bsYC4uLqywsJB3eVRUFOvevbuubtY2YMAANnbsWE7a6tWrmZ2dne7H0MCBA1nHjh0521i0aBELCQnhvE+j0bAOHTpwfmjWNnDgQNatWzdO2rRp01hoaKjutbe3N/vnP//JWef9999nCoVC99rPz48NHjyYs051Gfn55591aT/++CMDwH766Sdd2o4dOxgAVlxcLJjPd999l0VGRnKOt64Gdk3r169nDg4O7MSJE4wxxtLT05lIJGKXLl3irPfxxx+zHj16MMYYS0hIYADY5cuXdctzc3OZnZ1dgxrYhh5zVFQUe+qppzjb2rlzJxOJRCwjI4MxxphcLmfz58/nrDNmzBjOcQ8cOJDNnTuXs05mZiYDwM6cOcMYowY2aXrURYRYjR07diAsLAxeXl5wcnLChAkTUFFRgVu3bnHWe+qpp3T/v3btGioqKhAaGspZp1+/frr/5+XlITMzE7Nnz4aTk5PuX/VgomvXrhmUz3HjxqGsrAy//PILAO0j0aKiIl1XjpMnT6KiogJyuZyzv7i4OFy9epWzreDgYM7ryZMn48KFCwgMDMT06dOxfft2VFRUGJS/999/H59++ilCQkIwd+5cHD58uEHvq/mZtWrVivfxb838pqamoqysDGPGjOEc57Rp01BYWIi8vDzd+59++mnd+2xsbDjfYW25ubnIysrC0KFDG5RvIampqXB3d0fXrl11aba2tggJCUFqaipn3Z49e+r+365dO0gkEty+ffux9j9jxgz89NNPePLJJ/Hee+9h79699Q5qfOKJJ2Bra6t7LZfLOfm4ePFinWW9Pm+//TaysrLw888/6/YzfPhwzvcHAEOGDEGHDh2gUCgwfvx4rFu3Dnfu3NFt5/Tp04iIiIBYzH8JSk1NRVhYGCdt4MCBKC8vR1pami6tT58+nG2cPHkSp0+f5uTH2dkZGRkZenWntprfIcD97IqKinDjxg3ePGVkZOD+/fu6tNp1slqPHj10/6/u69+9e3e9tNzcXACARqPBsmXL0LNnT3h4eMDJyQnffPMNMjMz6zwOPvv378esWbMQGxurqzunTp0CYwx9+/blfF6ffvqp7rO6ePEi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\n",
 | 
						|
      "text/plain": [
 | 
						|
       "<Figure size 864x216 with 4 Axes>"
 | 
						|
      ]
 | 
						|
     },
 | 
						|
     "metadata": {},
 | 
						|
     "output_type": "display_data"
 | 
						|
    }
 | 
						|
   ],
 | 
						|
   "source": [
 | 
						|
    "# plot predictions and targets vs original features    \n",
 | 
						|
    "fig,ax=plt.subplots(1,4,figsize=(12,3),sharey=True)\n",
 | 
						|
    "for i in range(len(ax)):\n",
 | 
						|
    "    ax[i].scatter(X_train[:,i],y_train, label = 'target')\n",
 | 
						|
    "    ax[i].set_xlabel(X_features[i])\n",
 | 
						|
    "    ax[i].scatter(X_train[:,i],y_pred,color=dlc[\"dlorange\"], label = 'predict')\n",
 | 
						|
    "ax[0].set_ylabel(\"Price\"); ax[0].legend();\n",
 | 
						|
    "fig.suptitle(\"target versus prediction using z-score normalized model\")\n",
 | 
						|
    "plt.show()"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "markdown",
 | 
						|
   "metadata": {},
 | 
						|
   "source": [
 | 
						|
    "## Congratulations!\n",
 | 
						|
    "In this lab you:\n",
 | 
						|
    "- utilized an open-source machine learning toolkit, scikit-learn\n",
 | 
						|
    "- implemented linear regression using gradient descent and feature normalization from that toolkit"
 | 
						|
   ]
 | 
						|
  },
 | 
						|
  {
 | 
						|
   "cell_type": "code",
 | 
						|
   "execution_count": null,
 | 
						|
   "metadata": {},
 | 
						|
   "outputs": [],
 | 
						|
   "source": []
 | 
						|
  }
 | 
						|
 ],
 | 
						|
 "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.7.6"
 | 
						|
  }
 | 
						|
 },
 | 
						|
 "nbformat": 4,
 | 
						|
 "nbformat_minor": 5
 | 
						|
}
 |