{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logistic Regression with Sklearn and TensorFlow Part I" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import tensorflow as tf\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.metrics import roc_curve, roc_auc_score, classification_report, accuracy_score\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load data and visualize the data" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "credit_card = pd.read_csv('creditcard.csv')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdMAAAFNCAYAAABbkoWeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAGwNJREFUeJzt3X203VV95/H3x0R8KCIgEYFAgzW6irQiZIDW1qK2EJh24QM4YJWorMbVhbW6XFOxMxWq0lVbxefS4hAgTgUZ0crUWGTwAe2IEigKAR1SfCCCEEgQULEGv/PH2VcPl5Obm+x7cvPwfq111vmd72//9m+fC/d+8ttn399NVSFJkrbco2Z7AJIkbe8MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2Eq7SCSfDvJ7872OLZHSV6Z5EuzPQ5tvwxTaROSfDXJwiRPTXLdJtpWkh8meaA97t1a4xy3JEe19/fBSfUvJXnlDPR/ZpKfDn3tHkjyZ739SluDYSpNIcmjgV8GVgOHAVOGafOsqtq1PXbfSL9zZ3CYW9MPgVOSLBhT/x8d+trtWlV/M7lBBvzZpW2K/0NKUzsYuKkGtwpbxPTC9BHaVd2aJG9K8n3g/CR7JPnnJGuTrG/b84eOedi0bbty+59Dr1+R5DtJ7kny36Y495FJvp9kzlDtRUm+3rYPT7IyyX1J7kxy9hRv5V7gAuCMjZzrUUn+exvXXUmWJ3li27egXdkuSfLdJHdPNe5J/X4+yVlJ/hX4EfDUJK9KcnOS+5PcmuQ1Q+0fMW3bzv20tv2kJJe19/xV4FemMw5pYwxTaYT2g/pe4F+B32jbbwTekeTeJAduQbdPAfZkcKW7lMH33/nt9QHAj4EPTHN8BwHnAK8A9gWeBMwf1baqrmZwRfn8ofLLgI+07fcC762q3RiEyiWbOP1ZwEuSPGPEvle2x/OApwK78sj39FvAM4AXAG9J8qubON+EVzD4uj0B+A5wF/D7wG7Aq4B3Jzl0mn19EHgQ2Ad4dXtIW8wwlUaoqvPbFO21wJHArwM3ArtV1e5V9a0pDr+uBe69Sd43VP8ZcEZV/aSqflxV91TVpVX1o6q6n0FI/c40h3gC8M9VdVVV/QT4i9b/xlwEnAyQ5AnAca0G8FPgaUn2qqoHWvhuVFV9H/h74K0jdv8hcHZV3VpVDwBvBk6aNK39l+39fw34GvCsoX0vHfra3Ztk36F9F1TVqqraUFU/rapPVdW/18AXgM8Avz3V2Nv7nwO8BHhLVf2wqm4ELtzUcdJUDFNpkiR7th/kPwB+E/g88E0GV1Prk7x+E10c2gJ396p63VB9bVU9OHSexyf5hzYleh9wFbD78HTsFPYFbpt4UVU/BO6Zov1HgBcneQzwYuC6qvpO23cq8HTgG0muSfL70zj/O4BjkjxrUn1fBleNE74DzAX2Hqp9f2j7RwyuXidcMvS1272qbh/ad9vQNkmOTXJ1knVt5uA4YK9pjH1eG9Nwf9/ZSFtpWgxTaZKqWteuSl8D/I+2/S/AH7Qf8O/Z0q4nvX4jg4A+ok2xPrfV055/CDx+qP1ThrbvAPafeJHk8QymekefuOomBoFxLA+f4qWqbqmqk4EnMwjJjyX5pSnfSNU9wHuAt03adTuDaesJBwAbgDun6m+afv71a/8ouBR4J7B3+2+0go187ZIMf+3WtjHtP1Q7YAbGp52YYSpt3PDq3WczmPKdSU9g8DnpvUn25JGLeq5nMEX66CSLGEztTvgY8PtJfivJLgymXDf1/fwR4HUMQvt/TRSTvDzJvKr6GYMFRgAPTWP8ZzO4ch/+zPMi4A1JDkyyK/BXDFbobphGf5tjF+AxtGBMcixw9ND+rwHPTHJIkscCZ07sqKqHgI8DZ7bZgYOAJTM8Pu1kDFNp4w5j8Pnnk4CHqmr9DPf/HuBxwN3A1Qyufof9BYMFQeuBv+ThV5OrgNNa7Y7WZs0mzncRcBTw2aq6e6i+GFiV5AEGi5FOGp6O3piqug/4GwaLqiYsAz7MYMr6WwwW+fzJpvraXO0z5tcxWCy1nsHV9mVD+/8fg39g/B/gFmDyDRley2B6+fsMViefP9Nj1M4l/nFwSZL6eGUqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHXaXv9yxYzba6+9asGCBbM9DEnSNuTaa6+9u6rmbaqdYdosWLCAlStXzvYwJEnbkCTTutWk07ySJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJe/OOwWH/dflsD0E7mWv/9pTZHoK0U/PKVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdxhamSfZP8rkkNydZleRPW/3MJN9Lcn17HDd0zJuTrE7yzSTHDNUXt9rqJKcP1Q9M8pUktyT5aJJdWv0x7fXqtn/BuN6nJEnjvDLdALyxqn4VOBI4LclBbd+7q+qQ9lgB0PadBDwTWAz8XZI5SeYAHwSOBQ4CTh7q5x2tr4XAeuDUVj8VWF9VTwPe3dpJkjQWYwvTqrqjqq5r2/cDNwP7TXHI8cDFVfWTqvoWsBo4vD1WV9WtVfUfwMXA8UkCPB/4WDv+QuCFQ31d2LY/BrygtZckacZtlc9M2zTrs4GvtNJrk3w9ybIke7TafsBtQ4etabWN1Z8E3FtVGybVH9ZX2/+D1l6SpBk39jBNsitwKfD6qroPOAf4FeAQ4A7gXRNNRxxeW1Cfqq/JY1uaZGWSlWvXrp3yfUiStDFjDdMkj2YQpP9YVR8HqKo7q+qhqvoZ8CEG07gwuLLcf+jw+cDtU9TvBnZPMndS/WF9tf1PBNZNHl9VnVtVi6pq0bx583rfriRpJzXO1bwBzgNurqqzh+r7DDV7EXBj274MOKmtxD0QWAh8FbgGWNhW7u7CYJHSZVVVwOeAE9rxS4BPDvW1pG2fAHy2tZckacbN3XSTLfYc4BXADUmub7U/Z7Aa9xAG067fBl4DUFWrklwC3MRgJfBpVfUQQJLXApcDc4BlVbWq9fcm4OIkbwf+jUF4054/nGQ1gyvSk8b4PiVJO7mxhWlVfYnRn12umOKYs4CzRtRXjDquqm7lF9PEw/UHgRM3Z7ySJG0p74AkSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdRpbmCbZP8nnktycZFWSP231PZNckeSW9rxHqyfJ+5KsTvL1JIcO9bWktb8lyZKh+mFJbmjHvC9JpjqHJEnjMM4r0w3AG6vqV4EjgdOSHAScDlxZVQuBK9trgGOBhe2xFDgHBsEInAEcARwOnDEUjue0thPHLW71jZ1DkqQZN7Ywrao7quq6tn0/cDOwH3A8cGFrdiHwwrZ9PLC8Bq4Gdk+yD3AMcEVVrauq9cAVwOK2b7eq+nJVFbB8Ul+jziFJ0ozbKp+ZJlkAPBv4CrB3Vd0Bg8AFntya7QfcNnTYmlabqr5mRJ0pziFJ0owbe5gm2RW4FHh9Vd03VdMRtdqC+uaMbWmSlUlWrl27dnMOlSTp58YapkkezSBI/7GqPt7Kd7YpWtrzXa2+Bth/6PD5wO2bqM8fUZ/qHA9TVedW1aKqWjRv3rwte5OSpJ3eOFfzBjgPuLmqzh7adRkwsSJ3CfDJofopbVXvkcAP2hTt5cDRSfZoC4+OBi5v++5PcmQ71ymT+hp1DkmSZtzcMfb9HOAVwA1Jrm+1Pwf+GrgkyanAd4ET274VwHHAauBHwKsAqmpdkrcB17R2b62qdW37j4ELgMcBn24PpjiHJEkzbmxhWlVfYvTnmgAvGNG+gNM20tcyYNmI+krg4BH1e0adQ5KkcfAOSJIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSp2mFaZIrp1OTJGlnNHeqnUkeCzwe2CvJHkDart2Afcc8NkmStgtThinwGuD1DILzWn4RpvcBHxzjuCRJ2m5MGaZV9V7gvUn+pKrev5XGJEnSdmVTV6YAVNX7k/wmsGD4mKpaPqZxSZK03ZhWmCb5MPArwPXAQ61cgGEqSdrpTStMgUXAQVVV4xyMJEnbo+n+numNwFM2p+Mky5LcleTGodqZSb6X5Pr2OG5o35uTrE7yzSTHDNUXt9rqJKcP1Q9M8pUktyT5aJJdWv0x7fXqtn/B5oxbkqTNNd0w3Qu4KcnlSS6beGzimAuAxSPq766qQ9pjBUCSg4CTgGe2Y/4uyZwkcxisGj4WOAg4ubUFeEfrayGwHji11U8F1lfV04B3t3aSJI3NdKd5z9zcjqvqqs24KjweuLiqfgJ8K8lq4PC2b3VV3QqQ5GLg+CQ3A88HXtbaXNjGeE7ra2K8HwM+kCROUUuSxmW6q3m/MIPnfG2SU4CVwBuraj2wH3D1UJs1rQZw26T6EcCTgHurasOI9vtNHFNVG5L8oLW/ewbfgyRJPzfd2wnen+S+9ngwyUNJ7tuC853DYFXwIcAdwLsmTjGibW1Bfaq+HiHJ0iQrk6xcu3btVOOWJGmjphWmVfWEqtqtPR4LvAT4wOaerKrurKqHqupnwIf4xVTuGmD/oabzgdunqN8N7J5k7qT6w/pq+58IrNvIeM6tqkVVtWjevHmb+3YkSQK28K/GVNU/MfjMcrMk2Wfo5YsYrBIGuAw4qa3EPRBYCHwVuAZY2Fbu7sJgkdJl7fPPzwEntOOXAJ8c6mtJ2z4B+Kyfl0qSxmm6N2148dDLRzH4vdMpAyrJRcBRDG6SvwY4AzgqySHt2G8zuPcvVbUqySXATcAG4LSqeqj181rgcmAOsKyqVrVTvAm4OMnbgX8Dzmv184APt0VM6xgEsCRJYzPd1bx/MLS9gUEQHj/VAVV18ojyeSNqE+3PAs4aUV8BrBhRv5VfTBMP1x8ETpxqbJIkzaTpruZ91bgHIknS9mq6q3nnJ/lEu6PRnUkuTTJ/3IOTJGl7MN0FSOczWNizL4Pf4/zfrSZJ0k5vumE6r6rOr6oN7XEB4O+SSJLE9MP07iQvn7hfbpKXA/eMc2CSJG0vphumrwZeCnyfwZ2LTgBclCRJEtP/1Zi3AUvafXRJsifwTgYhK0nSTm26V6a/PhGkAFW1Dnj2eIYkSdL2Zbph+qgke0y8aFem072qlSRphzbdQHwX8H+TfIzBrQBfyoi7FUmStDOa7h2QlidZyeDm9gFeXFU3jXVkkiRtJ6Y9VdvC0wCVJGmSLfoTbJIk6RcMU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ3GFqZJliW5K8mNQ7U9k1yR5Jb2vEerJ8n7kqxO8vUkhw4ds6S1vyXJkqH6YUluaMe8L0mmOockSeMyzivTC4DFk2qnA1dW1ULgyvYa4FhgYXssBc6BQTACZwBHAIcDZwyF4zmt7cRxizdxDkmSxmJsYVpVVwHrJpWPBy5s2xcCLxyqL6+Bq4Hdk+wDHANcUVXrqmo9cAWwuO3braq+XFUFLJ/U16hzSJI0Flv7M9O9q+oOgPb85FbfD7htqN2aVpuqvmZEfapzSJI0FtvKAqSMqNUW1DfvpMnSJCuTrFy7du3mHi5JErD1w/TONkVLe76r1dcA+w+1mw/cvon6/BH1qc7xCFV1blUtqqpF8+bN2+I3JUnauW3tML0MmFiRuwT45FD9lLaq90jgB22K9nLg6CR7tIVHRwOXt333JzmyreI9ZVJfo84hSdJYzB1Xx0kuAo4C9kqyhsGq3L8GLklyKvBd4MTWfAVwHLAa+BHwKoCqWpfkbcA1rd1bq2piUdMfM1gx/Djg0+3BFOeQJGksxhamVXXyRna9YETbAk7bSD/LgGUj6iuBg0fU7xl1DkmSxmVbWYAkSdJ2yzCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROsxKmSb6d5IYk1ydZ2Wp7JrkiyS3teY9WT5L3JVmd5OtJDh3qZ0lrf0uSJUP1w1r/q9ux2frvUpK0s5jNK9PnVdUhVbWovT4duLKqFgJXttcAxwIL22MpcA4Mwhc4AzgCOBw4YyKAW5ulQ8ctHv/bkSTtrLalad7jgQvb9oXAC4fqy2vgamD3JPsAxwBXVNW6qloPXAEsbvt2q6ovV1UBy4f6kiRpxs1WmBbwmSTXJlnaantX1R0A7fnJrb4fcNvQsWtabar6mhF1SZLGYu4snfc5VXV7kicDVyT5xhRtR33eWVtQf2THgyBfCnDAAQdMPWJJkjZiVq5Mq+r29nwX8AkGn3ne2aZoac93teZrgP2HDp8P3L6J+vwR9VHjOLeqFlXVonnz5vW+LUnSTmqrh2mSX0ryhIlt4GjgRuAyYGJF7hLgk237MuCUtqr3SOAHbRr4cuDoJHu0hUdHA5e3ffcnObKt4j1lqC9JkmbcbEzz7g18ov22ylzgI1X1L0muAS5JcirwXeDE1n4FcBywGvgR8CqAqlqX5G3ANa3dW6tqXdv+Y+AC4HHAp9tDkqSx2OphWlW3As8aUb8HeMGIegGnbaSvZcCyEfWVwMHdg5UkaRq2pV+NkSRpu2SYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlSSpk2EqSVInw1SSpE6GqSRJnQxTSZI6GaaSJHUyTCVJ6mSYSpLUyTCVJKmTYSpJUifDVJKkToapJEmdDFNJkjoZppIkdTJMJUnqZJhKktTJMJUkqZNhKklSJ8NUkqROO2yYJlmc5JtJVic5fbbHI0nace2QYZpkDvBB4FjgIODkJAfN7qgkSTuqHTJMgcOB1VV1a1X9B3AxcPwsj0mStIOaO9sDGJP9gNuGXq8BjpilsUg7te++9ddmewjaiRzwlhtm5bw7aphmRK0e0ShZCixtLx9I8s2xjkrTsRdw92wPYnuTdy6Z7SFo5vm9sCXOGPXjv8svT6fRjhqma4D9h17PB26f3KiqzgXO3VqD0qYlWVlVi2Z7HNJs83th+7KjfmZ6DbAwyYFJdgFOAi6b5TFJknZQO+SVaVVtSPJa4HJgDrCsqlbN8rAkSTuoHTJMAapqBbBitsehzea0uzTg98J2JFWPWJcjSZI2w476makkSVuNYaptgrd/lAaSLEtyV5IbZ3ssmj7DVLPO2z9KD3MBsHi2B6HNY5hqW+DtH6Wmqq4C1s32OLR5DFNtC0bd/nG/WRqLJG02w1Tbgmnd/lGStlWGqbYF07r9oyRtqwxTbQu8/aOk7ZphqllXVRuAids/3gxc4u0ftbNKchHwZeAZSdYkOXW2x6RN8w5IkiR18spUkqROhqkkSZ0MU0mSOhmmkiR1MkwlSepkmEqS1MkwlbaCJE9JcnGSf09yU5IVSZ6eZME4/9RWktcnOaVtn5hkVZKfJVk0w+c5M8n3klzfHn89k/0PneeCJCe07YuTLBzHeaTNNXe2ByDt6JIE+ARwYVWd1GqHAHvz8Bv8z/R55wKvBg5tpRuBFwP/MKZTvruq3jnFeOZU1UMzeL5zgD8D/mgG+5S2iFem0vg9D/hpVf39RKGqrq+qLw43alepX0xyXXv8Zqvvk+SqdsV3Y5LfTjKnXaXdmOSGJG8Ycd7nA9e1O0xRVTdX1TfH+D4fIcm3k7wlyZeAE5P8UZJrknwtyaVJHt/a/fyKs71+oD0nyQfa1fyngCcPdf9F4HfbPxqkWeX/hNL4HQxcO412dwG/V1UPtunLi4BFwMuAy6vqrPaH1B8PHALsV1UHAyTZfUR/z5nOeZM8A/joRnYfVVX3Jvko8IwR+8+uquVt+w1JXt6231RVl7ftB6vqt9q5nlRVH2rbbwdOBd4/xfBe1M77awyu5G8ClgFU1c+SrAaeNZ33KY2TYSptOx4NfKBNAT8EPL3VrwGWJXk08E9VdX2SW4GnJnk/8CngMyP624fBvY6n1K5WD9lEm/8yjfFvbJp3OKgPbiG6O7Arg/sxT+W5wEVtevj2JJ+dtP8uYF8MU80yw1Qav1XACZtsBW8A7mRwpfUo4EGAqroqyXOB/wx8OMnfVtXyJM8CjgFOA17K4PPRYT8GHrupk87glenG/HBo+wLghVX1tSSvBI5q9Q20j53aZ8y7DB0z1Q3EH8vgfUqzyjCVxu+zwF8l+aOhKc7/xGC69jtD7Z4IrGnTl0uAOa3tLwPfq6oPJfkl4NAkK4D/qKpLk/w7g5Ca7GbgaZsa3AxemU7HE4A72lX2HwLfa/VvA4cBlwDHM7hKB7gKeE2S5Qw+L30e8JGh/p7O4B8r0qxyAZI0ZjX400wvAn6v/WrMKuBMHvkH0P8OWJLkagYhMXFFdxRwfZJ/A14CvBfYD/h8kusZBOmbR5z60wymSQFI8qIka4DfAD6VZFNTrOPwF8BXgCuAbwzVPwT8TpKvAkfwi/f+CeAW4AYGq3e/MHFAkr2BH1fVHVth3NKU/BNs0g4sySeAP6uqW2Z7LDOtrWC+r6rOm+2xSF6ZSju20xksRNoR3QtcONuDkMArU0mSunllKklSJ8NUkqROhqkkSZ0MU0mSOhmmkiR1+v+xucj/10KWlAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = plt.subplots(figsize=(7, 5))\n", "sns.countplot(x='Class', data=credit_card)\n", "plt.title('# Fraud vs NonFraud')\n", "plt.xlabel('Class (1==Fraud)')\n", "plt.savefig('inbalance_class.png', dpi=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see we have mostly non-fraudulent transactions. Such a problem is also called inbalanced class problem.\n", "\n", "99.8% of all transactions are non-fraudulent. The easiest classifier would always predict no fraud and would be in almost all cases correct. Such classifier would have a very high accuracy but is quite useless." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.99827251436937992" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "base_line_accuracy = 1-np.sum(credit_card.Class)/credit_card.shape[0]\n", "base_line_accuracy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For such an inbalanced class problem we could use over or undersampling methods to try to balance the classes (see inbalance-learn for example: https://github.com/scikit-learn-contrib/imbalanced-learn), but this out of the scope of todays post. We will come back to this in a later post.\n", "\n", "As accuracy is not very informative in this case the AUC (Aera under the curve) a better metric to assess the model quality. The AUC in a two class classification class is equal to the probability that our classifier will detect a fraudulent transaction given one fraudulent and genuiune transaction to choice from. Guessing would have a probability of 50%." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "X = credit_card.drop(columns='Class', axis=1)\n", "y = credit_card.Class.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Due to the construction of the dataset (PCA transformed features, which minimizes the correlation between factors), we dont have any highly correlated features. Multicolinearity could cause problems in a logisitc regression.\n", "\n", "To test for multicolinearity one could look into the correlation matrix (works only for non categorical features) or run partial regressions and compare the standard errors or use pseudo-R^2 values and calculate Variance-Inflation-Factors.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "corr = X.corr()\n", "\n", "mask = np.zeros_like(corr, dtype=np.bool)\n", "mask[np.triu_indices_from(mask)] = True\n", "\n", "cmap = sns.diverging_palette(220, 10, as_cmap=True)\n", "\n", "# Draw the heatmap with the mask and correct aspect ratio\n", "f, ax = plt.subplots(figsize=(11, 9))\n", "sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,\n", " square=True, linewidths=.5, cbar_kws={\"shrink\": .5})\n", "plt.savefig('heat_map.png', dpi=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logisitc Regression with Sklearn\n", "\n", "Short reminder of Logistic Regression:\n", "\n", "In Logisitic Regression the logits (logs of the odds) are assumed to be a linear function of the features\n", "\n", "$$L=\\log(\\frac{P(Y=1)}{1-P(Y=1)}) = \\beta_0 + \\sum_{i=1}^n \\beta_i X_i. $$\n", "\n", "Solving this equatation for $p=P(Y=1)$ yields to\n", "\n", "$$ p = \\frac{\\exp(L)}{1-\\exp(L)}.$$\n", "\n", "The parameters $\\beta_i$ can be derived by Maximum Likelihood Estimation (MLE). The likelihood for a given $m$ observation $Y_j$ is\n", "\n", "$$ lkl = \\prod_{j=1}^m p^{Y_j}(1-p)^{1-Y_j}.$$\n", "\n", "To find the maximum of the likelihood is equivalent to the minimize the negative logarithm of the likelihood (loglikelihood).\n", "\n", "$$ -llkh = -\\sum_{j=1}^m Y_j \\log(p) + (1-Y_j) \\log(1-p),$$\n", "\n", "which is numerical more stable. The log-likelihood function has the same form as the cross-entropy error function for a discrete case.\n", "\n", "So finding the maximum likelihood estimator is the same problem as minimizing the average cross entropy error function.\n", "\n", "In SciKit-Learn uses by default a coordinate descent algorithm to find the minimum of L2 regularized version of the loss function (see. http://scikit-learn.org/stable/modules/linear_model.html#logistic-regression).\n", "\n", "The main difference between L1 (Lasso) and L2 (Ridge) regulaziation is, that the L1 prefer a sparse solution (the higher the regulazation parameter the more parameter will be zero) while L2 enforce small parameter values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train the model\n", "\n", "### Training and test set\n", "\n", "First we split our data set into a train and a validation set by using the function train_test_split. The model performace " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model definition\n", "\n", "As preperation we standardize our features to have zero mean and a unit standard deviation. The convergence of gradient descent algorithm are better. We use the class `StandardScaler`. The class *StandardScaler* has the method `fit_transform()` which learn the mean $\\mu_i$ and standard deviation $\\sigma_i$ of each feature $i$ and return a standardized version $\\frac{x_i - \\mu_i}{\\sigma}$. We learn the mean and sd on the training data. We can apply the same standardization on the test set with the function *transform()*.\n", "\n", "\n", "The logistic regression is implemented in the class `LogisticRegression`, we will use for now the default parameterization. The model can be fit using the function `fit()`. After fitting the model can be used to make predicitons `predict()` or return the estimated the class probabilities `predict_proba()`.\n", "\n", "We combine both steps into a Pipeline. The pipline performs both steps automatically. When we call the method `fit()` of the pipeline, it will invoke the method `fit_and_transform()` for all but the last step and the method `fit()` of the last step, which is equivalent to:\n", "\n", "```python\n", "lr.fit(scaler.fit_transform(X_train), y_train)\n", "```\n", "\n", "or visualized as a dataflow:\n", "\n", "```X_train => scaler.fit_transform(.) => lr.fit(., y_train)```\n", "\n", "If we invoke the method `predict()` of the pipeline its equvivalent to\n", "\n", "\n", "```python\n", "lr.predict(scaler.transform(X_train))\n", "```\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "scaler = StandardScaler()\n", "lr = LogisticRegression()\n", "model1 = Pipeline([('standardize', scaler),\n", " ('log_reg', lr)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next step we fit our model to the training data" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pipeline(memory=None,\n", " steps=[('standardize', StandardScaler(copy=True, with_mean=True, with_std=True)), ('log_reg', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", " verbose=0, warm_start=False))])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model1.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "### Training score and Test score" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training accuracy: 99.9237 %\n", "Training AUC: 98.0664 %\n" ] } ], "source": [ "y_train_hat = model1.predict(X_train)\n", "y_train_hat_probs = model1.predict_proba(X_train)[:,1]\n", "train_accuracy = accuracy_score(y_train, y_train_hat)*100\n", "train_auc_roc = roc_auc_score(y_train, y_train_hat_probs)*100\n", "print('Training accuracy: %.4f %%' % train_accuracy)\n", "print('Training AUC: %.4f %%' % train_auc_roc)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training accuracy: 99.9199 %\n", "Training AUC: 97.4810 %\n" ] } ], "source": [ "y_test_hat = model1.predict(X_test)\n", "y_test_hat_probs = model1.predict_proba(X_test)[:,1]\n", "test_accuracy = accuracy_score(y_test, y_test_hat)*100\n", "test_auc_roc = roc_auc_score(y_test, y_test_hat_probs)*100\n", "print('Training accuracy: %.4f %%' % test_accuracy)\n", "print('Training AUC: %.4f %%' % test_auc_roc)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.9994 0.9998 0.9996 71089\n", " 1 0.8500 0.6018 0.7047 113\n", "\n", "avg / total 0.9991 0.9992 0.9991 71202\n", "\n" ] } ], "source": [ "print(classification_report(y_test, y_test_hat, digits=4))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fpr, tpr, thresholds = roc_curve(y_test, y_test_hat_probs, drop_intermediate=True)\n", "\n", "f, ax = plt.subplots(figsize=(9, 6))\n", "_ = plt.plot(fpr, tpr, [0,1], [0, 1])\n", "_ = plt.title('AUC ROC')\n", "_ = plt.xlabel('False positive rate')\n", "_ = plt.ylabel('True positive rate')\n", "plt.style.use('seaborn')\n", "\n", "plt.savefig('auc_roc.png', dpi=600)" ] }, { "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }