{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Predicting the Severity of Service Disruptions on the Telstra Network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Telstra](https://en.wikipedia.org/wiki/Telstra) is Australia's largest telecommunications provider. In a [Kaggle challenge](https://www.kaggle.com/c/telstra-recruiting-network), the company provides a dataset of service disruptions, the severity of which is rated on a scale from 0 to 2 (2 being most severe). In addition to the severity of a disruption, a number of features from service logs is provided in different files.\n",
"\n",
"In this notebook, I will consolidate the data from the different files and build a simple model to predict the severity of service disruptions.\n",
"\n",
"__[1. Loading Data](#1)__
\n",
"
\n",
"__[2. Preparing Features](#2)__
\n",
"[2.1. severity_type](#2.1)
\n",
"[2.2. resource_type](#2.2)
\n",
"[2.3. log_feature](#2.3)
\n",
"[2.4. event_type](#2.4)
\n",
"
\n",
"__[3. Preparing Training and Test Sets](#3)__
\n",
"[3.1. Training Set](#3.1)
\n",
"[3.2. Test Set](#3.2)
\n",
"[3.3. Merging Training/Test and Feature Dataframes](#3.3)
\n",
"
\n",
"__[4. Classification Model](#4)__
\n",
"[4.1. Training the Model](#4.1)
\n",
"[4.2. Making Predictions for the Test Set](#4.2)
\n",
"[4.3. Attempts to Improve the Model](#4.3)
\n",
"[4.3.1. Add Features by Correlation with Target](#4.3.1)
\n",
"[4.3.2. Recursive Feature Elimination (RFE)](#4.3.2)
\n",
"[4.3.3. Principal Component Analysis](#4.3.3)
\n",
"[4.3.4. PCA with Polynomial Features](#4.3.4)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.core.display import display, HTML\n",
"display(HTML(\"\"))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import csv\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.naive_bayes import GaussianNB\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.svm import SVC\n",
"from sklearn.feature_selection import RFE\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.preprocessing import PolynomialFeatures"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Loading Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data are spread out over multiple files which share a common index. There are 4 files containing features (`severity_type.csv`, `resource_type.csv`, `log_feature.csv`, `event_type.csv`) in addition to two files containing the target variable (`fault_severity`) and another feature (`location`), split into training and test sets.\n",
"\n",
"I will first load the training set (`train.csv`) and the 4 features into separate `DataFrame`s. Two of the file contain an incomplete third column which is the value 1 for a number of entries at the end of the file. This incomplete column will not be included as it is likely not a real feature."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Load the different files into different dataframes\n",
"df = pd.read_csv('train.csv')\n",
"severity_type = pd.read_csv('severity_type.csv')\n",
"resource_type = pd.read_csv('resource_type.csv', usecols=[0,1])\n",
"log_feature = pd.read_csv('log_feature.csv')\n",
"event_type = pd.read_csv('event_type.csv', usecols=[0,1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Preparing Features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the following, I will examine and transform each dataframe by checking the data types, whether the index is unique, extracting numerical features from string features, using one-hot encoding where appropriate, and checking for outliers and missing values."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.1. severity_type"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" severity_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" severity_type 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" severity_type 2 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" severity_type 2 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" severity_type 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 6852 | \n",
" severity_type 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id severity_type\n",
"0 6597 severity_type 2\n",
"1 8011 severity_type 2\n",
"2 2597 severity_type 2\n",
"3 5022 severity_type 1\n",
"4 6852 severity_type 1"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"severity_type.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id int64\n",
"severity_type object\n",
"dtype: object"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"severity_type.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This dataframe only contains one feature which is a string including the word \"severity_type\" and a number."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 18552\n",
"Entries : 18552\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(severity_type['id'].unique()))\n",
"print('Entries : ', len(severity_type['id']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Each ID in this dataframe is assigned only one value for the feature `severity_type`."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"severity_type 0\n",
"dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check for missing values\n",
"severity_type.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are no missing values in this dataframe.\n",
"\n",
"In the following, I'm defining a function that converts a string feature containing a fixed string and a number into a numerical feature."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def string_feature_to_numeric(df, col, fix_str):\n",
" '''\n",
" Checks that the column of a feature contains only integer numbers\n",
" in addition to a fixed string, then converts the feature to a \n",
" numerical one, removing the string.\n",
" df: DataFrame to operate on\n",
" col: Column of df to convert\n",
" fix_str: string preceding integer numbers in each sample\n",
" '''\n",
" \n",
" # Check that everything that follows the string is an integer number\n",
" # num_faults is the number of samples that do NOT contain integer\n",
" num_faults = \\\n",
" (df[col].str.replace(fix_str,'').apply(str.isdigit) == False).sum()\n",
" \n",
" # Convert feature from string to integer\n",
" if num_faults == 0:\n",
" df[col] = df[col].str.replace(fix_str,'').astype(int)\n",
" else:\n",
" print('Could not convert feature to integer.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using the above function, I'm converting the `severity_type` feature to an integer format."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"string_feature_to_numeric(severity_type, 'severity_type', 'severity_type ')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" severity_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" 2 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" 2 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 6852 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id severity_type\n",
"0 6597 2\n",
"1 8011 2\n",
"2 2597 2\n",
"3 5022 1\n",
"4 6852 1"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"severity_type.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 1, 4, 5, 3])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"severity_type['severity_type'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The severity type is categorized into five different categories, but it was explicitly mentioned in the description of the data that there is no ordering to these five categories. The following histogram shows that types 1 and 2 are far more common than the rest."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\niaiqB8ZCI8nhSf6hv2nc55Lsl+Q3k3x5bOUkS5Osm6h/374mybvSPSPhzCRvTvK6JCcBy4GL+z2d\nE5L8/bj3/r0knxpfbJLXAE8Grkv37JH/kuRd45b/1yTn9XXdleTiJHemu+HeEyarU5q2HXFvdl++\ndpYXsAi4he7ZHe8F/kPfvhvwJWDffv5k4MJ++hbgoH76DcD/mqL/GuC947b5Zrq9jLFly/vp0N3u\nY+w9Pgr8x+3UvIH+uQt9/V8HduvnvwQsA5bS3S316L79QuB1k9Xpy9d0Xwv2liNamKpqS5LDgX8P\nHANckmQlcCNwKHB1fxuHXYCx+/pcSvcf7jn9z5OBp03SH+CSEWqpJB8GXpbkg8CzgFeMUP+1wAuT\n3EkXIOvS3Vb+nqr6p77rR4DXAJ+dok6pmcGhBaeqHqX7y39Nf9jpVGAtcHtVPWs7q1wCfDzJJ7vV\n62tJlk3SH+DHI5bzQbpbc/8E+HiNOx8yiQ/Q3ZPrrn79MduesCy6vZrJ6pSaeY5DC0qSpyU5eFzT\nM4FvAXcD+/Ynz0myW/qHPlXV14FHgTfxiz2JCftP4Ud0j7mlf+/vAN+hO/z1wRHXuYHudtl/AHxs\nXL+njNXTL/viDOqUJmRwaKFZRHd32DuS3AocAry5qh6hu5Pu25P8M915jWePW+8S4GV0h60Yof9E\n/g54f39yfI++7WK6w0wT3ZJ7FfDZJNeNa7sU+KeqenBc2910D/S5E9gbeN8M6pQm5OW40hxL8jfA\nzVV1QcM6VwLnVdU1/fxS4MqqmhdPGdRjm3sc0hxKshZ4Bt3J7FH6L07yVeDhsdCQZpt7HJKkJu5x\nSJKaGBySpCYGhySpicEhSWpicEiSmhgckqQm/w9iVwTzuyRANAAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"severity_type['severity_type'].hist()\n",
"plt.xlabel('Severity type')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since it was mentioned specifically that this feature is not ordinal, I'm going to use one-hot encoding to create five binary features for each of the categories."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# one-hot encoding for severity_type\n",
"tmp = pd.get_dummies(severity_type['severity_type'])\n",
"tmp.columns = np.add(['ST' for x in range(5)], tmp.columns.astype(str))\n",
"\n",
"# Merge new features with index, drop old feature\n",
"severity_type = pd.concat([severity_type, tmp], axis=1)\\\n",
" .drop('severity_type', axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" ST1 | \n",
" ST2 | \n",
" ST3 | \n",
" ST4 | \n",
" ST5 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 6852 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id ST1 ST2 ST3 ST4 ST5\n",
"0 6597 0 1 0 0 0\n",
"1 8011 0 1 0 0 0\n",
"2 2597 0 1 0 0 0\n",
"3 5022 1 0 0 0 0\n",
"4 6852 1 0 0 0 0"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"severity_type.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.2. resource_type"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" resource_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" resource_type 8 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" resource_type 8 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" resource_type 8 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" resource_type 8 | \n",
"
\n",
" \n",
" 4 | \n",
" 6852 | \n",
" resource_type 8 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id resource_type\n",
"0 6597 resource_type 8\n",
"1 8011 resource_type 8\n",
"2 2597 resource_type 8\n",
"3 5022 resource_type 8\n",
"4 6852 resource_type 8"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"resource_type.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id int64\n",
"resource_type object\n",
"dtype: object"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"resource_type.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, the dataframe only contains one feature and it is in the form of a fixed string followed by a number."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 18552\n",
"Entries : 22877\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(resource_type['id'].unique()))\n",
"print('Entries : ', len(resource_type['id']))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"resource_type 0\n",
"dtype: int64"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Checking for missing values\n",
"resource_type.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are no missing values."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"resource_type 30\n",
"dtype: int64"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# There are some IDs with more than 5 resources\n",
"(resource_type.groupby('id').count() > 5).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this case, the index is not unique. Rather, some indices are assigned multiple values for `resource_type`."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# Convert string feature to numerical\n",
"string_feature_to_numeric(resource_type, 'resource_type', 'resource_type ')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sort(resource_type['resource_type'].unique())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The resources are categorized into 10 different categories. From the following histogram we can tell that two of them (2 and 8) are more common than others."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEKCAYAAADaa8itAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGP9JREFUeJzt3X2QXXWd5/H3ZxMfwCdA3C5MmAk7ZrHQlAoZQJm1eoyD\nCK6han3AYTQoO9ly8GFmU+PE3a1ifWAFR8aBmR01JWh0WBDRKlLCiimk1d1VRB4kPKhEjZIMihpA\nIyq2fveP+2vTHTtJk5x7b195v6pu9Tm/e+45v/Prc/vTv/OYqkKSpC78q2FXQJL0u8NQkSR1xlCR\nJHXGUJEkdcZQkSR1xlCRJHXGUJEkdcZQkSR1xlCRJHVmYb9mnORi4CXAvVX1zFb2t8C/Bx4Cvgm8\ntqrub++9FTgT+BXwpqq6ppWfBFwALAA+WFXntvIjgMuAJwM3Aq+uqof2Vq9DDz20lixZ0uGaDt5P\nf/pTHve4xw27GvOCbTGT7TGT7bHT/rbFjTfe+MOqespeJ6yqvryA5wNHA7dNKzsRWNiGzwPOa8NH\nAV8FHgMcQS9wFrTXN4F/Azy6TXNU+8zlwGlt+P3A6+dSr2OOOaZG3XXXXTfsKswbtsVMtsdMtsdO\n+9sWwFdqDn9j+7b7q6o+D2zfpewzVTXZRr8ELG7DK4HLquoXVfVtYDNwbHttrqpvVa8XchmwMkmA\nFwBXtM+vB07t17pIkuamb7u/5uB1wMfa8CJ6ITNlaysDuHuX8uPo7fK6f1pATZ/+tyRZDawGGBsb\nY2JiYn/rPlQ7duwY+XXoim0xk+0xk+2x06DaYiihkuS/ApPAJYNYXlWtA9YBLF++vMbHxwex2L6Z\nmJhg1NehK7bFTLbHTLbHToNqi4GHSpIz6B3AX9H20wFsAw6fNtniVsZuyn8EHJRkYeutTJ9ekjQk\nAz2luJ3J9RbgpVX14LS3NgCnJXlMO6trKfBl4AZgaZIjkjwaOA3Y0MLoOuBl7fOrgCsHtR6SpNn1\nLVSSXAp8ETgyydYkZwL/CDwB2JjkliTvB6iq2+mdzXUH8GngrKr6VeuFvAG4BrgTuLxNC/A3wH9O\nspneMZaL+rUukqS56dvur6p61SzFu/3DX1XnAOfMUn41cPUs5d+id3aYJGme8Ip6SVJnDBVJUmeG\neZ2KpEe4JWuv6uv81yyb5IxZlrHl3FP6utxHMnsqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKk\nzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4Y\nKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM70LVSSXJzk3iS3TSs7JMnGJHe1nwe38iS5MMnm\nJLcmOXraZ1a16e9Ksmpa+TFJNrXPXJgk/VoXSdLc9LOn8mHgpF3K1gLXVtVS4No2DvBiYGl7rQbe\nB70QAs4GjgOOBc6eCqI2zZ9P+9yuy5IkDVjfQqWqPg9s36V4JbC+Da8HTp1W/pHq+RJwUJLDgBcB\nG6tqe1XdB2wETmrvPbGqvlRVBXxk2rwkSUMy6GMqY1V1Txv+HjDWhhcBd0+bbmsr21P51lnKJUlD\ntHBYC66qSlKDWFaS1fR2qzE2NsbExMQgFts3O3bsGPl16IptMdOotceaZZN9nf/YAbMvY5TaqCuD\n2jYGHSrfT3JYVd3TdmHd28q3AYdPm25xK9sGjO9SPtHKF88y/ayqah2wDmD58uU1Pj6+u0lHwsTE\nBKO+Dl2xLWYatfY4Y+1VfZ3/mmWTnL/pt//MbTl9vK/LnY8GtW0MevfXBmDqDK5VwJXTyl/TzgI7\nHnig7Sa7BjgxycHtAP2JwDXtvR8nOb6d9fWaafOSJA1J33oqSS6l18s4NMlWemdxnQtcnuRM4DvA\nK9rkVwMnA5uBB4HXAlTV9iTvAG5o0729qqYO/v8FvTPMDgD+d3tJkoaob6FSVa/azVsrZpm2gLN2\nM5+LgYtnKf8K8Mz9qaMkqVteUS9J6oyhIknqjKEiSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyhIknq\njKEiSerM0O5SrLlbsstN99Ysm+z7jfimbDn3lIEsR9LvBnsqkqTOGCqSpM4YKpKkzhgqkqTOGCqS\npM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTO\nGCqSpM4MJVSS/FWS25PcluTSJI9NckSS65NsTvKxJI9u0z6mjW9u7y+ZNp+3tvKvJ3nRMNZFkrTT\nwEMlySLgTcDyqnomsAA4DTgPeG9VPQ24DzizfeRM4L5W/t42HUmOap97BnAS8E9JFgxyXSRJMw1r\n99dC4IAkC4EDgXuAFwBXtPfXA6e24ZVtnPb+iiRp5ZdV1S+q6tvAZuDYAdVfkjSLgYdKVW0D3gN8\n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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"resource_type['resource_type'].hist()\n",
"plt.xlabel('Resource')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since it can be assumed that the categories are not ordinal in nature, I'm going to encode them with one-hot encoding."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#One-hot encoding of resource_type\n",
"tmp = pd.get_dummies(resource_type['resource_type'])\n",
"\n",
"# Name the columns RTx where x is the category\n",
"tmp.columns = np.add(['RT' for x in range(10)], tmp.columns.astype(str))\n",
"\n",
"# Merge resource_type with new features, drop original feature\n",
"resource_type = pd.concat([resource_type, tmp], axis=1)\\\n",
" .drop('resource_type', axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" RT1 | \n",
" RT2 | \n",
" RT3 | \n",
" RT4 | \n",
" RT5 | \n",
" RT6 | \n",
" RT7 | \n",
" RT8 | \n",
" RT9 | \n",
" RT10 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 6852 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id RT1 RT2 RT3 RT4 RT5 RT6 RT7 RT8 RT9 RT10\n",
"0 6597 0 0 0 0 0 0 0 1 0 0\n",
"1 8011 0 0 0 0 0 0 0 1 0 0\n",
"2 2597 0 0 0 0 0 0 0 1 0 0\n",
"3 5022 0 0 0 0 0 0 0 1 0 0\n",
"4 6852 0 0 0 0 0 0 0 1 0 0"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"resource_type.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since I noted that the index isn't unique, i.e. that there are multiple instances of one index with different categories, I'm grouping the entries by index and summing up the entries for each category."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"resource_type = resource_type.groupby('id', as_index=False).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.3. log_feature"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" log_feature | \n",
" volume | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" feature 68 | \n",
" 6 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" feature 68 | \n",
" 7 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" feature 68 | \n",
" 1 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" feature 172 | \n",
" 2 | \n",
"
\n",
" \n",
" 4 | \n",
" 5022 | \n",
" feature 56 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id log_feature volume\n",
"0 6597 feature 68 6\n",
"1 8011 feature 68 7\n",
"2 2597 feature 68 1\n",
"3 5022 feature 172 2\n",
"4 5022 feature 56 1"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"log_feature.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id int64\n",
"log_feature object\n",
"volume int64\n",
"dtype: object"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"log_feature.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 18552\n",
"Entries : 58671\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(log_feature['id'].unique()))\n",
"print('Entries : ', len(log_feature['id']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This dataframe contains two features, `log_feature` and `volume`. The former is again a string features containing the numerical value after a fixed expression. The index is not unique in this dataframe either. Instead, a single ID can correspond to several log features."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"log_feature 0\n",
"volume 0\n",
"dtype: int64"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# No missing values\n",
"log_feature.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are no missing data in this dataframe."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"log_feature['volume'].hist(bins=100, log=True)\n",
"plt.xlabel('Volume')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The distribution for `volume` shows that there are no extreme outliers.\n",
"\n",
"Next, I'm converting the log feature from string to a numerical value:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"string_feature_to_numeric(log_feature, 'log_feature', 'feature ')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following two graphics show the distribution of log features. Some of them are much more common than others, but there are no extreme outliers."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAELCAYAAADHksFtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGMNJREFUeJzt3X+UZ3V93/HnWxAkTFyj4B4D2EWXY6RgDUwAA/XsajWL\nuBLtVkBC5QTcQ1ISe0qqa+1pNB6PxhxqmkqCW0LQaFgRasqua8AqE6RFWRaRXX6ZDdCGPcqW0Gwz\nYMTFd/+4d3a/O87cud+Z7/d+7515Ps6Zs99753vvfc3nu9/v+/v53F+RmUiSNJvnjTqAJKndLBSS\npEoWCklSJQuFJKmShUKSVMlCIUmqZKGQJFWyUEiSKlkoJEmVDh11gIU46qijcsWKFX0v9/TTT3Pk\nkUcOPtCAmG/+2pwN2p2vzdmg3fnanA1+Mt/27dufzMyja68gMzv7c+qpp+Z83HbbbfNarinmm782\nZ8tsd742Z8tsd742Z8v8yXzA3dnHZ61DT5KkSq0qFBFxZETcHRFvHXUWSVJhqIUiIq6NiD0RsXPa\n/DUR8XBE7IqIDT2/ej9wwzAzSZL6M+wexXXAmt4ZEXEIcBVwNnAicEFEnBgRbwIeAPYMOZMkqQ9D\nPeopM2+PiBXTZp8G7MrMRwAiYhNwLjAGHElRPH4QEVsz88fDzCdJmlvkkG9cVBaKLZl5Ujm9DliT\nmZeW0xcBp2fm5eX0xcCTmblllvWtB9YDLF++/NRNmzb1nWlycpKxsbG+l2uK+eavzdmg3fnanA3a\nna/N2eAn861evXp7Zo7XXkE/h0jN5wdYAezsmV4HXNMzfRHwqfms28NjR6PN+dqcLbPd+dqcLbPd\n+dqcLbObh8fuBo7rmT62nCdJaqFRnJm9DTghIo6nKBDnA+/qZwURsRZYu3LlyiHEk7ptxYYv73/8\n2MfPGWESLRbDPjz2euBO4FUR8XhEXJKZ+4DLgVuAB4EbMvP+ftabmZszc/2yZcsGH1qSdJBhH/V0\nwSzztwJbh7ltSdJgtOrM7LoiYm1EbNy7d++oo0jSotfJQuHQkyQ1p5OFQpLUnE4WCoeeJKk5nSwU\nDj1JUnM6fYc7SQLPHRm2TvYoJEnN6WShcB+FJDWnk4XCfRSS1JxOFgpJUnMsFJKkSp0sFO6jkKTm\ndLJQuI9CkprjeRSSFhXPqRi8TvYoJEnNsVBIkipZKCRJlTpZKDzqSZKa08lC4VFPktScThYKSVJz\nPDx2ifIQQkl12aOQJFWyRyE1zN6cusYehSSpUicLhYfHSlJzOlkoPDxWkprTyUIhSWqOhUKSVMmj\nnhYhj6qRNEgWCkmd1PuFSMPl0JMkqZKFQpJUyUIhSapkoZAkVepkofDMbElqTicLhWdmS1JzOlko\nJEnNsVBIkipZKCRJlTwzu6WGcRmOLp3J2uRlSLzkiVTNHoUkqZI9Cqmj7AmpKRaKRaJLw0qLlR/c\nWqwcepIkVbJQSJIqOfQktZxDWho1exSSpEqtKRQR8eqIuDoiboyIXxt1HklSYaiFIiKujYg9EbFz\n2vw1EfFwROyKiA0AmflgZl4GvBM4c5i5JEn1DbtHcR2wpndGRBwCXAWcDZwIXBARJ5a/exvwZWDr\nkHNJkmoaaqHIzNuBp6bNPg3YlZmPZOazwCbg3PL5N2fm2cCFw8wlSaovMnO4G4hYAWzJzJPK6XXA\nmsy8tJy+CDgduBF4B3A4cF9mXjXL+tYD6wGWL19+6qZNm/rONDk5ydjYWN/LNWVycpJH9z63f/rk\nY+a+78aO3TPfxKl32TrPqZtv2O3Xm7WffPPJNt9tVa2nV+86F/razvZ61pk/ly68L3rzzdbevRby\nevaja223evXq7Zk5Xnf51hwem5kTwESN520ENgKMj4/nqlWr+t7WxMQE81muKRMTE1x5x9P7px+7\ncNWcy1w8y5nZvcvWeU4dTbRfb9Z+8s0n23y3VbWeg+w48FpecfJzXLnjwNuu39d21tezZxu9b+th\nt12Tpuebtb17LOT17EfX2q5fozjqaTdwXM/0seU8SVILjaJQbANOiIjjI+Iw4Hzg5n5W4D2zJak5\nwz489nrgTuBVEfF4RFySmfuAy4FbgAeBGzLz/n7W6z2zJak5Q91HkZkXzDJ/Kx4CW5uXcJA0Sq3Z\nmd2PiFgLrF25cuWoo0jSQE2/ZUAbvhy25hIe/XDoSZKa08lCIUlqjkNPklptaijmipP3sWq0UZas\nThaKzNwMbB4fH3/PqLNocfHAAeknOfQkSarUyR6FpMXH3lx7dbJH4ZnZktScThYKD4+VpOY49CRJ\nI9ClobZO9igkSc3pZI/C8yikburSt2gd0MlC4XkUWqqmXweoTSwCi5dDT5KkShYKSVIlC4UkqZKF\nQpJUqZOFwjOzJak5nSwUnpktSc3pZKGQJDXHQiFJqlSrUETEJyLihRHx/Ij4WkT8n4j4lWGHk5aS\nFRu+vP9HapO6Z2a/OTPfFxFvBx4D3gHcDnxuWMGWCs9mlbplKb5n6xaKqeedA3wxM/dGxJAiSe2z\nFD8cpCl191FsiYiHgFOBr0XE0cA/DC9WNQ+PlaTm1CoUmbkB+EVgPDN/BDwDnDvMYHPk8fBYSWpI\n3Z3ZPwX8OvBH5ayfBcaHFUqS1B5191H8CbCdolcBsBv4IrBlGKE0OHWOoHH8XVKVuvsoXpmZnwB+\nBJCZzwDuzZakJaBuoXg2Io4AEiAiXgn8cGipJEmtUXfo6beBvwCOi4jPA2cCFw8rlDQMDrFJ81Or\nUGTmVyPiHuAMiiGn92bmk0NNJklqhcpCERGnTJv1vfLfl0fEyzPznuHEkiS1xVw9iisrfpfAGwaY\nRZLUQpWFIjNXNxWkHxGxFli7cuXKUUeRFsQLAKoLau2jiIgXUJxwdxZFT+IbwNWZOZLLeGTmZmDz\n+Pj4e0ax/aXCnb/Swi2G91Hdo54+C/w98J/L6XcBfwr8i2GEktpsMbzxpX7ULRQnZeaJPdO3RcQD\nwwgkSWqXuifc3RMRZ0xNRMTpwN3DiSRJapO6PYpTgf8ZEf+7nH458HBE7AAyM18zlHSSpJGrWyjW\nDDWFpKFYbPtTPEpsNOqemf2/IuJngON6l/GEO7XRYvtwlEat7uGxH6G4ttNfU14YEE+464sfXpK6\nqu7Q0zspLjX+7DDDLHVTxeSKk/dR/6WR1HVtH1Kr+2m0E3gRsGeIWaTGtP2NKbVJ3ULxMeDbEbGT\nnvtQZObbhpJKktQadQvFZ4DfBXYAPx5eHElS29QtFM9k5h8MNQkQEb8MnAO8EPjjzLx12NuUJFWr\ne2b2NyLiYxHxuog4ZeqnzoIRcW1E7CmHrXrnr4mIhyNiV0RsAMjMP8/M9wCXAef19ZdIkoaibo/i\n58t/z+iZV/fw2OuAT1FcWBCAiDgEuAp4E/A4sC0ibs7MqetH/fvy95I6yMPBF5e6J9zN+74UmXl7\nRKyYNvs0YFdmPgIQEZuAcyPiQeDjwFc8mW9uHrkjqQmRmXM/C4iIc4B/DLxgal5m/k7NZVcAWzLz\npHJ6HbAmMy8tpy8CTge+C7wb2Abcm5lXz7Cu9cB6gOXLl5+6adOmWvl7TU5OMjY21vdyC7Fj9979\nj08+ZtmM86csPwKe+MHM65lr2YWabf2982drv+l5epfp12zbnsvk5CSP7n1u3tvtVaet+309ql7b\nhay3jrnacaHvi37baHqeud4jddtutm0Pykw5q9qun/f+TAbxN0zPt3r16u2ZOV53+bpnZl8N/BSw\nGrgGWAfc1V/UuZU7zCt3mmfmRmAjwPj4eK5atarv7UxMTDCf5Rbi4t6u+IWrZpw/5YqT93Hljplf\nmrmWXajZ1t87f7b2m56nd5l+zbbtuUxMTHDlHU/Pe7u96rR1v69H1Wu7kPXWMVc7LvR90W8bTc8z\n13ukbtvNtu1BmSlnVdv1896fySD+hoW+tnVb/Rcz8zURcV9mfjgirgS+Mu+twm6K60ZNObacJ2mJ\ncOi0O+oe9TTV4XsmIn4W2Ae8bAHb3QacEBHHR8RhwPnAzXUXjoi1EbFx797BD71Ikg5Wt1BsiYgX\nAZ8AtgOPAtfXWTAirgfuBF4VEY9HxCWZuQ+4HLgFeBC4ITPvrxs6Mzdn5vplywY//ihJOljl0FNE\n/ALwN5n5kXJ6jOLs7IeAT9bZQGZeMMv8rcDWvtLK7rqkxs3Vo/g08CxARLye4tDVTwN7KXcoj4JD\nT5LUnLl2Zh+SmU+Vj88DNmbmTcBNEXHvcKPNLjM3A5vHx8ffM6oMkuqxF9x9cxaKiDi03KfwRsrz\nF2ouq0Vqx+69+w/tW+pn3fohqKVgrg/764G/jIgnKY58+gZARKykGH4aiYhYC6xduXLlqCJI6gAv\nJTIYlYUiMz8aEV+jOBT21jxwGvfzgN8YdriKXJ0eevJbqKQumXP4KDO/OcO87w4njrrGoictfu5n\nkKQBW2xfoDpZKNxHIaltFltx6NXJQtH1fRRLkTsVtRit6LlgYUc/TmupewkPSdISZaGQJFXqZKHw\nEh6S1JxODqq5j0Lqn/uJNF+dLBRaPPzwktrPQqFaej/Qrzh5hEEkNa6T+ygkSc2xUEiSKnVy6Mkz\nszXdUjnxSRqFTr6jPOppaXGHtzRaDj1Jkip1skcxCP1+S53Pt9rFfJEwSUuHPQpJUqUl26PoNcgx\ncHsRw+X+Cql59igkSZU6WSi8KKAkNaeThSIzN2fm+mXLlo06iiQteu6jmMYxcEk6WCd7FJKk5lgo\nJEmVLBSSpEoWCklSJQuFJKmSRz0NgGdjS1rM7FFIkip1slB4ZrYkNaeTQ0/euKgbuj4k1/X80qB0\nskchSWqOhUKSVKmTQ09NcehBkuxRSJLmYKGQJFWyUEiSKlkoJEmV3JmtxnmQgNQt9igkSZXsUcyD\n34glLSX2KCRJlVrTo4iIVwAfBJZl5rpR55GkQevqaMRQexQRcW1E7ImIndPmr4mIhyNiV0RsAMjM\nRzLzkmHmkST1b9g9iuuATwGfnZoREYcAVwFvAh4HtkXEzZn5wJCzqOX6/bbV1W9nUtcMtUeRmbcD\nT02bfRqwq+xBPAtsAs4dZg5J0vxFZg53AxErgC2ZeVI5vQ5Yk5mXltMXAacDvw18lKKncU1mfmyW\n9a0H1gMsX7781E2bNvWdaXJykkf3Ptf3ck1ZfgQ88YPRbPvkY5btf7xj98w3hhplvrm0ORvUz1fn\ndViI3vVPmZycZGxsbN7rHGTOmf7+hb62M/3NveufbbtV86c09f9utr9hLtNf29WrV2/PzPG6y7dm\nZ3Zm/i1wWY3nbQQ2AoyPj+eqVav63tbExARX3vF038s15YqT93HljtG8NI9duGr/44tnGdoZZb65\ntDkb1M9X53VYiN71T5mYmGA+76cpg8w509+/0Nd2pr+5d/2zbbdq/pSm/t/N9jfMZaGv7SgOj90N\nHNczfWw5T5LUQqP46rUNOCEijqcoEOcD7+pnBRGxFli7cuXKIcSTFr/eAwEe+/g5jS2rbhr24bHX\nA3cCr4qIxyPikszcB1wO3AI8CNyQmff3s97M3JyZ65ctm994nSSpvqH2KDLzglnmbwW2DnPbkqTB\naO9evwoOPQ2P5yYsbf0OK3Xp/8tiGDIb1d/QyWs9OfQkSc3pZKGQJDXHoSephZoc0lnRc57CbB8J\nTQ8xDXt7Xi6mP53sUTj0JEnN6WShkCQ1x0IhSarUyUIREWsjYuPevYO/WJok6WCdLBTuo5Ck5nSy\nUEiSmmOhkCRV6mShcB+FJDWnk4XCfRSS1JxOFgpJUnMsFJKkShYKSVIlC4UkqZJXj5U0o6V+xVQd\n0MkehUc9SVJzOlkoJEnNsVBIkipZKCRJlSwUkqRKFgpJUiUPj5WkkocEz6yTPQoPj5Wk5nSyUEiS\nmmOhkCRVslBIkipZKCRJlSwUkqRKFgpJUiULhSSpkoVCklQpMnPUGfo2dWY2cB7wV/NYxVHAkwMN\nNVjmm782Z4N252tzNmh3vjZng5/M948y8+i6C3eyUCxURNydmeOjzjEb881fm7NBu/O1ORu0O1+b\ns8HC8zn0JEmqZKGQJFVaqoVi46gDzMF889fmbNDufG3OBu3O1+ZssMB8S3IfhSSpvqXao5Ak1bTk\nCkVErImIhyNiV0RsGHUegIh4LCJ2RMS9EXF3Oe/FEfHViPir8t+faSjLtRGxJyJ29sybMUsU/qBs\ny/si4pQR5ftQROwu2+/eiHhLz+8+UOZ7OCJ+acjZjouI2yLigYi4PyLeW84feftVZGtL270gIu6K\niO+U+T5czj8+Ir5V5vhCRBxWzj+8nN5V/n7FCLJdFxGP9rTda8v5jb8vyu0eEhHfjogt5fTg2i4z\nl8wPcAjw18ArgMOA7wAntiDXY8BR0+Z9AthQPt4A/G5DWV4PnALsnCsL8BbgK0AAZwDfGlG+DwG/\nNcNzTyxf48OB48vX/pAhZnsZcEr5+KeB75YZRt5+Fdna0nYBjJWPnw98q2yTG4Dzy/lXA79WPv51\n4Ory8fnAF0aQ7Tpg3QzPb/x9UW733wB/BmwppwfWdkutR3EasCszH8nMZ4FNwLkjzjSbc4HPlI8/\nA/xyExvNzNuBp2pmORf4bBa+CbwoIl42gnyzORfYlJk/zMxHgV0U/weGle17mXlP+fjvgQeBY2hB\n+1Vkm03TbZeZOVlOPr/8SeANwI3l/OltN9WmNwJvjIhoONtsGn9fRMSxwDnANeV0MMC2W2qF4hjg\nb3qmH6f6zdKUBG6NiO0Rsb6ctzwzv1c+/j6wfDTRKrO0qT0vL7v51/YM040sX9md/3mKb5+tar9p\n2aAlbVcOndwL7AG+StGL+bvM3DdDhv35yt/vBV7SVLbMnGq7j5Zt98mIOHx6thlyD8vvA+8DflxO\nv4QBtt1SKxRtdVZmngKcDfyriHh97y+z6CO24vC0NmXp8UfAK4HXAt8DrhxlmIgYA24C/nVm/r/e\n3426/WbI1pq2y8znMvO1wLEUvZefG1WW6aZni4iTgA9QZPwF4MXA+0eRLSLeCuzJzO3D2sZSKxS7\ngeN6po8t541UZu4u/90DfIniTfLEVHe1/HfP6BLOmqUV7ZmZT5Rv5B8D/4UDQySN54uI51N8EH8+\nM/9rObsV7TdTtja13ZTM/DvgNuB1FMM2h86QYX++8vfLgL9tMNuacjgvM/OHwJ8wurY7E3hbRDxG\nMZz+BuA/McC2W2qFYhtwQnk0wGEUO3JuHmWgiDgyIn566jHwZmBnmevd5dPeDfy30SSEiiw3A/+y\nPMrjDGBvzxBLY6aN/76dov2m8p1fHuVxPHACcNcQcwTwx8CDmfkfe3418vabLVuL2u7oiHhR+fgI\n4E0U+1FuA9aVT5vedlNtug74etlbayrbQz3FPyjG/3vbrrH3RWZ+IDOPzcwVFJ9pX8/MCxlk2w17\nT3zbfiiOSPguxfjnB1uQ5xUUR5d8B7h/KhPFmOHXKK6O+9+BFzeU53qKIYgfUYxrXjJbFoqjOq4q\n23IHMD6ifH9abv++8k3wsp7nf7DM9zBw9pCznUUxrHQfcG/585Y2tF9Ftra03WuAb5c5dgL/oef9\ncRfFzvQvAoeX819QTu8qf/+KEWT7etl2O4HPceDIqMbfFz1ZV3HgqKeBtZ1nZkuSKi21oSdJUp8s\nFJKkShYKSVIlC4UkqZKFQpJUyUIhSapkodCSERGTcz+rr/X90/Ky0/eWJ2L1u/y/G2QeaVg8j0JL\nRkRMZubYANd3NXBHZn6uqTwRcWgeuNCb1Ah7FFpyyksr/F5E7IzihlHnlfOfFxF/GBEPRXGDoa0R\nsW6WdVwKvBP4SER8vpz3byNiW3k10Q/3PPfPyysD3z91deCI+DhwRNkb+XxErIiDb8b0WxHxofLx\nRET8fhQ3tXpveUmJm8ptbYuIM4fUVBIAh879FGnReQfF1VL/CXAUsC0ibqe4uNoKipv2vJTiWkPX\nzrSCzLwmIs6iuFzCjRHxZorrIZ1GcQmHmyPi9VncP+NXM/OpcnhqW0TclJkbIuLyLK5IOnXp7yqH\nZeZ4+dw/Az6ZmXdExMuBW4BXz7cxpLlYKLQUnQVcn5nPUVzZ9S8pLhV9FvDFLK6k+v2IuK2Pdb65\n/Pl2OT1GUThuB34zIt5ezj+unN/vlU6/0PP4nwEnxoF7zbwwIsbywM11pIGyUEiDEcDHMvPTB82M\nWEXxwf66zHwmIiYoLso23T4OHgqe/pynex4/DzgjM/9hoaGlOtxHoaXoG8B5Udy17GiK+3DfBfwP\n4J+X+yqWU1yJs65bgF8tbwxERBwTES+luNb//y2LxM9R3EN5yo/Ke0QAPAG8NCJeEsWd0t5asa1b\ngd+YmoiI1/aRU+qbPQotRV+iuCnOdyguvf2+zPx+RNwEvBF4gOJWkfdQ3CZyTpl5a0S8GrizHBKa\nBH4F+Avgsoh4kOJy3d/sWWwjcF9E3JOZF0bE71AUrN3AQxWb+03gqoi4j+I9fDtwWa2/XJoHD4+V\nekyN9UfESyg+tM/MzO+POpc0SvYopINtKe9mdhjwEYuEZI9CmlNEfAk4ftrs92fmLaPIIzXNQiFJ\nquRRT5KkShYKSVIlC4UkqZKFQpJUyUIhSar0/wEys7XPFaL9gQAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"log_feature['log_feature'].hist(bins=100, log=True)\n",
"plt.xlabel('log_feature')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,4))\n",
"plt.scatter(log_feature['log_feature'], log_feature['volume'], alpha=0.1)\n",
"plt.xlabel('log_feature')\n",
"plt.ylabel('volume')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the log features are not ordinal, I'm re-encoding them in individual features, which contain the volume value."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"# create new column for each feature and fill it with volume value\n",
"tmp = pd.get_dummies(log_feature['log_feature'])\n",
"\n",
"# the column names are LFx, where x stands for the log feature\n",
"tmp.columns = np.add(['LF' for x in range(386)], tmp.columns.astype(str))\n",
"\n",
"# Fill the columns with the corresponding volume number\n",
"for col in tmp.columns:\n",
" tmp[col] *= log_feature['volume']\n",
"\n",
"# Merge new features with index and drop old log feature and volume cols\n",
"log_feature = pd.concat([log_feature, tmp], axis=1)\\\n",
" .drop(['log_feature','volume'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" LF170 | \n",
" LF171 | \n",
" LF172 | \n",
" LF173 | \n",
" LF174 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 5 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id LF170 LF171 LF172 LF173 LF174\n",
"0 6597 0 0 0 0 0\n",
"1 8011 0 0 0 0 0\n",
"2 2597 0 0 0 0 0\n",
"3 5022 0 0 2 0 0\n",
"4 5022 0 0 0 0 0\n",
"5 5022 0 0 0 0 0"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"log_feature.loc[:5,['id','LF170','LF171','LF172','LF173','LF174']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, the data are grouped by index and summed up."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"log_feature = log_feature.groupby('id', as_index=False).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.4. event_type"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" event_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" event_type 11 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" event_type 15 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" event_type 15 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" event_type 15 | \n",
"
\n",
" \n",
" 4 | \n",
" 5022 | \n",
" event_type 11 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id event_type\n",
"0 6597 event_type 11\n",
"1 8011 event_type 15\n",
"2 2597 event_type 15\n",
"3 5022 event_type 15\n",
"4 5022 event_type 11"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"event_type.head()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id object\n",
"event_type object\n",
"dtype: object"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"event_type.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this dataframe, the index is not an integer but a string. Before converting it to an integer, I'm checking that every entry is indeed an integer."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check that all entries in 'id' are actually int numbers\n",
"(event_type['id'].apply(str.isdigit) == False).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Actually, I sample contains a non-numeric ID value and I'm going to remove this sample in the following:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" event_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 31170 | \n",
" _type 50 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id event_type\n",
"31170 _type 50 1"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# There is one entry in 'id' that is not a value number\n",
"event_type[event_type['id'].apply(str.isdigit)==False]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Remove the one sample with an invald 'id'\n",
"event_type = event_type[event_type['id'].apply(str.isdigit)==True]\n",
"\n",
"# Convert 'id' to int\n",
"event_type['id'] = event_type['id'].astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 18552\n",
"Events : 34082\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(event_type['id'].unique()))\n",
"print('Events : ', len(event_type['id']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, there are IDs that are associated with multiple event types, so I'll group the entries by ID at the end of this section."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"event_type 0\n",
"dtype: int64"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Checking for missing values\n",
"event_type.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are no missing values in the dataframe. Next, I'm converting the `event_type` feature from string to numeric:"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"string_feature_to_numeric(event_type, 'event_type', 'event_type ')"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18,\n",
" 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
" 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,\n",
" 53, 54])"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sort(event_type['event_type'].unique())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are 52 distinct event types. The following histogram shows that some are much more frequent than others, but there are no extreme outliers."
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEKCAYAAAAFJbKyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFoRJREFUeJzt3X+0XWV95/H3t4kUIUqCOFk0iQ1TaLuotIh3IBancwMW\nIziGmaFCBzW4mMmaKTpMB6dGZ7qoCqvRcUqxa6qTJXSiQ4kYacmAo00D19IfoAkwhh8yRAlCFoo0\nISWCYOh3/tjPhTPhntzzJHfnnnPP+7VW1j372c8+5/vcfXI/Z/84e0dmIklSr35iuguQJA0Wg0OS\nVMXgkCRVMTgkSVUMDklSFYNDklTF4JAkVTE4JElVDA5JUpXZ011AG4455phcvHjxpP1++MMfcuSR\nR7Zf0DQahjHCcIxzGMYIwzHOfh3jli1bnszM107Wb0YGx+LFi9m8efOk/cbGxhgdHW2/oGk0DGOE\n4RjnMIwRhmOc/TrGiHikl37uqpIkVTE4JElVDA5JUhWDQ5JUxeCQJFUxOCRJVQwOSVIVg0OSVMXg\nkCRVmZHfHNfkFq+6ZcL27avPOcSVSBo0bnFIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGBySpCoGhySp\nisEhSapicEiSqhgckqQqBockqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGBySpCoGhySp\nSqvBERG/GRH3RcS9EXF9RBweEcdFxJ0RsS0ivhARh5W+P1mmt5X5izue50Ol/cGIeGubNUuS9q+1\n4IiIBcC/A0Yy8/XALOAC4OPAVZl5PLALuLgscjGwq7RfVfoRESeW5X4BWAb8YUTMaqtuSdL+tb2r\najbwyoiYDRwBPA6cAawv89cC55bHy8s0Zf6ZERGlfV1mPpeZDwPbgFNbrluS1EVrwZGZO4BPAt+l\nCYzdwBbgqczcW7o9BiwojxcAj5Zl95b+r+lsn2AZSdIhNrutJ46IeTRbC8cBTwFfpNnV1NbrrQRW\nAsyfP5+xsbFJl9mzZ09P/QZZtzFedtLel3eGgf19DPO6nGmGYZyDPsbWggN4C/BwZv4AICJuBE4H\n5kbE7LJVsRDYUfrvABYBj5VdW0cBf9vRPq5zmRdl5hpgDcDIyEiOjo5OWuDY2Bi99Btk3cZ40apb\nJuy//cKX9x0Ew7wuZ5phGOegj7HNYxzfBZZExBHlWMWZwP3AbcB5pc8K4KbyeEOZpsy/NTOztF9Q\nzro6DjgB+HqLdUuS9qO1LY7MvDMi1gN3AXuBu2m2CG4B1kXEFaXtmrLINcDnI2IbsJPmTCoy876I\nuIEmdPYCl2TmC23VLUnavzZ3VZGZlwOX79P8HSY4KyozfwT8WpfnuRK4csoLlCRV85vjkqQqBock\nqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGBySpCoGhySpisEhSapicEiSqhgckqQqBock\nqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGBySpCoGhySpyuzpLkBS/1q86pYJ27evPucQ\nV6J+4haHJKmKwSFJqmJwSJKqGBySpCoGhySpisEhSapicEiSqhgckqQqBockqYrBIUmqYnBIkqoY\nHJKkKgaHJKmKwSFJqtJqcETE3IhYHxHfiogHIuJNEXF0RGyMiIfKz3mlb0TEpyJiW0R8MyJO6Xie\nFaX/QxGxos2aJUn71/b9OK4GvpKZ50XEYcARwIeBTZm5OiJWAauADwJvA04o/04DPg2cFhFHA5cD\nI0ACWyJiQ2buarl2aWh0u++GNJHWtjgi4ijgV4BrADLz+cx8ClgOrC3d1gLnlsfLgc9l4w5gbkQc\nC7wV2JiZO0tYbASWtVW3JGn/IjPbeeKIk4E1wP3ALwFbgEuBHZk5t/QJYFdmzo2Im4HVmfmXZd4m\nmi2RUeDwzLyitP828GxmfnKf11sJrASYP3/+G9etWzdpjXv27GHOnDlTMNr+1W2MW3fsnrD/SQuO\narukVgzzupwK3d4P3bT5PnFdTp+lS5duycyRyfq1uatqNnAK8P7MvDMirqbZLfWizMyImJLkysw1\nNEHFyMhIjo6OTrrM2NgYvfQbZN3GeFG3W4Je+PK+g2CY1+VU6PZ+6KbN94nrsv+1eXD8MeCxzLyz\nTK+nCZLvl11QlJ9PlPk7gEUdyy8sbd3aJUnToLXgyMzvAY9GxM+VpjNpdlttAMbPjFoB3FQebwDe\nU86uWgLszszHga8CZ0XEvHIG1lmlTZI0Ddo+q+r9wHXljKrvAO+lCasbIuJi4BHgnaXvl4GzgW3A\nM6UvmbkzIj4GfKP0+2hm7my5bklSF60GR2beQ3Ma7b7OnKBvApd0eZ5rgWuntjpJ0oHwm+OSpCoG\nhySpisEhSapicEiSqhgckqQqPQVHRHwiIl4dEa+IiE0R8YOIeFfbxUmS+k+vWxxnZebfAW8HtgPH\nA/+xraIkSf2r1+AY/77HOcAXM7PuimiSpBmj1y8A3hwR3wKeBf5tRLwW+FF7ZUmS+lVPWxyZuQr4\nZWAkM39Mc0mQ5W0WJknqT70eHD8C+A2au/IB/BQTX0pEkjTD9XqM44+A52m2OqC5rPkVrVQkSepr\nvQbHz2TmJ4AfA2TmM0C0VpUkqW/1GhzPR8QrgQSIiJ8BnmutKklS3+r1rKrLga8AiyLiOuB04KK2\nipIk9a+egiMzN0bEXcASml1Ul2bmk61WJknqS/sNjog4ZZ+mx8vP10XE6zLzrnbKkiT1q8m2OP7r\nfuYlcMYU1qIZYvGqWyZs3776nENciaQ27Dc4MnPpoSpEkjQYejrGERGH03wB8M00Wxq3A5/JTC87\nIklDptezqj4HPA38QZn+l8DngV9royhJUv/qNThen5kndkzfFhH3t1GQJKm/9foFwLsiYsn4RESc\nBmxupyRJUj/rdYvjjcBfR8R3y/TrgAcjYiuQmfmLrVQnSeo7vQbHslarkCQNjF6/Of5IRMwDFnUu\n4xcAJWn49Ho67sdork31bcqFDvELgJI0lHrdVfVOmkurP99mMZKk/tfrWVX3AnPbLESSNBh63eL4\nXeDuiLiXjvtwZOY7WqlKktS3eg2OtcDHga3A37dXjiSp3/UaHM9k5qdarUSSNBB6DY7bI+J3gQ38\n/7uqPB1XkoZMr8HxhvJzSUebp+NK0hDq9QuA3pdDkgT0vsVBRJwD/AJw+HhbZn60jaIkSf2rp+9x\nRMRngPOB9wNBcx+On26xLklSn+r1C4C/nJnvAXZl5keANwE/28uCETErIu6OiJvL9HERcWdEbIuI\nL0TEYaX9J8v0tjJ/ccdzfKi0PxgRb60ZoCRpavUaHM+Wn89ExE8Be4Fje1z2UuCBjumPA1dl5vHA\nLuDi0n4xTTAdD1xV+hERJwIX0OwmWwb8YUTM6vG1JUlTrNfguDki5gKfALYADwPXT7ZQRCwEzgE+\nW6aD5kys9aXLWuDc8nh5mabMP7P0Xw6sy8znMvNhYBtwao91S5KmWGRm95kR/wh4NDO/V6bfA7wL\n+BbwO5m5c79PHrGe5nIlrwI+QHOF3TvKVgURsQj435n5+nI5k2WZ+ViZ923gNOB3yjL/s7RfU5ZZ\nv89rrQRWAsyfP/+N69atm3Twe/bsYc6cOZP2G2Tdxrh1x+4J+5+04KiDfs02n7ubYV6XU6HbOuvG\ndXlw+nWMS5cu3ZKZI5P1m+ysqv8OvAUgIn4FWE1zgPxkYA1wXrcFI+LtwBOZuSUiRnus+4Bl5ppS\nEyMjIzk6OvlLjo2N0Uu/QdZtjBetumXC/tsvfHnfWm0+dzfDvC6nQrd11o3r8uAM+hgnC45ZHVsV\n5wNrMvNLwJci4p5Jlj0deEdEnE1zCu+rgauBuRExOzP3AguBHaX/DpobRT0WEbOBo4C/7Wgf17mM\nJOkQm+wYx6zyRxzgTODWjnn7DZ3M/FBmLszMxTQHt2/NzAuB23hpS2UFcFN5vKFMU+bfms1+tA3A\nBeWsq+OAE4CvTzoySVIrJtviuB74WkQ8SXNm1e0AEXE8ULdT9CUfBNZFxBXA3cA1pf0a4PMRsQ3Y\nSRM2ZOZ9EXEDcD/N2VyXZOYLB/jakqSDNNlWw5URsYnm1Ns/y5eOpP8EzbGOnmTmGDBWHn+HCc6K\nyswf0XyxcMI6gCt7fT1JUnsmveRIZt4xQdv/baccSVK/6/V7HJIkAQaHJKmSwSFJqmJwSJKqGByS\npCoGhySpisEhSapicEiSqhgckqQqBockqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGByS\npCoGhySpisEhSapicEiSqhgckqQqBockqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGByS\npCoGhySpisEhSapicEiSqhgckqQqBockqYrBIUmq0lpwRMSiiLgtIu6PiPsi4tLSfnREbIyIh8rP\neaU9IuJTEbEtIr4ZEad0PNeK0v+hiFjRVs2SpMm1ucWxF7gsM08ElgCXRMSJwCpgU2aeAGwq0wBv\nA04o/1YCn4YmaIDLgdOAU4HLx8NGknTotRYcmfl4Zt5VHj8NPAAsAJYDa0u3tcC55fFy4HPZuAOY\nGxHHAm8FNmbmzszcBWwElrVVtyRp/w7JMY6IWAy8AbgTmJ+Zj5dZ3wPml8cLgEc7FnustHVrlyRN\ng8jMdl8gYg7wNeDKzLwxIp7KzLkd83dl5ryIuBlYnZl/Wdo3AR8ERoHDM/OK0v7bwLOZ+cl9Xmcl\nzS4u5s+f/8Z169ZNWtuePXuYM2fOVAyzb3Ub49Yduyfsf9KCow76Ndt87m6GeV1OhW7rrBvX5cHp\n1zEuXbp0S2aOTNZvdptFRMQrgC8B12XmjaX5+xFxbGY+XnZFPVHadwCLOhZfWNp20IRHZ/vYvq+V\nmWuANQAjIyM5Ojq6b5eXGRsbo5d+g6zbGC9adcuE/bdf+PK+tdp87m6GeV1OhW7rrBvX5cEZ9DG2\neVZVANcAD2Tm73XM2gCMnxm1Aripo/095eyqJcDuskvrq8BZETGvHBQ/q7RJkqZBm1scpwPvBrZG\nxD2l7cPAauCGiLgYeAR4Z5n3ZeBsYBvwDPBegMzcGREfA75R+n00M3e2WLckaT9aC45yrCK6zD5z\ngv4JXNLlua4Frp266iRJB8pvjkuSqhgckqQqBockqYrBIUmq0ur3OKRDZeuO3S/7LsL21edMUzXS\nzOYWhySpisEhSapicEiSqhgckqQqBockqYrBIUmqYnBIkqoYHJKkKgaHJKmKwSFJqmJwSJKqGByS\npCoGhySpisEhSapicEiSqhgckqQqBockqYp3AJSkAbR4nztejjsUd750i0OSVMXgkCRVcVeVJjWd\nm8SS+o9bHJKkKgaHJKmKwSFJquIxDkkDq+b4m8fqpo7BIRX+YZF6464qSVIVtzh0wLp9Qpc0sxkc\nkmYcP9S0y11VkqQqbnFo6PhpVDo4bnFIkqoMzBZHRCwDrgZmAZ/NzNXTXNJA2LpjNxf5CVvqK93+\nXw7Kqd8DERwRMQv4b8CvAo8B34iIDZl5//RWpn7mLimpHQMRHMCpwLbM/A5ARKwDlgMGxww1qF/G\na7Pu2k+pE9XS77+/6VC7zvy9Dk5wLAAe7Zh+DDjtUBZQ++m15k3XpstOOqQv17puv782xzkVfyim\nYr3307qs+Z3Ujv2yk/a+LCCn4w/zVKyz6Xi/HgqRmdNdw6Qi4jxgWWb+qzL9buC0zHxfR5+VwMoy\n+XPAgz089THAk1Ncbr8ZhjHCcIxzGMYIwzHOfh3jT2fmayfrNChbHDuARR3TC0vbizJzDbCm5kkj\nYnNmjhx8ef1rGMYIwzHOYRgjDMc4B32Mg3I67jeAEyLiuIg4DLgA2DDNNUnSUBqILY7M3BsR7wO+\nSnM67rWZed80lyVJQ2kgggMgM78MfHmKn7Zq19aAGoYxwnCMcxjGCMMxzoEe40AcHJck9Y9BOcYh\nSeoTQxkcEbEsIh6MiG0RsWq665kqEXFtRDwREfd2tB0dERsj4qHyc9501niwImJRRNwWEfdHxH0R\ncWlpn2njPDwivh4R/6eM8yOl/biIuLO8d79QThYZaBExKyLujoiby/SMGmNEbI+IrRFxT0RsLm0D\n/X4duuDouHzJ24ATgV+PiBOnt6op8z+AZfu0rQI2ZeYJwKYyPcj2Apdl5onAEuCSsv5m2jifA87I\nzF8CTgaWRcQS4OPAVZl5PLALuHgaa5wqlwIPdEzPxDEuzcyTO07BHej369AFBx2XL8nM54Hxy5cM\nvMz8C2DnPs3LgbXl8Vrg3ENa1BTLzMcz867y+GmaPzgLmHnjzMzcUyZfUf4lcAawvrQP/DgjYiFw\nDvDZMh3MsDF2MdDv12EMjokuX7Jgmmo5FOZn5uPl8feA+dNZzFSKiMXAG4A7mYHjLLtw7gGeADYC\n3waeysy9pctMeO/+PvBbwN+X6dcw88aYwJ9FxJZyhQsY8PfrwJyOq4OXmRkRM+I0uoiYA3wJ+PeZ\n+XfNB9XGTBlnZr4AnBwRc4E/AX5+mkuaUhHxduCJzNwSEaPTXU+L3pyZOyLiHwAbI+JbnTMH8f06\njFsck16+ZIb5fkQcC1B+PjHN9Ry0iHgFTWhcl5k3luYZN85xmfkUcBvwJmBuRIx/4Bv09+7pwDsi\nYjvNLuMzaO65M5PGSGbuKD+foPkAcCoD/n4dxuAYtsuXbABWlMcrgJumsZaDVvaBXwM8kJm/1zFr\npo3ztWVLg4h4Jc29aB6gCZDzSreBHmdmfigzF2bmYpr/h7dm5oXMoDFGxJER8arxx8BZwL0M+Pt1\nKL8AGBFn0+xbHb98yZXTXNKUiIjrgVGaK29+H7gc+FPgBuB1wCPAOzNz3wPoAyMi3gzcDmzlpf3i\nH6Y5zjGTxvmLNAdNZ9F8wLshMz8aEf+Q5tP50cDdwLsy87npq3RqlF1VH8jMt8+kMZax/EmZnA38\ncWZeGRGvYYDfr0MZHJKkAzeMu6okSQfB4JAkVTE4JElVDA5JUhWDQ5JUxW+OS0VEvEBzmu+4dZm5\negqffxR4PjP/umae1G8MDuklz2bmyS0+/yiwB5goHPY3T+or7qqS9qPcu+WLHdOjHfeNOCsi/iYi\n7oqIL5brZ43ff+EjpX1rRPx8uSDjvwF+s9yX4R93POfL5kXEw+XSKkTEq8enI2IsIq4u/e6NiFNL\nnyOjuR/L18u9LWbEFZ/VnwwO6SWvLH+Qx/+dD/w5cFq5XATA+cC6iDgG+M/AWzLzFGAz8B86nuvJ\n0v5pmm9Ebwc+Q3OfiZMz8/bxjl3mjdFcbhyay3HcmJk/LtNHlC2j3wCuLW3/ieaSHacCS4H/0lGz\nNKXcVSW9ZMJdVRHxFeCfRsR6mj/mvwX8E5obgf1VuTLvYcDfdCw2fvHFLcA/P4BaPlte50+B9wL/\numPe9dDcf6VsjcyluQbSOyLiA6XP4TSXs+i8QZI0JQwOaXLrgPfR3CRrc2Y+XS62uDEzf73LMuPX\nVnqBA/h/lpl/FRGLy0HzWZl5b+fsfbsDAfyLzHyw9rWkWu6qkib3NeAUmk/960rbHcDpEXE8vHiM\n4WcneZ6ngVdVzPsc8MfAH+3Tfn55zTcDuzNzN/BV4P0l0IiIN0w2KOlAGRzSS/Y9xrEaXryh0s00\n96m/ubT9ALgIuD4ivkmzm2qyGy39L+Cf7XtwfD/zrgPmUXZNdfhRRNxNc1xk/H7cH6O5vew3I+K+\nMi21wqvjSn0qIs4DlmfmuzvaxmgOtm+etsI09DzGIfWhiPgDmi2cs6e7FmlfbnFIkqp4jEOSVMXg\nkCRVMTgkSVUMDklSFYNDklTF4JAkVfl/75Mlpx/zz/kAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"event_type['event_type'].hist(bins=53)\n",
"plt.xlabel('Event type')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As the events are not ordinal, I'm re-encoding them with a separate feature for each event."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# One-hot encoding: create new feature for each of the 53 columns\n",
"tmp = pd.get_dummies(event_type['event_type'])\n",
"\n",
"# Rename columnsas ETx where x stands for an event type\n",
"tmp.columns = np.add(['ET' for x in range(53)], tmp.columns.astype(str))\n",
"\n",
"# Merge one-hot encoded features with index, remove old feature\n",
"event_type = pd.concat([event_type, tmp], axis=1)\\\n",
" .drop('event_type', axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" ET1 | \n",
" ET2 | \n",
" ET3 | \n",
" ET4 | \n",
" ET5 | \n",
" ET6 | \n",
" ET7 | \n",
" ET8 | \n",
" ET9 | \n",
" ... | \n",
" ET45 | \n",
" ET46 | \n",
" ET47 | \n",
" ET48 | \n",
" ET49 | \n",
" ET50 | \n",
" ET51 | \n",
" ET52 | \n",
" ET53 | \n",
" ET54 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 8011 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2597 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 5022 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
5 rows × 54 columns
\n",
"
"
],
"text/plain": [
" id ET1 ET2 ET3 ET4 ET5 ET6 ET7 ET8 ET9 ... ET45 ET46 ET47 \\\n",
"0 6597 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n",
"1 8011 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n",
"2 2597 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n",
"3 5022 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n",
"4 5022 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n",
"\n",
" ET48 ET49 ET50 ET51 ET52 ET53 ET54 \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 54 columns]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"event_type.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now I'm going to group the data by ID and sum up the instances for each event type."
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"event_type = event_type.groupby('id', as_index=False).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. Preparing Training and Test Sets"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.1. Training Set"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" location | \n",
" fault_severity | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 14121 | \n",
" location 118 | \n",
" 1 | \n",
"
\n",
" \n",
" 1 | \n",
" 9320 | \n",
" location 91 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 14394 | \n",
" location 152 | \n",
" 1 | \n",
"
\n",
" \n",
" 3 | \n",
" 8218 | \n",
" location 931 | \n",
" 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 14804 | \n",
" location 120 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id location fault_severity\n",
"0 14121 location 118 1\n",
"1 9320 location 91 0\n",
"2 14394 location 152 1\n",
"3 8218 location 931 1\n",
"4 14804 location 120 0"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id int64\n",
"location object\n",
"fault_severity int64\n",
"dtype: object"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 7381\n",
"Entries : 7381\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(df['id'].unique()))\n",
"print('Entries : ', len(df['id']))"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"location 0\n",
"fault_severity 0\n",
"dtype: int64"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Checking for missing values\n",
"df.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The training data don't contain missing data, the index is unique, and the location is given as a string features, which needs to be converted to an integer:"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"string_feature_to_numeric(df, 'location', 'location ')"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nSUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['location'].hist(bins=100)\n",
"plt.xlabel('Location')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The location distribution doesn't show extreme outliers."
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 0, 2])"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['fault_severity'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All instances of the target variable `fault_severity` are indeed 0, 1, or 2."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.2. Test Set"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df_test = pd.read_csv('test.csv')"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" location | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 11066 | \n",
" location 481 | \n",
"
\n",
" \n",
" 1 | \n",
" 18000 | \n",
" location 962 | \n",
"
\n",
" \n",
" 2 | \n",
" 16964 | \n",
" location 491 | \n",
"
\n",
" \n",
" 3 | \n",
" 4795 | \n",
" location 532 | \n",
"
\n",
" \n",
" 4 | \n",
" 3392 | \n",
" location 600 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id location\n",
"0 11066 location 481\n",
"1 18000 location 962\n",
"2 16964 location 491\n",
"3 4795 location 532\n",
"4 3392 location 600"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_test.head()"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id int64\n",
"location object\n",
"dtype: object"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_test.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of distinct IDs: 11171\n",
"Entries : 11171\n"
]
}
],
"source": [
"print('Number of distinct IDs: ', len(df_test['id'].unique()))\n",
"print('Entries : ', len(df_test['id']))"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"id 0\n",
"location 0\n",
"dtype: int64"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check for missing values\n",
"df_test.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The test set has the same format as the trainig set (of course missing the target variable `fault_severity`. There are no missing values, and the location feature needs to be converted from a string to a numeric feature:"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"string_feature_to_numeric(df_test, 'location', 'location ')"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n/wAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df_test['location'].hist(bins=100)\n",
"plt.xlabel('Location')\n",
"plt.ylabel('Samples')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The distribution of locations doesn't show any outliers."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.3. Merging Training/Test and Feature Dataframes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having prepared the various features on one hand, and the training/test datasets on the other hand, I'm now merging the training and test sets with the features."
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" location | \n",
" fault_severity | \n",
" ST1 | \n",
" ST2 | \n",
" ST3 | \n",
" ST4 | \n",
" ST5 | \n",
" RT1 | \n",
" RT2 | \n",
" ... | \n",
" ET45 | \n",
" ET46 | \n",
" ET47 | \n",
" ET48 | \n",
" ET49 | \n",
" ET50 | \n",
" ET51 | \n",
" ET52 | \n",
" ET53 | \n",
" ET54 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 14121 | \n",
" 118 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 9320 | \n",
" 91 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 14394 | \n",
" 152 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 8218 | \n",
" 931 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 14804 | \n",
" 120 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
5 rows × 457 columns
\n",
"
"
],
"text/plain": [
" id location fault_severity ST1 ST2 ST3 ST4 ST5 RT1 RT2 ... \\\n",
"0 14121 118 1 0 1 0 0 0 0 1 ... \n",
"1 9320 91 0 0 1 0 0 0 0 1 ... \n",
"2 14394 152 1 0 1 0 0 0 0 1 ... \n",
"3 8218 931 1 1 0 0 0 0 0 0 ... \n",
"4 14804 120 0 1 0 0 0 0 0 1 ... \n",
"\n",
" ET45 ET46 ET47 ET48 ET49 ET50 ET51 ET52 ET53 ET54 \n",
"0 0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 457 columns]"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Merge training set with features\n",
"df_train = pd.merge(df, severity_type, on='id', how='left')\n",
"df_train = pd.merge(df_train, resource_type, on='id', how='left')\n",
"df_train = pd.merge(df_train, log_feature, on='id', how='left')\n",
"df_train = pd.merge(df_train, event_type, on='id', how='left')\n",
"df_train.head()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" location | \n",
" ST1 | \n",
" ST2 | \n",
" ST3 | \n",
" ST4 | \n",
" ST5 | \n",
" RT1 | \n",
" RT2 | \n",
" RT3 | \n",
" ... | \n",
" ET45 | \n",
" ET46 | \n",
" ET47 | \n",
" ET48 | \n",
" ET49 | \n",
" ET50 | \n",
" ET51 | \n",
" ET52 | \n",
" ET53 | \n",
" ET54 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 11066 | \n",
" 481 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 18000 | \n",
" 962 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 16964 | \n",
" 491 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 4795 | \n",
" 532 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 3392 | \n",
" 600 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
5 rows × 456 columns
\n",
"
"
],
"text/plain": [
" id location ST1 ST2 ST3 ST4 ST5 RT1 RT2 RT3 ... ET45 ET46 \\\n",
"0 11066 481 0 1 0 0 0 0 1 0 ... 0 0 \n",
"1 18000 962 1 0 0 0 0 0 0 0 ... 0 0 \n",
"2 16964 491 0 1 0 0 0 0 1 0 ... 0 0 \n",
"3 4795 532 0 0 0 0 1 0 0 1 ... 0 0 \n",
"4 3392 600 0 1 0 0 0 0 0 0 ... 0 0 \n",
"\n",
" ET47 ET48 ET49 ET50 ET51 ET52 ET53 ET54 \n",
"0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 456 columns]"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Merge test data with features\n",
"df_test = pd.merge(df_test, severity_type, on='id', how='left')\n",
"df_test = pd.merge(df_test, resource_type, on='id', how='left')\n",
"df_test = pd.merge(df_test, log_feature, on='id', how='left')\n",
"df_test = pd.merge(df_test, event_type, on='id', how='left')\n",
"df_test.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. Classification Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.1. Training the Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, I'm splitting the data into a feature matrix `X` and a target column `y`."
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_train = df_train.drop(['fault_severity'], axis=1)\n",
"y_train = df_train['fault_severity']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The problem is a single-label, multi-class classification problem. The target has three different classes (0,1,2). As the following graphic shows, there is considerable class imbalance which means that accuracy is likely not a good metric to evaluate the model because it will favor models that tend to predict the predominant class. Instead, I will use the F1 score (the harmonic mean of precision and recall) to evaluate my model."
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df_train['fault_severity'].hist(bins=3)\n",
"plt.xlabel('Fault Severity')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'm using four different classifiers implemented in `scikit-learn` to model that data. For each one, I'm using 5-fold cross validation on the training set to determine the F1 score."
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"classifiers = [KNeighborsClassifier(),\n",
" RandomForestClassifier(),\n",
" GaussianNB(),\n",
" LogisticRegression()\n",
" ]\n",
"classifier_names = ['kNN','forest','GNB','LogReg']"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"kNN \t 0.3500089692526277\n",
"forest \t 0.6453935093915613\n",
"GNB \t 0.37428942083539385\n",
"LogReg \t 0.4965441321576131\n"
]
}
],
"source": [
"# Loop through classifiers\n",
"for classifier, clf_name in zip(classifiers, classifier_names): \n",
" \n",
" # Calculate CV\n",
" print(clf_name,'\\t',cross_val_score(estimator=classifier, \n",
" X=X_train, y=y_train, cv=5, scoring='f1_macro').mean())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The random forest classifier performs best with an F1 score of 0.65."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.2. Making Predictions for the Test Set"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having found a model with a reasonable score, I'm now going to make and export the predictions for the test set.\n",
"\n",
"The dataframe `df_test` is actually the complete feature matrix:"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_test = df_test"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, the random forest classifier is trained on the training set, then it is used to predict the fault severity for the test set."
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"forest = RandomForestClassifier()\n",
"forest.fit(X_train,y_train) # Fit classifier on training set\n",
"y_pred = forest.predict(X_test) # Predict fault severity on test set"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(11171,)"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_pred.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Kaggle competition asked for a specific format for submission files, having a separate column for each fault severity. The following code converts the predictions in `y_pred` to the specified format."
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" predict_0 | \n",
" predict_1 | \n",
" predict_2 | \n",
"
\n",
" \n",
" id | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 11066 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 18000 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
"
\n",
" \n",
" 16964 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4795 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3392 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" predict_0 predict_1 predict_2\n",
"id \n",
"11066 1 0 0\n",
"18000 0 0 1\n",
"16964 1 0 0\n",
"4795 1 0 0\n",
"3392 0 1 0"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = pd.get_dummies(y_pred) # create separate columns\n",
"results.columns = ['predict_0', 'predict_1', 'predict_2'] #rename cols\n",
"results = pd.concat([df_test[['id']], results], axis=1) # merge with index\n",
"results = results.set_index('id') # set ID as index\n",
"results.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, the predictions are exported into a csv file."
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"results.to_csv('submission.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.3. Attempts to Improve the Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the following, I'll try four different feature selection techniques to improve the model. Using the second approach, RFE, the F1 score improves marginally to 0.66 but using only about a quarter of the features.\n",
"\n",
"(1) First, I will select features based on their correlation with the target variable. (2) Then, I'll try to select features through recursive feature elimination (RFE). (3) I will then try to use principal component analysis (PCA) to reduce the dimensionality of the feature matrix. (4) Finally, I will combine PCA with interaction features (adding quadratic features)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3.1. Add Features by Correlation with Target"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'm going to be using the following function for both this attempt and the next one (RFE). It plots the scores for two classifiers (Gaussian Naive Bayes and Random Forests) for a feature set that continuously grows according to a ranking provided in `features_ranking`."
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_feature_series(features_ranking):\n",
" '''\n",
" Evaluates GaussianNB() and RandomForestClassifier() on a continuously \n",
" increasing feature set. The features are added in an order specified \n",
" in 'features_ranking'. The performance of both classifiers is then \n",
" plotted. \n",
" 'features_ranking' (list): list of features ordered by \n",
" relevance (descening)\n",
" '''\n",
" # Lists to store feature names and scores\n",
" features, scores_GNB, scores_forest = [], [], [] \n",
"\n",
" # For each feature in descening order or relevance\n",
" for i in range(len(features_ranking)): \n",
" \n",
" # List of features to be evaluated\n",
" good_cols = list(features_ranking[:i+1])\n",
" \n",
" # Perform 3-fold CV for both classifiers on the current \n",
" # list of features, evaulate F1 score\n",
" cvs_GNB = cross_val_score(estimator=GaussianNB(), \n",
" X=X_train[good_cols], y=y_train, \n",
" cv=3, scoring='f1_macro').mean()\n",
" cvs_forest = cross_val_score(estimator=RandomForestClassifier(), \n",
" X=X_train[good_cols], y=y_train,\n",
" cv=3, scoring='f1_macro').mean()\n",
" \n",
" # Store name of latest feature and scores of both classifiers\n",
" features.append(features_ranking[i])\n",
" scores_GNB.append(cvs_GNB)\n",
" scores_forest.append(cvs_forest)\n",
"\n",
" # Plot scores for both classifiers \n",
" plt.figure(figsize=(12,4))\n",
" plt.plot(scores_GNB, label='GaussianNB')\n",
" plt.plot(scores_forest, label='Random Forest')\n",
" plt.xticks(range(len(features)), features, rotation=90)\n",
" plt.xlabel('Added Feature (left to right)')\n",
" plt.ylabel('F1 score')\n",
" plt.legend()\n",
" plt.grid()\n",
" plt.show()\n",
" \n",
" print('Ideal no. of features (GNB): %d | Ideal no. of features (RandomForest): %d' %\\\n",
" ( scores_GNB.index(max(scores_GNB))+1 , scores_forest.index(max(scores_forest))+1 ))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'm calculating a ranked list of features `corr_list` based on their respective correlation with the target. Then, using the above function, I'm evaluating how the two classifiers are performing on the growing feature set."
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n"
]
},
{
"data": {
"image/png": "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\nSZsv5AAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ideal no. of features (GNB): 2 | Ideal no. of features (RandomForest): 37\n"
]
}
],
"source": [
"# Calculate list of features sorted by correlation with target\n",
"corr_list = abs(df_train.corr()['fault_severity'])\\\n",
" .sort_values(ascending=False)[1:40]\n",
"\n",
"plot_feature_series(corr_list.index)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neither classifier exceeds the F1 score of 0.64 achieved with random forests on the full feature set."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3.2. Recursive Feature Elimination (RFE)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, I'm going to use RFE to create a ranked list of features. I'll use the correlation with the target to pre-select a set of 100 features."
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# List of 30 features that have the strongest correlation with the target\n",
"corr_cols = list(abs(df_train.corr()['fault_severity'])\\\n",
" .sort_values(ascending=False)[1:100].index)"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RFE(estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
" penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
" verbose=0, warm_start=False),\n",
" n_features_to_select=1, step=1, verbose=0)"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Train RFE model on the training set, with logistic regression \n",
"# as evaluating estimator\n",
"rfe = RFE(LogisticRegression(),1,step=1)\n",
"rfe.fit(X_train[corr_cols], y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following list `rfe_list` is a list of the 100 features, sorted by rank according to the RFE algorithm."
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"rfe_list = list(pd.Series(X_train[corr_cols].columns, index=rfe.ranking_)\\\n",
" .sort_index().values)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `plot_feature_series` now evaluated the two classifiers for a growing feature set (according to `rfe_list`)."
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n",
"/usr/local/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ideal no. of features (GNB): 62 | Ideal no. of features (RandomForest): 83\n"
]
}
],
"source": [
"plot_feature_series(rfe_list)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using the first 85 features of the RFE-sorted feature list, the random forest classifiers achieves a better F1 score (0.66) than with the full set of over 400 features (0.64)."
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6553709044991198"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cross_val_score(estimator=RandomForestClassifier(), \n",
" X=X_train[rfe_list[:85]], y=y_train, cv=5, scoring='f1_macro').mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3.3. Principal Component Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Another way to reduce the dimensionality of the feature matrix is through PCA. The following code builds a pipeline in which the features are standardized (a requirement for PCA), the PCA is performed to reduce the number of features to 200, and finally the reduced feature matrix is evaluated with random forests."
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6019685594501268"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipe = Pipeline([('std',StandardScaler()),\n",
" ('pca',PCA(n_components=200)),\n",
" ('forest', RandomForestClassifier())\n",
"])\n",
"cross_val_score(estimator=pipe, X=X_train, y=y_train,\n",
" cv=5, scoring='f1_macro').mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3.4. PCA with Polynomial Features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to take into account interaction between features, I'm using `scikit-learn`'s `PolynomialFeatures()` function to create quadratic features. Since this increases the feature matrix dramatically, I am using PCA to reduce the feature matrix before creating interaction features."
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5601360541669964"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipe = Pipeline([('std',StandardScaler()),\n",
" ('pca',PCA(n_components=50)),\n",
" ('poly',PolynomialFeatures(2)),\n",
" ('forest', RandomForestClassifier())\n",
"])\n",
"cross_val_score(estimator=pipe, X=X_train, y=y_train,\n",
" cv=5, scoring='f1_macro').mean()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}