{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction to Machine Learning, Homework I " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Start date: Saturday February 15__\n", "\n", "__Due date: Tuesday February 25__\n", "\n", "In this homework, we will practice the notions of linear regression and overfitting that we learned during the first two weeks\n", "\n", "__The homework is on 30 points + 2 Bonus pts__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question I.1 (18pts)\n", "\n", "In this first exercise, we will stuy the effect of regularization on noisy linear data. The plot blow represents a set of training points $\\left\\{\\mathbf{x}^{(i)}, t^{(i)}\\right\\}_{i=1}^N$ in 1D on form which we would like to learn a regression line. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ngkAHgET8P96OyyTG5NOjAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np \n", "import matplotlib.pyplot as plt\n", "\n", "x = np.linspace(0,10, 20)\n", "y = 1.5*x + 1\n", "\n", "noise = np.random.normal(0,1,len(x))\n", "\n", "ynoisy = y + noise\n", "\n", "plt.scatter(x.reshape(-1,1), ynoisy.reshape(-1,1), facecolor='red')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question I.1 (5pts)\n", "\n", "Write a function 'linearRegression_Loss' that takes as input the matrix encoding the prototypes, i.e.\n", "\n", "$$\\mathbf{X} = \\left[\n", " \\begin{array}{ccc}\n", " - & (\\mathbf{x}^{(1)})^{T} & - \\\\\n", " - & (\\mathbf{x}^{(2)})^{T} & - \\\\\n", " & \\vdots & \\\\\n", " - & (\\mathbf{x}^{(n)})^{T} & -\n", " \\end{array}\n", "\\right]$$\n", "\n", "where the dataset is given by $\\left\\{\\mathbf{x}^{(i)}, t_i\\right\\}$ and each $\\mathbf{x}^{(i)}\\in \\mathbb{R}^D$ with \n", "$$\\mathbf{x}^{(i)} = \\left[\\begin{array}{c}\n", "x^{(i)}_1\\\\\n", "\\vdots \\\\\n", "x^{(i)}_n\\end{array}\\right]$$\n", "\n", "The function should implement gradient descent steps on the loss function\n", "\n", "$$\\ell(\\boldsymbol{\\beta}) = \\frac{1}{2N}\\sum_{i=1}^N \\left(t^{(i)} - \\left(\\boldsymbol{\\beta}^T\\mathbf{x}^{(i)} +\\beta_0\\right)\\right)^2$$\n", "\n", "Here $\\mathbf{\\beta}$ encodes the weights $\\beta_1, \\beta_2, \\ldots, \\beta_D$ of the variables $x^{(i)}_1, \\ldots, x^{(i)}_{D}$. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def linearRegression_Loss(X, t):\n", " \n", " '''The function should take as input a matrix of sample points X \n", " of size n by D (without the column of 1) as well as a vector of targets t \n", " and return a vector of regression coefficients beta'''\n", " \n", " \n", " # Put your code here \n", " \n", " \n", " \n", " \n", " \n", " return beta \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question I.2 (3pts)\n", "\n", "Apply your function to the dataset show above and display the resulting line." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "'''Displaying the linear regression model'''\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question I.3 (5pts)\n", "\n", "We now want to study how a more complex model would behave on our noisy dataset. In order to \n", "avoid bad surprises, we will start by augmenting your model with a regularization term.\n", "\n", "Extend your function 'linearRegression_Loss' with an parameter 'reg' to which we can assign one of the following values \n", "- 'ridge'\n", "- 'lasso'\n", "- 'none'\n", "\n", "Corresponding to the following models (the last choice encoding the OLS formulation given earlier)\n", "\n", "$$\\ell_{\\text{Ridge}}(\\mathbf{\\beta}) = \\frac{1}{2N}\\sum_{i=1}^N \\left(t^{(i)} - \\left(\\mathbf{\\beta}^T\\mathbf{x}^{(i)} + \\beta_0\\right)\\right)^2 + \\lambda \\sum_{i=1}^{D+1} |\\beta_i|^2$$\n", "\n", "$$\\ell_{\\text{LASSO}}(\\mathbf{\\beta}) = \\frac{1}{2N}\\sum_{i=1}^N \\left(t^{(i)} - \\left(\\mathbf{\\beta}^T\\mathbf{x}^{(i)} + \\beta_0\\right)\\right)^2 + \\lambda \\sum_{i=1}^{D+1} |\\beta_i|$$\n", "\n", "Your new function should also take an additional argument encoding the weight of the regularization (we will call it lambdaR)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "def linearRegression_Loss(X, t, reg, lambdaR):\n", " \n", " \n", " \n", " return beta\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question I.4. (5pts) \n", "\n", "Apply your regularized regression implementation to the data above after generating additional features of the form \n", "$[x^2, x^3, \\ldots, x^p]$ for $p = 10$. Note that this implies that your implementation should be able to handle multiple features. \n", "On that line you should make sure that your gradient algorithm computes a gradient that encodes all the partial derivatives \n", "$$\\text{grad}_{\\boldsymbol{\\beta}}\\ell(\\boldsymbol{\\beta}) = \\left(\\frac{\\partial \\ell(\\boldsymbol{\\beta})}{\\partial \\beta_1}, \\ldots, \\frac{\\partial \\ell(\\boldsymbol{\\beta})}{\\partial \\beta_{D+1}}\\right)$$\n", "\n", "plot the result without regularization and for the Ridge regression formulation for a few values of $\\lambda$ (let's says $\\lambda = 0.1, 1, 10$ and $100$)\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "'''Use your implementation of linearRegression_Loss below'''\n", "\n", "p =10\n", "powers = np.arange(0,p) + 1\n", "\n", "x = np.linspace(0,10, 20)\n", "np.power(x, powers)\n", "\n", "\n", "lambdaR = [0.1, 1, 10, 100]\n", "\n", "\n", "for i in np.arange(0,len(lambdaR)):\n", "\n", " beta = linearRegression_Loss(X, t, reg, lambdaR):\n", " \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Question II. Simplified Stock prediction (12pts)\n", "\n", "The lines below can be used to download stock values. As you can see, we will focus on the evolution of the Google stock between December 1st 2004 and October 14th 2005. " ] }, { "cell_type": "code", "execution_count": 10, "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()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question II.1. (5pts)\n", "\n", "Now that you have tested your linear regression implementations, we will turn to the regression implementation of scikit-learn. In this exercise, we will use scikit learn to fit a simplified prediction model. We will take an order $p$ prediction model for $p=50$, that is a model of the form\n", "\n", "$$\\text{value}_{t} = \\alpha_0 + \\sum_{i=1}^{P} \\alpha_i\\; \\text{value}_{t-i}$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import scikitlearn as sklearn \n", "from sklearn import linear_model\n", "\n", "from sklearn.linear_model import Ridge\n", "\n", "\n", "'''Put your code here'''\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question II.2. (5pts)\n", "\n", "On top of the previous values, we would like to capture seasonal trends. Although we would ideally need more than one year of data, we stick to the dataset that you downloaded above. Add a variable to your model that encodes the day of the year at which the stock value is measured. I.e. we want a model of the form\n", "\n", "$$\\text{value}_{t} = \\alpha_0 + \\sum_{i=1}^{P} \\alpha_i\\; \\text{value}_{t-i} + \\alpha_{P+1} t$$\n", "\n", "where $t_i$ encodes the time information (this should be a single number between $1$ and $365$)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "'''put your updated model here'''\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Question II.3. (2pts)\n", "\n", "Once you have learned your models, load the the history of google stocks for the year 2006 and apply your model to get the predicted prices for all $t = '01-01-2006'$ to $t = '12-01-2006'$. Then compute the prediction error as \n", "\n", "$$\\text{err} = \\frac{1}{365}\\sum_{t=1}^{365} (\\hat{\\text{value}}_{\\text{pred}, t} - \\text{value}_t)^2$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "error = # compte with your code \n", "\n", "print \"Prediction error: {}\".format(error)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bonus (2pts) \n", "\n", "A popular family of models for time series analysis is the family of ARMA models. The extension of those models to non stationnarity is known as ARIMA (for Autoregressive Integrated Moving Average). It is possible to access those models through the 'statsmodels' module : https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima_model.ARIMA.html\n", "\n", "Try to improve your predictions by fitting an ARIMA model to your data." ] } ], "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 }