diff options
Diffstat (limited to 'notebooks/logistic-regression.ipynb')
| -rw-r--r-- | notebooks/logistic-regression.ipynb | 707 |
1 files changed, 707 insertions, 0 deletions
diff --git a/notebooks/logistic-regression.ipynb b/notebooks/logistic-regression.ipynb new file mode 100644 index 0000000..8c862d3 --- /dev/null +++ b/notebooks/logistic-regression.ipynb @@ -0,0 +1,707 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression\n", + "\n", + "Logistic regression is a *binary classification algorithm*." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Data')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "\n", + "# create linearly separable data\n", + "sep = False\n", + "while not sep:\n", + " X, Y = make_blobs(n_samples=200, n_features\n", + " =1, centers=2, cluster_std=0.5, center_box=(0, 10))\n", + " sep = True\n", + " for x_1 in X[Y == 1]:\n", + " for x_0 in X[Y == 0]:\n", + " if Y[X.argmin()] == 0 and x_0 > x_1:\n", + " sep = False\n", + " elif x_0 < x_1:\n", + " sep = False\n", + " \n", + "X = np.hstack([X, np.ones((X.shape[0], 1))])\n", + "\n", + " \n", + "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)\n", + "\n", + "plt.scatter(X[:, 0], Y, s=10, c='b')\n", + "plt.xlabel('feature')\n", + "plt.ylabel('groups')\n", + "plt.yticks([0, 1])\n", + "plt.title('Data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Binary target\n", + "\n", + "### Sigmoid function\n", + "\n", + "We have to fit a **model** trough our data. \n", + "The *sigmoid* (also called *logistic*) function is used:\n", + "$$\\boxed{\n", + "\\sigma(x) = \\frac{1}{1 + e^{-x}}\n", + "}$$\n", + "\n", + "It produce an 'S' shape like function that stays between 0 and 1" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def sigmoid(x):\n", + " return 1 / (1 + np.exp(-x))\n", + "\n", + "xs_sig = np.linspace(-7, 7, 100)\n", + "ys_sig = sigmoid(xs_sig)\n", + "plt.plot(xs_sig, ys_sig, label=r'$\\sigma(x) = {\\frac{1}{1 + e^{-x}}}$')\n", + "plt.yticks([0, 0.5, 1])\n", + "plt.xlim([-7, 7])\n", + "plt.legend()\n", + "plt.grid()\n", + "plt.title('Sigmoid function')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# helper function for approximation\n", + "def sigmoid_mu_s(x, mu, s):\n", + " return 1 / (1 + np.exp(-(x + mu) / s))\n", + "\n", + "plt.scatter(X[:, 0], Y, s=10, c='b', alpha=0.5)\n", + "sig_x = np.linspace(X[:, 0].min(), X[:, 0].max(), 100)\n", + "y_flip = 1 if Y[X[:, 0].argmin()] == 0 else -1\n", + "sig_y = sigmoid_mu_s(sig_x, -X[:, 0].mean(), y_flip * 0.5)\n", + "plt.plot(sig_x, sig_y, c='r')\n", + "plt.yticks([0, 0.5, 1])\n", + "plt.grid(axis='y')\n", + "plt.title('Approximation')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hypothesis and Prediction\n", + "\n", + "We can tweak the sigmoid function by passing the dot product of $x$ (vector of feature) and $\\theta$ (the vector of weights).\n", + "\n", + "$$h(x) = \\sigma(x \\cdot \\theta) = \\sigma(\\theta_0 x_0 + \\theta_1 x_1 + \\cdots + \\theta_n x_n)$$\n", + "$x_0$ being equal to 1. \n", + "$\\theta$ is not a parameter of $h$ because it's considered as a constant.\n", + "\n", + "$h$ is our hypothesis function. It return a probability of an $x$ to belong to one of the group. \n", + "To predict some new $x$ we input it to $h$ with the weights and see if the returned value if above or below 0.5.\n", + "\n", + "$$\n", + "\\text{prediction} =\n", + " \\begin{cases} \n", + " 1, & h(x) \\ge 0.5 \\\\\n", + " 0, & h(x) \\lt 0.5\n", + " \\end{cases}\n", + "$$\n", + "\n", + "This is equivalent to:\n", + "\n", + "$$\n", + "\\text{prediction} =\n", + " \\begin{cases} \n", + " 1, & x \\cdot \\theta \\ge 0 \\\\\n", + " 0, & x \\cdot \\theta \\lt 0\n", + " \\end{cases}\n", + "$$\n", + "\n", + "Indeed, in the sigmoid funcion: \n", + "* $x$ is *above* 0 then $e^{-x}$ tend to be small, $\\frac{1}{1 + \\text{small number}} \\approx 1$. \n", + "* $x$ is *below* 0 then $e^{-x}$ tend to be big, $\\frac{1}{1 + \\text{big number}} \\approx 0$. \n", + "\n", + "Therefore, a prediction can be visualized by projecting $x$ onto $\\theta$. \n", + "It will be more relevant the more the two vectors go in the same direction\n", + "(or opposite direction for negative projection),\n", + "for exemple if $x \\cdot \\theta = 0$ then $x$ is perpendicular to $\\theta$,\n", + "$h(x) = 0.5$ right in the middle of the sigmoid function,\n", + "the prediction become more irelevant as $x \\cdot \\theta$ tend to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def hypothesis(x, theta):\n", + " # suppose that x_0 = 1 and isn't mentionned\n", + " return sigmoid(x.dot(theta))\n", + "\n", + "\n", + "def predict(x, theta):\n", + " return int(hypothesis(x, theta) >= 0.5) # a bit more clear\n", + " # or\n", + " return int(x.dot(theta) >= 0)\n", + " # there is a nice vector interpretation for this one\n", + " # and it probably compute faster" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cost function\n", + "\n", + "We have to evaluate our model by introducing a cost function, this one is called the *logloss*\n", + "\n", + "For a single $x$:\n", + "$$\n", + "j(h(x), y) = \n", + " \\begin{cases} \n", + " -\\ln(h(x)), & y = 1 \\\\\n", + " -\\ln(1 - h(x)), & y = 0 \n", + " \\end{cases}\n", + "$$\n", + "It can be rewritten as a single continuous function:\n", + "$$ j(h(x), y) = -y \\ln(h(x)) - (1 - y) \\ln(1 - h(x))$$\n", + "\n", + "Even if it may seem more complicated at first sight, it's just a switch with the values of $y$. \n", + "- if $y = 1$ then $- (1 - y) \\ln(1 - h(x)) = 0$ and the $-\\ln(h(x))$ stays.\n", + "- if $y = 0$ then $-y \\ln(h(x)) = 0$ and the $-\\ln(1 - h(x))$ stays." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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9OkDHtcfX19flixZwquvvtrvazGKuU0fubTIBbB7927mzp3b93rbtm0sWbJkWOdasGABkZGRjiqtX8XFxUycOJG77rqL7OxsLrroItrb2/vef/HFF7nyyiv7Xufn51NZWcmCBQtISUnh008/7fe4xYsX88knnwDw85//nO9+19iq9KqrruLFF1/sO+7U12KUcmAfudMmBIHc7HQ1D7yzh73lzQ4956SEUO6/PPvsx0yaRFFREVarFYvFwg9/+EMeeeSRk4654IILaGlpOe1nH374YZYuXerQmgfj4MGDvPzyyzz11FOsWLGCN954g5tvvpmuri6KiopITU3tOzY/P5+bbrqJNWvW8NZbb/Hiiy+yYMGC04574IEH+J//+R+qq6vZvn07b7/9NgA5OTls3ry577hTX4tRyoFdK04Ncn8fi8zsFHh5eZGdnc2ePXs4ePAgY8eOZcaMGScds3btWqddf+nSpVRWVgInr0f+61//+qQW84nS0tKYNm0aALm5uRQXFwNQW1tLeHh433Hd3d3U1dVx33339b0ODw8/7Tgw/prQWvPII4+Ql5fX1+VisVjw9fXtm3V66msxSjlwHLm0yD3IQC1nZ5o9ezbr16/nL3/5S7993M5skfd2dcDgp+j7+R3/k9disfR1rQQEBJw0I3Lfvn1MnTq17/8cdu7cSU5OzmnHAezatYuKigqioqJOq6GzsxN/f/8zvhajkNv0kcvwQ2E3e/Zsfv7zn3P11VeTmJh42vtr165lx44dpz0GG+JLliyhrKzM0WWfJiIiAqvV2hfS+fn5TJ16fE25nTt3MmXKlNOOq6io4KabbmLlypUEBwef9H9mdXV1REdH9y1gdeprMUq5zzhyudkpDBMmTMDPz4+f/vSn53SeG2+8kTlz5lBQUEBSUhLPPPMMNpuNwsJCp98E7XXRRRexbt06wAjyKVOm9L23e/fuvqGRvccdO3aMa665ht///vdMnDiRX/ziFzzwwAN9P7N69Wouu+yyM74Wo5DNCtYuh7XI0Vo7/JGZmam11vqhD/frtP98V9tsNi3MsXfvXrNL0Fprfc899+jnnnvOKefetWuXvvfeewd1bHNz8zlfb+vWrfrmm2922HFXX321LigoOONrZ3GVz4ZH6mzT+v5Qrdf+oe9bwBY9zMx1eovcpqHbOvC+oGJ0OnToEBMmTKC9vZ3b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 |
