{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# In Depth: Linear Regression" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\n", "\n", "*This notebook contains an excerpt from the [Python Data Science Handbook](http://shop.oreilly.com/product/0636920034919.do) by Jake VanderPlas; the content is available [on GitHub](https://github.com/jakevdp/PythonDataScienceHandbook).*\n", "\n", "*The text is released under the [CC-BY-NC-ND license](https://creativecommons.org/licenses/by-nc-nd/3.0/us/legalcode), and code is released under the [MIT license](https://opensource.org/licenses/MIT). If you find this content useful, please consider supporting the work by [buying the book](http://shop.oreilly.com/product/0636920034919.do)!*" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\n", "< [In Depth: Naive Bayes Classification](05.05-Naive-Bayes.ipynb) | [Contents](Index.ipynb) | [In-Depth: Support Vector Machines](05.07-Support-Vector-Machines.ipynb) >" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Naive Bayes (discussed earlier in [In Depth: Naive Bayes Classification](05.05-Naive-Bayes.ipynb)) is a good starting point for classification tasks\n", "- linear regression models are a good starting point for regression tasks.\n", " - can be fit very quickly, and \n", " - are very interpretable.\n", " \n", "The simplest form of a linear regression model (i.e., fitting a straight line to data) \n", "- Extended to model more complicated data behavior.\n", "- We will see how linear models can be generalized to account for more complicated patterns in data.\n", "\n", "We begin with the standard imports:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:48:28.419326Z", "start_time": "2018-12-26T01:48:26.363658Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns; sns.set()\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Simple Linear Regression\n", "\n", "We will start with the most familiar linear regression, a straight-line fit to data.\n", "A straight-line fit is a model of the form\n", "$$\n", "y = ax + b\n", "$$\n", "where $a$ is commonly known as the *slope*, and $b$ is commonly known as the *intercept*.\n", "\n", "Consider the following data, which is scattered about a line with a slope of 2 and an intercept of -5:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:59:07.712292Z", "start_time": "2018-12-26T01:59:07.534304Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rng = np.random.RandomState(1)\n", "x = 10 * rng.rand(50)\n", "y = 2 * x - 5 + rng.randn(50)\n", "plt.scatter(x, y);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can use Scikit-Learn's ``LinearRegression`` estimator to fit this data and construct the best-fit line:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:59:08.889365Z", "start_time": "2018-12-26T01:59:08.703013Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "model = LinearRegression(fit_intercept=True)\n", "\n", "model.fit(x[:, np.newaxis], y)\n", "\n", "xfit = np.linspace(0, 10, 1000)\n", "ytest = 2*xfit -5\n", "yfit = model.predict(xfit[:, np.newaxis])\n", "\n", "plt.scatter(x, y)\n", "plt.plot(xfit, yfit);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The slope and intercept of the data are contained in the model's fit parameters, which in Scikit-Learn are always marked by a trailing underscore.\n", "Here the relevant parameters are ``coef_`` and ``intercept_``:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:59:13.031371Z", "start_time": "2018-12-26T01:59:13.027600Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model slope: 2.02720881036\n", "Model intercept: -4.99857708555\n" ] } ], "source": [ "print(\"Model slope: \", model.coef_[0])\n", "print(\"Model intercept:\", model.intercept_)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We see that the results are very close to the inputs, as we might hope." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Model evaluation for regression**\n", "\n", "- RMSE\n", "- R Square\n", "\n", "https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T02:32:43.445443Z", "start_time": "2018-12-26T02:32:43.441417Z" }, "code_folding": [], "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Root mean square error 均方根误差,亦称标准误差\n", "# https://en.wikipedia.org/wiki/Root-mean-square_deviation\n", "def rmse(y_test, y_pred): \n", " mse = np.mean((y_test - y_pred) ** 2)\n", " return mse ** 0.5" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T02:32:47.989491Z", "start_time": "2018-12-26T02:32:47.983715Z" }, "code_folding": [], "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# R square\n", "def R2(y_test, y_pred): \n", " residuals_sum_of_squares = np.sum((y_pred - y_test)**2)\n", " total_sum_of_squares = np.sum((y_test - np.mean(y_test))**2)\n", " return 1 - residuals_sum_of_squares/total_sum_of_squares\n", "# https://en.wikipedia.org/wiki/Coefficient_of_determination" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T02:35:37.441154Z", "start_time": "2018-12-26T02:35:37.436570Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RMSE: 0.1584\n", "R2 score: 0.9992\n" ] } ], "source": [ "print('RMSE: %.4f' % rmse(ytest, yfit))\n", "print('R2 score: %.4f' % R2(ytest, yfit))" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T06:10:19.758587Z", "start_time": "2018-12-26T06:10:19.755636Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from sklearn.metrics import mean_squared_error, r2_score, explained_variance_score" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T02:35:47.008382Z", "start_time": "2018-12-26T02:35:47.002317Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RMSE: 0.1584\n", "R2 score: 0.9992\n", "Variance score: 0.9998\n" ] } ], "source": [ "print('RMSE: %.4f' % mean_squared_error(ytest, yfit) ** 0.5)\n", "print('R2 score: %.4f' % r2_score(ytest, yfit))\n", "print('Variance score: %.4f' % explained_variance_score(ytest, yfit))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The ``LinearRegression`` estimator is much more capable than this, however—in addition to simple straight-line fits, it can also handle multidimensional linear models of the form\n", "$$\n", "y = a_0 + a_1 x_1 + a_2 x_2 + \\cdots\n", "$$\n", "where there are multiple $x$ values.\n", "Geometrically, this is akin to fitting a plane to points in three dimensions, or fitting a hyper-plane to points in higher dimensions." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Building some example data using NumPy**\n", "\n", "The multidimensional nature of such regressions makes them more difficult to visualize" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:53:32.046192Z", "start_time": "2018-12-26T01:53:32.040784Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "rng = np.random.RandomState(1)\n", "X = 10 * rng.rand(100, 3)\n", "y = 0.5 + np.dot(X, [1.5, -2., 1.])\n", "# $y$ is constructed from three random $x$ values" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "we can use the single ``LinearRegression`` estimator to fit lines, planes, or hyperplanes to our data." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2018-12-26T01:52:01.908289Z", "start_time": "2018-12-26T01:52:01.891454Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5\n", "[ 1.5 -2. 1. ]\n" ] } ], "source": [ "model.fit(X, y)\n", "print(model.intercept_)\n", "print(model.coef_)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Basis Function Regression 基函数回归\n", "\n", "One trick you can use to adapt linear regression to nonlinear relationships between variables\n", "- to transform the data according to *basis functions*.\n", "\n", "We have seen one version of this before, in the ``PolynomialRegression`` pipeline used in [Hyperparameters and Model Validation](05.03-Hyperparameters-and-Model-Validation.ipynb) and [Feature Engineering](05.04-Feature-Engineering.ipynb).\n", "\n", "The idea is to take our multidimensional linear model:\n", "$$\n", "y = a_0 + a_1 x_1 + a_2 x_2 + a_3 x_3 + \\cdots\n", "$$\n", "and build the $x_1, x_2, x_3,$ and so on, from our single-dimensional input $x$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "That is, we let $x_n = f_n(x)$, where $f_n()$ is some function that transforms our data.\n", "\n", "For example, if $f_n(x) = x^n$, our model becomes a polynomial regression:\n", "$$\n", "y = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \\cdots\n", "$$\n", "\n", "Notice that this is *still a linear model*\n", "- the linearity refers to the fact that the coefficients $a_n$ never multiply or divide each other.\n", "- What we have effectively done is taken our one-dimensional $x$ values and projected them into a higher dimension, so that a linear fit can fit more complicated relationships between $x$ and $y$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Polynomial basis functions 多项式基函数\n", "\n", "> polynomial, Synonym: multinomial, 多项式\n", "\n", "This polynomial projection is useful enough that it is built into Scikit-Learn, using the ``PolynomialFeatures`` transformer:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T09:39:14.565054Z", "start_time": "2018-05-20T09:39:14.558498Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 2., 4., 8.],\n", " [ 3., 9., 27.],\n", " [ 4., 16., 64.]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import PolynomialFeatures\n", "x = np.array([2, 3, 4])\n", "poly = PolynomialFeatures(3, include_bias=False)\n", "poly.fit_transform(x[:, None])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We see here that the transformer has converted our one-dimensional array into a three-dimensional array by taking the exponent of each value.\n", "- This new, higher-dimensional data representation can then be plugged into a linear regression.\n", "- As we saw in [Feature Engineering](05.04-Feature-Engineering.ipynb), the cleanest way to accomplish this is to use a pipeline.\n", "\n", "Let's make a 7th-degree polynomial model in this way:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T09:40:06.921714Z", "start_time": "2018-05-20T09:40:06.917263Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from sklearn.pipeline import make_pipeline\n", "poly_model = make_pipeline(PolynomialFeatures(7),\n", " LinearRegression())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With this transform in place, we can use the linear model to fit much more complicated relationships between $x$ and $y$. \n", "\n", "For example, here is a sine wave with noise:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Our linear model, through the use of 7th-order polynomial basis functions, can provide an excellent fit to this non-linear data!" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T09:56:35.280127Z", "start_time": "2018-05-20T09:56:35.146469Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rng = np.random.RandomState(1)\n", "x = 10 * rng.rand(50)\n", "y = np.sin(x) + 0.1 * rng.randn(50)\n", "xfit = np.linspace(0, 10, 1000)\n", "\n", "poly_model.fit(x[:, np.newaxis], y)\n", "yfit = poly_model.predict(xfit[:, np.newaxis])\n", "\n", "plt.scatter(x, y)\n", "plt.plot(xfit, yfit);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Gaussian basis functions 高斯基函数\n", "\n", "Of course, other basis functions are possible.\n", "For example, one useful pattern is to fit a model that is not a sum of polynomial bases, but a sum of Gaussian bases.\n", "The result might look something like the following figure:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "\n", "
[figure source in Appendix](#Gaussian-Basis)
\n", "\n", "The shaded regions in the plot are the scaled basis functions, and when added together they reproduce the smooth curve through the data.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "These Gaussian basis functions are not built into Scikit-Learn, \n", "- but we can write a custom transformer that will create them\n", "- Scikit-Learn transformers are implemented as Python classes; \n", " - reading Scikit-Learn's source is a good way to see how they can be created:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The simplest case of a normal distribution is known as the ''standard normal distribution''.\n", "\n", "$$\n", "f(x \\mid \\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi\\sigma^2} } e^{ -\\frac{(x-\\mu)^2}{2\\sigma^2} } \\sim e^{ -0.5 (\\frac{x-\\mu}{\\sigma})^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:22:00.734658Z", "start_time": "2018-05-20T15:22:00.710792Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from sklearn.base import BaseEstimator, TransformerMixin\n", "\n", "class GaussianFeatures(BaseEstimator, TransformerMixin):\n", " \"\"\"Uniformly spaced Gaussian features for one-dimensional input\"\"\"\n", " def __init__(self, N, sigma_factor=2.0):\n", " self.N = N\n", " self.sigma_factor = sigma_factor\n", " \n", " @staticmethod\n", " def _gauss_basis(x, mu, sigma, axis=None):\n", " arg = (x - mu) / sigma\n", " return np.exp(-0.5 * np.sum(arg ** 2, axis))\n", " \n", " def fit(self, X, y=None):\n", " # create N centers spread along the data range\n", " self.mu_ = np.linspace(X.min(), X.max(), self.N)\n", " self.sigma_ = self.sigma_factor * (self.mu_[1] - self.mu_[0])\n", " return self\n", " \n", " def transform(self, X):\n", " return self._gauss_basis(X[:, :, np.newaxis], self.mu_,\n", " self.sigma_, axis=1)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:22:01.648815Z", "start_time": "2018-05-20T15:22:01.503183Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rng = np.random.RandomState(1)\n", "x = 10 * rng.rand(50)\n", "y = np.sin(x) + 0.1 * rng.randn(50)\n", "xfit = np.linspace(0, 10, 1000)\n", "\n", "gauss_model = make_pipeline(GaussianFeatures(20),\n", " LinearRegression())\n", "gauss_model.fit(x[:, np.newaxis], y)\n", "yfit = gauss_model.predict(xfit[:, np.newaxis])\n", "\n", "plt.scatter(x, y)\n", "plt.plot(xfit, yfit)\n", "plt.xlim(0, 10);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "There is nothing magic about polynomial basis functions: \n", "- You should have some sort of intuition about **the generating process of your data**; \n", "- If you think one basis or another might be appropriate, you can use them as well." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Regularization 正则化\n", "\n", "The introduction of basis functions into our linear regression makes the model much more flexible, \n", "- but it also can very quickly lead to over-fitting (refer back to [Hyperparameters and Model Validation](05.03-Hyperparameters-and-Model-Validation.ipynb) for a discussion of this).\n", "\n", "For example, if we choose too many Gaussian basis functions, we end up with results that don't look so good:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:33:09.422378Z", "start_time": "2018-05-20T15:33:09.258227Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = make_pipeline(GaussianFeatures(30),\n", " LinearRegression())\n", "model.fit(x[:, np.newaxis], y)\n", "\n", "plt.scatter(x, y)\n", "plt.plot(xfit, model.predict(xfit[:, np.newaxis]))\n", "\n", "plt.xlim(0, 10)\n", "plt.ylim(-5, 1.5);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With the data projected to the 30-dimensional basis, the model has far too much flexibility and goes to extreme values between locations where it is constrained by data.\n", "\n", "We can see the reason for this if we plot the coefficients of the Gaussian bases with respect to their locations:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:35:27.115635Z", "start_time": "2018-05-20T15:35:26.843888Z" }, "code_folding": [ 0 ], "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def basis_plot(model, title=None): \n", " fig, ax = plt.subplots(2, sharex=True)\n", " model.fit(x[:, np.newaxis], y)\n", " ax[0].scatter(x, y)\n", " ax[0].plot(xfit, model.predict(xfit[:, np.newaxis]))\n", " ax[0].set(xlabel='x', ylabel='y', ylim=(-5, 1.5))\n", " \n", " if title:\n", " ax[0].set_title(title)\n", "\n", " ax[1].plot(model.steps[0][1].mu_,\n", " model.steps[1][1].coef_)\n", " ax[1].set(xlabel='basis location',\n", " ylabel='coefficient',\n", " xlim=(0, 10))\n", " \n", "model = make_pipeline(GaussianFeatures(30), LinearRegression())\n", "basis_plot(model)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is typical over-fitting behavior when basis functions overlap: \n", "- the coefficients of adjacent basis functions blow up and cancel each other out.\n", "\n", "We know that such behavior is problematic" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "It would be nice if we could limit such spikes expliticly in the model \n", "- by **penalizing large values of the model parameters**.\n", "\n", "Such a penalty is known as *regularization*, and comes in several forms." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Ridge regression ($L_2$ Regularization) 岭回归\n", "\n", "\n", "*ridge regression* or $L_2$ *regularization*, sometimes also called *Tikhonov regularization*.\n", "- Perhaps the most common form of regularization\n", "\n", "This proceeds by penalizing the **sum of squares** (2-norms) of the model coefficients; \n", "- The penalty on the model fit would be \n", "$$\n", "P = \\alpha\\sum_{n=1}^N \\theta_n^2\n", "$$\n", "\n", "where $\\alpha$ is a free parameter that controls the strength of the penalty.\n", "\n", "This type of penalized model is built into Scikit-Learn with the ``Ridge`` estimator:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:44:24.582352Z", "start_time": "2018-05-20T15:44:24.362999Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.linear_model import Ridge\n", "model = make_pipeline(GaussianFeatures(30), Ridge(alpha=0.1))\n", "basis_plot(model, title='Ridge Regression')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The $\\alpha$ parameter is essentially a knob controlling the complexity of the resulting model.\n", "- In the limit $\\alpha \\to 0$, we recover the standard linear regression result; \n", "- in the limit $\\alpha \\to \\infty$, all model responses will be suppressed.\n", "\n", "One advantage of ridge regression in particular is that it can be computed very efficiently\n", "- at hardly more computational cost than the original linear regression model." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Lasso regression ($L_1$ regularization) 套索回归\n", "\n", "Lasso regression involves penalizing the **sum of absolute values** (1-norms) of regression coefficients:\n", "$$\n", "P = \\alpha\\sum_{n=1}^N |\\theta_n|\n", "$$\n", "Though this is conceptually very similar to ridge regression, the results can differ surprisingly: \n", "- for example, due to geometric reasons lasso regression tends to favor *sparse models* where possible: \n", " - it preferentially sets model coefficients to exactly zero.\n", "\n", "We can see this behavior in duplicating the ridge regression figure, but using L1-normalized coefficients:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:47:04.365611Z", "start_time": "2018-05-20T15:47:04.159181Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/datalab/Applications/anaconda/lib/python3.5/site-packages/sklearn/linear_model/coordinate_descent.py:466: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations\n", " ConvergenceWarning)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.linear_model import Lasso\n", "model = make_pipeline(GaussianFeatures(30), Lasso(alpha=0.001))\n", "basis_plot(model, title='Lasso Regression')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With the lasso regression penalty, **the majority of the coefficients are exactly zero**, \n", "- with the functional behavior being modeled by a small subset of the available basis functions.\n", "\n", "As with ridge regularization, the $\\alpha$ parameter tunes the strength of the penalty, and should be determined via, for example, cross-validation (refer back to [Hyperparameters and Model Validation](05.03-Hyperparameters-and-Model-Validation.ipynb) for a discussion of this)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Example: Predicting Bicycle Traffic" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "source": [ "To predict the number of bicycle trips across Seattle's Fremont Bridge based on weather, season, and other factors.\n", "\n", "We have seen this data already in [Working With Time Series](03.11-Working-with-Time-Series.ipynb).\n", "\n", "- we will join the bike data with another dataset, and \n", "- try to determine the extent to which weather and seasonal factors—temperature, precipitation, and daylight hours—affect the volume of bicycle traffic through this corridor.\n", "\n", "- the NOAA makes available their daily [weather station data](http://www.ncdc.noaa.gov/cdo-web/search?datasetid=GHCND) (I used station ID USW00024233) \n", "- we can easily use Pandas to join the two data sources.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "We will perform a simple linear regression to relate weather and other information to bicycle counts, in order to estimate how a change in any one of these parameters affects the number of riders on a given day.\n", "\n", "In particular, this is an example of how the tools of Scikit-Learn can be used in a statistical modeling framework, in which the parameters of the model are assumed to have interpretable meaning.\n", "\n", "Let's start by loading the two datasets, indexing by date:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# !curl -o FremontBridge.csv https://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:53:35.910674Z", "start_time": "2018-05-20T15:53:20.663864Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import pandas as pd\n", "counts = pd.read_csv('data/Fremont_Bridge.csv', index_col='Date', parse_dates=True)\n", "weather = pd.read_csv('data/BicycleWeather.csv', index_col='DATE', parse_dates=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Next we will compute the total daily bicycle traffic, and put this in its own dataframe:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:53:53.996710Z", "start_time": "2018-05-20T15:53:53.981379Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "daily = counts.resample('d').sum()\n", "daily['Total'] = daily.sum(axis=1)\n", "daily = daily[['Total']] # remove other columns" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We saw previously that the patterns of use generally vary from day to day; let's account for this in our data by adding binary columns that indicate the day of the week:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:54:09.994337Z", "start_time": "2018-05-20T15:54:09.942189Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n", "for i in range(7):\n", " daily[days[i]] = (daily.index.dayofweek == i).astype(float)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Similarly, we might expect riders to behave differently on holidays; let's add an indicator of this as well:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:54:34.478168Z", "start_time": "2018-05-20T15:54:34.445100Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from pandas.tseries.holiday import USFederalHolidayCalendar\n", "cal = USFederalHolidayCalendar()\n", "holidays = cal.holidays('2012', '2016')\n", "daily = daily.join(pd.Series(1, index=holidays, name='holiday'))\n", "daily['holiday'].fillna(0, inplace=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We also might suspect that the hours of daylight would affect how many people ride; let's use the standard astronomical calculation to add this information:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:55:20.848224Z", "start_time": "2018-05-20T15:55:20.530107Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(8, 17)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def hours_of_daylight(date, axis=23.44, latitude=47.61):\n", " \"\"\"Compute the hours of daylight for the given date\"\"\"\n", " days = (date - pd.datetime(2000, 12, 21)).days\n", " m = (1. - np.tan(np.radians(latitude))\n", " * np.tan(np.radians(axis) * np.cos(days * 2 * np.pi / 365.25)))\n", " return 24. * np.degrees(np.arccos(1 - np.clip(m, 0, 2))) / 180.\n", "\n", "daily['daylight_hrs'] = list(map(hours_of_daylight, daily.index))\n", "daily[['daylight_hrs']].plot()\n", "plt.ylim(8, 17)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can also add the average temperature and total precipitation to the data.\n", "In addition to the inches of precipitation, let's add a flag that indicates whether a day is dry (has zero precipitation):" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:55:35.967003Z", "start_time": "2018-05-20T15:55:35.952760Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# temperatures are in 1/10 deg C; convert to C\n", "weather['TMIN'] /= 10\n", "weather['TMAX'] /= 10\n", "weather['Temp (C)'] = 0.5 * (weather['TMIN'] + weather['TMAX'])\n", "\n", "# precip is in 1/10 mm; convert to inches\n", "weather['PRCP'] /= 254\n", "weather['dry day'] = (weather['PRCP'] == 0).astype(int)\n", "\n", "daily = daily.join(weather[['PRCP', 'Temp (C)', 'dry day']])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Finally, let's add a counter that increases from day 1, and measures how many years have passed.\n", "This will let us measure any observed annual increase or decrease in daily crossings:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:55:51.546978Z", "start_time": "2018-05-20T15:55:51.528230Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "daily['annual'] = (daily.index - daily.index[0]).days / 365." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now our data is in order, and we can take a look at it:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:56:04.238306Z", "start_time": "2018-05-20T15:56:04.217949Z" }, "slideshow": { "slide_type": "fragment" } }, "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TotalMonTueWedThuFriSatSunholidaydaylight_hrsPRCPTemp (C)dry dayannual
Date
2012-10-033521.00.00.01.00.00.00.00.00.011.2773590.013.351.00.000000
2012-10-043475.00.00.00.01.00.00.00.00.011.2191420.013.601.00.002740
2012-10-053148.00.00.00.00.01.00.00.00.011.1610380.015.301.00.005479
2012-10-062006.00.00.00.00.00.01.00.00.011.1030560.015.851.00.008219
2012-10-072142.00.00.00.00.00.00.01.00.011.0452080.015.851.00.010959
\n", "
" ], "text/plain": [ " Total Mon Tue Wed Thu Fri Sat Sun holiday daylight_hrs \\\n", "Date \n", "2012-10-03 3521.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 11.277359 \n", "2012-10-04 3475.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 11.219142 \n", "2012-10-05 3148.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 11.161038 \n", "2012-10-06 2006.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 11.103056 \n", "2012-10-07 2142.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.045208 \n", "\n", " PRCP Temp (C) dry day annual \n", "Date \n", "2012-10-03 0.0 13.35 1.0 0.000000 \n", "2012-10-04 0.0 13.60 1.0 0.002740 \n", "2012-10-05 0.0 15.30 1.0 0.005479 \n", "2012-10-06 0.0 15.85 1.0 0.008219 \n", "2012-10-07 0.0 15.85 1.0 0.010959 " ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "daily.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With this in place, we can choose the columns to use, and fit a linear regression model to our data.\n", "We will set ``fit_intercept = False``, because the daily flags essentially operate as their own day-specific intercepts:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:56:39.750887Z", "start_time": "2018-05-20T15:56:39.734285Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Drop any rows with null values\n", "daily.dropna(axis=0, how='any', inplace=True)\n", "\n", "column_names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'holiday',\n", " 'daylight_hrs', 'PRCP', 'dry day', 'Temp (C)', 'annual']\n", "X = daily[column_names]\n", "y = daily['Total']\n", "\n", "model = LinearRegression(fit_intercept=False)\n", "model.fit(X, y)\n", "daily['predicted'] = model.predict(X)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Finally, we can compare the total and predicted bicycle traffic visually:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:56:48.137178Z", "start_time": "2018-05-20T15:56:47.862115Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "daily[['Total', 'predicted']].plot(alpha=0.5);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "It is evident that we have missed some key features, especially during the summer time.\n", "\n", "- Either our features are not complete\n", " - i.e., people decide whether to ride to work based on more than just these\n", "- or there are some nonlinear relationships that we have failed to take into account \n", " - e.g., perhaps people ride less at both high and low temperatures\n", "\n", "Nevertheless, our rough approximation is enough to give us some insights, and we can take a look at the coefficients of the linear model to estimate how much each feature contributes to the daily bicycle count:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:58:02.441342Z", "start_time": "2018-05-20T15:58:02.435225Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "Mon 504.882756\n", "Tue 610.233936\n", "Wed 592.673642\n", "Thu 482.358115\n", "Fri 177.980345\n", "Sat -1103.301710\n", "Sun -1133.567246\n", "holiday -1187.401381\n", "daylight_hrs 128.851511\n", "PRCP -664.834882\n", "dry day 547.698592\n", "Temp (C) 65.162791\n", "annual 26.942713\n", "dtype: float64" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params = pd.Series(model.coef_, index=X.columns)\n", "params" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "These numbers are difficult to interpret without some measure of their uncertainty.\n", "We can compute these uncertainties quickly using bootstrap resamplings of the data:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:58:23.047893Z", "start_time": "2018-05-20T15:58:20.770355Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from sklearn.utils import resample\n", "np.random.seed(1)\n", "err = np.std([model.fit(*resample(X, y)).coef_\n", " for i in range(1000)], 0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "With these errors estimated, let's again look at the results:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "ExecuteTime": { "end_time": "2018-05-20T15:58:37.008473Z", "start_time": "2018-05-20T15:58:37.001643Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " effect error\n", "Mon 505.0 86.0\n", "Tue 610.0 83.0\n", "Wed 593.0 83.0\n", "Thu 482.0 85.0\n", "Fri 178.0 81.0\n", "Sat -1103.0 80.0\n", "Sun -1134.0 83.0\n", "holiday -1187.0 163.0\n", "daylight_hrs 129.0 9.0\n", "PRCP -665.0 62.0\n", "dry day 548.0 33.0\n", "Temp (C) 65.0 4.0\n", "annual 27.0 18.0\n" ] } ], "source": [ "print(pd.DataFrame({'effect': params.round(0),\n", " 'error': err.round(0)}))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- We first see that there is a relatively stable trend in the weekly baseline: \n", " - there are many more riders on weekdays than on weekends and holidays.\n", "- We see that for each additional hour of daylight, 129 ± 9 more people choose to ride; \n", "- a temperature increase of one degree Celsius encourages 65 ± 4 people to grab their bicycle; \n", "- a dry day means an average of 548 ± 33 more riders, and each inch of precipitation means 665 ± 62 more people leave their bike at home.\n", "\n", "Once all these effects are accounted for, we see a modest increase of 27 ± 18 new daily riders each year.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- Our model is almost certainly missing some relevant information. \n", " - For example, nonlinear effects \n", " - such as effects of precipitation *and* cold temperature \n", " - nonlinear trends within each variable \n", " - such as disinclination to ride at very cold and very hot temperatures\n", "- Additionally, we have thrown away some of the finer-grained information\n", " - such as the difference between a rainy morning and a rainy afternoon, \n", "- and we have ignored correlations between days\n", " - such as the possible effect of a rainy Tuesday on Wednesday's numbers, \n", " - or the effect of an unexpected sunny day after a streak of rainy days.\n", " \n", "These are all potentially interesting effects, and you now have the tools to begin exploring them if you wish!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "< [In Depth: Naive Bayes Classification](05.05-Naive-Bayes.ipynb) | [Contents](Index.ipynb) | [In-Depth: Support Vector Machines](05.07-Support-Vector-Machines.ipynb) >" ] } ], "metadata": { "anaconda-cloud": {}, "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python [default]", "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.5.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": false, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "268px", "left": "1058px", "top": "113px", "width": "180px" }, "toc_section_display": false, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }