{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Intro to Machine Learning, Week 1: Regression, Regularization " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This first programming session covers linear regression, batch and stochastic gradient descent as well as regularization. You will asked to implement those methods from numpy but we will also use the built in functions from scikit learn. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1. Generating data\n", "\n", "Using numpy together with the random submodule. Generate equispaced points on the line between 0 and 5. Choose a particular linear function of the form $t_i = \\beta_0 + \\beta_1 x_i$ for some $\\beta_0$ and $\\beta_1$ to generate the targets. Then perturb those targets with some random noise of the form $\\varepsilon_i \\sim \\mathcal{N}(0,\\sigma^2)$ for some appropriate $\\sigma^2$ (try a few values). \n", "\n", "Plot the result using the submodule pyplot from the module matplotlib. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy \n", "import matplotlib.pyplot as plt\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2. Learning the weights \n", "\n", "##### 2.1. Batch gradient descent. \n", "Now that we have the data, we will see if we can recover the weights. We will start by implementing a simple batch gradient descent approach. Using the pairs $\\left\\{x_i, t_i\\right\\}_{i=1}^N$, implement the gradient descent step that we learned in class. Try different learning rates and plot the evolution of the error on the training set. Display the resulting model on top of the data. \n", "\n", "In this case since we know how the data was generated, you can also plot the evolution of the test error throught he iterations. One way to measure the prediction error in this case is to take the difference between your model and the noiseless data $\\beta_0 + \\beta_1x$. In general, however, we do not have access to the true function that was used to generate the data. All we have is a set of pairs $\\left\\{\\mathbf{x}_i, t_i\\right\\}_{i=1}^N$. In this case, we will typically split this set into a training and a test part. Use the training part to learn the model and evaluate the model based on the test part as $\\sum_{i\\in \\text{test}}\\left(h_{\\beta_{\\text{training}}}(\\mathbf{x}_i) -t_i\\right)^2$. Implement this approach as well. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy \n", "import matplotlib.pyplot as plt\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2. Stochastic gradient and minibatch\n", "\n", "In class we have seen that an alternative to gradient descent is to apply iterations that rely on only one sample at each iteration. Such iterations thus take the form \n", "\n", "$$\\mathbf{\\beta}' \\leftarrow \\mathbf{\\beta} +\\eta \\cdot \\mathbf{x}_i\\left(\\langle \\mathbf{\\beta}, \\mathbf{x}_i\\rangle - t_i \\right)$$\n", "\n", "where $\\eta $ represents the learning rate and are repeated for each $\\left\\{\\mathbf{x}_i, t_i\\right\\}$ from the dataset. The procedure is repeated several time until an appropriate criterion (e.g. sufficiently small training error) is achieved. One pass over the whole training set is called epoch and the optimization thus relies on a repetition of such epochs. Implement this idea below and plot the evolution of the training and test error. Compare with the Batch gradient descent approach that you implemented above\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An intermediate approach between Stochastic gradient descent and Batch gradient descent consists in considering minibatches of pairs $\\left\\{\\mathbf{x}_i, t_i\\right\\}_{i\\in S}$. I.e. we divide the dataset (which often is too big to be considered as a whole) and apply the iterations on each batch separately. One epoch thus corresponding to a pass through the whole set of minibatches. Implement that last aproach, look at the evolution of the error with the iterations and compare with the previous approaches." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3. From univariate to multivariate\n", "\n", "We now want to extend your algorithm to the multidimensional framework. Consider a model of the form $\\beta_0 + \\beta_1 x_1 + \\beta_2 x_2$ and generate noisy targets as above. Then apply both the batch gradient descent and stochastic gradient descent iteration to recover your weights. This time, since we are in 2D space, we can plot the actual iterations. Using the contour function from matplotlib, plot and iteration on top of the level lines of the loss. Compare the trajectory of batch gradient descent with stochastic gradient descent. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4. Polynomial features\n", "\n", "So far we have worked with data that had been linearly generated. The Multivariate regression model is in fact much more powerful and can be used with any type of features, including polynomial features through which we can thus learn data that generated non linearly. Generate data following a model of the form $\\beta_0 + \\beta_1x+\\beta_2 x^2$ where you see $x^2$ as an additional feature, i.e. $x_1 = x$ and $x_2 = x^2$. Learn the model and plot the result in the space $(t, x)$ and $(t, x, x^2)$. In this last case, what do you notice?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### Exercise 5. Repeart the exercises above with the linear regression, polynomial features and from scikit learn. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 6. Regression for prediction\n", "\n", "Using the lines below load the evolution of the Google stock prices during the year 2004-2005. Relying on this data, try to learn a predictive model for the year 2005 - 2006. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[*********************100%***********************] 1 of 1 downloaded\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import yfinance as yf\n", "# Get the data of the stock AAPL\n", "data = yf.download('GOOG','2004-12-01','2005-10-14')\n", "# Import the plotting library\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "# Plot the close price of the AAPL\n", "data['Adj Close'].plot()\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 }