From 32f020b4a1dca936345a57fb609014bc610ad67c Mon Sep 17 00:00:00 2001 From: Abdulsamod1 Date: Tue, 21 Apr 2020 14:32:07 +0100 Subject: [PATCH] LOGISTIC REGRESSION ALGORITHM --- LOGISTIC REGRESSION ALGORITHM.ipynb | 380 ++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 LOGISTIC REGRESSION ALGORITHM.ipynb diff --git a/LOGISTIC REGRESSION ALGORITHM.ipynb b/LOGISTIC REGRESSION ALGORITHM.ipynb new file mode 100644 index 0000000..220fd85 --- /dev/null +++ b/LOGISTIC REGRESSION ALGORITHM.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Logistic regression is a regression analysis that predicts the probability of an outcome that can only have two values (i.e. a dichotomy). A logistic regression produces a logistic curve, which is limited to values between 0 and 1. Logistic regression models the probability that each input belongs to a particular category. For this particular notebook we will try to predict the outcome of species in an iris dataset using a Logistic Regression." + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the help of a function called a logistic function or most commonly known as a sigmoid. This sigmoid function is reponsible for predicting or classifying a given input. Logistic function or sigmoid is defined as:Where:\n", + "![image.png](attachment:image.png)\n", + "e = Euler's number which is 2.71828.\n", + "x0 = the value of the sigmoid's midpoint on the x-axis.\n", + "L = the maximum value.\n", + "k = steepness of the curve." + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAATIAAABqCAYAAAA/bN3rAAAgAElEQVR4Ae3d95t1NfU28O9f5U9w2VCa0kGKICggSpHee1UpgohSpINIkaYCiigoIh3pHUSQDvZe9nt9Ivd5F4eZYZ5H5pkzc5LrOpO9k5WVlZXk3isr2Xv+b+iha2CBNfD3v/99VMO//vWvYfxe5j/+8Y8RzV//+tfRdb/oGpiPBv5vPkSdpmtgZTUAoAJe//73v2dl85///Gf45z//+bb8P//5z2+77zddA7NpoAPZbJrp6e+JBio4AbSEWGCss1wDuoAdYOuha2C+GuhANl9NdbqV0gAgA0oACmC5r+CGaYAsFaD9y1/+ktsedw28qwY6kL2rijrB/6qBv/3tb+8ALzxZY6y0P/3pTwO/WAU44Natsv9V89NTvgPZ9PT1orQUWFVfVywzwgCq6viXNpPFtiiC90qXlAY6kC2p7lp6wlYr63e/+92oAfGFJeHVV1/NZbPQ3FSf2iizX3QNzKCBDmQzKKUnvXcaCGB997vfHQ499NDhqquuGq6//vrhiCOOGHbdddfhZz/72XD66acPO+2003DLLbe0ii1FhcTvnTSd03LVQAey5dqz71G7YlFZBsZCAk4zLQmTr+rQS3N9/vnnD0899VTj8eKLLw477LDDcOqpp7alJEvtnHPOGV5//fXmK4voAcHc97hrYDYNdCCbTTM9faQBYAaMhApWHPLjVhNaAIQ+QAT07r777pGv7Mc//vGw6aabDjfccEPjie7WW29tu5fhn7IjIfpF18AcGuhANodyetZ/NQCIYplJAV7jFtkf//jHEagBMfcJ6HPEAkBZSm6++ebNQgvNb3/721w2sBznP8rsF10DM2igA9kMSulJ/18D9XUhS8BYTCgAlvzqxH/ttddGlhgHPuCKNef6D3/4w3D44YcPBx100CC/AmRqRd+BLNro8Xw00IFsPlqachoWVZZ6v//974fbbrttOO2004bdd999OPjgg4c99thjOOGEE4Z77rlnBFpRWQU+fJ5++ulhxx13HC644IJmtQGy0FTQjAUXPj3uGphLAx3I5tJOz2sayDLxueeeG/bff/8GXLfffntbSgZ87DjaeTzssMOGRx99tAGfg64CCyu+s5/85CfDhhtuONx0003v0G54yZjJUntHgZ7QNfCWBjqQ9aEwLw3c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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For Logistic Regression however here is the definition of the logistic function:\n", + "Where:\n", + "![image.png](attachment:image.png)\n", + "Θ = is the weight." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn import datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data set\n", + "I will use the well known Iris data set. It contains 3 classes of 50 instances each, where each class refers to a type of iris plant. To simplify things, we take just the first two feature columns. Also, the two non-linearly separable classes are labeled with the same category, ending up with a binary classification problem" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "iris = datasets.load_iris()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "X = iris.data[:, :2]\n", + "y = (iris.target != 0) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlMAAAFlCAYAAADPim3FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3df4wkZ53f8c93uw3LgMHBHnLG450B+WSxtnzgHQyOI8thNwGMtfwBRxYNuTPcaZIeE0ySEwm3kqWzZAWUKCF3vlk0YCWGnbPN+bjDIOwc9p0VUIStWWMMtiH4jp31LE68LIcdshjY2W/+qB7PbG/1r3q6q+qper+kUnc9XdX11FPVNd+pfvr5mrsLAAAA2WwrugIAAAAxI5gCAAAIQDAFAAAQgGAKAAAgAMEUAABAAIIpAACAAM1BFzSzhqQVSUfd/bqO166X9B8kHW0X3erun+31fuedd57PzMwMVVkAAIAiHDp06MfuPpn22sDBlKQbJT0p6ZVdXr/L3T886JvNzMxoZWVliM0DAAAUw8xWu7020Nd8ZjYl6V2Set5tAgAAqJtB+0x9StLHJJ3qscx7zOwxM7vbzC5MW8DM5s1sxcxWjh07NmxdAQAASqdvMGVm10l61t0P9Vjsy5Jm3P0ySfdLuj1tIXdfcvdZd5+dnEz92hEAACAqg/SZukrSXjO7VtJ2Sa80s4Pu/oGNBdz9+JblPyPpk6OtJgAAiN2vfvUrra2t6YUXXii6Kl1t375dU1NTOuusswZep28w5e4fl/RxSTKzayT93tZAql1+vrs/057dq6SjOgAAwIvW1tZ09tlna2ZmRmZWdHXO4O46fvy41tbW9LrXvW7g9TKPM2VmN5vZ3vbsR8zscTP7tqSPSLo+6/sCAIBqeuGFF3TuueeWMpCSJDPTueeeO/Sds2GGRpC7Pyjpwfbzm7aUv3j3CgAAoJuyBlIbstSPEdABAEBt3Hfffbr44ot10UUX6ROf+MRI3pNgCgAA1ML6+rpuuOEG3XvvvXriiSd0xx136Iknngh+X4IpAABQSsvL0syMtG1b8ri8HPZ+Dz/8sC666CK9/vWv10te8hLt27dPX/rSl4LrSTAFAABKZ3lZmp+XVlcl9+Rxfj4soDp69KguvHBzXPGpqSkdPXq0xxqDIZgCamLU/+EBwDjt3y+dOHF62YkTSXlW7n5G2Sg6xA/1az4Acdr4D2/jwrTxH54kzc0VVy8A6ObIkeHKBzE1NaWnn376xfm1tTW99rWvzf6GbdyZAmpgHP/hAcA47dgxXPkg3vzmN+sHP/iBfvjDH+qXv/yl7rzzTu3du7f/in0QTAE1MI7/8ABgnG65RZqYOL1sYiIpz6rZbOrWW2/V29/+dr3hDW/Q+973Pl1yySVhFRVf8wG1sGNH8tVeWjkAlNFGF4T9+5N//HbsSAKp0K4J1157ra699trwCm7BnSmgBsbxHx4AjNvcnHT4sHTqVPJY1j6eBFNADczNSUtL0vS0ZJY8Li2V98IEADHhaz6gJubmCJ4AYBy4MwUAABCAYAoAACAAwRQAAEAAgikAAFAbH/rQh/Sa17xGl1566cjek2AKAADUxvXXX6/77rtvpO9JMAUAAMppDBnar776ar361a8Ofp+tGBoBAACUT0QZ2rkzBQAAyieiDO0EUwAAoHwiytBOMAUAAMqnWyb2EmZoJ5gCAADlM6YM7e9///t15ZVX6vvf/76mpqZ02223Bb2fRAd0AABQRhudzPfvT77a27EjCaQCO5/fcccdI6jc6QimAABAOUWSoZ2v+QAAAAIQTAEAAAQgmAIAALlx96Kr0FOW+hFMAQUZQ5YEACi17du36/jx46UNqNxdx48f1/bt24dajw7oQAEiypIAACMzNTWltbU1HTt2rOiqdLV9+3ZNTU0NtY4VFR3Ozs76yspKIdsGijYzkwRQnaanpcOH864NAKAfMzvk7rNpr/E1H1CAiLIkAAD6IJgCChBRlgQAQB8EU0ABxpQlAQBQAIIpoABzc9LSUtJHyix5XFqi8zkAxIhf8wEFiSRLAgCgD+5MAQAABCCYAgAACEAwBQAAEIBgCgAAIADBFCqHnHcAgDzxaz5UCjnvAAB5484UKmX//s1AasOJE0k5AADjQDCFSiHnHQAgbwRTqBRy3gEA8kYwhUoh5x0AIG8EU6gUct4BAPLGr/lQOeS8AwDkiTtTAAAAAQimAAAAAhBMAQAABCCYAgAACDBwMGVmDTP7lpl9JeW1l5rZXWb2lJk9ZGYzo6wkgOKQ6xAAehvmztSNkp7s8trvSPo7d79I0n+W9MnQigEo3kauw9VVyX0z1yEBFQBsGiiYMrMpSe+S9Nkui7xb0u3t53dL2m1mFl49AEUi1yEA9DfonalPSfqYpFNdXr9A0tOS5O4nJT0n6dzOhcxs3sxWzGzl2LFjGaoLIE/kOgSA/voGU2Z2naRn3f1Qr8VSyvyMAvcld59199nJyckhqgmgCOQ6BID+BrkzdZWkvWZ2WNKdkt5mZgc7llmTdKEkmVlT0qsk/WSE9QRQAHIdAkB/fYMpd/+4u0+5+4ykfZL+yt0/0LHYPZJ+u/38ve1lzrgzBSAu5DoEgP4y5+Yzs5slrbj7PZJuk/R5M3tKyR2pfSOqH4CCkesQAHobKphy9wclPdh+ftOW8hck/eYoKwYAABADRkAHAAAIQDAFAAAQgGAKAAAgAMEUAABAAIIpINDCgtRsJkMHNJvJPACgPjIPjQAgCZwOHNicX1/fnF9cLKZOAIB8cWcKCLC0NFw5AKB6CKaAAOvrw5UDAKqHYAoI0GgMVw4AqB6CKSDA/Pxw5QCA6qEDOhBgo5P50lLy1V6jkQRSdD4HgPogmAICLS4SPAFAnfE1HwAAQACCKQAAgAAEUwAAAAEIpgAAAAIQTKG09uxJ8t1tTHv2FF2juC0vSzMz0rZtyePyctE1AlApeV9kSnRRI5hCKe3ZIz3wwOllDzxAQJXV8nIyZMPqquSePM7PE1ABGJG8LzIlu6iZuxey4dnZWV9ZWSlk2yg/s+6vFXTKRm1mJrnWdJqelg4fzrs2ACon74tMARc1Mzvk7rNpr3FnCqiBI0eGKweAoeR9kSnZRY1gCqiBHTuGKweAoeR9kSnZRY1gCqW0e/dw5ejtllukiYnTyyYmknIACJb3RaZkFzWCKZTS/fefGTjt3p2UY3hzc0n+wOnppD/a9HQyPzdXdM0AVELeF5mSXdTogA4AANAHHdABAADGhGAKAAAgAMEUAABAAIIpAACAAARTKK1Y0jyVKD0UAKAAzaIrAKTZSLt04kQyv5F2SRrPL1+zbi/vegIAyoehEVBKsaR5IucdANQDQyMgOrGkeSpZeigAQAEIplBKsaR5Kll6KABAAQimUEqxpHkqWXooAEABCKZQSrGkeSpZeigAQAHogA4AANAHHdABAADGhGAKAAAgAMEUAABAAIIpAACAAARTBYsprxu56wDUHhc0pCA3X4FiyutG7joAtccFDV0wNEKBYsrrRu46ALXHBa3Weg2NQDBVoG3bpLTmN5NOncq/Pr1krWtM+wgAPXFBqzXGmSqpmPK6kbsOQO1xQUMXBFMFiimvG7nrANQeFzR0QTBVoJjyupG7DkDtcUFDF/SZAgAA6IM+UwAAAGNCMAUAABCAYAoAACAAwRQAAECAvsGUmW03s4fN7Ntm9riZ/UHKMteb2TEze7Q9/e54qosYLSxIzWby45dmM5kf53qxpM6KpZ4AgN4Gyc33C0lvc/efmdlZkr5hZve6+zc7lrvL3T88+ioiZgsL0oEDm/Pr65vzi4ujXy+W1Fmx1BMA0N9QQyOY2YSkb0hquftDW8qvlzQ7TDDF0Aj10GwmgVCnRkM6eXL068WSOiuWegIAEsFDI5hZw8welfSspK9tDaS2eI+ZPWZmd5vZhV3eZ97MVsxs5dixYwPvAOKVFhD1Kg9d78iR4cqLEks9AQD9DRRMufu6u79R0pSkK8zs0o5Fvixpxt0vk3S/pNu7vM+Su8+6++zk5GRIvRGJRmO48tD1YkmdFUs9AQD9DfVrPnf/qaQHJb2jo/y4u/+iPfsZSbtGUjtEb6Mf0KDloevFkjorlnoCAPob5Nd8k2Z2Tvv5yyTtkfS9jmXO3zK7V9KTo6wk4rW4KLVam3eUGo1kvlcn8pD1YkmdFUs9AQD99e2AbmaXKfnarqEk+PqCu99sZjdLWnH3e8zs3ysJok5K+omSDurf6/qmogM6AACIR68O6CQ6BgAA6INExwAAAGNCMAUAABCAYAoAACAAwRQAAEAAgqmC5Z3sNmvy4CK2mbVt6tCmlZb3AYzlRANQXu5eyLRr1y6vu4MH3Scm3KXNaWIiKR+HVuv0bW1MrdZ4theyzaxtU4c2rbS8D2AsJxqAwikZDio1pmFohALlnew2a/LgIraZtW3q0KaVlvcBjOVEA1A4xpkqqW3bkn9pO5lJp06Nfntm3V8b12mQdZtZ26YObVppeR/AWE40AIVjnKmSyjvZbdbkwUVsM2vb1KFNKy3vAxjLiQag1AimCpR3stusyYOL2GbWtqlDm1Za3gcwlhMNQLl160w17okO6ImDB92np93Nksdx919ttdwbjaS/bKORT0fprNvM2jZ1aNNKy/sAxnKiASiU6IAOAACQHX2mAAAAxoRgCgAAIADBFAAAQACCKQAAgAAEUxg7Up+hkqqelLHq+weMULPoCqDalpeTMZdOnEjmV1c3x2Camxv9ekAuFhakAwc259fXN+cXF4up0yhVff+AEWNoBIwVqc9QSVVPylj1/QMyYGgEFObIkeHKQ9cDcpEWaPQqj03V9w8YMYIpjBWpz1BJVU/KWPX9A0aMYApjReozVFLVkzJWff+AESOYwljNzUlLS0lfJ7PkcWmpfyfyrOsBuVhclFqtzTs1jUYyX5XO2VXfP2DE6IAOAADQBx3QAQAAxoRgCgAAIADBFAAAQACCKQAAgAAEUx3yzgeXdXsxpc0ix15NceDTZf3wxtKeeSfjjOWijWpz90KmXbt2edkcPOg+MeEubU4TE0l5mbbXap2+zsbUao2nniHyblOUBAc+XdYPbyztmbWeea+XVSzHAWMhacW7xDQMjbBF3vngsm4vprRZ5NirKQ58uqwf3ljaM+9knLFctFEJvYZGIJjaYtu25F+NTmbSqVPl2Z5Z99cKOpxd5d2mKAkOfLqsH95Y2jNrPfNeL6tYjgPGgnGmBpR3Pris24spbRY59mqKA58u64c3lvbMOxlnLBdtVB7B1BZ554PLur2Y0maRY6+mOPDpsn54Y2nPvJNxxnLRRvV160w17qmMHdDdk36E09PuZsnjuPsVZt1eq+XeaCT9HxuNcnY+35B3m6IkOPDpsn54Y2nPrPXMe72sYjkOGDnRAR0AACA7+kwBAACMCcEUAABAAIIpAACAAARTAAAAAQimChZTWqmY8gECpRVLbrc9e5IP+8a0Z0+1tgeMEMFUgZaXk+FlVleTQXVXV5P5cV1bQ7a3sCAdOLCZCWN9PZknoAKGkPeHPqs9e6QHHji97IEHxhfg5L09YMQYGqFAMaWViikfIFBaseR2yztnVUw5slBbDI1QUkeODFde5PbSAqle5QBS5P2hB5ALgqkCxZRWKqZ8gEBpkdsNqCSCqQLFlFYqpnyAQGnFkttt9+7hymPbHjBiBFMFmpuTlpaS7hJmyePSUlJetu0tLkqt1uadqEYjmV9cHE9dgUrK+0Of1f33nxnI7N6dlFdhe8CI0QEdAACgDzqgAwAAjAnBFAAAQACCKQAAgAAEUwAAAAH6BlNmtt3MHjazb5vZ42b2BynLvNTM7jKzp8zsITObGUdlh5E1/VUsabOyCsmvR5t2kfcOZj2IVa9n1ZNHZs1dl3d7xvKB54KWLmT/qt42vbh7z0mSSXpF+/lZkh6S9NaOZRYkfbr9fJ+ku/q9765du3xcDh50n5hwT/IQJNPERFI+jvVi0Wqdvm8bU6vVf13atIu8dzDrQax6PUNO7hjs3p2+f7t3914v7/aM5QPPBS1dyP5VvW3cXdKKd4uVur2QurA0IekRSW/pKP/vkq5sP29K+rHawy50m8YZTE1Pp18HpqfHs14sGo30/Ws0+q9Lm3aR9w5mPYhVr2fIyR2DtH3bmHrJuz1j+cBzQUsXsn9VbxvvHUwNNM6UmTUkHZJ0kaQ/dvd/2/H6dyW9w93X2vN/0w64ftyx3LykeUnasWPHrtW0hJ8jsG1bchQ7mUmnTo1+vViE5BKlTbvIewezHsSq17PqiXJjac9YPvBc0NKF7F/V20YjGGfK3dfd/Y2SpiRdYWaXdm4jbbWU91ly91l3n52cnBxk05lkTX9V9bRZIfn1aNMu8t7BrAex6vUkeWS6vNszlg88F7R0IftX9bbpY6hf87n7TyU9KOkdHS+tSbpQksysKelVkn4ygvplkjX9VSxps7IKya9Hm3aR9w5mPYhVr2fVk0dmzV2Xd3vG8oHngpYuZP+q3jb9dPv+b2OSNCnpnPbzl0n6uqTrOpa5Qad3QP9Cv/cdZ58p96TP2/S0u1nyOGgfuKzrxaLV2uwO0WgM1z+XNu0i7x3MehCrXs+QkzsGnZ3Q+3U+35B3e8bygeeCli5k/yreNgrpM2Vml0m6XVJDyZ2sL7j7zWZ2c/uN7zGz7ZI+L+lNSu5I7XP3v+31vuTmAwAAsejVZ6rZb2V3f0xJkNRZftOW5y9I+s2QSgIAAMSIEdABAAACEEwBAAAEIJgCAAAIQDAFAAAQgGCqQ53zNCISVU/Qmvf+xbJeVrEc96rjOFRbtzETxj2Ne5ypLGqQpxGxq3qC1rz3L5b1sorluFcdx6ESFJqbbxzKOM7UzIyUli5welo6fDjv2gApsp6ksZzcee9fLOtlFctxrzqOQyX0GmeKYGqLGuRpROyqnqA17/2LZb2sYjnuVcdxqITgRMd1UfM8jYhB1RO05r1/sayXVSzHveo4DpVHMLVF3fM0IgJVT9Ca9/7Fsl5WsRz3quM4VF+3zlTjnsrYAd298nkaUQVVT9Ca9/7Fsl5WsRz3quM4RE90QAcAAMiOPlMAAABjQjAFAAAQgGAKAAAgAMEUAABAAIIpIDZZc3wtLEjNZjJQYLOZzI9ze3nLe/84DuliqWcsYmrPmOo6at1+5jfuqaxDIwClljXHV6t1+jobU6s1nu3lLe/94ziki6WesYipPWOqa0ZiaASgIrLm+Go2pfX1M8sbDenkydFvL2957x/HIV0s9YxFTO0ZU10zIjcfUBVZc3yZdX+t1zUglpxiee8fxyFdLPWMRUztGVNdM2KcKaAqsub4ajSGKw/dXt7y3j+OQ7pY6hmLmNozprqOAcEUEJOsOb7m54crD91e3vLeP45DuljqGYuY2jOmuo5Dt85U457ogA5klDXHV6vl3mgkHUMbjf6dnkO3l7e894/jkC6WesYipvaMqa4ZiA7oAAAA2dFnCgAAYEwIpgAAAAIQTAEAAAQgmAIAAAhAMIXqqXp+qLz375JLkoH3NqZLLhnv9mI5fnnn9ANQXt1+5jfuiaERMBZVzw+V9/7t3JmeS27nzvFsL5bjl3dOPwCFE0MjoDaqnh8q7/3Lmv4kq1iOX945/QAUjtx8qI+q54fKe//yDqZiOX555/QDUDjGmUJ9VD0/FPtXDnnn9ANQagRTqJaq54fKe/927hyuPFQsxy/vnH4ASo1gCtUyNyctLSV9UMySx6WlpLwK8t6/xx8/M3DauTMpH4dYjl/WesayfwCGQp8pAACAPugzBQAAMCYEUwAAAAEIpgAAAAIQTAEAAAQgmAKKkneOtqrnkoulnkBV1fgz2Cy6AkAtLS9L8/PSiRPJ/OpqMi+N52fyWbeXdz2ziqWeQFXV/DPI0AhAEfLO0Vb1XHKx1BOoqhp8BsnNB5RN3jnaqp5LLpZ6AlVVg88g40wBZZN3jraq55KLpZ5AVdX8M0gwBRQh7xxtVc8lF0s9gaqq+WeQYAooQt452qqeSy6WegJVVfPPIH2mAAAA+qDPFAAAwJgQTAEAAAQgmAIAAAhAMAUAABCgbzBlZhea2V+b2ZNm9riZ3ZiyzDVm9pyZPdqebhpPdVGoWHLJxSLvXHlVb8+8LSxIzWbyy6VmM5mvEs4XYHDu3nOSdL6ky9vPz5b0vyTt7FjmGklf6fdeW6ddu3Y5InLwoPvEhHsyxm0yTUwk5VXYXt6y7l/e6yFdq3V6W25MrVbRNRsNzhfgDJJWvEtMM/TQCGb2JUm3uvvXtpRdI+n33P26Qd+HoREiE0suuVjknSuv6u2Zt2ZTWl8/s7zRkE6ezL8+o8b5ApxhZLn5zGxG0v+QdKm7P7+l/BpJfyZpTdKPlARWj6esPy9pXpJ27NixazXtw4pyiiWXXCzyzpVX9fbMm1n31woau2+kOF+AM4xknCkze4WSgOmjWwOptkckTbv7b0j6I0l/kfYe7r7k7rPuPjs5OTnoplEGseSSi0XeufKq3p55azSGK48N5wswlIGCKTM7S0kgtezuX+x83d2fd/eftZ9/VdJZZnbeSGuKYsWSSy4WeefKq3p75m1+frjy2HC+AMPp1plqY5Jkkj4n6VM9lvk1bX5leIWkIxvz3SY6oEfo4EH36Wl3s+Rx3J1R895e3rLuX97rIV2r5d5oJJ2zG43qdD7fwPkCnEYhHdDN7B9K+rqk70ja+LL89yXtaAdjnzazD0tqSTop6eeS/rW7/89e70sHdAAAEItefaaa/VZ2928ouTvVa5lbJd2arXoAAADxYgR0AACAAARTAAAAAQimAAAAAhBMAQAABCCYwuBIfDpaVU+UCwA10ffXfICkJHCan5dOnEjmV1c3ByicmyuuXrFaWJAOHNicX1/fnF9cLKZOAIBMhk50PCqMMxUZEp+OVtUT5QJAxYwkNx9q7siR4crRW1og1ascAFBaBFMYDIlPR6vqiXIBoEYIpjAYEp+OVtUT5QJAjRBMYTBzc9LSUtJHyix5XFqi83lWi4tSq7V5J6rRSObpfA4A0aEDOgAAQB90QAcAABgTgikAAIAABFMAAAABCKYAAAACEEyNCGnreqBx0tEuceP4AWgjN98IkLauBxonHe0SN44fgC0YGmEESFvXA42TjnaJG8cPqJ1eQyMQTI3Atm1SWjOaSadO5V+fUqFx0tEuceP4AbXDOFNjRtq6HmicdLRL3Dh+ALYgmBoB0tb1QOOko13ixvEDsAXB1AiQtq4HGicd7RI3jh+ALegzBQAA0Ad9pgAAAMaEYAoAACAAwRQAAEAAgikAAIAABFMAymVhQWo2k1/JNZvJ/DiRYw9AIHLzASiPhQXpwIHN+fX1zfnFxdFvjxx7AEaAoREAlEezmQRQnRoN6eTJ0W+PHHsABsTQCADikBZI9SoPdeTIcOUAkIJgCkB5NBrDlYcixx6AESCYAlAeG/2VBi0PRY49ACNAMAWgPBYXpVZr805Uo5HMj6PzuUSOPQAjQQd0AACAPuiADgAAMCYEUwAAAAEIpgAAAAIQTAEAAAQgmAIAAAhAMAUAABCAYAoAACAAwRQAAEAAgikAAIAABFMAAAABCKYAAAACEEwBAAAEIJgCAAAIQDAFAAAQgGAKAAAgAMEUAABAgL7BlJldaGZ/bWZPmtnjZnZjyjJmZn9oZk+Z2WNmdvl4qosoLS9LMzPStm3J4/Jy0TUCAGBkmgMsc1LSv3H3R8zsbEmHzOxr7v7ElmXeKenX29NbJB1oP6Lulpel+XnpxIlkfnU1mZekubni6gUAwIj0vTPl7s+4+yPt5/9X0pOSLuhY7N2SPueJb0o6x8zOH3ltEZ/9+zcDqQ0nTiTlAABUwFB9psxsRtKbJD3U8dIFkp7eMr+mMwMumdm8ma2Y2cqxY8eGqynidOTIcOUAAERm4GDKzF4h6c8kfdTdn+98OWUVP6PAfcndZ919dnJycriaIk47dgxXDgBAZAYKpszsLCWB1LK7fzFlkTVJF26Zn5L0o/DqIXq33CJNTJxeNjGRlAMAUAGD/JrPJN0m6Ul3/09dFrtH0m+1f9X3VknPufszI6wnYjU3Jy0tSdPTklnyuLRE53MAQGUM8mu+qyT9M0nfMbNH22W/L2mHJLn7pyV9VdK1kp6SdELSB0dfVURrbo7gCQBQWX2DKXf/htL7RG1dxiXdMKpKAQAAxIIR0AEAAAIQTAEAAAQgmAIAAAhAMAUAABCAYAoAACAAwRQAAEAAgikAAIAABFMAAAABCKYAAAACEEwBAAAEIJgCAAAIQDAFAAAQwJIcxQVs2OyYpNVCNj5e50n6cdGVKCnaJh3tko52SUe7pKNd0tEu3Q3bNtPuPpn2QmHBVFWZ2Yq7zxZdjzKibdLRLulol3S0SzraJR3t0t0o24av+QAAAAIQTAEAAAQgmBq9paIrUGK0TTraJR3tko52SUe7pKNduhtZ29BnCgAAIAB3pgAAAAIQTAEAAAQgmApgZg0z+5aZfSXltevN7JiZPdqefreIOubNzA6b2Xfa+7yS8rqZ2R+a2VNm9piZXV5EPYswQNtcY2bPbTlnbiqinnkzs3PM7G4z+56ZPWlmV3a8XstzZoB2qd35YmYXb9nfR83seTP7aMcytTtfBmyX2p0vkmRm/8rMHjez75rZHWa2veP1l5rZXe3z5SEzm8myneYoKltjN0p6UtIru7x+l7t/OMf6lMU/cvduA6G9U9Kvt6e3SDrQfqyLXm0jSV939+tyq005/BdJ97n7e83sJZImOl6v6znTr12kmp0v7v59SW+Ukn9mJR2V9Ocdi9XufBmwXaSanS9mdoGkj0ja6e4/N7MvSNon6b9tWex3JP2du19kZvskfVLSPx12W9yZysjMpiS9S9Jni65LZN4t6XOe+Kakc8zs/KIrhWKY2SslXS3pNkly91+6+087FqvdOTNgu9Tdbkl/4+6dmTRqd7506NYuddWU9DIzayr5h+RHHa+/W9Lt7ed3S9ptZjbsRgimsvuUpI9JOtVjmfe0bzPfbWYX5lSvormkvzSzQ2Y2n/L6BZKe3jK/1i6rg35tI0lXmtm3zexeM7skz8oV5PWSjkn6r+2vzD9rZi/vWKPpahEAAALASURBVKaO58wg7SLV73zZap+kO1LK63i+bNWtXaSanS/uflTSf5R0RNIzkp5z97/sWOzF88XdT0p6TtK5w26LYCoDM7tO0rPufqjHYl+WNOPul0m6X5uRb9Vd5e6XK7nVfoOZXd3xelrEX5fxOfq1zSNKcj/9hqQ/kvQXeVewAE1Jl0s64O5vkvT/JP27jmXqeM4M0i51PF8kSe2vPfdK+tO0l1PKqn6+SOrbLrU7X8zs7ym58/Q6Sa+V9HIz+0DnYimrDn2+EExlc5WkvWZ2WNKdkt5mZge3LuDux939F+3Zz0jalW8Vi+HuP2o/PqvkO/srOhZZk7T1Lt2UzrztWkn92sbdn3f3n7Wff1XSWWZ2Xu4VzdeapDV3f6g9f7eSIKJzmbqdM33bpabny4Z3SnrE3f9Pymt1PF82dG2Xmp4veyT90N2PufuvJH1R0j/oWObF86X9VeCrJP1k2A0RTGXg7h939yl3n1FyS/Wv3P20aLfjO/q9SjqqV5qZvdzMzt54LumfSPpux2L3SPqt9i9u3qrktuszOVc1d4O0jZn92sZ39WZ2hZLP5/G865ond//fkp42s4vbRbslPdGxWO3OmUHapY7nyxbvV/evsmp3vmzRtV1qer4ckfRWM5to7/tunfm3+B5Jv91+/l4lf8+HvjPFr/lGyMxulrTi7vdI+oiZ7ZV0UkmUe32RdcvJ35f05+3Pa1PSn7j7fWb2LyTJ3T8t6auSrpX0lKQTkj5YUF3zNkjbvFdSy8xOSvq5pH1ZPtQR+peSlttfUfytpA9yzkjq3y61PF/MbELSP5b0z7eU1f58GaBdane+uPtDZna3kq84T0r6lqSljr/Vt0n6vJk9peRv9b4s2yKdDAAAQAC+5gMAAAhAMAUAABCAYAoAACAAwRQAAEAAgikAAIAABFMAAAABCKYAAAAC/H+h7JnuSTpg/gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(10, 6))\n", + "plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='b', label='0')\n", + "plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='r', label='1')\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Algorithm\n", + "Given a set of inputs X, we want to assign them to one of two possible categories (0 or 1). Logistic regression models the probability that each input belongs to a particular category." + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hypothesis\n", + "A function takes inputs and returns outputs. To generate probabilities, logistic regression uses a function that gives outputs between 0 and 1 for all values of X. There are many functions that meet this description, but the used in this case is the logistic function. From here we will refer to it as sigmoid.\n", + "![image.png](attachment:image.png)\n", + "\n" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "def sigmoid(z):\n", + " return 1 / (1 + np.exp(-z))\n", + "z = np.dot(X, theta)\n", + "h = sigmoid(z)" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Loss function\n", + "Functions have parameters/weights (represented by theta in our notation) and we want to find the best values for them. To start we pick random values and we need a way to measure how well the algorithm performs using those random weights. That measure is computed using the loss function, defined as:\n", + "![image.png](attachment:image.png)\n", + "Where:\n", + "m = the number of samples\n", + "y = the target class\n", + " " + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "def loss(h, y):\n", + " return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gradient descent\n", + "Our goal is to minimize the loss function and the way we have to achive it is by increasing/decreasing the weights, i.e. fitting them. The question is, how do we know what parameters should be biggers and what parameters should be smallers? The answer is given by the derivative of the loss function with respect to each weight. It tells us how loss would change if we modified the parameters.\n", + "![image.png](attachment:image.png)" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "gradient = np.dot(X.T, (h - y)) / y.shape[0]" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "lr = 0.01\n", + "theta -= lr * gradient" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "class LogisticRegression:\n", + " def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):\n", + " self.lr = lr\n", + " self.num_iter = num_iter\n", + " self.fit_intercept = fit_intercept\n", + " self.verbose = verbose\n", + " \n", + " def __add_intercept(self, X):\n", + " intercept = np.ones((X.shape[0], 1))\n", + " return np.concatenate((intercept, X), axis=1)\n", + " \n", + " def __sigmoid(self, z):\n", + " return 1 / (1 + np.exp(-z))\n", + " def __loss(self, h, y):\n", + " return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()\n", + " \n", + " def fit(self, X, y):\n", + " if self.fit_intercept:\n", + " X = self.__add_intercept(X)\n", + " \n", + " # weights initialization\n", + " self.theta = np.zeros(X.shape[1])\n", + " \n", + " for i in range(self.num_iter):\n", + " z = np.dot(X, self.theta)\n", + " h = self.__sigmoid(z)\n", + " gradient = np.dot(X.T, (h - y)) / y.size\n", + " self.theta -= self.lr * gradient\n", + " \n", + " z = np.dot(X, self.theta)\n", + " h = self.__sigmoid(z)\n", + " loss = self.__loss(h, y)\n", + " \n", + " if(self.verbose ==True and i % 10000 == 0):\n", + " print(f'loss: {loss} \\t')\n", + " \n", + " def predict_prob(self, X):\n", + " if self.fit_intercept:\n", + " X = self.__add_intercept(X)\n", + " \n", + " return self.__sigmoid(np.dot(X, self.theta))\n", + " def predict(self, X):\n", + " return self.predict_prob(X).round()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "model = LogisticRegression(lr=0.1, num_iter=300000)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 21.8 s\n" + ] + } + ], + "source": [ + "%time model.fit(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preds = model.predict(X)\n", + "(preds == y).mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " Picking a learning rate = 0.1 and number of iterations = 300000 the algorithm classified all instances successfully. These are the resulting weights:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-25.89066442, 12.523156 , -13.40150447])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.theta" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(10, 6))\n", + "plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='b', label='0')\n", + "plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='r', label='1')\n", + "plt.legend()\n", + "x1_min, x1_max = X[:,0].min(), X[:,0].max(),\n", + "x2_min, x2_max = X[:,1].min(), X[:,1].max(),\n", + "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n", + "grid = np.c_[xx1.ravel(), xx2.ravel()]\n", + "probs = model.predict_prob(grid).reshape(xx1.shape)\n", + "plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='black');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}