{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "CrimPredict.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "[View in Colaboratory](https://colab.research.google.com/github/garybake/kaggle_entries/blob/master/CrimPredict.ipynb)" ] }, { "metadata": { "id": "DPyOL__Ww1PL", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Criminality Prediction" ] }, { "metadata": { "id": "m8fU8Q8Fw1PM", "colab_type": "text" }, "cell_type": "markdown", "source": [ "https://www.hackerearth.com/challenge/competitive/predict-the-criminal/machine-learning/predict-the-criminal/" ] }, { "metadata": { "id": "eHoAV7rKw1PN", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Notes on field names \n", "https://www.icpsr.umich.edu/icpsrweb/NAHDAP/studies/04373/datasets/0001/variables/ANALWT_C?archive=nahdap" ] }, { "metadata": { "id": "_wQAoIbPw1PN", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Problem Statement\n", "\n", "There has been a surge in crimes committed in recent years, making crime a top cause of concern for law enforcement. If we are able to estimate whether someone is going to commit a crime in the future, we can take precautions and be prepared. You are given a dataset containing answers to various questions concerning the professional and private lives of several people. A few of them have been arrested for various small and large crimes in the past. Use the given data to predict if the people in the test data will commit a crime. The train data consists of 45718 rows, while the test data consists of 11430 rows." ] }, { "metadata": { "id": "1zlE_SqEw1PO", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Using keras. I don't think a neural network is the ideal method for this problem, more I wanted to use it to aid my learning of keras. \n", "\n", "Initially I ran it using jupyter notes, then switched to the new jupyter labs and was impressed, then moved to google colab for the final runs (this is awesome for running on a free gpu)." ] }, { "metadata": { "id": "uW8dP1uYw1PQ", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "c2e45892-84e5-4e1e-efe9-2fbdac1fe53e" }, "cell_type": "code", "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "from keras import models\n", "from keras import layers\n", "from keras import metrics\n", "from keras import regularizers\n", "\n", "import matplotlib.pyplot as plt" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ], "name": "stderr" } ] }, { "metadata": { "id": "Nr5Lx6Tkw1PV", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Get Data" ] }, { "metadata": { "id": "UdmzV2mKw1PW", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Running locally\n", "# df_train_orig = pd.read_csv('data/criminal_train.csv')\n", "# df_test_orig = pd.read_csv('data/criminal_test.csv')" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "g3CFAqGDxzIO", "colab_type": "code", "colab": { "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=", "ok": true, "headers": [ [ "content-type", "application/javascript" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 106 }, "outputId": "e3dc581f-33a8-49fe-a34a-7ebab090389a" }, "cell_type": "code", "source": [ "from google.colab import files\n", "uploaded = files.upload()" ], "execution_count": 3, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Saving criminal_train.csv to criminal_train (1).csv\n", "Saving criminal_test.csv to criminal_test (1).csv\n" ], "name": "stdout" } ] }, { "metadata": { "id": "C4Id0ughx3Fw", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "df6016ed-df4d-4435-f22c-06ba1265a77f" }, "cell_type": "code", "source": [ "for fn in uploaded.keys():\n", " print('User uploaded file \"{name}\" with length {length} bytes'.format(name=fn, length=len(uploaded[fn]))) \n", "\n", "import io\n", "df_train_orig = pd.read_csv(io.StringIO(uploaded['criminal_train.csv'].decode('utf-8')))\n", "df_test_orig = pd.read_csv(io.StringIO(uploaded['criminal_test.csv'].decode('utf-8')))" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ "User uploaded file \"criminal_train.csv\" with length 8253714 bytes\n", "User uploaded file \"criminal_test.csv\" with length 2040958 bytes\n" ], "name": "stdout" } ] }, { "metadata": { "id": "J72DZnRZw1PY", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Take a copy so we don't have to keep reloading the data while playing with the data\n", "import copy\n", "df_train = copy.deepcopy(df_train_orig)\n", "df_test = copy.deepcopy(df_test_orig)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "2k9zNn0hw1Pa", "colab_type": "text" }, "cell_type": "markdown", "source": [ "We are using one-hot-encoding. \n", "However this could result in the train and test set ending up with difference columns.\n", "A quick solution is to join the train and test set together and split after applying ohe.\n", "Set Criminal to -1 to differentiate the 2 sets. \n", "_There are better ways of doing this_" ] }, { "metadata": { "id": "N0vTe8z7w1Pb", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "df_test['Criminal'] = -1\n", "df_both = pd.concat([df_train, df_test])" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "j5aUN2G9w1Ph", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 253 }, "outputId": "840a735c-8c67-4961-caa0-ff4ed2e9d301" }, "cell_type": "code", "source": [ "df_both.head()" ], "execution_count": 8, "outputs": [ { "output_type": "execute_result", "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", " \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", "
PERIDIFATHERNRCH17_2IRHHSIZ2IIHHSIZ2IRKI17_2IIKI17_2IRHH65_2IIHH65_2PRXRETRY...TOOLONGTROUBUNDPDEN10COUTYP2MAIIN102AIIND102ANALWT_CVESTRVEREPCriminal
0250951434241311199...1211223884.8059984002610
1130051434131211199...2223221627.1081064001521
2674151434121211199...2223224344.9579804002410
3709251434021111199...221122792.5219314002710
4752351431061411199...2222221518.1185264000120
\n", "

5 rows × 72 columns

\n", "
" ], "text/plain": [ " PERID IFATHER NRCH17_2 IRHHSIZ2 IIHHSIZ2 IRKI17_2 IIKI17_2 \\\n", "0 25095143 4 2 4 1 3 1 \n", "1 13005143 4 1 3 1 2 1 \n", "2 67415143 4 1 2 1 2 1 \n", "3 70925143 4 0 2 1 1 1 \n", "4 75235143 1 0 6 1 4 1 \n", "\n", " IRHH65_2 IIHH65_2 PRXRETRY ... TOOLONG TROUBUND PDEN10 COUTYP2 \\\n", "0 1 1 99 ... 1 2 1 1 \n", "1 1 1 99 ... 2 2 2 3 \n", "2 1 1 99 ... 2 2 2 3 \n", "3 1 1 99 ... 2 2 1 1 \n", "4 1 1 99 ... 2 2 2 2 \n", "\n", " MAIIN102 AIIND102 ANALWT_C VESTR VEREP Criminal \n", "0 2 2 3884.805998 40026 1 0 \n", "1 2 2 1627.108106 40015 2 1 \n", "2 2 2 4344.957980 40024 1 0 \n", "3 2 2 792.521931 40027 1 0 \n", "4 2 2 1518.118526 40001 2 0 \n", "\n", "[5 rows x 72 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "metadata": { "id": "P_zt_Lojw1Pk", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "532645c7-1d47-47d0-89fb-f9849fe1d660" }, "cell_type": "code", "source": [ "print(df_both.shape)" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "text": [ "(57148, 72)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "1sfyv0xxw1Pn", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Process Data" ] }, { "metadata": { "id": "5AIyVMgjw1Pq", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Feature engineering" ] }, { "metadata": { "id": "knkagp0Iw1Pr", "colab_type": "text" }, "cell_type": "markdown", "source": [ "I went through the definitions on the fields using the link (substituting the field name:\n", "https://www.icpsr.umich.edu/icpsrweb/NAHDAP/studies/04373/datasets/0001/variables/ANALWT_C?archive=nahdap" ] }, { "metadata": { "id": "AduIyYDYw1Pr", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**default**\n", "Most of the fields look categorical\n", "\n", "**to_dump** \n", "Fields I didn't feel neccasary, they were mostly metadata\n", "\n", "**two_is zero** \n", "Fields with a yes no answer, where 2 is no. For ohe we can convert the no to a zero. (also converted nulls to zero - neural nets effectively handle zeros as nulls)\n", "\n", "**is_numeric** \n", "Non categorical fields\n", "\n", "A couple of fields looked ordinal (income fields) but I got a better score setting them to ordinal and pushing them through OHE." ] }, { "metadata": { "id": "l7MkeDEKw1Ps", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "to_dump = ['IIHHSIZ2','IIKI17_2','IIHH65_2','PRXRETRY','HLNVCOST','HLNVOFFR','HLNVREF','HLNVNEED','HLNVSOR','IIMCDCHP','IIMEDICR','IICHMPUS','IIPRVHLT','IIOTHHLT','IIINSUR4','IIFAMSOC','IIFAMSSI','IIFSTAMP','IIFAMPMT','IIFAMSVC','IIWELMOS','IIPINC3','IIFAMIN3','ANALWT_C','VESTR','VEREP']\n", "two_is_zero =['IRMCDCHP','IRMEDICR','IRCHMPUS','IRPRVHLT','IROTHHLT','ANYHLTI2','IRINSUR4','OTHINS','IRFAMSOC','IRFAMSSI','IRFSTAMP','IRFAMPMT','IRFAMSVC','GOVTPROG']\n", "is_numeric = ['HLCNOTMO', 'IRWELMOS']" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "Oqc4VHQ8w1Pv", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Dump the unneeded fields\n", "all_cols = list(df_both)\n", "for col in all_cols:\n", " if col in to_dump:\n", " df_both = df_both.drop(col, axis=1)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "kUNmTNSqw1P0", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "\n", "for col in df_both:\n", " if col != 'Criminal':\n", "\n", " # A lot of fields had the same 'no answer' mappings so set them all to zero\n", " df_both[col] = df_both[col].replace(-1, 0) # Null\n", " df_both[col] = df_both[col].replace(85, 0) # BAD DATA Logically assigned\n", " df_both[col] = df_both[col].replace(94, 0) # DON'T KNOW\n", " df_both[col] = df_both[col].replace(97, 0) # REFUSED\n", " df_both[col] = df_both[col].replace(98, 0) # BLANK (NO ANSWER)\n", " df_both[col] = df_both[col].replace(99, 0) # LEGITIMATE SKIP (Respondent answering)\n", " \n", " # Set the 'no' answers to zero\n", " if col in two_is_zero:\n", " df_both[col] = df_both[col].replace(2, 0) # 'no' answers\n", " \n", " # Set the fields to categorical (do I need to do this?)\n", " if col not in is_numeric:\n", " df_both[col] = df_both[col].astype('category')\n", " else:\n", " # Normalise the other fields so all fields are between -/+ 1 standard deviation\n", " mean = df_both[col].mean(axis=0)\n", " df_both[col] -= mean\n", " std = df_both[col].std(axis=0)\n", " df_both[col] /= std" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "iXG56yk4w1P4", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "outputId": "a845a45b-abf3-4299-c7ba-0b81329e0c4c" }, "cell_type": "code", "source": [ "df_both.Criminal.value_counts()" ], "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 0 42543\n", "-1 11430\n", " 1 3175\n", "Name: Criminal, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "metadata": { "id": "zID8kYumw1P8", "colab_type": "text" }, "cell_type": "markdown", "source": [ "One hot encode all of the fields" ] }, { "metadata": { "id": "X-2ycRqPw1P8", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 170 }, "outputId": "fed1e57b-03ff-442f-de76-e0902c413a47" }, "cell_type": "code", "source": [ "# List of columns before OHE\n", "df_both.columns[1:-1]" ], "execution_count": 14, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['IFATHER', 'NRCH17_2', 'IRHHSIZ2', 'IRKI17_2', 'IRHH65_2', 'PRXYDATA',\n", " 'MEDICARE', 'CAIDCHIP', 'CHAMPUS', 'PRVHLTIN', 'GRPHLTIN', 'HLTINNOS',\n", " 'HLCNOTYR', 'HLCNOTMO', 'HLCLAST', 'HLLOSRSN', 'IRMCDCHP', 'IRMEDICR',\n", " 'IRCHMPUS', 'IRPRVHLT', 'IROTHHLT', 'HLCALLFG', 'HLCALL99', 'ANYHLTI2',\n", " 'IRINSUR4', 'OTHINS', 'CELLNOTCL', 'CELLWRKNG', 'IRFAMSOC', 'IRFAMSSI',\n", " 'IRFSTAMP', 'IRFAMPMT', 'IRFAMSVC', 'IRWELMOS', 'IRPINC3', 'IRFAMIN3',\n", " 'GOVTPROG', 'POVERTY3', 'TOOLONG', 'TROUBUND', 'PDEN10', 'COUTYP2',\n", " 'MAIIN102', 'AIIND102'],\n", " dtype='object')" ] }, "metadata": { "tags": [] }, "execution_count": 14 } ] }, { "metadata": { "id": "yjlQLZQmw1P-", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Hold back the numeric fields from OHE\n", "cat_cols = set(df_both.columns[1:-1])\n", "for col in is_numeric:\n", " cat_cols.remove(col)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "-DHfwwkCw1QB", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Actually do the OHE\n", "df_ohe = pd.get_dummies(df_both, columns=cat_cols) # ignore perid and criminal column" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "v2toNam_w1QE", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Put all the data back together with the new OHE fields\n", "df_ohe['PERID'] = df_both.PERID\n", "df_ohe['Criminal'] = df_both.Criminal\n", "for col in is_numeric:\n", " df_ohe[col] = df_both[col]" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "ikWARhoJw1QG", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "7cfa7ef5-b2bd-43e7-bd1d-b52609c61417" }, "cell_type": "code", "source": [ "print(df_ohe.shape)" ], "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ "(57148, 150)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "1oT6GiL70o9z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 119 }, "outputId": "200cf312-0640-4a8c-b08c-9fbd39934a07" }, "cell_type": "code", "source": [ "df_ohe.columns" ], "execution_count": 19, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['PERID', 'HLCNOTMO', 'IRWELMOS', 'Criminal', 'IRFAMPMT_0', 'IRFAMPMT_1',\n", " 'IFATHER_0', 'IFATHER_1', 'IFATHER_2', 'IFATHER_3',\n", " ...\n", " 'MAIIN102_2', 'IRFSTAMP_0', 'IRFSTAMP_1', 'PRXYDATA_0', 'PRXYDATA_1',\n", " 'PRXYDATA_2', 'IRFAMSOC_0', 'IRFAMSOC_1', 'IRCHMPUS_0', 'IRCHMPUS_1'],\n", " dtype='object', length=150)" ] }, "metadata": { "tags": [] }, "execution_count": 19 } ] }, { "metadata": { "id": "R3M68sHN053B", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Split the data back into train and test sets" ] }, { "metadata": { "id": "JwbMclhkw1QI", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "df_train = df_ohe[df_ohe['Criminal'] != -1]\n", "df_test = df_ohe[df_ohe['Criminal'] == -1]" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "NSgq5FoNw1QK", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "8a28ff99-7db7-41e6-a79a-58b21b522be1" }, "cell_type": "code", "source": [ "df_train_labels = df_train['Criminal']\n", "# Drop the PERID field as we shouldn't predict from it\n", "# Also drop the Criminal field else our model will just use this!\n", "df_train = df_train.drop(['PERID','Criminal'], axis = 1)\n", "print(df_train.shape)" ], "execution_count": 21, "outputs": [ { "output_type": "stream", "text": [ "(45718, 148)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "EEl_qVn-w1QM", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Remove the Criminal column from the test set\n", "df_test = df_test.drop(['Criminal'], axis = 1)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "pwK3r1nOw1QP", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "02762f89-3d6d-4ab9-deef-d91938e307ad" }, "cell_type": "code", "source": [ "print(df_train.shape)\n", "print(df_test.shape)" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "text": [ "(45718, 148)\n", "(11430, 149)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "-OzZ_uU1w1QT", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Convert for Keras" ] }, { "metadata": { "id": "sNf2gatz1FEa", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Keras deals with numpy arrays rather than pandas dataframes so we do a little bit of conversion" ] }, { "metadata": { "id": "b-6bU2D4w1QU", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Get the base arrays using the values from the dataframes\n", "labels = df_train_labels.values\n", "data = df_train.values" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "pef7v7Z2w1QX", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# TODO: do I need to do this step?\n", "# Convert from ints to floats\n", "labels = labels.astype(np.float32, copy=False)\n", "data = data.astype(np.float32, copy=False)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "FOBHIytuw1Qa", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "10cc2dcd-4e58-4bc0-bd35-67df92c7fbf5" }, "cell_type": "code", "source": [ "print(data.shape)\n", "print(labels.shape)" ], "execution_count": 26, "outputs": [ { "output_type": "stream", "text": [ "(45718, 148)\n", "(45718,)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "2O8GMZTA1WEX", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Split the training data into a train and test set (the other test set is what we sumbit with)" ] }, { "metadata": { "id": "6StGm7Njw1Qe", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "jiTfxbAew1Qi", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "data_train, data_test, labels_train, labels_test = train_test_split(data, labels, test_size=0.20, random_state=42)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "MSheB-N6w1Qj", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Build the model" ] }, { "metadata": { "id": "XWVcsUkxw1Qk", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# We need this to handle the unbalanced data\n", "# https://github.com/keras-team/keras/issues/1875\n", "# TODO: I don't think I need to do this\n", "def get_class_weights(y, smooth_factor=0):\n", " \"\"\"\n", " Returns the weights for each class based on the frequencies of the samples\n", " :param smooth_factor: factor that smooths extremely uneven weights\n", " :param y: list of true labels (the labels must be hashable)\n", " :return: dictionary with the weight for each class\n", " \"\"\"\n", " from collections import Counter\n", " counter = Counter(y)\n", "\n", " if smooth_factor > 0:\n", " p = max(counter.values()) * smooth_factor\n", " for k in counter.keys():\n", " counter[k] += p\n", "\n", " majority = max(counter.values())\n", "\n", " return {cls: float(majority) / count for cls, count in counter.items()}" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "80qVn4hzw1Qn", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "931fe080-89e6-4386-eea8-feddabced1f8" }, "cell_type": "code", "source": [ "class_weights = get_class_weights(labels)\n", "class_weights" ], "execution_count": 30, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{0.0: 1.0, 1.0: 13.399370078740157}" ] }, "metadata": { "tags": [] }, "execution_count": 30 } ] }, { "metadata": { "id": "V6asofu2w1Qq", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Used as the evaluation function\n", "# Removed from older keras source due to it being inappropriate for batchings \n", "# use huge batches to compensate\n", "import keras.backend as K\n", "def matthews_correlation(y_true, y_pred):\n", " y_pred_pos = K.round(K.clip(y_pred, 0, 1))\n", " y_pred_neg = 1 - y_pred_pos\n", "\n", " y_pos = K.round(K.clip(y_true, 0, 1))\n", " y_neg = 1 - y_pos\n", "\n", " tp = K.sum(y_pos * y_pred_pos)\n", " tn = K.sum(y_neg * y_pred_neg)\n", "\n", " fp = K.sum(y_neg * y_pred_pos)\n", " fn = K.sum(y_pos * y_pred_neg)\n", "\n", " numerator = (tp * tn - fp * fn)\n", " denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))\n", "\n", " return numerator / (denominator + K.epsilon())" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "EesjVMguw1Qs", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Build the network" ] }, { "metadata": { "id": "1vC1u5QVw1Qu", "colab_type": "text" }, "cell_type": "markdown", "source": [ "After the feature engineering this is the next largest amount of work.\n", "\n", "I started with a couple of layers (64/31/1) and appropriate model parameters.\n", "\n", "The problem is a binary classification which means we use binary_crossentropy as the loss and sigmoid activation on the last layer. \n", "Optimizer is rmsprop (TODO: check other optimizers)\n", "\n", "I then iterated over hyperparams to find the best values, tuning each section before moving to the next:\n", "1. Layers \n", "2. Number of epochs \n", "3. Batch_size \n", "4. Regularization (no effect) \n", "\n", "Then back through the loop to make sure the later settings hadn't changed the initial tunings." ] }, { "metadata": { "id": "RnFoTan3w1Qu", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "model = models.Sequential()\n", "model.add(layers.Dense(128, activation='relu', input_shape=(148,)))\n", "model.add(layers.Dense(64, activation='relu'))\n", "model.add(layers.Dense(1, activation='sigmoid'))" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "lVh5gYwow1Qv", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "model.compile(optimizer='rmsprop',\n", " loss='binary_crossentropy',\n", " metrics=[matthews_correlation])" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "q5swSUFV6dZv", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Run the model" ] }, { "metadata": { "id": "5abHt3qEw1Qx", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "d6d32c75-9676-41f0-857e-8bc51752e92a" }, "cell_type": "code", "source": [ "history = model.fit(data_train,\n", " labels_train,\n", " epochs=85,\n", " class_weight = class_weights,\n", " batch_size=10000,\n", " verbose=0,\n", " validation_data=(data_test, labels_test))\n", "print('done')" ], "execution_count": 34, "outputs": [ { "output_type": "stream", "text": [ "done\n" ], "name": "stdout" } ] }, { "metadata": { "id": "aKp6JG6Gw1Qz", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Evaluate the model" ] }, { "metadata": { "id": "05ZiNFeT60kO", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Using the history object we can get see what the state of the model was at each training step" ] }, { "metadata": { "id": "f5lR0U0Ww1Qz", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "matt = history.history['matthews_correlation']\n", "val_matt = history.history['val_matthews_correlation']\n", "loss = history.history['loss']\n", "val_loss = history.history['val_loss']\n", "\n", "epochs = range(1, len(matt) + 1)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "Xvdp2ZNv7DLM", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**Graph the loss** \n", "This is the total difference (accross all rows in batch) between the target and the ground truth." ] }, { "metadata": { "id": "XwPG-BL1w1Q2", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "b34ac52b-ea79-42f8-8ba3-da69c20b7c15" }, "cell_type": "code", "source": [ "plt.plot(epochs, loss, 'bo', label='Training loss')\n", "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", "plt.title('Training and validation loss')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Loss')\n", "plt.legend()\n", "plt.show()" ], "execution_count": 36, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n4C2EEEIEmP8DtYbfsoRmlK4AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "UBk8sjiv8MeZ", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**Graph the accuracy** \n", "https://en.wikipedia.org/wiki/Matthews_correlation_coefficient \n", "Using matthews correlation coefficient, compares how many we predicted correctly compared to how many predicted incorrectly. \n", "A more useful measure than binary_crossentropy due to the weighted dataset we have." ] }, { "metadata": { "id": "4xZ112hYw1Q3", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "b351bfa4-b7ca-454e-ac78-ec641a34ef7e" }, "cell_type": "code", "source": [ "plt.plot(epochs, matt, 'bo', label='Training acc')\n", "plt.plot(epochs, val_matt, 'b', label='Validation acc')\n", "plt.title('Training and validation accuracy')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Acc')\n", "plt.legend()\n", "plt.show()" ], "execution_count": 37, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "6PkkMl0T9Y4M", "colab_type": "text" }, "cell_type": "markdown", "source": [ "The validation accuracy is all over the place so we plot a smoothed line to get a better idea of how the model is performing" ] }, { "metadata": { "id": "WJHz6hNPw1Q5", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "def smooth_curve(points, factor=0.9):\n", " smoothed_points = []\n", " for point in points:\n", " if smoothed_points:\n", " previous = smoothed_points[-1]\n", " smoothed_points.append(previous * factor + point * (1 - factor))\n", " else:\n", " smoothed_points.append(point)\n", " return smoothed_points" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "QYtwR4rJw1Q8", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "smooth_history = smooth_curve(val_matt, factor=0.9)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "q_69x5XHw1Q9", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "d930b736-bea8-4da5-e262-4dd27df2beac" }, "cell_type": "code", "source": [ "plt.plot(range(1, len(smooth_history) + 1), smooth_history)\n", "plt.title('Smooth validation acc by epoch')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Validation acc')\n", "plt.show()" ], "execution_count": 40, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nIiJiEf8Auz7LjaEoxG0AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "-sLdIzsO9msY", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Run a test on all of the data to get a final accuracy score" ] }, { "metadata": { "id": "3XSiIpCTw1RB", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "1cef84e0-e8f3-4d4c-8d74-174ee0a3f507" }, "cell_type": "code", "source": [ "test_loss, test_acc = model.evaluate(data, labels)" ], "execution_count": 41, "outputs": [ { "output_type": "stream", "text": [ "45718/45718 [==============================] - 4s 83us/step\n" ], "name": "stdout" } ] }, { "metadata": { "id": "Lt9ygcql9xGU", "colab_type": "text" }, "cell_type": "markdown", "source": [ "We can use the test accuracy to get a good idea of the current performance of the model. " ] }, { "metadata": { "id": "5_YWK_HUw1RF", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "15c562df-2a2d-4e3b-898c-3ea7f80635e7" }, "cell_type": "code", "source": [ "test_acc" ], "execution_count": 42, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.5748746381161005" ] }, "metadata": { "tags": [] }, "execution_count": 42 } ] }, { "metadata": { "id": "0OPlq4yi-FM-", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**Importand step** \n", "Go back to 'build the model' and change one of the hyperparams. Incrementaly improving the accuracy score. \n", "With MCC: \n", "A value of 0 is the score we could expect my returning random values. \n", "A negative score means we are performing worse than random. \n", "A 1 means we are prediction every value correctly. " ] }, { "metadata": { "id": "MCcyC-oMw1RI", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Submit our predictions" ] }, { "metadata": { "id": "8IxfDS2_w1RI", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Get the predictions out of the model using the test data set. This contains all of the columns apart from 'Criminal', we are supposed to use our model to fill in this field.\n", "(This code is messy and should be improved)" ] }, { "metadata": { "id": "V7k2lZpww1RI", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "new_predict = copy.deepcopy(df_test)\n", "vals = df_test.drop(['PERID'], axis = 1).values # drop the PERID" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "hs09G_cTw1RK", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Run the model on the test data\n", "predictions = model.predict(vals)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "0svngNQAw1RM", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "def split_val(v):\n", " if v > 0.5:\n", " return 1\n", " return 0" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "qCAnFhorERvg", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Apply the function to each row and create a new predictions column\n", "new_predict['predictions'] = [split_val(x) for x in predictions]" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "p6tfPza0w1RT", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "df_predict = new_predict[['PERID', 'predictions']]\n", "df_predict=df_predict.rename(columns = {'predictions':'Criminal'})" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "1EDYFqLbF-KS", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "outputId": "6980275e-c113-4484-d914-ed1d48d92d62" }, "cell_type": "code", "source": [ "df_predict.head() # The submitted file should have just PERID and Criminal columns" ], "execution_count": 79, "outputs": [ { "output_type": "execute_result", "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", "
PERIDCriminal
0665836790
1354946790
2794246790
3117446790
4315546790
\n", "
" ], "text/plain": [ " PERID Criminal\n", "0 66583679 0\n", "1 35494679 0\n", "2 79424679 0\n", "3 11744679 0\n", "4 31554679 0" ] }, "metadata": { "tags": [] }, "execution_count": 79 } ] }, { "metadata": { "id": "aY2UCOX5w1RW", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Export our predictions to csv\n", "df_predict.to_csv('predictions.csv', sep=',', index=False)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "ROS-yTXPw1RX", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "# Download the csv file\n", "files.download('predictions.csv')" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "dZ1WFluWCm18", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Afterthoughs" ] }, { "metadata": { "id": "VRmcAKBoCmGC", "colab_type": "text" }, "cell_type": "markdown", "source": [ "I thought it was an interesting problem. I went through all of the fields I could get definitions for and some where a bit hard to understand their meaning/significance.\n", "The unbalanced data set as always was a struggle. This was the first time I've use MCC for to handle the accuracy and I can see the reasoning behind it.\n", "\n", "I like Keras and once tuned gives a decent accuracy. I figured the top scores would be using something like xgboost as I've had decent success with it in the past on this sort of problem. When I ran some tests using xgboost on this data (using the same feature engineering) I could only get close but no better than the keras score. Even after a couple of hours tuning and using cross validation. \n", "\n", "I also tried a bit of a bit of ensembling, though only used 5 slightly different keras models so didn't get enough of a different set of predictions to make it work.\n", "\n", "I like the new google colab (colab.research.google.com). (Apart from the file upload was a bit of a faf). My laptop has an ATI gpu which is rubbish for ML, so being able to run it on a free machine with a supported GPU improved how fast I could iterate through the training immensely. Incidentally with xgboost not currently supporting GPU I got a better performance on my laptop with its greater number of CPU cores.\n", "\n", "I got a decent score in the competition (0.82038) though not good enough to get into the top tier. \n", "I still think xgboost is the way to get a better score, with some ensembling maybe from svm. \n", "\n", "I didn't spend much time looking at the spread of the values in each field, maybe getting a better representation of the data in batch could have helped.\n", "Finally the removal of MCC from keras' metrics. I understand why it was removed from the metrics - it doesn't work well on batches of data and needs a full evaluation to give an accurate value. I figured I could work around it by using huge batches, though this still is something that I don't feel was optimal." ] } ] }