{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Logistic Regression in plain Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In logistic regression, we are trying to model the outcome of a **binary variable** given a **linear combination of input features**. For example, we could try to predict the outcome of an election (win/lose) using information about how much money a candidate spent campaigning, how much time she/he spent campaigning, etc.\n", "\n", "### Model \n", "\n", "Logistic regression works as follows.\n", "\n", "**Given:** \n", "- dataset $\\{(\\boldsymbol{x}^{(1)}, y^{(1)}), ..., (\\boldsymbol{x}^{(m)}, y^{(m)})\\}$\n", "- with $\\boldsymbol{x}^{(i)}$ being a $d-$dimensional vector $\\boldsymbol{x}^{(i)} = (x^{(i)}_1, ..., x^{(i)}_d)$\n", "- $y^{(i)}$ being a binary target variable, $y^{(i)} \\in \\{0,1\\}$\n", "\n", "The logistic regression model can be interpreted as a very **simple neural network:**\n", "- it has a real-valued weight vector $\\boldsymbol{w}= (w^{(1)}, ..., w^{(d)})$\n", "- it has a real-valued bias $b$\n", "- it uses a sigmoid function as its activation function\n", "\n", "![title](figures/logistic_regression.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training\n", "\n", "Different to [linear regression](linear_regression.ipynb), logistic regression has no closed form solution. But the cost function is convex, so we can train the model using gradient descent. In fact, **gradient descent** (or any other optimization algorithm) is guaranteed to find the global minimum (if the learning rate is small enough and enough training iterations are used). \n", "\n", "Training a logistic regression model has different steps. In the beginning (step 0) the parameters are initialized. The other steps are repeated for a specified number of training iterations or until convergence of the parameters.\n", "\n", "* * * \n", "**Step 0: ** Initialize the weight vector and bias with zeros (or small random values).\n", "* * *\n", "\n", "**Step 1: ** Compute a linear combination of the input features and weights. This can be done in one step for all training examples, using vectorization and broadcasting:\n", "$\\boldsymbol{a} = \\boldsymbol{X} \\cdot \\boldsymbol{w} + b $\n", "\n", "where $\\boldsymbol{X}$ is a matrix of shape $(n_{samples}, n_{features})$ that holds all training examples, and $\\cdot$ denotes the dot product.\n", "* * *\n", "\n", "**Step 2: ** Apply the sigmoid activation function, which returns values between 0 and 1:\n", "\n", "$\\boldsymbol{\\hat{y}} = \\sigma(\\boldsymbol{a}) = \\frac{1}{1 + \\exp(-\\boldsymbol{a})}$\n", "* * *\n", "\n", "** Step 3: ** Compute the cost over the whole training set. We want to model the probability of the target values being 0 or 1. So during training we want to adapt our parameters such that our model outputs high values for examples with a positive label (true label being 1) and small values for examples with a negative label (true label being 0). This is reflected in the cost function:\n", "\n", "$J(\\boldsymbol{w},b) = - \\frac{1}{m} \\sum_{i=1}^m \\Big[ y^{(i)} \\log(\\hat{y}^{(i)}) + (1 - y^{(i)}) \\log(1 - \\hat{y}^{(i)}) \\Big]$\n", "* * *\n", "\n", "** Step 4: ** Compute the gradient of the cost function with respect to the weight vector and bias. A detailed explanation of this derivation can be found [here](https://stats.stackexchange.com/questions/278771/how-is-the-cost-function-from-logistic-regression-derivated).\n", "\n", "The general formula is given by:\n", "\n", "$ \\frac{\\partial J}{\\partial w_j} = \\frac{1}{m}\\sum_{i=1}^m\\left[\\hat{y}^{(i)}-y^{(i)}\\right]\\,x_j^{(i)}$\n", "\n", "For the bias, the inputs $x_j^{(i)}$ will be given 1.\n", "* * *\n", "\n", "** Step 5: ** Update the weights and bias\n", "\n", "$\\boldsymbol{w} = \\boldsymbol{w} - \\eta \\, \\nabla_w J$ \n", "\n", "$b = b - \\eta \\, \\nabla_b J$\n", "\n", "where $\\eta$ is the learning rate." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:52:33.101260Z", "start_time": "2018-03-11T13:52:33.093590Z" } }, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.datasets import make_blobs\n", "import matplotlib.pyplot as plt\n", "np.random.seed(123)\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:52:34.810918Z", "start_time": "2018-03-11T13:52:34.493190Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# We will perform logistic regression using a simple toy dataset of two classes\n", "X, y_true = make_blobs(n_samples= 1000, centers=2)\n", "\n", "fig = plt.figure(figsize=(8,6))\n", "plt.scatter(X[:,0], X[:,1], c=y_true)\n", "plt.title(\"Dataset\")\n", "plt.xlabel(\"First feature\")\n", "plt.ylabel(\"Second feature\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:52:35.271152Z", "start_time": "2018-03-11T13:52:35.258996Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape X_train: (750, 2)\n", "Shape y_train: (750, 1)\n", "Shape X_test: (250, 2)\n", "Shape y_test: (250, 1)\n" ] } ], "source": [ "# Reshape targets to get column vector with shape (n_samples, 1)\n", "y_true = y_true[:, np.newaxis]\n", "# Split the data into a training and test set\n", "X_train, X_test, y_train, y_test = train_test_split(X, y_true)\n", "\n", "print(f'Shape X_train: {X_train.shape}')\n", "print(f'Shape y_train: {y_train.shape}')\n", "print(f'Shape X_test: {X_test.shape}')\n", "print(f'Shape y_test: {y_test.shape}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logistic regression class" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:52:36.892670Z", "start_time": "2018-03-11T13:52:36.796510Z" } }, "outputs": [], "source": [ "class LogisticRegression:\n", " \n", " def __init__(self):\n", " pass\n", "\n", " def sigmoid(self, a):\n", " return 1 / (1 + np.exp(-a))\n", "\n", " def train(self, X, y_true, n_iters, learning_rate):\n", " \"\"\"\n", " Trains the logistic regression model on given data X and targets y\n", " \"\"\"\n", " # Step 0: Initialize the parameters\n", " n_samples, n_features = X.shape\n", " self.weights = np.zeros((n_features, 1))\n", " self.bias = 0\n", " costs = []\n", " \n", " for i in range(n_iters):\n", " # Step 1 and 2: Compute a linear combination of the input features and weights, \n", " # apply the sigmoid activation function\n", " y_predict = self.sigmoid(np.dot(X, self.weights) + self.bias)\n", " \n", " # Step 3: Compute the cost over the whole training set.\n", " cost = (- 1 / n_samples) * np.sum(y_true * np.log(y_predict) + (1 - y_true) * (np.log(1 - y_predict)))\n", "\n", " # Step 4: Compute the gradients\n", " dw = (1 / n_samples) * np.dot(X.T, (y_predict - y_true))\n", " db = (1 / n_samples) * np.sum(y_predict - y_true)\n", "\n", " # Step 5: Update the parameters\n", " self.weights = self.weights - learning_rate * dw\n", " self.bias = self.bias - learning_rate * db\n", "\n", " costs.append(cost)\n", " if i % 100 == 0:\n", " print(f\"Cost after iteration {i}: {cost}\")\n", "\n", " return self.weights, self.bias, costs\n", "\n", " def predict(self, X):\n", " \"\"\"\n", " Predicts binary labels for a set of examples X.\n", " \"\"\"\n", " y_predict = self.sigmoid(np.dot(X, self.weights) + self.bias)\n", " y_predict_labels = [1 if elem > 0.5 else 0 for elem in y_predict]\n", "\n", " return np.array(y_predict_labels)[:, np.newaxis]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initializing and training the model" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:53:08.008432Z", "start_time": "2018-03-11T13:53:07.714396Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cost after iteration 0: 0.6931471805599453\n", "Cost after iteration 100: 0.046514002935609956\n", "Cost after iteration 200: 0.02405337743999163\n", "Cost after iteration 300: 0.016354408151412207\n", "Cost after iteration 400: 0.012445770521974634\n", "Cost after iteration 500: 0.010073981792906512\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "regressor = LogisticRegression()\n", "w_trained, b_trained, costs = regressor.train(X_train, y_train, n_iters=600, learning_rate=0.009)\n", "\n", "fig = plt.figure(figsize=(8,6))\n", "plt.plot(np.arange(600), costs)\n", "plt.title(\"Development of cost over training\")\n", "plt.xlabel(\"Number of iterations\")\n", "plt.ylabel(\"Cost\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testing the model" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2018-03-11T13:53:48.726560Z", "start_time": "2018-03-11T13:53:48.714892Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train accuracy: 100.0%\n", "test accuracy: 100.0%\n" ] } ], "source": [ "y_p_train = regressor.predict(X_train)\n", "y_p_test = regressor.predict(X_test)\n", "\n", "print(f\"train accuracy: {100 - np.mean(np.abs(y_p_train - y_train)) * 100}%\")\n", "print(f\"test accuracy: {100 - np.mean(np.abs(y_p_test - y_test))}%\")" ] } ], "metadata": { "anaconda-cloud": {}, "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.6.9" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }