Skip to content

Instantly share code, notes, and snippets.

@wcneill
Created May 1, 2020 16:48
Show Gist options
  • Save wcneill/572e8c83ffb4bf253706f2ae5112dce8 to your computer and use it in GitHub Desktop.
Save wcneill/572e8c83ffb4bf253706f2ae5112dce8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# regular expressions\n",
"import re \n",
"\n",
"# math and data utilities\n",
"import numpy as np\n",
"import pandas as pd\n",
"import scipy.stats as ss\n",
"import itertools\n",
"\n",
"# data and statistics libraries\n",
"import sklearn.preprocessing as pre\n",
"from sklearn import model_selection\n",
"from sklearn import metrics\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.svm import SVC\n",
"\n",
"# visualization libraries\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl\n",
"import seaborn as sns\n",
"\n",
"# Set-up default visualization parameters\n",
"mpl.rcParams['figure.figsize'] = [10,6]\n",
"viz_dict = {\n",
" 'axes.titlesize':18,\n",
" 'axes.labelsize':16,\n",
"}\n",
"sns.set_context(\"notebook\", rc=viz_dict)\n",
"sns.set_style(\"whitegrid\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Initial Setup\n",
"We can download the data from Kaggle to our data folder using the command line:\n",
"\n",
"`kaggle competitions download -c titanic`\n",
"\n",
"`unzip titanic.zip`\n",
"\n",
"After that, let's get the data into some Pandas dataframes:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"train_df = pd.read_csv('data/train.csv', index_col='PassengerId')\n",
"test_df = pd.read_csv('data/test.csv', index_col='PassengerId')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploratory Data Analysis:\n",
"\n",
"Our next step will be to ask and answer the following questions:\n",
"\n",
"1. _Are we missing any data?_ \n",
"2. _What form does our data take?_\n",
"3. _What additional information can we garner from what we already have?_\n",
"4. _What relationships can we find between our variables, especially between the input and output variables?_ \n",
"5. _How can we use the answers to the first two question to add value to our data and the models that will use it?_\n",
"\n",
"\n",
"## Question 1: What Are We Missing?\n",
"Let's take a look at the number of entries in our training data, as well as those variables contain significant missing data. Below, we see that the training data contains 891 passenger samples, with 11 total variables describing each passenger. We see that there is a significant amount of missing data for the variables __Age__ and __Cabin__. We will have to deal with this missing data by either finding an intelligent way to fill the gaps, or perhaps dropping the features entirely. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 891 entries, 1 to 891\n",
"Data columns (total 11 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Survived 891 non-null int64 \n",
" 1 Pclass 891 non-null int64 \n",
" 2 Name 891 non-null object \n",
" 3 Sex 891 non-null object \n",
" 4 Age 714 non-null float64\n",
" 5 SibSp 891 non-null int64 \n",
" 6 Parch 891 non-null int64 \n",
" 7 Ticket 891 non-null object \n",
" 8 Fare 891 non-null float64\n",
" 9 Cabin 204 non-null object \n",
" 10 Embarked 889 non-null object \n",
"dtypes: float64(2), int64(4), object(5)\n",
"memory usage: 83.5+ KB\n"
]
}
],
"source": [
"# Question 1: Are we missing any data?\n",
"train_df.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Question 2: What is the form of our data?\n",
"Taking a look at our `.info()` print out as well as the first few entries of our data frame below, we see that our data comes primarily in the form of categorical data, with the exception of __Age__ and __Fare__. These categories are described by Python strings, which is why the data type above is listed as 'object'. This is how Pandas deals with unidentified data types. We will later tell Pandas that these variables are strings. "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>A/5 21171</td>\n",
" <td>7.2500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
" <td>female</td>\n",
" <td>38.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>PC 17599</td>\n",
" <td>71.2833</td>\n",
" <td>C85</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Heikkinen, Miss. Laina</td>\n",
" <td>female</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>STON/O2. 3101282</td>\n",
" <td>7.9250</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
" <td>female</td>\n",
" <td>35.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>113803</td>\n",
" <td>53.1000</td>\n",
" <td>C123</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Allen, Mr. William Henry</td>\n",
" <td>male</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>373450</td>\n",
" <td>8.0500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Survived Pclass \\\n",
"PassengerId \n",
"1 0 3 \n",
"2 1 1 \n",
"3 1 3 \n",
"4 1 1 \n",
"5 0 3 \n",
"\n",
" Name Sex Age \\\n",
"PassengerId \n",
"1 Braund, Mr. Owen Harris male 22.0 \n",
"2 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 \n",
"3 Heikkinen, Miss. Laina female 26.0 \n",
"4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 \n",
"5 Allen, Mr. William Henry male 35.0 \n",
"\n",
" SibSp Parch Ticket Fare Cabin Embarked \n",
"PassengerId \n",
"1 1 0 A/5 21171 7.2500 NaN S \n",
"2 1 0 PC 17599 71.2833 C85 C \n",
"3 0 0 STON/O2. 3101282 7.9250 NaN S \n",
"4 1 0 113803 53.1000 C123 S \n",
"5 0 0 373450 8.0500 NaN S "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Look at the first few entries\n",
"train_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Question 3: What additional information can we garner from what we already have?\n",
"\n",
"### Passenger Title\n",
" \n",
"A quick glance at the __Name__ variable shows us that each name comes with a title. A title is useful in telling us things like social status, marriage status career, and even rank within a specific career. Therefore, it may be useful to have this information on hand. Let's parse it out:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Mr 517\n",
"Miss 182\n",
"Mrs 125\n",
"Master 40\n",
"Dr 7\n",
"Rev 6\n",
"Col 2\n",
"Mlle 2\n",
"Major 2\n",
"Don 1\n",
"Capt 1\n",
"Sir 1\n",
"Jonkheer 1\n",
"Countess 1\n",
"Mme 1\n",
"Ms 1\n",
"Lady 1\n",
"Name: Title, dtype: int64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df['Title'] = train_df['Name'].str.extract(r'([A-Za-z]+)\\.')\n",
"train_df.Title.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we might notice that many of these titles are synonymous. For example, _Mme_ is the French equivalent to 'Mrs' and _Mlle_ is the equivalent to 'Miss'. Other titles imply varying levels of nobility like 'Sir', 'Countess' and 'Don'. Some titles infer a profession. Let's reduce our titles to their common denominators:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"title_dict = {\n",
" 'Mrs': 'Mrs', 'Lady': 'Lady', 'Countess': 'Lady',\n",
" 'Jonkheer': 'Lord', 'Col': 'Officer', 'Rev': 'Rev',\n",
" 'Miss': 'Miss', 'Mlle': 'Miss', 'Mme': 'Mrs', 'Ms': 'Miss', 'Dona': 'Lady',\n",
" 'Mr': 'Mr', 'Dr': 'Dr', 'Major': 'Officer', 'Capt': 'Officer', 'Sir': 'Lord', 'Don': 'Lord', 'Master': 'Master'\n",
"}\n",
"\n",
"train_df.Title = train_df.Title.map(title_dict)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Histogram of Categorical Data: Title')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmsAAAGPCAYAAAADcZftAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nO3de3zO9eP/8edlJ4ucspGFSm1hGHLW5pBzI0MWtnRCCR80h/hIZzmGRTr6SKlhopkph3yqOWSKFiJsNdVsxYcZO13v3x9+u75dtrGxXdcbj/vt5nZzvQ/X+/m6rmv29H6/r/fbYhiGIQAAAJhSOWcHAAAAQNEoawAAACZGWQMAADAxyhoAAICJUdYAAABMjLIGAABgYpQ13LAWLlwoPz8/7dy5s9D5KSkp8vPz06RJk2zTJk2aJD8/vxJvy2q1KiUl5YqzXs8OHDigkJAQNWrUSJ06ddLlria0Z88ejRs3Tp06dZK/v7/uu+8+TZw4UUlJSVeV47fffruq9cvaxZ9FRz93WFiY/Pz87P40btxYnTt31vPPP68//vjjqjKU5et/ce6i/uzcuVNhYWHq1KmT3foZGRn6+++/bY+v9N8B4Eq5OjsAcC0ZOHCg2rRpU6J1MjIyNHToUAUFBWnUqFFllOzaNWXKFB07dkzjxo1T9erVZbFYilx2wYIFWrRokerVq6eQkBB5eXnp6NGjWrlypb788kstW7ZM/v7+Jc7w+OOPy8vLSzNmzLiaoZSpmTNnqk6dOs6OoZkzZ9r+npmZqcOHD2v16tXasGGDVqxYoXr16pX4OVevXq0XXnhB+/btK82oNv/MLElvvfWWjh49WmB6vXr1NGLECJ07d842LTExUU899ZRmz56tVq1alUk+4HIoa0AJNG3aVE2bNi3ROqdOndKPP/6ooKCgMkp1bTt06JA6duyoRx999JLLrV69Wm+++aYGDhyo6dOnq1y5/zswMHDgQIWGhmrEiBHavHmzPDw8SpThm2++Ud++fa8ov6P06dPH2REkFZ5jwIABCg0N1ZgxY7Ru3Tq796Y4vvvuO2VlZZVWxAIuzrxq1SodPXq00LFUr17d7vGhQ4d04sSJMssGFAeHQQE4VU5OjipUqHDZZWbOnKm6devq+eefL1AG7rzzTj3xxBNKS0vT5s2byzIuClG/fn0NHz5chw8f1tatW50dB7juUNaAErj4XBXDMBQZGalu3bqpUaNGatu2rSIiImzn7+zcuVOdO3eWJEVGRsrPz8927tq5c+c0Z84c27lXnTp10uzZs+0OwUgXDqO+8MILat++vQICAjRixAglJCTIz89P0dHRtu34+flpzZo1Cg4OVqNGjTR58mRJUlpaml588UV17txZ/v7+at68ucLDw5WQkGDbRv768fHxmjJlilq0aKHmzZtr8uTJyszM1LZt29SnTx81adJEffr00fbt2y/7Wl1ufNHR0bbXcs2aNXbjuVh8fLxOnTql/v37y8XFpdBlBg0apK+++ko9e/a0TUtOTtbEiRMVGBgof39/tWzZUiNGjNDhw4cl/d95if/MkH8Oo9Vq1fvvv6/u3bvbzo17+eWXlZGRYbfdnJwcvfHGG+rQoYOaNGmiIUOG6ODBg2rQoIEWLlxot+zKlSvVp08fNWrUSK1bt9b48ePtzmXMz7N06VI9/PDD8vf319ChQyUVfl7Ztm3bNGTIEDVt2lTt2rXT2LFj7Z4vJydHS5YsUe/evRUQEKDGjRurd+/eWrVqVaGv4dUIDg6WJH399dcl2n5YWJjWrFlTYIyGYWjFihXq37+/mjZtqkaNGql79+56++237c5rzP8cFfXZKal/nrO2cOFC289ReHh4gXPZ/unPP//UhAkT1Lp1azVq1EgPPvig1q1bVyqZAA6D4oZ35swZu5OH850+ffqy67711lt68803NXjwYFsRW7ZsmRITExUTE6N69epp8uTJeu2119SlSxd16dJF1apVU3Z2th599FH98MMPCgkJkb+/v/bt26d33nlHCQkJWrZsmdzc3JSXl6cnnnhC+/bt06BBg1S3bl2tX79eTz/9dKF5XnzxRfXp00cDBgxQrVq1dP78eQ0ePFhnzpzR4MGDVaNGDSUlJWnFihUaNmyYtm3bpooVK9rWnzRpku666y6NHz9eu3btUnR0tP7880/t379fYWFhuvnmm/X2229rzJgx2rRpkypVqlRojuKMr0WLFpo5c6YmTJige++9Vw899JCaNWtW6PMlJiZKkpo0aVLke1GxYkW7saSnp+uhhx5SxYoVNWTIEFWtWlUHDhxQVFSUjhw5oo0bN6patWoFMuSfczVlyhR99tln6tu3r4YOHaojR45oxYoV2rNnj1asWGE71Prss88qLi5Offv2VaNGjbR161aFh4fLarXa5Xv99df1/vvvq02bNpowYYJOnDih5cuXKz4+XitXrtRtt91mW3b+/PkKCgpScHBwkYd0169fr/Hjx+vuu+/WqFGjlJOTo/fff18//vijoqOjValSJU2ePFkbNmzQww8/rLCwMJ08eVJRUVGaMmWK6tSpo5YtWxb5epZU7dq15enpqYMHD9qmFWf7I0aMkNVq1e7du+3Oy3vjjTf01ltvqW/fvnrooYd09uxZffbZZ5ozZ468vLxsh63zP0dFfXauRpcuXZSWlqZPP/1UI0aMUKNGjQpdLjU1VQMGDJBhGAoLC1PlypW1efNmRURE6MSJE3riiSdKPRtuMAZwg1qwYIHh6+t72T8TJ060rTNx4kTD19fX9rhHjx7GsGHD7J53xYoVRu/evY3k5GTDMAzjt99+M3x9fY0FCxbYlvn4448NX19f44MPPrBb95133jF8fX2Njz76yDAMw1izZo3h6+trREVF2ZbJzs42+vfvb/j6+hqrV682DMMwduzYYfj6+hpDhgyxe77169cbvr6+xn//+98CGX19fY2NGzfard+vXz8jLy/PMAzDyMvLM9q1a2f4+voa27Zts60bFRVl+Pr6Gt98802Rr21xx2cYRoHXuDDTp083fH19jSNHjlxyuX9asmSJ4evra/zyyy9202fPnm34+voaiYmJRWbIfz1WrFhht+7XX39t+Pr6GkuXLjUMwzC+++47w9fX15g7d65tGavVaowcOdLuPf/ll18MPz8/Y+TIkYbVarUt+8MPPxh+fn7GmDFjDMP4v89Kly5djOzsbLtt/zNj/nsTHBxsnDt3zrbMt99+a/j6+hrLly83Tpw4Yfj5+RmzZ8+2e54jR44Yvr6+xksvvVTk+AszZMgQu89+Ye677z6jW7duhmEYJdr+xT9X2dnZRrNmzYyxY8farXvmzBnD39/fGD58+CVzXM6lxjJkyBCjY8eOtserV682fH19jR07dhSZd+LEiUbLli2N1NRUu+caN26c4e/vb6Snp19VXoA9a7jhTZw4Uffcc0+B6enp6YqIiLjkujVr1tTOnTv1n//8R7169VL16tUVGhqq0NDQS663ZcsWVaxYUYMHD7abHh4ersWLF2vz5s0aNGiQNm3apMqVKyskJMS2jJubmx599FGNHTu2wPO2b9/e7nHPnj3VunVr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Uvv27RUUFKTOnTvr/fffV0pKitq2bavjx4/ro48+Uq1atfT4449Lktq1a6eOHTtqzpw5OnbsmBo1aqT4+Hjbtcby35+7775bYWFh+vDDD/Xoo4/q/vvvV1pamj788ENVqlRJ48ePL9Fr4e7urkmTJmnixIl6+OGH1bt3b509e1bLli1TvXr1NGDAAKWkpMjV1VUTJkzQ4MGD5erqqq1bt+qbb76Rm5vbFb/3a9eutf09MzNTP//8s9auXStPT0/NmjXLNua2bdsWe/v5hXrBggVq1aqVmjZtqooVK+q1117T77//rkqVKmnnzp2KjY2Vh4eH3bq//fab9uzZo2bNmpXJHrf8bCtWrFB6errtenL/9Oyzz2rnzp0aPHiwBg8erFq1aumrr77S1q1bNXDgQN19992lngs3FsoacBVGjx6tKlWqaPXq1Xr99dfl4uKiZs2aadasWbbz1Tw9PTV27Fi99957evnll1WnTh21atVKS5cu1ZtvvqkNGzZo3bp1qlmzpoYPH66nnnrKdujQzc1N7777rmbNmqV169YpKytL7dq10/Tp0zVp0qQiz13LFxoaqtOnT2vlypV6+eWXVb16dQUEBCgyMlKhoaHasWOH7aKrpcnd3b1Y4yuJcuXK6aWXXlJgYKBWrFih5cuX6+TJk6pWrZr69OmjESNG2P2yHjVqlPLy8hQbG6utW7fK29tbbdu21WOPPaZevXppx44d6tKli6QLv2znzJmjl156SS+99JIefPBBzZ8/X++++64+++wzbd26VdWqVVPXrl01ZswYuy9izJs3T/PmzdP69esVExOjpk2bau7cuXr66aft3p8pU6bojjvu0CeffKIZM2aocuXK6tKli0aPHi0fH58Svx59+vRRxYoVtWTJEs2ZM0eVKlVSx44dNX78eN10003y9fXVggULFBkZqblz56pChQq6++679cEHH+jjjz/Wrl27ijzn7lImTJhg+3vlypVVs2ZN9evXT08++aRq1Khhm1eS7T/88MPasWOH3n33Xf34449677339Pbbb2v27NlatGiR3N3ddccdd2ju3Lnat2+fli1bpvT0dFWvXl3fffed7VqGZVHW2rRpox49emjr1q3asWOHunbtWmCZOnXqKCoqSgsWLFBUVJQyMzNVu3ZtTZ48WWFhYaWeCTcei2Gmr9UAsHPq1ClVqFChwC/U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gQJXmO+++049evSQu7u73N3dtXbtWp09e1aJiYmaPHmybbnMzEzbnuRr6XaQLVq0UJUqVfTRRx/p6NGjSkpKUmZmpnbt2qWgoCDbDdW7d+8uq9WqChUqKCgoSF9++aVq166t2rVrq0aNGg7LyxcMSkH+oaSEhATt2LHDdggp36VuznotKu54mzdvrvXr16t9+/aKjY3ViBEjnBH3ql1uvJI0dOhQffjhh6pTp45mzZqlxYsX6/bbb9eGDRsUHBys3bt3q3///rJarU4YwaUVNb4//vhDAwcO1JkzZxQYGKi+ffvKMAy5urpq5cqVGjNmjE6dOqXQ0FAdO3bM7jnz8vIUERGhtWvXau3atfr000/Vv39/SdfWz0Nh71dubq4k+3FYLBa7va2urtfu/4PLlSunCRMmKDU1Ve+9957y8vL0yCOP2N7LlStX2n6We/furdjYWMXGxl6TexOLIzs7W8eOHdNff/11TX12mzRposTEROXk5NhN/+GHH2x7uS/F1dXVrtSlpKTIarXaits/Pw9VqlSRdG39bG/evFnPPvusypcvr5CQELVo0UKGYVzyZ7lfv36KiYnR559/bvvPi6NQ1kpJjx49NGfOHPn7+1/T/1AXV3HGO3PmTK1bt059+/bVtGnTtH//fgenLD2XG++AAQN09uxZDR06VEOHDtX+/fu1fPlyLVy4UD169NDzzz+vv//+WxkZGU5If3mFje+mm25S3bp1NXToUDVq1EibNm1SXl6e9u/fryFDhqhFixaaOHGi6tWrp2PHjsnFxcVWZFq3bq2oqCjl5OTo7NmzGjRokH744QdnDvGKtG7dWuvXr9f58+eVm5ur1atX287t+6c2bdro888/l9Vq1fHjx7Vnzx4npC09rq6umjBhghYtWqQGDRrY9qrk5ubaHfYKDg5WbGyskpOT1bx5cyenLn1Wq1ULFy5UkyZNVKdOHWfHKZF7771Xd911l1599VVbYUtMTNTixYv19NNPX3b9Fi1a6IsvvlBOTo7OnTunJ554Qunp6br99tttX8D49ttvNXjw4DIdR1nZvn27evTooX79+qlSpUrauXOn8vLy1KZNG23dulVnzpxRVlaWvvzyS9s69957r/7880/t3LlT999/v0PzXv+twkE6duyoKVOmaMyYMc6O4hDFGW9YWJjGjx+v6Ohoubi4mP6E3Eu53HjHjRunSZMmydXVVTfddJNefvllVa9eXePGjVNwcLBcXFwUERGhSpUqOTh58RQ2Pjc3N1mtVvXs2VOGYahFixY6fPiwGjRooICAAD3wwAPy9PRUs2bNFBgYqN9++02RkZGaPXu2xowZo+TkZPXt21e5ubkKCQlRq1atTH85i927d9sdwgwODlaHDh3Ur18/5ebmqn379hoyZIj+/PNPu/UGDRqkw4cPq0ePHvLx8ZGvr6+jo5e6wMBANW3aVLt371bXrl310EMPKS8vT/fdd5/69u0rSbr11ltVtWpVNW3atFiH1q4F+efuSRfKWv369TV37lwdPHjQyclKLjIyUvPmzdMDDzwgFxcXVa5cWbNmzVKrVq20a9euS67bpUsXJSYmKiQkRFarVeHh4brjjjs0a9YsTZ8+Xe+++67c3Nw0b968a+K9v/hnu3Hjxtq5c6fWr18vNzc3NWvWTCkpKRowYIAeeeQR9e/fX5UqVVKtWrXsnqdLly46deqUww/5W4yLz5QGAACAjWEYysnJ0aOPPqrnnntODRs2dOj2OQwKAABwCWlpaWrXrp2aNGni8KImsWcNAADA1NizBgAAYGKUNQAAABOjrAFACXDmCABH49IdAG5IkyZN0po1ay65TMuWLXXTTTdpyZIlki5cCqFq1aq2a0uFhYXZzQeAskBZA3BDevrpp233R5SkiRMnqm7dunYXDM3JydEtt9xie7xw4UJNmDDBoTkBgLIG4IZUp04du6vSly9fXtWqVVNAQIATUwFAQZyzBgBFCAsL0/DhwyVJfn5+ki7cRq1Tp06FLp+bm6v58+erQ4cOatSokUJCQrR9+3aH5QVwfaKsAUAxfPrpp5IuFLjIyMhCl/n3v/+tDz74QOHh4XrzzTd155136sknn7zm7xUKwLk4DAoAxZB/ePTWW29VgwYNCsw/cuSIoqOj9fLLL2vAgAGSLtxfMy0tTW+88YaWLVvm0LwArh/sWQOAUpB/Y+zAwEDl5uba/gQFBWnPnj3Kzs52ckIA1yr2rAFAKTh16pSkC2WtMCdPnlSNGjUcGQnAdYKyBgCl4Oabb5bFYtGKFSvk6lrwn9aqVas6IRWA6wGHQQGgmMqVK/qfzObNm8swDJ09e1aNGjWy/dm+fbuWLl1aaIEDgOKgrAFAMVWqVEkJCQnau3dvgXn169dXt27dFBERoY8++kg7duzQggULNG/ePNWqVeuSRQ8ALoX/6gFAMT3zzDN64403tHv3bsXHxxeYP3v2bM2fP19vv/22/vrrL/n4+Gj8+PF6/PHHnZAWwPXCYnBXYgAAANNivzwAAICJUdYAAABMjLIGAABgYpQ1AAAAE6OsAQAAmBhlDQAAwMQoawAAACZGWQMAADAxyhoAAICJ/T8Tuhu0VjQv+QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.countplot(train_df.Title).set_title(\"Histogram of Categorical Data: Title\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>A/5 21171</td>\n",
" <td>7.25</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Mr</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Survived Pclass Name Sex Age SibSp \\\n",
"PassengerId \n",
"1 0 3 Braund, Mr. Owen Harris male 22.0 1 \n",
"\n",
" Parch Ticket Fare Cabin Embarked Title \n",
"PassengerId \n",
"1 0 A/5 21171 7.25 NaN S Mr "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By again looking at our data set, we might notice the variables __SibSp__ and __Parch__. The first is the number of siblings and/or spouses that a passenger traveled with. The second is the number of parents and/or children a passenger traveled with. Combining these two variables we can get total family size. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"train_df['FamilySize'] = 1 + train_df.SibSp + train_df.Parch"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x22a8c07c5b0>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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Xn/9dcXExKi0tFRBQUGe210ul0pKSuocDwoKUklJSUPnAgAANAkNjrVXXnlFt99+u55//nm1bdv2op508uTJevjhhzVhwgQVFxfL4XB4brMsSw6HQ7W1tfUePx+FhYV1joWHh1/4cMPk5+fbPQEAAHhZg2OttLT0okNt9+7dqqys1I033qiWLVsqOjpa2dnZ8vPz89ynrKxMLpdLwcHBKisr8xw/ePCgXC7XeT1fz5495XQ6L3iv6ZpSeAIA0Fy53e56TzCd1uAfihsaGqodO3Zc1Jh9+/YpJSVFlZWVqqys1KeffqoxY8Zoz5492rt3r2pqapSVlaXIyEiFhITI6XR6zh6tXbtWkZGRF/X8AAAAl5oGn1mbMmWKnnzySdXU1Kh3795q2bJlnfuEhob+5mNERUWpoKBA8fHx8vPzU3R0tGJjY9WxY0dNmjRJbrdbUVFRiomJkSSlp6crJSVF5eXlCg0NVVJS0nm+PAAAgEubw7IsqyF37NGjx///ol+9d+z0+8mKiooad90FOn068WyXQcOnLrNhVePKf5FwBQCgKThXtzT4zNo//vGP836DPwAAAC5Og2Nt4MCB3twBAACAejQ41p555plz3mfu3LkXNQYAAABnanCs1fd+tJMnT2rfvn1q3769BgwY0KjDAAAAcB6x9t5779V7vKSkRBMmTNCgQYMabRQAAABOafDPWTubK6+8UhMnTtQrr7zSGHsAAADwCxcda5JUW1urgwcPNsZDAQAA4BcafBn0448/rnOstrZWpaWlev311xUWFtaowwAAAHAesTZ58uSz3tanTx/NmjWrMfYAAADgFxoca59++mmdYw6HQ23atFG7du0adRQAAABOaXCshYSESDr10VK7d+9WeXm5OnToQKgBAAB4UYNjTZLeeecdZWRk6PDhw55jnTp10qOPPqoxY8Y0+jgAAIDmrsGxlpWVpZSUFMXGxmrEiBG64oorVFZWpnXr1mn27Nlq27atYmNjvbkVAACg2WlwrL3yyisaM2ZMnW8kGDp0qNq3b69XX32VWAMAAGhkDf45a3v37lV0dHS9tw0dOlTfffddo40CAADAKQ2Otd/97nfauXNnvbd9++236tChQ6ONAgAAwCkNvgyakJCghQsXqnXr1ho2bJjatWunY8eOKTs7W4sXL9Z9993nzZ0AAADNUoNjbezYsdqxY4ee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+cX/QwRgPGINgLEsy1J1dXWdX5L0448/KikpSa1atdLChQv10ksv6eqrr9bMmTO1Y8cOz2OcOHFCs2bN0rhx45SRkaGffvrJ8/snnnhC06ZNU15enhYuXHjOPfHx8Tp69Kg2bNjgOVZWVqavvvpKd955pyQpMjJSGzZs0IQJE/Thhx+qrKxM0qlLtxMmTFCPHj3qPG5oaKhWrlx5xq8hQ4aoVatWiomJkSStWbNGU6ZMUf/+/bV06VLFx8dr7ty5evXVVy/8HzCASwKXQQEYKzc3t94PDt+4caN27dqlsLAwpaene97D1qdPHw0cOCsJi9YAAASBSURBVFBbtmzxRFFVVZWefPJJjRgxQpK0bds2/e1vf9OKFSvUv39/SdKWLVu0bdu2c+7p0aOHevTooaysLN16662SpA8//FBt27ZVZGSkJCk5OVlHjhzRe++9p88++0ySdM0112jYsGF68MEH1b59+zqP26ZNmzMuva5fv16ff/65XnzxRXXv3l21tbX661//qri4OKWmpko69RmODodDL7/8shITE5vVh40DzQ2xBsBY4eHheuaZZ+ocb9eunaKiohQVFSW3260dO3aouLhYX3/9tSTVuUzZq1cvz+87deokSerZs6fnWIcOHXT8+PEGbYqPj9fChQt18uRJtWrVSu+//75GjBihwMBASafe8zZ37lw99thjysnJUV5enjZv3qylS5fq3Xff1T//+U916dLlrI+/c+dOTZs2TYmJiYqLi5Mk7dmzR6WlpRo8eLDnzKJ06izeokWLVFBQoJtvvrlB+wFceog1AMZq27btGaH1SzU1NUpLS9PKlStVVVWl3//+9+rXr58k1XnPWOvWret8fcuWLS9oU1xcnNLT05WTk6PQ0FBt377dc7brl4KDg5WYmKjExERVV1dr7dq1mjlzppYsWaJ58+bV+9hHjx7VxIkT1b17d02bNs1z/MiRI5KkKVOmaMqUKXW+7vSlVgBNE7EG4JK0dOlSZWZmat68eYqKilKrVq30888/65133vHq815xxRUaNGiQ1q9fr3379qlr166eS5hbt27VI488oqVLl6pPnz6er/H399eoUaOUk5Oj3bt31/u4tbW1euKJJ3T8+HEtW7bMc6ZOOhWtkpSamqrevXvX+dqrrrqqMV8iAMPwDQYALklbt25Vz549NXz4cM/7tb744gtJdc+sNbb4+Hht2LBBH3/8secbCySpW7duOnHihJYtW1bna2pqavTDDz+oe/fu9T7mggULlJeXpwULFqhz585n3HbNNdeoQ4cOKikpUa9evTy/jhw5ooULF57xw3YBND2cWQNwSerVq5f+/ve/a8WKFbr++uv19ddf66WXXpLD4VBFRYVXn/u2227TzJkztX379jO+i7RDhw5KTk7W3LlzdeTIEd11110KDg5WaWmp3n77bZWUlGjJkiV1Hi87O1uvvvqq7r77bnXo0EFbt2713NamTRtdd911mjRpktLS0iSd+rlt+/bt04IFC9StWzfOrAFNHLEG4JI0btw4lZWVacmSJXK73erWrZueffZZZWVl6X//+59Xn9vpdGrAgAE6fPhwnW8WeOCBB9S1a1etWLFCc+bM0fHjx3X55Zd7flBufd9c8Pnnn0uS58d2/NKAAQO0fPlyz6chvPnmm3r99dfVoUMHxcTEKDk5WQ6Hw2uvFYD9HJa3rxcAQBPjdrsVGRmpJ598Un/84x/tngOgiePMGgA00NGjR7V8+XJt2rRJfn5+5/0B7wBwIYg1AGggp9Opt956S06nU+np6Rf84z8A4HxwGRQAAMBg/OgOAAAAgxFrAAAABiPWAAAADEasAQAAGIxYAwAAMBixBgAAYLD/B4tzImRlDnkHAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.countplot(train_df.FamilySize)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It appears that the Titanic's voyage was not necessarily a couple's or family affair. The majority of passengers traveled alone, and perhaps that is valuable information. Let's add the category __Alone__."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x22a8be929d0>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"train_df['Alone'] = train_df.FamilySize.apply(lambda x: 1 if x==1 else 0)\n",
"plt.figure(figsize=(8,5))\n",
"sns.countplot(train_df.Alone)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Last Name\n",
"\n",
"A last name is a group identity. While we know that many passengers traveled alone, there were still a significant number of families onboard the Titanic. Perhaps survival among specific families was more common than others. This is all speculation, but perhaps worth a look."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"train_df['LName'] = train_df.Name.str.extract(r'([A-Za-z]+),')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Name Length\n",
"\n",
"This one has a very simple explanation: While reviewing notebooks on Kaggle, I saw that one competitor found that the length of a person's name added to the performance of the model. So, why not try it out?"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" <th>FamilySize</th>\n",
" <th>Alone</th>\n",
" <th>LName</th>\n",
" <th>NameLength</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>A/5 21171</td>\n",
" <td>7.2500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Mr</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>Braund</td>\n",
" <td>23</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
" <td>female</td>\n",
" <td>38.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>PC 17599</td>\n",
" <td>71.2833</td>\n",
" <td>C85</td>\n",
" <td>C</td>\n",
" <td>Mrs</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>Cumings</td>\n",
" <td>51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Heikkinen, Miss. Laina</td>\n",
" <td>female</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>STON/O2. 3101282</td>\n",
" <td>7.9250</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Miss</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Heikkinen</td>\n",
" <td>22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
" <td>female</td>\n",
" <td>35.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>113803</td>\n",
" <td>53.1000</td>\n",
" <td>C123</td>\n",
" <td>S</td>\n",
" <td>Mrs</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>Futrelle</td>\n",
" <td>44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Allen, Mr. William Henry</td>\n",
" <td>male</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>373450</td>\n",
" <td>8.0500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Mr</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Allen</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>887</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>Montvila, Rev. Juozas</td>\n",
" <td>male</td>\n",
" <td>27.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>211536</td>\n",
" <td>13.0000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Rev</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Montvila</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>888</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Graham, Miss. Margaret Edith</td>\n",
" <td>female</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>112053</td>\n",
" <td>30.0000</td>\n",
" <td>B42</td>\n",
" <td>S</td>\n",
" <td>Miss</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Graham</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>889</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Johnston, Miss. Catherine Helen \"Carrie\"</td>\n",
" <td>female</td>\n",
" <td>NaN</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>W./C. 6607</td>\n",
" <td>23.4500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Miss</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>Johnston</td>\n",
" <td>40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>890</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Behr, Mr. Karl Howell</td>\n",
" <td>male</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>111369</td>\n",
" <td>30.0000</td>\n",
" <td>C148</td>\n",
" <td>C</td>\n",
" <td>Mr</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Behr</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>891</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Dooley, Mr. Patrick</td>\n",
" <td>male</td>\n",
" <td>32.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>370376</td>\n",
" <td>7.7500</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" <td>Mr</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Dooley</td>\n",
" <td>19</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>891 rows × 16 columns</p>\n",
"</div>"
],
"text/plain": [
" Survived Pclass \\\n",
"PassengerId \n",
"1 0 3 \n",
"2 1 1 \n",
"3 1 3 \n",
"4 1 1 \n",
"5 0 3 \n",
"... ... ... \n",
"887 0 2 \n",
"888 1 1 \n",
"889 0 3 \n",
"890 1 1 \n",
"891 0 3 \n",
"\n",
" Name Sex Age \\\n",
"PassengerId \n",
"1 Braund, Mr. Owen Harris male 22.0 \n",
"2 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 \n",
"3 Heikkinen, Miss. Laina female 26.0 \n",
"4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 \n",
"5 Allen, Mr. William Henry male 35.0 \n",
"... ... ... ... \n",
"887 Montvila, Rev. Juozas male 27.0 \n",
"888 Graham, Miss. Margaret Edith female 19.0 \n",
"889 Johnston, Miss. Catherine Helen \"Carrie\" female NaN \n",
"890 Behr, Mr. Karl Howell male 26.0 \n",
"891 Dooley, Mr. Patrick male 32.0 \n",
"\n",
" SibSp Parch Ticket Fare Cabin Embarked Title \\\n",
"PassengerId \n",
"1 1 0 A/5 21171 7.2500 NaN S Mr \n",
"2 1 0 PC 17599 71.2833 C85 C Mrs \n",
"3 0 0 STON/O2. 3101282 7.9250 NaN S Miss \n",
"4 1 0 113803 53.1000 C123 S Mrs \n",
"5 0 0 373450 8.0500 NaN S Mr \n",
"... ... ... ... ... ... ... ... \n",
"887 0 0 211536 13.0000 NaN S Rev \n",
"888 0 0 112053 30.0000 B42 S Miss \n",
"889 1 2 W./C. 6607 23.4500 NaN S Miss \n",
"890 0 0 111369 30.0000 C148 C Mr \n",
"891 0 0 370376 7.7500 NaN Q Mr \n",
"\n",
" FamilySize Alone LName NameLength \n",
"PassengerId \n",
"1 2 0 Braund 23 \n",
"2 2 0 Cumings 51 \n",
"3 1 1 Heikkinen 22 \n",
"4 2 0 Futrelle 44 \n",
"5 1 1 Allen 24 \n",
"... ... ... ... ... \n",
"887 1 1 Montvila 21 \n",
"888 1 1 Graham 28 \n",
"889 4 0 Johnston 40 \n",
"890 1 1 Behr 21 \n",
"891 1 1 Dooley 19 \n",
"\n",
"[891 rows x 16 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df['NameLength'] = train_df.Name.apply(len)\n",
"train_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Question 4: What statistical relationships does our data contain?\n",
"\n",
"We now have a more robust data set that includes (possibly) valuable new insights into our passengers lives. But how helpful is this data, really? One way to find out is to look at the statistical relationships between our variables, especially between each input variable and our single output variable __Survived__. \n",
"\n",
"Correlation is a common go-to tool we would use to determine such relationships. However, it is important to note that we have mostly categorical data in our data set, and that throws a small wrench in our gears. \n",
"\n",
"First, our categorical data needs to be encoded into numeric format before we can do calculations of any kind. \n",
"\n",
"Next, we need to consider the types categorical we are studying:\n",
"\n",
"- __Ordinal__ variables imply an underlying rank, or order. The classifications mild, moderate, severe would be an example. A common method of calculating the correlation between ordinal variables is called _Kendall's Tau ($\\tau$)_. \n",
"- __Nominal__ variables have no such rank or order. Examples might be male or female, cat or dog. In this case we will use _Cramer's V_ to determine association."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" <th>FamilySize</th>\n",
" <th>Alone</th>\n",
" <th>LName</th>\n",
" <th>NameLength</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>A/5 21171</td>\n",
" <td>7.25</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" <td>Mr</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>Braund</td>\n",
" <td>23</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Survived Pclass Name Sex Age SibSp \\\n",
"PassengerId \n",
"1 0 3 Braund, Mr. Owen Harris male 22.0 1 \n",
"\n",
" Parch Ticket Fare Cabin Embarked Title FamilySize Alone \\\n",
"PassengerId \n",
"1 0 A/5 21171 7.25 NaN S Mr 2 0 \n",
"\n",
" LName NameLength \n",
"PassengerId \n",
"1 Braund 23 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df.head(1)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# nominal variables (use Cramer's V)\n",
"nom_vars = ['Survived', 'Title', 'Embarked', 'Sex', 'Alone', 'LName']\n",
"\n",
"# ordinal variables (nominal-ordinal, use Rank Biserial or Kendall's Tau)\n",
"ord_vars = ['Survived', 'Pclass', 'FamilySize', 'Parch', 'SibSp', 'NameLength']\n",
"\n",
"# continuous variables (use Pearson's r)\n",
"cont_vars = ['Survived', 'Fare', 'Age']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the cell above, we separate our variables by their data types. The reason for this is that when considering the underlying associations between variables, there is not a \"one size fits all\" method. The most common mathematical method of calculating correlation is _Pearson's r_, which should typically only be used on continuous variables. In our case, the vast majority of variables are actually discrete/categorical. \n",
"\n",
"In order to perform calculations, we must convert any non numeric data into numbers. You can't do math on words, so let's get started:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# convert all string 'object' types to numeric categories\n",
"for i in train_df.columns:\n",
" if train_df[i].dtype == 'object':\n",
" train_df[i], _ = pd.factorize(train_df[i])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# A method that creates a correlation matrix in the form of a Pandas DataFrame using Cramer's V.\n",
"def cramers_v_matrix(dataframe, variables):\n",
" \n",
" df = pd.DataFrame(index=dataframe[variables].columns, columns=dataframe[variables].columns, dtype=\"float64\")\n",
" \n",
" for v1, v2 in itertools.combinations(variables, 2):\n",
" \n",
" # generate contingency table:\n",
" table = pd.crosstab(dataframe[v1], dataframe[v2])\n",
" n = len(dataframe.index)\n",
" r, k = table.shape\n",
" \n",
" # calculate chi squared and phi\n",
" chi2 = ss.chi2_contingency(table)[0]\n",
" phi2 = chi2/n\n",
" \n",
" # bias corrections:\n",
" r = r - ((r - 1)**2)/(n - 1)\n",
" k = k - ((k - 1)**2)/(n - 1)\n",
" phi2 = max(0, phi2 - (k - 1)*(r - 1)/(n - 1))\n",
" \n",
" # fill correlation matrix\n",
" df.loc[v1, v2] = np.sqrt(phi2/min(k - 1, r - 1))\n",
" df.loc[v2, v1] = np.sqrt(phi2/min(k - 1, r - 1))\n",
" np.fill_diagonal(df.values, np.ones(len(df)))\n",
" \n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, \"Pearson's R Correlation\")"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x432 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1, 3, figsize=(20,6))\n",
"\n",
"# nominal variable correlation\n",
"ax1 = sns.heatmap(cramers_v_matrix(train_df, nom_vars), annot=True, ax=axes[0], vmin=0)\n",
"\n",
"# ordinal variable correlation: \n",
"ax2 = sns.heatmap(train_df[ord_vars].corr(method='kendall'), annot=True, ax=axes[1], vmin=-1)\n",
"\n",
"# Pearson's correlation:\n",
"ax3 = sns.heatmap(train_df[cont_vars].corr(), annot=True, ax=axes[2], vmin=-1)\n",
"\n",
"ax1.set_title(\"Cramer's V Correlation\")\n",
"ax2.set_title(\"Kendall's Tau Correlation\")\n",
"ax3.set_title(\"Pearson's R Correlation\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above heatmaps show our strength of association between each variable. While there is no rigid standard for \"Highly Associated\" or \"Weakly Associated\", we will use a cut-off value of |0.1| between our independent variables and survival. We will likely drop features whose association is lower than |0.1|. This is an entirely arbitrary guess, and I may return to raise or lower the bar later (In fact, I decided to keep Age after noticing improved performance when I did). \n",
"\n",
"For now, the feature that meets the criteria for dropping are __SibSp__. Additionally, I am choosing to drop __Name__, __Ticket__ and __Cabin__, mostly on a hunch that they don't add much. \n",
"\n",
"It should be noted that correlation between independent (predictor) variables can mean redundant information. This can cause a drop in performance in some algorithms. Some might choose to drop highly correlated predictors. I did not take the time to do that, but you might try it at home!"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>Parch</th>\n",
" <th>Fare</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" <th>FamilySize</th>\n",
" <th>Alone</th>\n",
" <th>LName</th>\n",
" <th>NameLength</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>22.0</td>\n",
" <td>0</td>\n",
" <td>7.2500</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>23</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>38.0</td>\n",
" <td>0</td>\n",
" <td>71.2833</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>7.9250</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>53.1000</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>8.0500</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>887</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>27.0</td>\n",
" <td>0</td>\n",
" <td>13.0000</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>663</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>888</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>30.0000</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>233</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>889</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>2</td>\n",
" <td>23.4500</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>603</td>\n",
" <td>40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>890</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>30.0000</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>664</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>891</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>32.0</td>\n",
" <td>0</td>\n",
" <td>7.7500</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>665</td>\n",
" <td>19</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>891 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" Survived Pclass Sex Age Parch Fare Embarked Title \\\n",
"PassengerId \n",
"1 0 3 0 22.0 0 7.2500 0 0 \n",
"2 1 1 1 38.0 0 71.2833 1 1 \n",
"3 1 3 1 26.0 0 7.9250 0 2 \n",
"4 1 1 1 35.0 0 53.1000 0 1 \n",
"5 0 3 0 35.0 0 8.0500 0 0 \n",
"... ... ... ... ... ... ... ... ... \n",
"887 0 2 0 27.0 0 13.0000 0 5 \n",
"888 1 1 1 19.0 0 30.0000 0 2 \n",
"889 0 3 1 NaN 2 23.4500 0 2 \n",
"890 1 1 0 26.0 0 30.0000 1 0 \n",
"891 0 3 0 32.0 0 7.7500 2 0 \n",
"\n",
" FamilySize Alone LName NameLength \n",
"PassengerId \n",
"1 2 0 0 23 \n",
"2 2 0 1 51 \n",
"3 1 1 2 22 \n",
"4 2 0 3 44 \n",
"5 1 1 4 24 \n",
"... ... ... ... ... \n",
"887 1 1 663 21 \n",
"888 1 1 233 28 \n",
"889 4 0 603 40 \n",
"890 1 1 664 21 \n",
"891 1 1 665 19 \n",
"\n",
"[891 rows x 12 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"todrop = ['SibSp', 'Ticket', 'Cabin', 'Name']\n",
"train_df = train_df.drop(todrop, axis=1)\n",
"train_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Setup for Machine Learning:\n",
"\n",
"During this phase, we will begin to format our data for feeding into a machine learning algorithm. We will then use this formatted data to get a picture of what a few different models can do for us, and pick the best one. This phase is broken into the following parts:\n",
"\n",
"1. __Train/Test Split__\n",
"2. __Normalize Data of each split__ \n",
"3. __Impute missing values__ \n",
"\n",
"Let's go.\n",
"\n",
"## Train/Test Split\n",
"\n",
"We will split our data once into training and testing sets. Within the training set, we will use stratified k-fold cross validation to find average performance of our models. \n",
"\n",
"The test set will not be touched until after we have fully tuned each of our candidate models using the training data and k-fold cross validation. Once training and tuning is complete, we will compare the results of each model on the held-out test set. The one that performs the best will be used for the competition."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"X = train_df.drop(['Survived'], axis = 1)\n",
"Y = train_df.loc[:, 'Survived']\n",
"\n",
"x_train, x_test, y_train, y_test = model_selection.train_test_split(X, Y, test_size=0.2, random_state=333)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalizing the Data\n",
"\n",
"Some Machine Learning models require all of our predictors to be on the same scale, while others do not. Most notably, models like Logistic Regression and SVM will probably benefit from scaling, while decision trees will simply ignore scaling. Because we are going to be looking at a mixed bag of algorithms, I'm going to go ahead and scale our data."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Pclass</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>Parch</th>\n",
" <th>Fare</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" <th>FamilySize</th>\n",
" <th>Alone</th>\n",
" <th>LName</th>\n",
" <th>NameLength</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>466</th>\n",
" <td>0.810433</td>\n",
" <td>-0.751555</td>\n",
" <td>0.606253</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.503686</td>\n",
" <td>-0.557754</td>\n",
" <td>-0.677693</td>\n",
" <td>-0.563259</td>\n",
" <td>0.802709</td>\n",
" <td>0.474261</td>\n",
" <td>0.412271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>508</th>\n",
" <td>-1.624285</td>\n",
" <td>-0.751555</td>\n",
" <td>NaN</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.074801</td>\n",
" <td>-0.557754</td>\n",
" <td>-0.677693</td>\n",
" <td>-0.563259</td>\n",
" <td>0.802709</td>\n",
" <td>0.630255</td>\n",
" <td>1.883636</td>\n",
" </tr>\n",
" <tr>\n",
" <th>316</th>\n",
" <td>0.810433</td>\n",
" <td>1.330574</td>\n",
" <td>-0.234031</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.485998</td>\n",
" <td>-0.557754</td>\n",
" <td>0.974764</td>\n",
" <td>-0.563259</td>\n",
" <td>0.802709</td>\n",
" <td>-0.102915</td>\n",
" <td>0.412271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>341</th>\n",
" <td>-0.406926</td>\n",
" <td>-0.751555</td>\n",
" <td>-1.914600</td>\n",
" <td>0.771076</td>\n",
" <td>-0.086898</td>\n",
" <td>-0.557754</td>\n",
" <td>1.800993</td>\n",
" <td>0.749475</td>\n",
" <td>-1.245781</td>\n",
" <td>-0.830884</td>\n",
" <td>0.307174</td>\n",
" </tr>\n",
" <tr>\n",
" <th>118</th>\n",
" <td>-0.406926</td>\n",
" <td>-0.751555</td>\n",
" <td>-0.023960</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.196868</td>\n",
" <td>-0.557754</td>\n",
" <td>-0.677693</td>\n",
" <td>0.093108</td>\n",
" <td>-1.245781</td>\n",
" <td>-1.324864</td>\n",
" <td>0.412271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>0.810433</td>\n",
" <td>-0.751555</td>\n",
" <td>NaN</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.317836</td>\n",
" <td>2.631970</td>\n",
" <td>-0.677693</td>\n",
" <td>0.093108</td>\n",
" <td>-1.245781</td>\n",
" <td>-1.298865</td>\n",
" <td>-1.059093</td>\n",
" </tr>\n",
" <tr>\n",
" <th>375</th>\n",
" <td>0.810433</td>\n",
" <td>1.330574</td>\n",
" <td>-1.844576</td>\n",
" <td>0.771076</td>\n",
" <td>-0.195219</td>\n",
" <td>-0.557754</td>\n",
" <td>0.974764</td>\n",
" <td>2.062208</td>\n",
" <td>-1.245781</td>\n",
" <td>-1.491257</td>\n",
" <td>-0.113216</td>\n",
" </tr>\n",
" <tr>\n",
" <th>367</th>\n",
" <td>-1.624285</td>\n",
" <td>1.330574</td>\n",
" <td>2.146774</td>\n",
" <td>-0.454384</td>\n",
" <td>0.996311</td>\n",
" <td>1.037108</td>\n",
" <td>0.148535</td>\n",
" <td>0.093108</td>\n",
" <td>-1.245781</td>\n",
" <td>0.084277</td>\n",
" <td>2.198929</td>\n",
" </tr>\n",
" <tr>\n",
" <th>420</th>\n",
" <td>0.810433</td>\n",
" <td>1.330574</td>\n",
" <td>-1.354410</td>\n",
" <td>1.996537</td>\n",
" <td>-0.127587</td>\n",
" <td>-0.557754</td>\n",
" <td>0.974764</td>\n",
" <td>0.749475</td>\n",
" <td>-1.245781</td>\n",
" <td>0.276669</td>\n",
" <td>-0.218313</td>\n",
" </tr>\n",
" <tr>\n",
" <th>781</th>\n",
" <td>0.810433</td>\n",
" <td>1.330574</td>\n",
" <td>-1.144339</td>\n",
" <td>-0.454384</td>\n",
" <td>-0.499744</td>\n",
" <td>1.037108</td>\n",
" <td>0.974764</td>\n",
" <td>-0.563259</td>\n",
" <td>0.802709</td>\n",
" <td>1.597414</td>\n",
" <td>-0.743801</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>712 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" Pclass Sex Age Parch Fare Embarked \\\n",
"PassengerId \n",
"466 0.810433 -0.751555 0.606253 -0.454384 -0.503686 -0.557754 \n",
"508 -1.624285 -0.751555 NaN -0.454384 -0.074801 -0.557754 \n",
"316 0.810433 1.330574 -0.234031 -0.454384 -0.485998 -0.557754 \n",
"341 -0.406926 -0.751555 -1.914600 0.771076 -0.086898 -0.557754 \n",
"118 -0.406926 -0.751555 -0.023960 -0.454384 -0.196868 -0.557754 \n",
"... ... ... ... ... ... ... \n",
"47 0.810433 -0.751555 NaN -0.454384 -0.317836 2.631970 \n",
"375 0.810433 1.330574 -1.844576 0.771076 -0.195219 -0.557754 \n",
"367 -1.624285 1.330574 2.146774 -0.454384 0.996311 1.037108 \n",
"420 0.810433 1.330574 -1.354410 1.996537 -0.127587 -0.557754 \n",
"781 0.810433 1.330574 -1.144339 -0.454384 -0.499744 1.037108 \n",
"\n",
" Title FamilySize Alone LName NameLength \n",
"PassengerId \n",
"466 -0.677693 -0.563259 0.802709 0.474261 0.412271 \n",
"508 -0.677693 -0.563259 0.802709 0.630255 1.883636 \n",
"316 0.974764 -0.563259 0.802709 -0.102915 0.412271 \n",
"341 1.800993 0.749475 -1.245781 -0.830884 0.307174 \n",
"118 -0.677693 0.093108 -1.245781 -1.324864 0.412271 \n",
"... ... ... ... ... ... \n",
"47 -0.677693 0.093108 -1.245781 -1.298865 -1.059093 \n",
"375 0.974764 2.062208 -1.245781 -1.491257 -0.113216 \n",
"367 0.148535 0.093108 -1.245781 0.084277 2.198929 \n",
"420 0.974764 0.749475 -1.245781 0.276669 -0.218313 \n",
"781 0.974764 -0.563259 0.802709 1.597414 -0.743801 \n",
"\n",
"[712 rows x 11 columns]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# We normalize the training and testing data separately so as to avoid data leaks.\n",
"\n",
"x_train = pd.DataFrame(pre.scale(x_train), columns=x_train.columns, index=x_train.index)\n",
"x_test = pd.DataFrame(pre.scale(x_test), columns=x_test.columns, index=x_test.index)\n",
"x_train"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imputing Missing Data\n",
"\n",
"You might recall that there were a significant amount of missing __Age__ values in our data. Let's fill this in with the median age:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 712 entries, 466 to 781\n",
"Data columns (total 11 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Pclass 712 non-null float64\n",
" 1 Sex 712 non-null float64\n",
" 2 Age 712 non-null float64\n",
" 3 Parch 712 non-null float64\n",
" 4 Fare 712 non-null float64\n",
" 5 Embarked 712 non-null float64\n",
" 6 Title 712 non-null float64\n",
" 7 FamilySize 712 non-null float64\n",
" 8 Alone 712 non-null float64\n",
" 9 LName 712 non-null float64\n",
" 10 NameLength 712 non-null float64\n",
"dtypes: float64(11)\n",
"memory usage: 66.8 KB\n"
]
}
],
"source": [
"x_train.loc[x_train.Age.isnull(), 'Age'] = x_train.loc[:, 'Age'].median()\n",
"x_test.loc[x_test.Age.isnull(), 'Age'] = x_test.loc[:, 'Age'].median()\n",
"x_train.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we see that each and every variable that we chose to keep has 712 valid data entries. \n",
"\n",
"# Model Selection\n",
"\n",
"Now that we have prepared our data, we want to look at different options available to us for solving classification problems. Some common ones are:\n",
"\n",
"- K-Nearest Neighbors\n",
"- Support Vector Machines\n",
"- Decision Trees\n",
"- Logistic Regression\n",
"\n",
"We will train and tune each of these models on our training data by way of k-fold cross-validation. When complete, we will compare the tuned models' performance on a held out test set. \n",
"\n",
"## Training and Comparing Base Models:\n",
"\n",
"First, we want to get a feel model's performance before tuning. We will write two functions to help us describe our results. The first will evaluate the model several times over random splits in the data, and return the average performance as a dictionary. The second will simply nicely print our dictionary."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def kfold_evaluate(model, folds=5):\n",
" eval_dict = {}\n",
" accuracy = 0\n",
" f1 = 0\n",
" AUC = 0\n",
" \n",
" skf = model_selection.StratifiedKFold(n_splits=folds)\n",
" \n",
" # perform k splits on the training data. Gather performance results.\n",
" for train_idx, test_idx in skf.split(x_train, y_train):\n",
" xk_train, xk_test = x_train.iloc[train_idx], x_train.iloc[test_idx]\n",
" yk_train, yk_test = y_train.iloc[train_idx], y_train.iloc[test_idx]\n",
" \n",
" model.fit(xk_train, yk_train)\n",
" y_pred = model.predict(xk_test)\n",
" report = metrics.classification_report(yk_test, y_pred, output_dict=True)\n",
" \n",
" prob_array = model.predict_proba(xk_test)\n",
" \n",
" fpr, tpr, huh = metrics.roc_curve(yk_test, model.predict_proba(xk_test)[:,1])\n",
" auc = metrics.auc(fpr, tpr)\n",
" accuracy += report['accuracy']\n",
" f1 += report['macro avg']['f1-score']\n",
" AUC += auc\n",
" \n",
" # Average performance metrics over the k folds\n",
" measures = np.array([accuracy, f1, AUC])\n",
" measures = measures/folds\n",
"\n",
" # Add metric averages to dictionary and return.\n",
" eval_dict['Accuracy'] = measures[0]\n",
" eval_dict['F1 Score'] = measures[1]\n",
" eval_dict['AUC'] = measures[2] \n",
" eval_dict['Model'] = model\n",
" \n",
" return eval_dict\n",
"\n",
"# a function to pretty print our dictionary of dictionaries:\n",
"def pprint(web, level):\n",
" for k,v in web.items():\n",
" if isinstance(v, dict):\n",
" print('\\t'*level, f'{k}: ')\n",
" level += 1\n",
" pprint(v, level)\n",
" level -= 1\n",
" else:\n",
" print('\\t'*level, k, \": \", v)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"evals = {}\n",
"evals['KNN'] = kfold_evaluate(KNeighborsClassifier())\n",
"evals['Logistic Regression'] = kfold_evaluate(LogisticRegression(max_iter=1000))\n",
"evals['Random Forest'] = kfold_evaluate(RandomForestClassifier())\n",
"evals['SVC'] = kfold_evaluate(SVC(probability=True))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmEAAAF8CAYAAACHVWyTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOzdeVhV1eL/8TfzoAZIDJWlNjgFqImJQ5JKmgORqWki6PXmUNdUygrLus4DalI5m18r0xxSUZxyKLXUMvmliVlmZletEMWUiwwHzvn94eO+EiRYHDfg5/U8Ps/Ze6+99lqHLXyetfde28Fms9kQERERkRvK0ewGiIiIiNyMFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiaJj4+nbt26hf4FBQXRtm1bxo0bx4ULF8xuYrFWr15ttHfLli1/Wm78+PHUrVuXtm3bltmxr3xn9tjv6n5d+VevXj1CQkJ49NFHeeutt8jNzf2rTS9WcnIybdu2JTg4mBdeeKFM6xaR8s/Z7AaI3OxGjhyJj48PALm5uRw7dozly5dz6NAhPvzwQ5ycnExu4Z/bvn077du3L3bbJ598coNbUzZ69uxJkyZNjOWcnBz27dvHrFmz+Pbbb5k7d26ZHOf8+fOMHDmSGjVqMGrUKGrWrFkm9YpIxaEQJmKyiIgIatSoUWhdrVq1GDNmDLt27aJNmzYmtezaatSowY4dOygoKCgSFA8fPszp06epXr26Sa376xo1akRUVFShdT179qSgoIBNmzZx4MABGjVq9LeP89NPP2GxWIiOjqZnz55/uz4RqXh0OVKkHGrWrBkAx44dM7klf65du3b8/vvvpKSkFNm2detW7rrrLu69914TWmYfnTp1AuDrr78uk/osFgsAVapUKZP6RKTiUQgTKYd+++03AO68885C6zdv3kyfPn1o0qSJcf9YQkICeXl5Rpm8vDwmTJhAu3btCAoKIjw8nDFjxhS5x+y3337jpZdeIiwsjODgYB5//HHWrVtX6ja2bNkSDw+PYi87btu2jUceeaTY/U6fPs2LL75oHPexxx5jxYoVRcqlpqbSv39/GjduzEMPPcT7779fbH1/tx+l5eh4+ddlfn7+dR07Pj6eRx99lCVLltC0aVOaNm1Ky5YtiY2NBS5fjq5bty6nTp0CSvf9FFfnrl27iI+Pp0uXLqSkpNCzZ09CQkJo164da9aswWKxMH36dFq2bMmDDz7I8OHDOX/+fKF6S3N+xcTE8M9//pNdu3bxxBNPEBwczMMPP8zbb7+N1WotVN+PP/7IsGHDaNasGU2aNCEmJob9+/cXKnPs2DH+9a9/ERoaSsOGDenVqxefffbZX/kRiVQ4uhwpYrKLFy+SkZEBXB4d+fHHHxk/fjz3339/oZvaV65cyahRo2jbti0jRozAYrGwdetWFi5ciKenJ0OGDAFg7NixrF+/ntjYWO68805++OEHlixZws8//8z//d//AZCWlkaPHj2w2WzExMTg5eXF9u3befHFFzlz5gxPP/10ie12d3enZcuWbN++nfj4eGP9iRMn+OGHHxg3bhyHDh0qtM/Jkyd58sknyc3NpU+fPvj5+bFlyxZee+01Tpw4wUsvvQTADz/8QExMDLfccgvPPvssFouFWbNmUVBQUKi+suhHae3duxeA+++//7qP/euvvzJr1iyGDBnCmTNniIiIYMeOHcydO9e4B6169eql/n6Kq7Nhw4Zs3LiR9PR0Bg8eTI8ePXjsscd4//33eeWVV0hOTiYzM5Nnn32WH3/8kSVLluDh4cGkSZOA0p9fAEePHmX48OH07NmTnj17sn79embOnEn16tWJjo4GLp8HTz75JM7OzvTp04fq1auzbNky/vGPf7BkyRJCQkL4/vvv6d27N7feeiuDBg3CxcWF9evXM3DgQKZPn26MPopUWjYRMcXLL79sq1OnTrH/QkJCbAcOHChU/tFHH7X17NnTZrVajXUWi8XWunVrW5cuXYx1ISEhtjFjxhTad8aMGbYnnnjC9t///tc49oMPPmhLS0srVO7555+3BQUF2c6ePfun7V61apWtTp06ti+++MK2evVqW506dWxHjx41ts+fP9/WsmVLm9VqtfXp08fWpk0bY9vw4cNt9erVs6WmphrrCgoKbIMGDbLVrVvXqOe5556zNWrUyPbLL78Y5Y4dO2YLCgqy1alTp9B3WJp+XPmur+VKvxYvXmw7d+6c8e/IkSO2t99+29agQQNb165dje//eo+9atWqQuW++OKLIutL+/38WZ1X1i9evNhYt2PHDludOnVsbdq0seXm5hrre/XqZWvVqpWxXNrzq0+fPrY6derYtm/fbqzLycmxNW3a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kxONGjXixx9/ZPHixcTExODl5cUPP/xAYmIi6enpxv41atRg3Lhx+Pj4MGXKFHbv3o2joyMREREMGTKk2L5dunSJ2NhYPvnkE86ePcurr77KL7/8grOzM3FxcbRu3Zq3336btLQ0fv75Z06fPk2PHj145pln7PjTExERKTuV93JkObRz504++eQTVq1axZo1a/j5559ZtmwZ3333HUuWLGH16tUsXbqUn3/+uci+s2fPZvTo0axevZoWLVrw7bffMmrUKABWrlxZqOybb77JXXfdxaZNm0hISCAxMbHY9gwcOJDIyEhatGjBgAED6NOnDx07diQjI4Pp06ezcOFCkpKSaN68OdOmTcNisfDSSy8xdepUkpKScHYunOHr1q3Lxx9/TEBAQKH9W7VqxbRp0zh9+jS7du1i3bp1fPjhhxw7dozc3Nxi+3a1cePGERYWRnJyMm+99RavvPIKZ8+eBeD7779n4cKFrFy5kvnz53Px4sW//PMRERG5kTQSdgN98cUXdO7cGQ8PDwC6detGUlISeXl5tGnThqpVqwLQuXPnImGiXbt2DBkyhIiICNq1a0fLli3/9DhfffUV06ZNAy4Ho+XLlxdb7srlyI8//pjJkyfz6KOP4uDgwMGDB/n111+JjY0FID8/Hx8fH44ePYqvry/16tUDoHv37kyYMMGoLyQkBKDI/larFS8vLwICAnBzc6NXr160adOGESNG4ObmVmzfTp06Veh7Gz9+PAB33nknDRs25ODBgwA0a9YMV1dXfH198fb2JjMzk1tuuaU0Pw4RERFTKYTdQFartci6/Px8HB0di912tX79+tGmTRs+/fRTpk6dyjfffPOnl96cnZ1xcHAwln/88Udq166No2PxA58dOnRg9+7dvPLKKyxYsICCggIeeOAB5s6dC0BGRgYAZ86cuWY73d3dAYrsn5ubS1ZWFs7OzqxcuZJ9+/axa9cuevXqxeLFi4vtW2RkpFHvH98xb7PZKCgoACj0QlQHB4ciZUVERMorXY68gcLCwtiwYQM5OTnk5+ezatUqwsLCaN68OTt37uS///0veXl5bNmypVCIgsv3fWVlZdGvXz/69etnXLJzcnIiPz+/UNnQ0FA2bNgAXA5gAwYMKFLfHw0bNoyUlBR27NhBw4YNOXDgAD/99BMACxYsICEhgbvvvpuLFy/y/fffA5CcnFxs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iIjI36WRMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERMohImIiIiYQCFMRASoe39du9afW6D3mIpIYXp3pIgIUNW9KsHvBdut/kN9D9mtbhGpmEo1EpacnEynTp1o3749S5YsKbL98OHDdOvWjccee4xBgwZx8eJFAFJSUujevTtRUVH07duX06dPA7Bv3z6aNWtGVFQUUVFRjBw5sgy7JCIiIlL+lRjC0tLSmDFjBkuXLiUpKYnly5dz7NixQmUmTJjA0KFDWbduHbVr12bhwoUAvPjii4wfP561a9cSGRnJ+PHjAUhNTaV///6sXbuWtWvXMmnSJDt0TURERKT8KjGE7dmzh7CwMLy9vfH09KRDhw5s3ry5UBmr1UpWVhYA2dnZuLu7k5eXx7Bhw6hXrx4AdevW5ddffwXg0KFDfP7550RGRjJ48GBjvYiIiMjNosR7ws6cOYOfn5+x7O/vzzfffFOoTHx8PP3792fixIl4eHiwYsUKXF1diYqKAi6HtJkzZxIREQFAtWrV6NixI+3bt+fDDz8kLi6OZcuWlbrRqamppS4rf1+TJk3MbsLfkpKSYnYTpAK4Eee5zsXKo6L/XqyoKtv/oRJDmNVqxcHBwVi22WyFlnNycnj11Vd59913CQkJYdGiRbz88svMnz8fgLy8POLj48nPz2fQoEEAjB071tj/qaeeYvr06WRmZlKtWrVSNTooKAg3N7fS9VBuevplKeWFzkWRv6ei/R/Kzc295sBRiZcjAwMDSU9PN5bT09Px9/c3lo8ePYqbmxshISEA9OzZk3379gGQlZXF008/TX5+PnPmzMHFxQWr1cqcOXMoKCgodBwnJ6fr65mIiIhIBVZiCGvRogV79+4lIyOD7OxstmzZQuvWrY3tNWvW5LfffuP48eMAbN++neDgy495v/jii9SsWZPExERcXV0vH9DRka1bt/Lxxx8DkJSURMOGDfH09CzzzomIlBfWXPvNE2bPukXEfkq8HBkQEEBcXByxsbFYLBa6d+9OSEgIAwYMYOjQoQQHBzNp0iSGDx+OzWbD19eXiRMn8u2337J9+3buvfdeunbtCly+n2zBggVMmTKF1157jVmzZlG9enUSEhLs3lERETM5urlxpF59u9Rd/7sjdqlXROyrVJO1RkZGEhkZWWjdggULjM/h4eGEh4cX2e/7778vtr777rvvum7EFxEREals9NqiGyjHUlByoXJYt4iIiJQ9vbboBnJ3caJW/Aa71H1icme71CsiIiL2oZEwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCWGVhyTG7BSIiInIdNEVFZeHiDqO97FP36Av2qVdEROQmppEwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiIiIiZQCBMRERExgUKYiJSpHEtBhaxbRORGcza7ASJSubi7OFErfoNd6j4xubNd6hURMYNGwkRERERMoBAmIiIiYgKFMBERERETKISJSMVhyTG7BSIiZUY35otIxeHiDqO97FP36Av2qVdE5E9oJExERETEBAphIiIiIiYoVQhLTk6mU6dOtG/fniVLlhTZfvjwYbp168Zjjz3GoEGDuHjxIgC//PIL0dHRPProozzzzDNkZWUBcPHiRQYOHEjHjh2Jjo4mPT29DLskIiIiUv6VGMLS0tKYMWMGS5cuJSkpieXLl3Ps2LFCZSZMmMDQoUNZt24dtWvXZuHChQCMGTOG3r17s3nzZoKCgpg9ezYAiYmJhIaGsmnTJnr06MGECRPs0DURERGR8qvEELZnzx7CwsLw9vbG09OTDh06sHnz5kJlrFarMcqVnZ2Nu7s7FouFr776ig4dOgDwxBNPGPvt2LGDyMhIALp06cKuXbuwWCxl2jERERGR8qzEEHbmzBn8/PyMZX9/f9LS0gqViY+PZ9SoUbRq1Yo9e/bQq1cvzp8/T9WqVXF2vvwApp+fn7Hf1XU6OztTtWpVMjIyyqxTIiIiIuVdiVNUWK1WHBwcjGWbzVZoOScnh1dffZV3332XkJAQFi1axMsvv8y4ceMKlQOKLF9dp6Nj6Z8RSE1NLXXZ8qRJkyZmN+GmlJKSYnYTbio6z82h8/zG0nlujsp2npcYwgIDA9m/f7+xnJ6ejr+/v7F89OhR3NzcCAkJAaBnz568+eabVK9enczMTAoKCnByciq0n7+/P2fPniUwMJD8/HyysrLw9vYudaODgoJwc3MrdXm5uemXpdwMdJ7LzaCinee5ubnXHDgqcfipRYsW7N27l4yMDLKzs9myZQutW7c2ttesWZPffvuN48ePA7B9+3aCg4NxcXEhNDSUjRs3ApCUlGTsFx4eTlJSEgAbN24kNDQUFxeXv95LERERkQqmxJGwgIAA4uLiiI2NxWKx0L17d0JCQhgwYABDhw4lODiYSZMmMXz4cGw2G76+vkycOBGAf//738THxzNnzhxuu+023njjDQCGDRtGfHw8nTt3plq1akybNs2+vRQREREpZ0r12qLIyEjjacYrFixYYHwODw8nPDy8yH533HEHixcvLrLe29ubuXPnXm9bRURERCoNzZgvIiIiYgKFMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiIiIiZQCBMRERExgUKYiIiIiAkUwkRERERMoBAmIiIiYgKFMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREzgXJpCycnJzJkzh/z8fPr27Ut0dLSx7ciRI8THxxvLGRkZeHl58d5779G/f39jfWZmJufPn+frr79m3759PPfccwQGBgLQoEEDJk2aVFZ9EhERESn3SgxhaWlpzJgxg9WrV+Pq6kqvXr1o1qwZ9957LwD169dn7dq1AGRnZ9OjRw9Gjx6Nr6+vsd5qtdK3b1/i4uIASE1NpX///gwaNMhe/RIREREp10q8HLlnzx7CwsLw9vbG09OTDh06sHnz5mLLzps3j6ZNmxIaGlpo/apVq/Dw8CAyMhKAQ4cO8fnnnxMZGcngwYP59ddfy6ArIiIiIhVHiSHszJkz+Pn5Gcv+/v6kpaUVKZeZmcmKFSsYMmRIofUFBQXMnTuXF154wVhXrVo1YmJiSE5OJjw83BghExEREblZlHg50mq14uDgYCzbbLZCy1esW7eOiIgIfH19C63/7LPPqFWrFnXr1jXWjR071vj81FNPMX36dDIzM6lWrVqpGp2amlqqcuVNkyZNzG7CTSklJcXsJtxUdJ6bQ+f5jaXz3ByV7TwvMYQFBgayf/9+Yzk9PR1/f/8i5bZt21bsPV7btm2jU6dOxrLVamXevHkMHDgQJycnY/3Vn0sSFBSEm5tbqcvLzU2/LOVmoPNcbgYV7TzPzc295sBRiZcjW7Rowd69e8nIyCA7O5stW7bQunXrQmVsNhuHDx+mcePGRfY/cOBAoXvEHB0d2bp1Kx9//DEASUlJNGzYEE9Pz1J3SkRERKSiKzGEBQQEEBcXR2xsLI8//jhdunQhJCSEAQMGcOjQIeDytBQuLi7Fjk6dPHnSmIriiilTpvD+++/TuXNnVq1axfjx48uoOyIiIiIVQ6nmCYuMjDSebLxiwYIFxmdfX192795d7L4HDx4ssu6+++5j2bJl19NOERERkUpFM+aLiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiIiIiZQCBMRERExgUKYiIiIiAkUwkRERERMoBAmIiIiYgKFMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERM4l6ZQcnIyc+bMIT8/n759+xIdHW1sO3LkCPHx8cZyRkYGXl5erF+/njVr1jB9+nR8fX0BePjhh4mLi+PixYuMGDGCkydPUr16dRITE/Hz8yvjromIiIiUXyWGsLS0NGbMmMHq1atxdXWlV69eNGvWjHvvvReA+vXrs3btWgCys7Pp0aMHo0ePBiA1NZX4+Hi6dOlSqM7ExERCQ0OZP38+SUlJTJgwgcTExDLumoiIiEj5VeLlyD179hAWFoa3tzeenp506NCBzZs3F1t23rx5NG3alNDQUAAOHTrEmjVriIyMZMSIEVy4cAGAHTt2EBkZCUCXLl3YtWsXFoulrPokIiIiUu6VGMLOnDlT6FKhv78/aWlpRcplZmayYsUKhgwZYqzz8/Pj2WefZd26ddx2222MHTu2SJ3Ozs5UrVqVjIyMv90ZERERkYqixMuRVqsVBwcHY9lmsxVavmLdunVEREQY938BzJo1y/j89NNP88gjjxR7DJvNhqNj6Z8RSE1NLXXZ8qRJkyZmN+GmlJKSYnYTbio6z82h8/zG0nlujsp2npcYwgIDA9m/f7+xnJ6ejr+/f5Fy27ZtY9CgQcZyZmYmq1atol+/fsDloOXk5ARcHk07e/YsgYGB5Ofnk5WVhbe3d6kbHRQUhJubW6nLy81NvyzlZqDzXG4GFe08z83NvebAUYnDTy1atGDv3r1kZGSQnZ3Nli1baN26daEyNpuNw4cP07hxY2Odp6cn77zzDgcPHgTggw8+MEbCwsPDSUpKAmDjxo2Ehobi4uJy/b0TERERqaBKHAkLCAggLi6O2NhYLBYL3bt3JyQkhAEDBjB06FCCg4PJyMjAxcWl0OiUk5MTiYmJjB49mpycHGrVqkVCQgIAw4YNIz4+ns6dO1OtWjWmTZtmvx6KiIiIlEOlmicsMjLSeJrxigULFhiffX192b17d5H9QkNDWbNmTZH13t7ezJ0793rbKiIiIlJpaMZ8ERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiIiIiZQCBMRERExgUKYiIiIiAkUwkRERERMoBAmIiIiYgKFMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIC59IUSk5OZs6cOeTn59O3b1+io6ONbUeOHCE+Pt5YzsjIwMvLi/Xr15OSksKkSZOwWCx4e3szceJE7rjjDvbt28dzzz1HYGAgAA0aNGDSpEll3DURERGR8qvEEJaWlsaMGTNYvXo1rq6u9OrVi2bNmnHvvfcCUL9+fdauXQtAdnY2PXr0YPTo0QC8+OKLzJ49m3r16vHRRx8xfvx45syZQ2pqKv3792fQoEH265mIiIhIOVbi5cg9e/YQFhaGt7c3np6edOjQgc2bNxdbdt68eTRt2pTQ0FDy8vIYNmwY9erVA6Bu3br8+uuvABw6dIjPP/+cyMhIBg8ebKwXERERuVmUGMLOnDmDn5+fsezv709aWlqRcpmZmaxYsYIhQ4YA4OrqSlRUFABWq5WZM2cSEREBQLVq1YiJiSE5OZnw8HDi4uLKpDMiIiIiFUWJlyOtVisODg7Gss1mK7R8xbp164iIiMDX17fQ+ry8POLj48nPzzcuP44dO9bY/tRTTzF9+nQyMzOpVq1aqRqdmppaqnLlTZMmTcxuwk0pJSXF7CbcVHSem0Pn+Y2l89wcle08LzGEBQYGsn//fmM5PT0df3//IuW2bdtW5B6vrKwsnnnmGby9vZkzZw4uLi5YrVbmzZvHwIEDcXJyMspe/bkkQUFBuLm5lbq83Nz0y1JuBjrP5WZQ0c7z3Nzcaw4clXg5skWLFuzdu5eMjAyys7PZsmULrVu3LlTGZrNx+PBhGjduXGj9iy++SM2aNUlMTMTV1fXyAR0d2bp1Kx9//DEASUlJNGzYEE9Pz+vunIiIiEhFVeJIWEBAAHFxccTGxmKxWOjevTshISEMGDCAoUOHEhwcTEZGBi4uLoVGp7799lu2b9/OvffeS9euXYHL95MtWLCAKVOm8NprrzFr1iyqV69OQkKC/XooIiIiUg6Vap6wyMhIIiMjC61bsGCB8dnX15fdu3cX2t6gQQO+//77Yuu77777WLZs2fW2VURERKTS0Iz5IiIiIiZQCBMRERExgUKYiIiIiAkUwkRERERMoBAmIiIiYgKFMBERERETKISJiIiImEAhTERERMQECmEiIiIiJlAIExERETGBQpiIiIiICRTCREREREygECYiIiJiAoUwERERERMohImIiIiYQCFMRERExAQKYSIiIiImUAgTERERMYFCmIiIiIgJFMJERERETKAQJiIiImIChTAREREREyiEiYiIiJhAIUxERETEBAphIiIiIiZQCBMRERExgUKYiIiIiAkUwkRERERMoBAmIiIiYgKFMBERERETKISJiIiImMC5NIWSk5OZM2cO+fn59O3bl+joaGPbkSNHiI+PN5YzMjLw8vJi/fr1/PLLL7z44oucO3eO2rVrM23aNKpUqcLFixcZMWIEJ0+epHr16iQmJuLn51f2vRMREREpp0ocCUtLS2PGjBksXbqUpKQkli9fzrFjx4zt9evXZ+3ataxdu5Zly5bh5eXF6NGjARgzZgy9e/dm8+bNBAUFMXv2bAASExMJDQ1l06ZN9OjRgwkTJtindyIiIiLlVIkhbM+ePYSFheHt7Y2npycdOnRg8+bNxZadN28eTZs2JTQ0FIvFwldffUWHDh0AeOKJJ4z9duzY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YMrKyli4cCG33347s2bNYsWKFeTl5VFTUzPg3L148SJhYWH8dXU3wzDo7e0F/rge+vr6GDNmTL/g8MKFC0yYMGEEeiU3usHG/o8++giLxYLH4xmQ/6abbiImJobffvuNH374galTp/q2V1dX09bWNugPXOT60O3IUebgwYMkJCRQX1/P4cOH+eSTT1i9ejX19fW43W6+/vprAOx2O3v27GHBggU4nU4Mw8DtdpOdnU1XVxcRERG+vB9//LHfuk6ePMmMGTN44oknmDNnDrW1tfT29hIdHe23LoCMjAxsNhuLFy8mNDR0BI6ISH8ej4fXXnsNr9cLQHt7O62trcTFxREfH09dXR1er5eenh7y8vJobGwkISGBiooKAFpbW/nss8+YN29ev3LDw8O57bbbfEFYQ0MDWVlZI9s5uWENNvbv3buXhIQEKisrfV+oW1pacLlczJs3j7Fjx5KVlcWmTZtob28HLv8CuaSkhJiYmEB26YagmbBRxuFwDHgOJSsrC7vdzttvv82zzz5Ld3c306dP55VXXsFsNlNUVITVagWgoKCA8ePHs2bNGgoLC3njjTe46667/Na1aNEi9uzZQ0pKCoZhsGDBAr766itCQ0MpLi4eUBfAnXfeSVBQEBkZGcN7IEQG8eSTT2Kz2bBarYSGhmIymcjKymLRokUAZGdn89hjj9HX18cDDzxAYmIiMTExPP/8876f9BcVFREZGTmg7OLiYjZt2oTdbsdsNmOz2fzeChK53q429hcUFNDa2sqSJUswmUyEhoayefNmJk6cCMC6devYunUrmZmZhISEEBwcTF5e3qBjv1w/QcZf59lFholhGDQ3N7NhwwYqKysD3RwREZGA0kyYjJjt27djt9t5/fXXA90UERGRgNNMmIiIiEgA6MF8ERERkQBQECYiIiISAArCRERERAJAQZiIiIhIACgIExEREQkABWEiIiIiAfB/EScWCKFmEyIAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>KNN</th>\n",
" <th>Logistic Regression</th>\n",
" <th>Random Forest</th>\n",
" <th>SVC</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.8216</td>\n",
" <td>0.817394</td>\n",
" <td>0.8399</td>\n",
" <td>0.835625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.808083</td>\n",
" <td>0.805034</td>\n",
" <td>0.828417</td>\n",
" <td>0.823467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AUC</th>\n",
" <td>0.842471</td>\n",
" <td>0.865725</td>\n",
" <td>0.870281</td>\n",
" <td>0.848343</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Model</th>\n",
" <td>KNeighborsClassifier(algorithm='auto', leaf_si...</td>\n",
" <td>LogisticRegression(C=1.0, class_weight=None, d...</td>\n",
" <td>(DecisionTreeClassifier(ccp_alpha=0.0, class_w...</td>\n",
" <td>SVC(C=1.0, break_ties=False, cache_size=200, c...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" KNN \\\n",
"Accuracy 0.8216 \n",
"F1 Score 0.808083 \n",
"AUC 0.842471 \n",
"Model KNeighborsClassifier(algorithm='auto', leaf_si... \n",
"\n",
" Logistic Regression \\\n",
"Accuracy 0.817394 \n",
"F1 Score 0.805034 \n",
"AUC 0.865725 \n",
"Model LogisticRegression(C=1.0, class_weight=None, d... \n",
"\n",
" Random Forest \\\n",
"Accuracy 0.8399 \n",
"F1 Score 0.828417 \n",
"AUC 0.870281 \n",
"Model (DecisionTreeClassifier(ccp_alpha=0.0, class_w... \n",
"\n",
" SVC \n",
"Accuracy 0.835625 \n",
"F1 Score 0.823467 \n",
"AUC 0.848343 \n",
"Model SVC(C=1.0, break_ties=False, cache_size=200, c... "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_df = pd.DataFrame(evals)\n",
"result_df.drop('Model', axis=0).plot(kind='bar', ylim=(0.7, 0.9)).set_title(\"Base Model Performance\")\n",
"plt.xticks(rotation=0)\n",
"plt.show()\n",
"result_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Base Model Summary\n",
"\n",
"It appears that we have a clear winner in our Random Forest classifier. \n",
"\n",
"## Hyper-parameter Tuning: \n",
"\n",
"Let's tune up our current champion's hyper-parameters in hopes of eking out a little bit more performance. We will use scikit-learn's `RandomizedSearchCV` which has some speed advantages over using an exhaustive `GridSearchCV`. Our first step is to create our grid of parameters over which we will randomly search for the best settings:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" n_estimators : [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000]\n",
" max_features : ['auto', 'sqrt']\n",
" max_depth : [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, None]\n",
" min_samples_split : [2, 5, 10]\n",
" min_samples_leaf : [1, 2, 4]\n",
" bootstrap : [True, False]\n"
]
}
],
"source": [
"# Number of trees in random forest\n",
"n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]\n",
"# Number of features to consider at every split\n",
"max_features = ['auto', 'sqrt']\n",
"# Maximum number of levels in tree\n",
"max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]\n",
"max_depth.append(None)\n",
"# Minimum number of samples required to split a node\n",
"min_samples_split = [2, 5, 10]\n",
"# Minimum number of samples required at each leaf node\n",
"min_samples_leaf = [1, 2, 4]\n",
"# Method of selecting samples for training each tree\n",
"bootstrap = [True, False]\n",
"# Create the random grid\n",
"random_grid = {'n_estimators': n_estimators, \n",
" 'max_features': max_features,\n",
" 'max_depth': max_depth,\n",
" 'min_samples_split': min_samples_split,\n",
" 'min_samples_leaf': min_samples_leaf,\n",
" 'bootstrap': bootstrap}\n",
"\n",
"pprint(random_grid, 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we want to create our `RandomizedSearchCV` object which will use the grid we just created above. It will randomly sample 10 combinations of parameters, test them over 3 folds and return the set of parameters that performed the best on our training data."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"# create RandomizedSearchCV object\n",
"searcher = model_selection.RandomizedSearchCV(estimator = RandomForestClassifier(),\n",
" param_distributions = random_grid,\n",
" n_iter = 10, # Number of parameter settings to sample (this could take a while)\n",
" cv = 3, # Number of folds for k-fold validation \n",
" n_jobs = -1, # Use all processors to compute in parallel\n",
" random_state=0) \n",
"search = searcher.fit(x_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'n_estimators': 1600,\n",
" 'min_samples_split': 10,\n",
" 'min_samples_leaf': 4,\n",
" 'max_features': 'auto',\n",
" 'max_depth': 30,\n",
" 'bootstrap': False}"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"params = search.best_params_\n",
"params"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After performing our parameter tuning, we can verify whether or not the parameters provided by the search actually improve the base model or not. Let's compare the performance of the two models before and after tuning."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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LRQQEKCtW7fa7bddu3YOj/3pp59KkmJjY8v0u0mTJtq8eXOF9tmxY0fbrJWzs7MaNmyoWrVq2QKYJDVo0ECSlJubK0kaOXKkMjIy7ALY+fPnbfs5d+5cmTb91u9/F1u3bpWzs7MeffRRu3oTJkxQamqqvLy8tHHjRvn5+emee+6x+wyjoqLk4uJS5jME4BgzYQCu6PfPwnJ3d5cku2uFylO3bt0rbvfzzz+rQYMGcnFxsav3pz/9qcJtCw4Ots3SXTpGQECAGjVqZFfv8OHDslqt+stf/lLufn5/wX1Fnv919OhR3XLLLeU+lqNp06batm1bhfb5++1dXV3L1L0UriwWi22Z2WxWYmKisrOzdfjwYR09etT22f62nuT4d3Hs2DH5+/vLy8vLrl5AQIACAgIkXfwM8/Pzdf/995fbj19//bXc5QAujxAGQNLlQ9W1Xufz22uSynO5uw0vBYSK8PHxUWRkpMN6FotFderU0dtvv13u+t9eDyapTDAsz5UesWixWOTm5lahfZa33NFnnpWVpcGDB6tWrVqKjIxUr1691KJFCx0+fLjcR3I4+l2UlpY6PGZpaakaN26sl19+udz1v73+DUDFEMKAGubS/5B/f0fbpVNT10vDhg21d+9eWa1WuwDw888/V/qxbr/9dn3xxRcKCQkpExbS09Pl6+t7zfvMy8srM5v1448/qn79+n+ozVcyffp0ubu7a+3atXazZvPnz7+m/d12223KyMhQYWGhXTDOzs7WP/7xDz355JNq0KCBsrKyFBERYRfqzGazNm3apKCgoGvvEFBDcU0YUMNcOr3073//27bs7Nmz+uyzz65rOx588EGdOnVK69evty2zWCxavnx5pR+rQ4cOkqR58+bZLf/0008VFxentLS0a97nggUL7JZv3rxZP/7442VPfVaG06dPy8/Pzy6AFRQU2F5d5ehU8e9FRUXJYrHon//8p93yZcuWaf369br11lvVoUMHnT59WsuWLbOrs3z5csXHx5d5hAYAx5gJA2qYTp06acqUKZo0aZKOHTsmd3d3rVy5Up6ente1HT179tTy5cv1t7/9Tbt27VLjxo2Vnp6u3bt3S7r206DliYqKUseOHfWPf/xDR48eVWRkpI4dO6aPPvpIt912m5544olr3uf777+vnJwctWnTRj/99JOWLVumhg0blrlgvzK1b99e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ZDIpNjZWZ8+eVXFxsf7+978rOjpa3bt317p16yRJHTp00NGjRyVJX3/9tQYPHizp4r+onnnmGUVHR2vfvn368MMP1adPH3Xv3l09e/bUoUOHLnusgQMH2h7oa7Va1blzZ9tL3YHK8MMPP+iHH34o81aP38rNzVVpaantxbpNmjTRW2+9JVfXi/8mXbJkiaKjo9W1a1fNmDFDkpSXl6fY2FiZTCb17NnTNnM2Z84cPfHEE+ratauWLl2qn3/+WY8//rh69uypAQMG6Pvvv6/iHgP/c7nv/ispLCzUe++9pxdffNH2RpqgoCC9+eabCgi48d6NeaMhhN2EPvvsM912221q0qSJOnXqpBUrVujChQsaN26cXn/9daWlpemuu+5ScnKyPvjgA507d07r16/X4sWLNXfuXNv/nC7n0lR3w4YNtXnzZn3wwQf65JNP9Je//EUfffTRZY/Vq1cv2+zFzp07dccdd6hevXrX4yPBTebEiRN2pyIXLVokSbrzzjs1depU+fj4XHbbhx9+WGfPntX999+vJ554QgsXLlSTJk3k4+OjPXv2aOnSpfr444+1Zs0aZWdnKysrS5MnT1ZERITS0tL01ltv6e9//7vy8vIkSRcuXNC6des0cOBATZgwQePHj1dycrImT56s+Pj46/J5AFL53/2OHDp0SK6urmrUqJHd8rCwMN15551V1VT8P05H3oRWrVql7t27S5K6du2qcePGKTo6WvXq1VPz5s0lSWPHjpUkxcbGqm/fvnJ2dlZAQECFrgMICwuTJHl5eWnmzJlau3atfvrpJ33++edq3ry59u/fX+6xzp07p8TERJ07d07Jycl65JFHKr3vqBkudzqyInx8fLR8+XLt379fGRkZ+vTTT/Xuu+/q448/1jfffKO//vWvthmBJUuWSJK++uorTZkyRZLUsGFD3Xvvvdq9e7ek//09FBYWKisrS88995ztWOfOndOpU6dUt27da+0qUGHlffePHj1aTk5OZeparVY5OzvL2dlZ7u7u17up+H+EsJvMyZMn9fnnnys7O1vvv/++rFarzpw5o23bttn9IRYUFKiwsFCurq52y3/++WfVr19f0sU/UkkqKSmxO8all5H++uuvGjx4sB599FG1b99et956q/bt2yc3N7dyjxUUFKT27dsrPT1dX331lV5++eUq+xyAy1m8eLHuv/9+3X333QoODtbjjz+usWPHKj09vczYzcnJUe3atfX7t7tZrVaVlpZK+t/fg8Vikbu7u104PH78uHx9fa9Dr1DTXe67f9OmTfLx8VFBQUGZ+rfccouaNm2q8+fP65dfftFtt91mW7927Vrl5eVd9gYXVA5OR95kUlNTFRERoW3btunTTz/Vv/71L40aNUrbtm3TyZMndfDgQUnSokWLtGzZMrVu3Vrr1q2T1WrVyZMn9eijj+rChQuqW7eure6WLVvKPdbevXvVqFEjPfbYYwoNDdXmzZtVWlqqJk2alHssSerVq5cSExP1wAMPyMPD4zp8IoC9goICzZo1S4WFhZKks2fP6siRI2revLnCw8P12WefqbCwUCUlJRo7dqyysrIUERGhjz/+WJJ05MgRffvtt7rvvvvs9uvt7a3GjRvbQtiXX36pQYMGXd/Ooca63Hf/8uXLFRERoZSUFNs/qA8dOqTs7Gzdd999qlWrlgYNGqSJEyfq7Nmzki7egfzmm2+qadOmRnapRmAm7CaTnJxc5jqUQYMGadGiRUpKStLf/vY3mc1m3XHHHZo+fbrc3Nw0ZcoU9ejRQ5L04osvysvLS3FxcZo8ebLefvtttWvXrtxjtW3bVsuWLVPXrl1ltVrVunVr/ec//5GHh4dmzJhR5liS1KpVKzk5OalXr15V+0EAl/HUU08pMTFRPXr0kIeHh5ydnTVo0CC1bdtWkvToo4+qf//+slgsevDBBxUZGammTZvqpZdest3SP2XKFAUGBpbZ94wZMzRx4kQtWrRIbm5uSkxMLPdUEFDZrvTd/+KLL+rIkSOKiYmRs7OzPDw89MYbb8jPz0+SFB8fr7lz56pv375ydXWVi4uLxo4de9nvflQeJ+vv59mBKmK1WnXgwAFNmDBBKSkpRjcHAABDMROG6+a9997TokWLNHv2bKObAgCA4ZgJAwAAMAAX5gMAABiAEAYAAGAAQhgAAIABCGEAAAAGIIQBAAAYgBAGAABggP8DYALq+59Cj9oAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Tuned</th>\n",
" <th>Basic</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.846902</td>\n",
" <td>0.838501</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.836075</td>\n",
" <td>0.826364</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AUC</th>\n",
" <td>0.878691</td>\n",
" <td>0.872901</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Model</th>\n",
" <td>(DecisionTreeClassifier(ccp_alpha=0.0, class_w...</td>\n",
" <td>(DecisionTreeClassifier(ccp_alpha=0.0, class_w...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Tuned \\\n",
"Accuracy 0.846902 \n",
"F1 Score 0.836075 \n",
"AUC 0.878691 \n",
"Model (DecisionTreeClassifier(ccp_alpha=0.0, class_w... \n",
"\n",
" Basic \n",
"Accuracy 0.838501 \n",
"F1 Score 0.826364 \n",
"AUC 0.872901 \n",
"Model (DecisionTreeClassifier(ccp_alpha=0.0, class_w... "
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tuning_eval = {}\n",
"tuned_rf = RandomForestClassifier(**params)\n",
"basic_rf = RandomForestClassifier()\n",
"\n",
"tuning_eval['Tuned'] = kfold_evaluate(tuned_rf)\n",
"tuning_eval['Basic'] = kfold_evaluate(basic_rf)\n",
"\n",
"result_df = pd.DataFrame(tuning_eval)\n",
"result_df.drop('Model', axis=0).plot(kind='bar', ylim=(0.7, 0.9)).set_title(\"Tuning Performance\")\n",
"plt.xticks(rotation=0)\n",
"plt.show()\n",
"result_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Final Steps: \n",
"\n",
"Now that we have chosen and tuned a Random Forest classifier, we want to test it on data it has never before seen. This will tell us how we might expect the model to perform in the future, on new data. It's time to use that held out test set. \n",
"\n",
"Then, we will combine the test and training data, and re-fit our model to the combined data set, hopefully giving it the greatest chance of success on the unlabeled data from the competition. \n",
"\n",
"Finally, we will make our predictions on the unlabeled data for submission to the competition. \n",
"\n",
"### Final Test on Held Out Data"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"y_pred = tuned_rf.predict(x_test)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Died: \n",
"\t precision : 0.7815126050420168\n",
"\t recall : 0.8532110091743119\n",
"\t f1-score : 0.8157894736842106\n",
"\t support : 109\n",
" Survived: \n",
"\t precision : 0.7333333333333333\n",
"\t recall : 0.6285714285714286\n",
"\t f1-score : 0.6769230769230768\n",
"\t support : 70\n",
" accuracy : 0.7653631284916201\n",
" macro avg: \n",
"\t precision : 0.757422969187675\n",
"\t recall : 0.7408912188728702\n",
"\t f1-score : 0.7463562753036437\n",
"\t support : 179\n",
" weighted avg: \n",
"\t precision : 0.7626715490665541\n",
"\t recall : 0.7653631284916201\n",
"\t f1-score : 0.761484178861421\n",
"\t support : 179\n"
]
}
],
"source": [
"results = metrics.classification_report(y_test, y_pred,\n",
" labels = [0, 1],\n",
" target_names = ['Died', 'Survived'],\n",
" output_dict = True)\n",
"\n",
"pprint(results, 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like we may have experienced some overfitting. Our model's performance on the test data is roughly 7-9% lower across the board. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Combine Training and Testing Datasets for Final Model Fit\n",
"\n",
"Now that we have ascertained that our tuned model performs with about 76% accuracy and has an f1-score of 0.74 on new data, we can proceed to train our model on the entire labeled training set. "
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=False, ccp_alpha=0.0, class_weight=None,\n",
" criterion='gini', max_depth=30, max_features='auto',\n",
" max_leaf_nodes=None, max_samples=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=4, min_samples_split=10,\n",
" min_weight_fraction_leaf=0.0, n_estimators=1600,\n",
" n_jobs=None, oob_score=False, random_state=None,\n",
" verbose=0, warm_start=False)"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = pd.concat([x_train, x_test], axis=0).sort_index()\n",
"Y = pd.concat([y_train, y_test], axis=0).sort_index()\n",
"tuned_rf.fit(X, Y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Format and Standardize Unlabeled Data\n",
"\n",
"Next we need to transform our unlabeled data in the same manner as when we were formatting our training data. This includes encoding categorical variables, dropping the same features and normalization. This should ensure consistent results on the never before seen competition data. "
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Pclass</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>Parch</th>\n",
" <th>Fare</th>\n",
" <th>Embarked</th>\n",
" <th>Title</th>\n",
" <th>FamilySize</th>\n",
" <th>Alone</th>\n",
" <th>LName</th>\n",
" <th>NameLength</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>892</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>0.386231</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.497413</td>\n",
" <td>-1.955941</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>-1.672873</td>\n",
" <td>-1.153019</td>\n",
" </tr>\n",
" <tr>\n",
" <th>893</th>\n",
" <td>0.873482</td>\n",
" <td>1.322876</td>\n",
" <td>1.371370</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.512278</td>\n",
" <td>-0.231082</td>\n",
" <td>0.207099</td>\n",
" <td>0.105643</td>\n",
" <td>-1.238278</td>\n",
" <td>-1.662873</td>\n",
" <td>0.453521</td>\n",
" </tr>\n",
" <tr>\n",
" <th>894</th>\n",
" <td>-0.315819</td>\n",
" <td>-0.755929</td>\n",
" <td>2.553537</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.464100</td>\n",
" <td>-1.955941</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>-1.652873</td>\n",
" <td>-0.249340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>895</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>-0.204852</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.482475</td>\n",
" <td>-0.231082</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>-1.642873</td>\n",
" <td>-1.153019</td>\n",
" </tr>\n",
" <tr>\n",
" <th>896</th>\n",
" <td>0.873482</td>\n",
" <td>1.322876</td>\n",
" <td>-0.598908</td>\n",
" <td>0.619896</td>\n",
" <td>-0.417492</td>\n",
" <td>-0.231082</td>\n",
" <td>0.207099</td>\n",
" <td>0.764728</td>\n",
" <td>-1.238278</td>\n",
" <td>-1.632872</td>\n",
" <td>1.658426</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1305</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>-0.204852</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.493455</td>\n",
" <td>-0.231082</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>1.797181</td>\n",
" <td>-0.952201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1306</th>\n",
" <td>-1.505120</td>\n",
" <td>1.322876</td>\n",
" <td>0.740881</td>\n",
" <td>-0.400248</td>\n",
" <td>1.314435</td>\n",
" <td>1.493778</td>\n",
" <td>5.732668</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>1.807181</td>\n",
" <td>0.051886</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1307</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>0.701476</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.507796</td>\n",
" <td>-0.231082</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>1.817182</td>\n",
" <td>0.051886</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1308</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>-0.204852</td>\n",
" <td>-0.400248</td>\n",
" <td>-0.493455</td>\n",
" <td>-0.231082</td>\n",
" <td>-0.713830</td>\n",
" <td>-0.553443</td>\n",
" <td>0.807573</td>\n",
" <td>0.787165</td>\n",
" <td>-0.851793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1309</th>\n",
" <td>0.873482</td>\n",
" <td>-0.755929</td>\n",
" <td>-0.204852</td>\n",
" <td>0.619896</td>\n",
" <td>-0.236957</td>\n",
" <td>1.493778</td>\n",
" <td>2.048955</td>\n",
" <td>0.764728</td>\n",
" <td>-1.238278</td>\n",
" <td>1.827182</td>\n",
" <td>-0.349749</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>418 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" Pclass Sex Age Parch Fare Embarked \\\n",
"PassengerId \n",
"892 0.873482 -0.755929 0.386231 -0.400248 -0.497413 -1.955941 \n",
"893 0.873482 1.322876 1.371370 -0.400248 -0.512278 -0.231082 \n",
"894 -0.315819 -0.755929 2.553537 -0.400248 -0.464100 -1.955941 \n",
"895 0.873482 -0.755929 -0.204852 -0.400248 -0.482475 -0.231082 \n",
"896 0.873482 1.322876 -0.598908 0.619896 -0.417492 -0.231082 \n",
"... ... ... ... ... ... ... \n",
"1305 0.873482 -0.755929 -0.204852 -0.400248 -0.493455 -0.231082 \n",
"1306 -1.505120 1.322876 0.740881 -0.400248 1.314435 1.493778 \n",
"1307 0.873482 -0.755929 0.701476 -0.400248 -0.507796 -0.231082 \n",
"1308 0.873482 -0.755929 -0.204852 -0.400248 -0.493455 -0.231082 \n",
"1309 0.873482 -0.755929 -0.204852 0.619896 -0.236957 1.493778 \n",
"\n",
" Title FamilySize Alone LName NameLength \n",
"PassengerId \n",
"892 -0.713830 -0.553443 0.807573 -1.672873 -1.153019 \n",
"893 0.207099 0.105643 -1.238278 -1.662873 0.453521 \n",
"894 -0.713830 -0.553443 0.807573 -1.652873 -0.249340 \n",
"895 -0.713830 -0.553443 0.807573 -1.642873 -1.153019 \n",
"896 0.207099 0.764728 -1.238278 -1.632872 1.658426 \n",
"... ... ... ... ... ... \n",
"1305 -0.713830 -0.553443 0.807573 1.797181 -0.952201 \n",
"1306 5.732668 -0.553443 0.807573 1.807181 0.051886 \n",
"1307 -0.713830 -0.553443 0.807573 1.817182 0.051886 \n",
"1308 -0.713830 -0.553443 0.807573 0.787165 -0.851793 \n",
"1309 2.048955 0.764728 -1.238278 1.827182 -0.349749 \n",
"\n",
"[418 rows x 11 columns]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Feature Engineering:\n",
"test_df['Title'] = test_df.Name.str.extract(r'([A-Za-z]+)\\.')\n",
"test_df['LName'] = test_df.Name.str.extract(r'([A-Za-z]+),')\n",
"test_df['NameLength'] = test_df.Name.apply(len)\n",
"test_df['FamilySize'] = 1 + test_df.SibSp + test_df.Parch\n",
"test_df['Alone'] = test_df.FamilySize.apply(lambda x: 1 if x==1 else 0)\n",
"test_df.Title = test_df.Title.map(title_dict)\n",
"\n",
"# Feature Selection\n",
"test_df = test_df.drop(todrop, axis=1)\n",
"\n",
"# Imputation of missing age and fare data\n",
"test_df.loc[test_df.Age.isna(), 'Age'] = test_df.Age.median()\n",
"test_df.loc[test_df.Fare.isna(), 'Fare'] = test_df.Fare.median()\n",
"\n",
"# encode categorical data\n",
"for i in test_df.columns:\n",
" if test_df[i].dtype == 'object':\n",
" test_df[i], _ = pd.factorize(test_df[i])\n",
" \n",
"# center and scale data \n",
"test_df = pd.DataFrame(pre.scale(test_df), columns=test_df.columns, index=test_df.index)\n",
"\n",
"# ensure columns of unlabeled data are in same order as training data.\n",
"test_df = test_df[x_test.columns]\n",
"test_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Make Final Predictions and Common Sense Check:\n",
"\n",
"Roughly 32 percent of the passengers aboard the Titanic lived. We will do a last, common sense check to see if our algorithm predicts roughly the same distribution of survivals. Since __Survived__ variable with value 1 implies survival, we can simply add all instances of survival and divide by the total number of passengers to get a rough idea of our predicted distribution. \n",
"\n",
"Keep in mind, the competition organizers could have been tricky and given us uneven distributions for training and testing. In that case, this might not work, but I'm assuming they did not. "
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"final = tuned_rf.predict(test_df)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.3660287081339713"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"final.sum()/len(final)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>PassengerId</th>\n",
" <th>Survived</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>892</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>893</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>894</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>895</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>896</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>413</th>\n",
" <td>1305</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>414</th>\n",
" <td>1306</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>415</th>\n",
" <td>1307</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>416</th>\n",
" <td>1308</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>417</th>\n",
" <td>1309</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>418 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" PassengerId Survived\n",
"0 892 0\n",
"1 893 0\n",
"2 894 0\n",
"3 895 0\n",
"4 896 1\n",
".. ... ...\n",
"413 1305 0\n",
"414 1306 1\n",
"415 1307 0\n",
"416 1308 0\n",
"417 1309 1\n",
"\n",
"[418 rows x 2 columns]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"submission = pd.DataFrame({'PassengerId':test_df.index,\n",
" 'Survived':final})\n",
"submission"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"submission.to_csv('submission2.csv', index=False)"
]
}
],
"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.8.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment