{ "metadata": { "celltoolbar": "Slideshow", "name": "", "signature": "sha256:f8fb7301a1bcdf4ffba898f265b8d6f724b3676fe889347c4303273be50151b3" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Logistic regression model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Likelihood" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align*}\n", " y|x, \\theta \\sim \\text{Bernoulli}(\\sigma(\\theta^T x))\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", " \\sigma(x) = \\frac{1}{1 + \\exp(-\\theta^T x)}\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", " p(y|x, \\theta) &= \\sigma(\\theta^T x)^y * (1 - \\sigma(\\theta^T x))^{1 - y}\\\\\n", " &= \\frac{\\exp(y\\theta^T x)}{1 + \\exp(\\theta^T x)}\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", " \\log p(y|x, \\theta) = y \\theta^T x - \\log(1 + \\exp(\\theta^T x))\n", "\\end{align*}" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Prior" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align*}\n", " \\theta \\sim \\mathcal{N}(0, \\lambda^{-1})\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", " \\log p(\\theta) = -\\frac{\\lambda}{2}||\\theta||_2^2 + \\text{const}\n", "\\end{align*} " ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Objective function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align*}\n", " f(\\theta) = -\\sum_i \\left\\{y^i \\theta^T x^i - \\log(1 + \\exp(\\theta^T x^i))\\right\\} \n", " + \\frac{\\lambda}{2}||\\theta||_2^2\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", " \\frac{\\delta f(\\theta)}{\\delta \\theta_k} &= \n", " -\\sum_i \\left\\{ y^i x^i_k - x^i_k \\frac{\\exp(\\theta^T x^i)}{1 + \\exp(\\theta^T x^i)} \\right\\}\n", " + \\lambda\\theta_k \\\\\n", " &= -\\sum_i x^i_k \\left\\{y^i - \\frac{1}{1 + \\exp(-\\theta^T x^i)} \\right\\}\n", " + \\lambda\\theta_k\n", "\\end{align*}" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Dependencies" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import sklearn.metrics as met\n", "import sklearn.datasets as ds\n", "from scipy.optimize import fmin_bfgs\n", "import matplotlib.pyplot as plt\n", "import time" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Base class" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class LogisticRegressionBase(object):\n", " \"\"\" Abstract class for logistic regression.\n", " \n", " NOTE: Do not modify!\n", " \"\"\"\n", " \n", " def __init__(self, X, y):\n", " self.X = X\n", " self.y = y\n", " self.n_samples = self.X.shape[0]\n", " self.n_features = self.X.shape[1]\n", " self.lambda_ = 0.05\n", " \n", " def f(self, theta):\n", " \"\"\" Evaluate objective function f at theta. \"\"\"\n", " return None\n", " \n", " def fprime(self, theta):\n", " \"\"\" Compute first derivative of f at theta. \"\"\"\n", " return None\n", " \n", " def _init_params(self):\n", " \"\"\" Initialize model parameters. \"\"\"\n", " self.theta0 = np.random.randn(self.n_features)\n", " \n", " def fit(self):\n", " \"\"\" Fit theta via gradient descent. \"\"\"\n", " self._init_params()\n", " self.theta = fmin_bfgs(f=self.f, x0=self.theta0,\n", " fprime=self.fprime)\n", " self._f0 = self.f(self.theta0)\n", " self._f = self.f(self.theta)\n", " print('f(theta0): %.3f' % self._f0)\n", " print('f(theta): %.3f' % self._f)\n", " print('Training accuracy: %.3f' % met.accuracy_score(self.y, self.predict(hard=True)))\n", " \n", " \n", " def sigmoid(self, x):\n", " return 1 / (1 + np.exp(-x))\n", " \n", " def predict(self, X=None, hard=False):\n", " if X is None:\n", " X = self.X\n", " p = self.sigmoid(X.dot(self.theta))\n", " return np.round(p) if hard else p" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Hands on: Implement logistic regression!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class LogisticRegressionYours(LogisticRegressionBase):\n", " \"\"\" Your implementation of logistic regression.\"\"\"\n", " \n", " def f(self, theta):\n", " \"\"\" Evaluate objective function f at theta. \n", " \n", " Parameters\n", " ----------\n", " theta: parameter vector (self.n_features)\n", " self.X: design matrix (self.n_samples x self.n_features)\n", " self.y: labels (self.n_features)\n", " self.lambda_: regularization paramter\n", " \"\"\"\n", " X = self.X\n", " y = self.y\n", " lambda_ = self.lambda_\n", " \n", " # TODO: return f(theta)\n", " raise NotImplementedError()\n", " \n", " def fprime(self, theta):\n", " \"\"\" Compute first derivative of f at theta.\n", " \n", " Parameters\n", " ----------\n", " theta: parameter vector (self.n_features)\n", " self.X: design matrix (self.n_samples x self.n_features)\n", " self.y: labels (self.n_features)\n", " self.lambda_: regularization paramter\n", " \"\"\"\n", " X = self.X\n", " y = self.y\n", " lambda_ = self.lambda_\n", " \n", " # TODO: return fprime(theta)\n", " raise NotImplementedError()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Reference Implementation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class LogisticRegressionReference(LogisticRegressionBase):\n", " def f(self, theta):\n", " z = self.X.dot(theta)\n", " rv = -np.sum(self.y * z - np.log(1 + np.exp(z)))\n", " rv += 0.5 * self.lambda_ * theta.dot(theta)\n", " return rv\n", " \n", " def fprime(self, theta):\n", " div = self.y - 1 / (1 + np.exp(-self.X.dot(theta)))\n", " return -np.sum(self.X * div.reshape(-1, 1), axis=0) + self.lambda_ * theta" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Naive implementation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class LogisticRegressionNaive(LogisticRegressionBase):\n", " def f(self, theta):\n", " rv = 0.0\n", " for i in range(self.n_samples):\n", " rv -= self.y[i] * self.X[i].dot(theta) - np.log(1 + np.exp(self.X[i].dot(theta)))\n", " rv += self.lambda_ * theta.dot(theta)\n", " return rv\n", " \n", " def fprime(self, theta):\n", " prime = np.empty(theta.size)\n", " for k in range(self.n_features):\n", " prime[k] = 0.0\n", " for i in range(self.n_samples):\n", " prime[k] -= self.y[i] * self.X[i, k] - self.X[i, k] * \\\n", " np.exp(theta.dot(self.X[i])) / (1 + np.exp(theta.dot(self.X[i])))\n", " prime[k] += self.lambda_ * theta[k]\n", " return prime" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Data" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Randomly generate classification dataset\n", "np.random.seed(0)\n", "n_samples = 1000\n", "n_features = 100\n", "X, y = ds.make_classification(n_samples=n_samples, \n", " n_features=n_features,\n", " n_informative=int(n_features / 2))" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 7 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Evaluation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def evaluate(lr):\n", " \"\"\" Evaluate performance of logistic regression model. \"\"\"\n", " \n", " t0 = time.clock()\n", " lr.fit()\n", " t1 = time.clock()\n", " \n", " print('Fitting time (sec): %d' % (t1 - t0))\n", " print('Accuracy: %.3f' % (met.accuracy_score(lr.y, lr.predict(hard=True))))\n", " print('AUC: %.3f' % (met.roc_auc_score(lr.y, lr.predict())))\n", " \n", " fpr, tpr, thr = met.roc_curve(lr.y, lr.predict())\n", " fig, ax = plt.subplots(figsize=(10, 7))\n", " ax.plot(fpr, tpr, linewidth=3)\n", " ax.set_xlabel('False positive rate')\n", " ax.set_ylabel('True positive rate')\n", " ax.grid()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Reference implementation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Evaluate reference implementation\n", "evaluate(LogisticRegressionReference(X, y))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimization terminated successfully.\n", " Current function value: 391.096883\n", " Iterations: 146\n", " Function evaluations: 188\n", " Gradient evaluations: 188\n", "f(theta0): 13107.042\n", "f(theta): 391.097\n", "Training accuracy: 0.819\n", "Fitting time (sec): 0\n", "Accuracy: 0.819\n", "AUC: 0.905\n" ] }, { "output_type": "stream", "stream": "stderr", "text": [ "-c:4: RuntimeWarning: overflow encountered in exp\n", "-c:9: RuntimeWarning: overflow encountered in exp\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Naive implementation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Evaluate naive implementation\n", "evaluate(LogisticRegressionNaive(X, y))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Warning: Desired error not necessarily achieved due to precision loss.\n", " Current function value: 395.728108\n", " Iterations: 90\n", " Function evaluations: 137\n", " Gradient evaluations: 125\n", "f(theta0): 11131.183\n", "f(theta): 395.728\n", "Training accuracy: 0.825\n", "Fitting time (sec): 108\n", "Accuracy: 0.825\n", "AUC: 0.903\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nkiRJkiSpZf4/RUuqjF2pOSkAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Your implementation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Evaluate your implementation\n", "evaluate(LogisticRegressionYours(X, y))" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }