{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Logistic Regression Agenda\n", "\n", " * Attempt to use linear regression for classification\n", " * Logistic regression is a better alternative for classification\n", " * Brief overview of probability, odds, e, log, and log-odds\n", " * What is the logistic regression model?\n", " * Interpreting logistic regression coefficients\n", " * Compare logistic regression with other models\n", " \n", "By the end of this session you will be able to:\n", " * Use logistic regression for a classification problem in the future\n", " * interpret the coefficients of a trained logistic regression model" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Predicting a categorical response" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "In the first part of today's lesson, we were attempting to predict a **continuous response**. However, what we want to do now is see if we can apply the same sort of logic to predict an outcome that has only 2 distinct possibilities, or what is known as a **categorical response.**\n", "\n", "In machine learning , we looked at **regression** when we were using linear regression, but we are now going to try to use the same approach for what is known as a **classification** problem (problems with only a discrete, finite number of outcomes; in our case, just 2).\n", "\n", "As always, we are going to import all of the functionality we need before we get started:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "#data handling/modeling\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn.linear_model import LinearRegression, LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn import metrics\n", "import scipy.stats as stats\n", "\n", "# visualization\n", "%matplotlib inline\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are going to import a slightly different dataset. This dataset is also from the famed [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/index.html) and can be found [here](https://archive.ics.uci.edu/ml/datasets/Vertebral+Column).\n", "\n", "This dataset contains 6 biomechanical features used to classify orthopaedic patients into 2 classes - normal and abnormal:\n", " * pelvic incidence\n", " * pelvic tilt\n", " * lumbar lordosis angle\n", " * sacral slope\n", " * pelvic radius\n", " * grade of spondylolisthesis\n", " \n", "Lets load the data in:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AB 210\n", "NO 100\n", "Name: outcome, dtype: int64" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vertebral_data = pd.read_csv(\"./data/vertebral_column_2_categories.dat\", sep=\" \",\n", " names=[\"pelvic_incidence\",\"pelvic_tilt\",\"lumbar_lordosis_angle\",\"sacral_slope\",\"pelvic_radius\",\"spondy_grade\",\"outcome\"])\n", "vertebral_data.outcome.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to use linear regression for this task, we have to convert our **categorical** target into a number:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 210\n", "0 100\n", "Name: outcome_number, dtype: int64" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vertebral_data[\"outcome_number\"] = (vertebral_data.outcome=='AB').astype(int)\n", "vertebral_data.outcome_number.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cool, so now our outcome is no longer a value, but a number. Let's plot `pelvic_incidence` relative to this new numeric `outcome_number`:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/Nicole/anaconda3/lib/python3.6/site-packages/seaborn/axisgrid.py:2065: UserWarning: The `size` parameter has been renamed to `height`; pleaes update your code.\n", " warnings.warn(msg, UserWarning)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.pairplot(vertebral_data,x_vars=[\"pelvic_incidence\"],y_vars=\"outcome_number\", size=6, aspect=0.8)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "And now lets do a simple linear regression on that feature like we did before:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# fit a linear regression model and store the predictions\n", "feature_cols = ['pelvic_incidence']\n", "X = vertebral_data[feature_cols]\n", "y = vertebral_data.outcome_number\n", "linreg = LinearRegression()\n", "linreg.fit(X, y)\n", "outcome_pred = linreg.predict(X)" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# scatter plot that includes the regression line\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, outcome_pred, color='red')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Lets examine the predictions:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.47167114, 0.75740477, 0.76191585, 0.57389026, 0.4830928 ,\n", " 0.60959496, 0.53223477, 0.51706986, 0.44892378])" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "outcome_pred[1:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If **pelvic_incidence=35**, what class do we predict for outcome? **0**\n", "\n", "So, we predict the 0 class for **lower** values of `pelvic_incidence`, and the 1 class for **higher** values of `pelvic_incidence`. What's our cutoff value? Around **pelvic_incidence=45**, because that's where the linear regression line crosses the midpoint (0.5) between predicting class 0 and class 1.\n", "\n", "So, we'll say that if **outcome_pred >= 0.5**, we predict a class of **1**, else we predict a class of **0**." ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,\n", " 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1,\n", " 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1,\n", " 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,\n", " 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n", " 1, 0])" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# np.where returns the first value if the condition is True, and the second value if the condition is False\n", "np.where(outcome_pred >= .5, 1, 0)" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,\n", " 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1,\n", " 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1,\n", " 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,\n", " 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n", " 1, 0])" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# transform predictions to 1 or 0\n", "outcome_pred_class = np.where(outcome_pred >= 0.5, 1, 0)\n", "outcome_pred_class" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the class predictions\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, outcome_pred_class, color='red')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "What went wrong? This is a line plot, and it connects points in the order they are found. Let's sort the DataFrame to fix this:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# add predicted class to DataFrame\n", "vertebral_data['outcome_pred_class'] = outcome_pred_class\n", "\n", "# sort DataFrame by pelvic_incidence so that the line plot makes sense\n", "vertebral_data.sort_values('pelvic_incidence', inplace=True)" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the class predictions again\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, vertebral_data.outcome_pred_class, color='red')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Use Logistic Regression Instead of Linear Regression on Categorical Outcome Variables\n", "\n", "Logistic regression can do exactly what we just did:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/Nicole/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", " FutureWarning)\n" ] } ], "source": [ "logreg = LogisticRegression(C=1e9)\n", "feature_cols = ['pelvic_incidence']\n", "X = vertebral_data[feature_cols]\n", "y = vertebral_data.outcome_number\n", "logreg.fit(X, y)\n", "outcome_pred_class_log = logreg.predict(X)" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1])" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# print the class predictions\n", "outcome_pred_class_log" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the class predictions\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, outcome_pred_class_log, color='red')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "What if we wanted the **predicted probabilities** instead of just the **class predictions**, to understand how confident we are in a given prediction?" ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# store the predicted probabilites of class 1\n", "outcome_probs = logreg.predict_proba(X)[:, 1]" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.32272128, 0.32969355, 0.33554176, 0.3361414 ])" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "outcome_probs[1:5]" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the predicted probabilities, and the 50% line\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, outcome_probs, color='red')\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence,np.ones(outcome_probs.shape)*.5,'k--')" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pelvic incidence of 15: [[0.82575878 0.17424122]]\n" ] } ], "source": [ "# examine some example predictions\n", "array = np.array(15)\n", "print(\"Pelvic incidence of 15:\", logreg.predict_proba(array.reshape(-1, 1)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "What are these numbers? \n", "\n", "The first number in each entry indicates the predicted probability of **class 0**, and the second number in each entry indicates the predicted probability of **class 1**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Review: Probability, odds, e, log, log-odds\n", "\n", "$$probability = \\frac {one\\ outcome} {all\\ outcomes}$$\n", "\n", "$$odds = \\frac {one\\ outcome} {all\\ other\\ outcomes}$$\n", "\n", "Examples:\n", "\n", "- Dice roll of 1: probability = 1/6, odds = 1/5\n", "- Even dice roll: probability = 3/6, odds = 3/3 = 1\n", "- Dice roll less than 5: probability = 4/6, odds = 4/2 = 2\n", "\n", "$$odds = \\frac {probability} {1 - probability}$$\n", "\n", "$$probability = \\frac {odds} {1 + odds}$$" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
probabilityodds
00.1000.111111
10.2000.250000
20.2500.333333
30.3000.428571
40.4000.666667
50.5001.000000
60.6001.500000
70.7002.333333
80.8004.000000
90.9009.000000
100.99099.000000
110.999999.000000
\n", "
" ], "text/plain": [ " probability odds\n", "0 0.100 0.111111\n", "1 0.200 0.250000\n", "2 0.250 0.333333\n", "3 0.300 0.428571\n", "4 0.400 0.666667\n", "5 0.500 1.000000\n", "6 0.600 1.500000\n", "7 0.700 2.333333\n", "8 0.800 4.000000\n", "9 0.900 9.000000\n", "10 0.990 99.000000\n", "11 0.999 999.000000" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a table of probability versus odds\n", "prob_table = pd.DataFrame({'probability':[0.1, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999]})\n", "prob_table['odds'] = prob_table.probability/(1 - prob_table.probability)\n", "prob_table" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "What is **e**? It is the base rate of growth shared by all continually growing processes:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2.718281828459045" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# exponential function: e^1\n", "np.exp(1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "What is a **(natural) log**? It gives you the time needed to reach a certain level of growth ([wiki](https://en.wikipedia.org/wiki/Natural_logarithm)):" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# time needed to grow 1 unit to 2.718 units\n", "np.log(np.exp(1))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "It is also the **inverse** of the exponential function ([review your properties of logarithms here](http://www.purplemath.com/modules/logrules.htm)):" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.log(np.exp(5))" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
probabilityoddslog_odds
00.1000.111111-2.197225
10.2000.250000-1.386294
20.2500.333333-1.098612
30.3000.428571-0.847298
40.4000.666667-0.405465
50.5001.0000000.000000
60.6001.5000000.405465
70.7002.3333330.847298
80.8004.0000001.386294
90.9009.0000002.197225
100.99099.0000004.595120
110.999999.0000006.906755
\n", "
" ], "text/plain": [ " probability odds log_odds\n", "0 0.100 0.111111 -2.197225\n", "1 0.200 0.250000 -1.386294\n", "2 0.250 0.333333 -1.098612\n", "3 0.300 0.428571 -0.847298\n", "4 0.400 0.666667 -0.405465\n", "5 0.500 1.000000 0.000000\n", "6 0.600 1.500000 0.405465\n", "7 0.700 2.333333 0.847298\n", "8 0.800 4.000000 1.386294\n", "9 0.900 9.000000 2.197225\n", "10 0.990 99.000000 4.595120\n", "11 0.999 999.000000 6.906755" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# add log-odds to the table\n", "prob_table['log_odds'] = np.log(prob_table.odds)\n", "prob_table" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Ok, but what is logistic regression?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "[**Linear regression:**](https://en.wikipedia.org/wiki/Linear_regression) continuous response is modeled as a linear combination of the features used :\n", "\n", "$$y = \\beta_0 + \\beta_1x + ... \\beta_nx$$\n", "\n", "[**Logistic regression:**](https://en.wikipedia.org/wiki/Logistic_regression) log-odds of a categorical response being \"true\" (or the number 1) is modeled as a linear combination of the features:\n", "\n", "$$\\log \\left({p\\over 1-p}\\right) = \\beta_0 + \\beta_1x + ... \\beta_nx$$\n", "\n", "This is called the [**logit function**](https://en.wikipedia.org/wiki/Logit).\n", "\n", "Probability is sometimes written as pi:\n", "\n", "$$\\log \\left({\\pi\\over 1-\\pi}\\right) = \\beta_0 + \\beta_1x + ... \\beta_nx$$\n", "\n", "The equation can be rearranged into the [**logistic function**](https://en.wikipedia.org/wiki/Logistic_function):\n", "\n", "$$\\pi = \\frac{e^{\\beta_0 + \\beta_1x + ... + \\beta_nx}} {1 + e^{\\beta_0 + \\beta_1x + ... + \\beta_nx}}$$\n", "\n", "Here's what that looks like:\n", "\n", "![logistic curve](./images/logistic_curve.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In other words:\n", "\n", "- Logistic regression outputs the **probabilities of a specific class**\n", "- Those probabilities can be converted into **class predictions**:\n", "\n", "$f(x)= \n", "\\begin{cases}\n", " 1,& \\text{if } p\\geq 0.5\\\\\n", " 0, & \\text{otherwise}\n", "\\end{cases}$\n", "\n", "The **logistic function** has some nice properties:\n", "\n", "- Takes on an \"s\" shape (which allows it to be differentiable, a really important math property for functions to have)\n", "- Output is bounded by 0 and 1\n", "\n", "Some things to note:\n", "\n", "- **Multinomial logistic regression** is used when there are more than 2 classes.\n", "- Coefficients are estimated using **maximum likelihood estimation**, meaning that we choose parameters that maximize the likelihood of the observed data. We do this using fancy math involving taking derivatives, and thats why that S-shaped curve is so important." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Interpreting Logistic Regression Coefficients" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the predicted probabilities again\n", "sns.mpl.pyplot.scatter(vertebral_data.pelvic_incidence, vertebral_data.outcome_number)\n", "sns.mpl.pyplot.plot(vertebral_data.pelvic_incidence, outcome_probs, color='red')" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Log odds: [0.59481302]\n" ] } ], "source": [ "# compute predicted log-odds for pelvic_incidence=55 using the equation\n", "logodds = logreg.intercept_ + logreg.coef_[0] * 55\n", "print(\"Log odds:\",logodds)" ] }, { "cell_type": "code", "execution_count": 139, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "odds: [1.81269197]\n" ] } ], "source": [ "# convert log-odds to odds\n", "odds = np.exp(logodds)\n", "print(\"odds:\",odds)" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "probability: [0.64446871]\n" ] } ], "source": [ "# convert odds to probability, this is the number you would see in the plot above where x= 55\n", "prob = odds/(1 + odds)\n", "print(\"probability:\",prob)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([0.64446871])" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute predicted probability for al=2 using the predict_proba method\n", "array = np.array(55)\n", "logreg.predict_proba(array.reshape(-1,1))[:, 1]" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "[('pelvic_incidence', 0.053766875792266015)]" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# examine the coefficient for al\n", "list(zip(feature_cols, logreg.coef_[0]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Interpretation:** A 1 unit increase in `pelvic_incidence` is associated with a ~0.054 unit increase in the log-odds of `outcome`, where a positive outcome is having a vertebral abnormality (not positive in the real world, but positive in how we coded our outcome feature)." ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.6566903741190347" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# increasing pelvic_incidence by 1 (so that pelvic_incidence=56) increases the log-odds by about 0.054\n", "logodds = 0.59481302 + 0.053766875792266015\n", "odds = np.exp(logodds)\n", "prob = odds/(1 + odds)\n", "prob" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### What does this mean actually? \n", "\n", "**Positive coefficients increase the log-odds of the response (and thus increase the probability), and negative coefficients decrease the log-odds of the response (and thus decrease the probability).**" ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([-2.36236515])" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# examine the intercept\n", "logreg.intercept_" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Interpretation:** For a 'pelvic_incidence' value of 0, the log-odds of 'outcome' is -2.36." ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([0.08608793])" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# convert log-odds to probability\n", "logodds = logreg.intercept_\n", "odds = np.exp(logodds)\n", "prob = odds/(1 + odds)\n", "prob" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "That makes sense from the plot above, because the probability of outcome=1 should be very low for such a low `pelvic_incidence` value." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![logistic betas example](./images/logistic_betas_example.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Changing the $\\beta_0$ value shifts the curve **horizontally**, whereas changing the $\\beta_1$ value changes the **slope** of the curve.\n", "\n", "The non-bias $\\beta$ coefficients are effectively estimates of how certain you are of the outcome given how much evidence that specific feature gives you. A really high magnitude (positive or negative) value means you are very certain of the outcome, given you know that feature's value." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How does sklearn determine the optimal curve?\n", "Logistic regression uses a method called **Mean Log-Likelihood Estimation (MLE)** to determine the best set of $\\beta$ to use. Check out an explanation of how it works here: [StatQuest](https://www.youtube.com/watch?v=yIYKR4sgzI8) Josh Starmer has a very good Youtube channel explaining all kinds of statistics concepts." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How do we measure model performance for classification problems?\n", "\n", "Now that we have a trained model just as we did before with linear regression, what is our **evaluation metric/loss function**?\n", "\n", "There are two common (inverse) measurements we can make that capture the performance of our classification model:\n", " * **Classification accuracy**: percentage of correct predictions (**reward function**)\n", " * **Classification error**: percentage of incorrect predictions (**loss function**)\n", "\n", "In our case, we are going to use classification accuracy. Let's compute our classification accuracy after training on the whole dataset, using our just-trained one-feature model and the scikit-learn method `accuracy_score`:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model accuracy: 0.6258064516129033\n" ] } ], "source": [ "y = vertebral_data.outcome_number\n", "y_pred = outcome_pred_class\n", "print(\"Model accuracy:\",metrics.accuracy_score(y,y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "68% is ok, but its not really fantastic. Can we do better? (YES WE CAN!)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise Time!!\n", " * Generate the logistic regression model incorporating all of the features we have available to predict `outcome_number` and get the accuracy when training and testing on all data. How much better is this than the case where we trained our model using only `pelvic_incidence`?\n", " * Use train/test split with 70% training, 30% testing and get the test error of the model trained on all features using `train_test_split` like we did during linear regression \n", " * Inspect all of the model coefficients of the model trained on all features. Which feature is the most important for the prediction? Which is the least important?\n", " * What are some problems you can see in using the data like we have been? (Look at the fraction of positive and negative outcomes in the dataset)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Comparing Logistic Regression with Other Models\n", "\n", "Logistic regression has some really awesome advantages:\n", "\n", " * It is a highly interpretable method (if you remember what the conversions from log-odds to probability are)\n", " * Model training and prediction are fast\n", " * No tuning is required (excluding regularization, which we will talk about later)\n", " * No need to scale features\n", " * Outputs well-calibrated predicted probabilities (the probabilities behave like probabilities)\n", "\n", "However, logistic regression also has some disadvantages:\n", "\n", " * It presumes a linear relationship between the features and the log-odds of the response\n", " * Compared to other, more fancypants modeling approaches, performance is (generally) not competitive with the best supervised learning methods\n", " * Like linear regression for regression, it is sensitive to irrelevant features\n", " * Unless you explicitly code them (we will see how to do that later), logistic regression can't automatically learn feature interactions" ] } ], "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.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }