Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anthonycarminati/2cbd676dd968fbe69321751639107523 to your computer and use it in GitHub Desktop.
Save anthonycarminati/2cbd676dd968fbe69321751639107523 to your computer and use it in GitHub Desktop.
An iPython notebook that shows off the process of creating dummy data and performing classification.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Environment Setup"
]
},
{
"cell_type": "code",
"execution_count": 161,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"# Jupyter Notebook 'magic' function to enable inline plotting\n",
"%pylab inline\n",
"# Data manipulation tool - comes with basic plotting and analytics functions\n",
"import pandas as pd\n",
"# Core data manipulation tool - sits 'beneath' Pandas and is good for low-level matrix tasks\n",
"# Note: works with integer matrices only, so categorical var's must be transformed into int's\n",
"import numpy as np\n",
"# Pretty plotting library - not necessary\n",
"import seaborn as sns\n",
"# SciKit-Learn module for creating numerical test data\n",
"from sklearn import datasets\n",
"# SciKit-Learn module for selecting the most useful features\n",
"from sklearn import feature_selection\n",
"# SciKit-Learn module for removing the least useful features\n",
"from sklearn.feature_selection import RFE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Creating Test Data"
]
},
{
"cell_type": "code",
"execution_count": 162,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Use datasets module to create a dataset\n",
"# Note: specify `random_state` parameter or output changes every time the function is run\n",
"sk_data = datasets.make_classification(\n",
" n_samples=1000, # Number of samples\n",
" n_features=20, # Number of features\n",
" n_informative=3, # Number of useful/informative/significant features\n",
" n_repeated=3, # Number of features that are repeated - distraction data\n",
" n_classes=3, # Number of classes that we're trying to group samples into\n",
" random_state=4 # Seed for random number generator\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 163,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tuple"
]
},
"execution_count": 163,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(sk_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: The output of the SciKit-Learn dataset generator is a tuple of two arrays; the first is a 2D array of our features and the second is a 1D array of our classes. In order to conduct exploratory data analysis (EDA) with Pandas, we're going to convert it into a Pandas DataFrame object."
]
},
{
"cell_type": "code",
"execution_count": 164,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Extract the features array and classes array from our sk_data tuple object\n",
"features, classes = sk_data"
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Type of our features array: <type 'numpy.ndarray'>\n",
"Dimensions of our features array: (1000, 20)\n",
"Type of our features array: <type 'numpy.ndarray'>\n",
"Dimensions of our classes array: (1000,)\n"
]
}
],
"source": [
"# We need some information about our arrays\n",
"print('Type of our features array: {0}'.format(type(features)))\n",
"print('Dimensions of our features array: {0}'.format(features.shape))\n",
"print('Type of our features array: {0}'.format(type(classes)))\n",
"print('Dimensions of our classes array: {0}'.format(classes.shape))"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Numpy provides us with the ability to concatenate two numpy arrays\n",
"# In the last step we learned that the arrays were already numpy arrays, so we're good to go\n",
"features_classes = np.c_[features, classes]"
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-1.93, -1.93, 2.22, -0.86, 0.98, -1.75, -1.93, 0.95, -0.57,\n",
" 0.66, -0.94, 0.63, 1.39, -1.4 , 0.63, 0.5 , 1.09, 0.48,\n",
" 0.98, -0.29, 0. ],\n",
" [-0.61, -0.61, -0.89, 0.03, 0.97, 1.49, -0.61, -1.02, 1.34,\n",
" -0.22, 1.64, 0.28, -0.11, 0.36, 1.91, 0.04, 0.64, 0.1 ,\n",
" 0.97, 0.09, 2. ]])"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's take a quick look\n",
"features_classes[:2,:]\n",
"# It worked! Features and classes are now in a single 2D array"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our concatentation worked - all features and classes are now in a single 2D array called `features_classes`. Now let's load this into a Pandas DataFrame with custom headers."
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# First things first - create an array of our column headers.\n",
"# Note: this can be done when generating the DataFrame, but this keeps the code a bit cleaner\n",
"cols = [\n",
" 'feature_1','feature_2','feature_3','feature_4','feature_5',\n",
" 'feature_6','feature_7','feature_8','feature_9','feature_10',\n",
" 'feature_11','feature_12','feature_13','feature_14','feature_15',\n",
" 'feature_16','feature_17','feature_18','feature_19','feature_20',\n",
" 'class'\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Create a fresh DataFrame with our features and classes\n",
"df = pd.DataFrame(features_classes, columns=cols)"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>feature_1</th>\n",
" <th>feature_2</th>\n",
" <th>feature_3</th>\n",
" <th>feature_4</th>\n",
" <th>feature_5</th>\n",
" <th>feature_6</th>\n",
" <th>feature_7</th>\n",
" <th>feature_8</th>\n",
" <th>feature_9</th>\n",
" <th>feature_10</th>\n",
" <th>...</th>\n",
" <th>feature_12</th>\n",
" <th>feature_13</th>\n",
" <th>feature_14</th>\n",
" <th>feature_15</th>\n",
" <th>feature_16</th>\n",
" <th>feature_17</th>\n",
" <th>feature_18</th>\n",
" <th>feature_19</th>\n",
" <th>feature_20</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-1.929568</td>\n",
" <td>-1.929568</td>\n",
" <td>2.220507</td>\n",
" <td>-0.862065</td>\n",
" <td>0.983588</td>\n",
" <td>-1.745631</td>\n",
" <td>-1.929568</td>\n",
" <td>0.951698</td>\n",
" <td>-0.565620</td>\n",
" <td>0.660429</td>\n",
" <td>...</td>\n",
" <td>0.632392</td>\n",
" <td>1.393702</td>\n",
" <td>-1.403115</td>\n",
" <td>0.629202</td>\n",
" <td>0.504615</td>\n",
" <td>1.094145</td>\n",
" <td>0.482342</td>\n",
" <td>0.983588</td>\n",
" <td>-0.286627</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-0.609266</td>\n",
" <td>-0.609266</td>\n",
" <td>-0.894378</td>\n",
" <td>0.031083</td>\n",
" <td>0.971238</td>\n",
" <td>1.491204</td>\n",
" <td>-0.609266</td>\n",
" <td>-1.020097</td>\n",
" <td>1.339008</td>\n",
" <td>-0.215753</td>\n",
" <td>...</td>\n",
" <td>0.277985</td>\n",
" <td>-0.107663</td>\n",
" <td>0.359959</td>\n",
" <td>1.911842</td>\n",
" <td>0.038337</td>\n",
" <td>0.639280</td>\n",
" <td>0.098879</td>\n",
" <td>0.971238</td>\n",
" <td>0.088424</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-1.290105</td>\n",
" <td>-1.290105</td>\n",
" <td>1.494661</td>\n",
" <td>-0.512230</td>\n",
" <td>1.103154</td>\n",
" <td>1.250608</td>\n",
" <td>-1.290105</td>\n",
" <td>0.131689</td>\n",
" <td>1.618369</td>\n",
" <td>-0.650769</td>\n",
" <td>...</td>\n",
" <td>-0.370894</td>\n",
" <td>-0.149012</td>\n",
" <td>-0.621338</td>\n",
" <td>-0.809731</td>\n",
" <td>0.063844</td>\n",
" <td>-0.310331</td>\n",
" <td>0.647834</td>\n",
" <td>1.103154</td>\n",
" <td>0.866486</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" feature_1 feature_2 feature_3 feature_4 feature_5 feature_6 \\\n",
"0 -1.929568 -1.929568 2.220507 -0.862065 0.983588 -1.745631 \n",
"1 -0.609266 -0.609266 -0.894378 0.031083 0.971238 1.491204 \n",
"2 -1.290105 -1.290105 1.494661 -0.512230 1.103154 1.250608 \n",
"\n",
" feature_7 feature_8 feature_9 feature_10 ... feature_12 feature_13 \\\n",
"0 -1.929568 0.951698 -0.565620 0.660429 ... 0.632392 1.393702 \n",
"1 -0.609266 -1.020097 1.339008 -0.215753 ... 0.277985 -0.107663 \n",
"2 -1.290105 0.131689 1.618369 -0.650769 ... -0.370894 -0.149012 \n",
"\n",
" feature_14 feature_15 feature_16 feature_17 feature_18 feature_19 \\\n",
"0 -1.403115 0.629202 0.504615 1.094145 0.482342 0.983588 \n",
"1 0.359959 1.911842 0.038337 0.639280 0.098879 0.971238 \n",
"2 -0.621338 -0.809731 0.063844 -0.310331 0.647834 1.103154 \n",
"\n",
" feature_20 class \n",
"0 -0.286627 0.0 \n",
"1 0.088424 2.0 \n",
"2 0.866486 2.0 \n",
"\n",
"[3 rows x 21 columns]"
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's check out the first 3 rows\n",
"df.head(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: In our example we already have data prepared in SciKit-Learn's 'preferred' format and in a Pandas DataFrame. If we wanted to go the other way - from a Pandas DataFrame to SciKit-Learn's preferred format - we could use the technique below:"
]
},
{
"cell_type": "code",
"execution_count": 171,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Select raw values for all rows in the first 20 columns (our known number of features)\n",
"df_features = df.ix[:,:20].values\n",
"# Select raw values for all rows in only the 'class' column\n",
"df_classes =df['class'].values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a quick review we've currently got our data stored in the following variables:\n",
"- `sk_data` = Tuple, first item is NumPy Array of features and second item is NumPy Array of classes\n",
"- `features` = Numpy Array of features, extracted from `sk_data`\n",
"- `classes` = Numpy Array of classes, extracted from `sk_data`\n",
"- `df` = Pandas DataFrame, all features and classes\n",
"- `df_features` = Numpy Array of features\n",
"- `df_classes` = Numpy Array of classes\n",
"\n",
"Now let's get to doing some basic EDA. Remember from our input parameters we generated a dataset containing:\n",
"- 20 features\n",
"- 1000 samples\n",
"- 3 classes (aka targets)\n",
"- 3 repeated columns (we'll have to find those)\n",
"- 3 useful/informative/significant features\n",
"\n",
"Normally, we would not have the luxury of knowing the number of useful features or repeated columns off the bat so let's proceed as though we never knew this info."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploratory Data Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Generally speaking, with EDA we want to answer the easiest questions about our data first and then move on to more complex experiments. The idea being, simple experiments inform the direction of our more advanced/complicated tests."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Univariate Analysis\n",
"When profiling our variables individually, the following tactics are really useful for gaining a basic understanding of our data:\n",
"- Measures of Central Tendency\n",
" - Mean\n",
" - Median\n",
"- Measures of Dispersion\n",
" - Variance\n",
" - Standard Deviation\n",
" - Box Plot (includes outlier detection)\n",
" - Violin Plot (includes outlier detection)\n",
"- Event Frequency(discrete variables) or Density(continuous variables)\n",
" - Histogram\n",
" - Kernel Density Plot\n",
"- Trend Detection\n",
" - Line graph\n",
" - Requires a time-based independent variable"
]
},
{
"cell_type": "code",
"execution_count": 172,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>feature_1</th>\n",
" <th>feature_2</th>\n",
" <th>feature_3</th>\n",
" <th>feature_4</th>\n",
" <th>feature_5</th>\n",
" <th>feature_6</th>\n",
" <th>feature_7</th>\n",
" <th>feature_8</th>\n",
" <th>feature_9</th>\n",
" <th>feature_10</th>\n",
" <th>...</th>\n",
" <th>feature_12</th>\n",
" <th>feature_13</th>\n",
" <th>feature_14</th>\n",
" <th>feature_15</th>\n",
" <th>feature_16</th>\n",
" <th>feature_17</th>\n",
" <th>feature_18</th>\n",
" <th>feature_19</th>\n",
" <th>feature_20</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>...</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" <td>1000.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>-0.240523</td>\n",
" <td>-0.240523</td>\n",
" <td>-0.014877</td>\n",
" <td>-0.286865</td>\n",
" <td>-0.002084</td>\n",
" <td>0.302418</td>\n",
" <td>-0.240523</td>\n",
" <td>0.008057</td>\n",
" <td>0.489984</td>\n",
" <td>-0.036351</td>\n",
" <td>...</td>\n",
" <td>-0.020501</td>\n",
" <td>0.020434</td>\n",
" <td>-0.009898</td>\n",
" <td>0.035657</td>\n",
" <td>0.024025</td>\n",
" <td>-0.038217</td>\n",
" <td>-0.035582</td>\n",
" <td>-0.002084</td>\n",
" <td>0.062132</td>\n",
" <td>0.999000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>1.740357</td>\n",
" <td>1.740357</td>\n",
" <td>1.016059</td>\n",
" <td>1.280307</td>\n",
" <td>1.274211</td>\n",
" <td>1.378021</td>\n",
" <td>1.740357</td>\n",
" <td>0.979214</td>\n",
" <td>1.418114</td>\n",
" <td>1.018115</td>\n",
" <td>...</td>\n",
" <td>0.998543</td>\n",
" <td>1.051217</td>\n",
" <td>0.964432</td>\n",
" <td>1.027410</td>\n",
" <td>1.002159</td>\n",
" <td>0.966398</td>\n",
" <td>1.030402</td>\n",
" <td>1.274211</td>\n",
" <td>0.942712</td>\n",
" <td>0.817109</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>-4.860176</td>\n",
" <td>-4.860176</td>\n",
" <td>-3.420193</td>\n",
" <td>-4.168268</td>\n",
" <td>-5.516052</td>\n",
" <td>-4.584735</td>\n",
" <td>-4.860176</td>\n",
" <td>-3.302371</td>\n",
" <td>-4.767524</td>\n",
" <td>-2.749158</td>\n",
" <td>...</td>\n",
" <td>-2.890801</td>\n",
" <td>-3.875438</td>\n",
" <td>-2.670310</td>\n",
" <td>-3.302156</td>\n",
" <td>-2.909946</td>\n",
" <td>-3.580472</td>\n",
" <td>-3.857274</td>\n",
" <td>-5.516052</td>\n",
" <td>-3.239109</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>-1.648212</td>\n",
" <td>-1.648212</td>\n",
" <td>-0.653600</td>\n",
" <td>-1.147666</td>\n",
" <td>-1.048022</td>\n",
" <td>-0.705697</td>\n",
" <td>-1.648212</td>\n",
" <td>-0.652252</td>\n",
" <td>-0.492640</td>\n",
" <td>-0.737058</td>\n",
" <td>...</td>\n",
" <td>-0.659614</td>\n",
" <td>-0.674910</td>\n",
" <td>-0.681390</td>\n",
" <td>-0.658821</td>\n",
" <td>-0.633144</td>\n",
" <td>-0.670834</td>\n",
" <td>-0.738395</td>\n",
" <td>-1.048022</td>\n",
" <td>-0.547774</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>-0.310771</td>\n",
" <td>-0.310771</td>\n",
" <td>-0.027639</td>\n",
" <td>-0.393898</td>\n",
" <td>0.364254</td>\n",
" <td>0.425762</td>\n",
" <td>-0.310771</td>\n",
" <td>0.051077</td>\n",
" <td>0.352261</td>\n",
" <td>-0.054474</td>\n",
" <td>...</td>\n",
" <td>-0.035559</td>\n",
" <td>0.095247</td>\n",
" <td>0.007506</td>\n",
" <td>0.026846</td>\n",
" <td>-0.010368</td>\n",
" <td>-0.090358</td>\n",
" <td>-0.027527</td>\n",
" <td>0.364254</td>\n",
" <td>0.058986</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.063454</td>\n",
" <td>1.063454</td>\n",
" <td>0.611241</td>\n",
" <td>0.792766</td>\n",
" <td>0.995891</td>\n",
" <td>1.298732</td>\n",
" <td>1.063454</td>\n",
" <td>0.673262</td>\n",
" <td>1.413612</td>\n",
" <td>0.616095</td>\n",
" <td>...</td>\n",
" <td>0.627179</td>\n",
" <td>0.702403</td>\n",
" <td>0.648514</td>\n",
" <td>0.689837</td>\n",
" <td>0.714789</td>\n",
" <td>0.597136</td>\n",
" <td>0.660691</td>\n",
" <td>0.995891</td>\n",
" <td>0.693148</td>\n",
" <td>2.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>4.867679</td>\n",
" <td>4.867679</td>\n",
" <td>3.731691</td>\n",
" <td>3.484043</td>\n",
" <td>3.063736</td>\n",
" <td>3.883626</td>\n",
" <td>4.867679</td>\n",
" <td>3.541373</td>\n",
" <td>5.350297</td>\n",
" <td>2.909366</td>\n",
" <td>...</td>\n",
" <td>3.716621</td>\n",
" <td>3.413228</td>\n",
" <td>2.638109</td>\n",
" <td>3.401899</td>\n",
" <td>3.149994</td>\n",
" <td>3.580943</td>\n",
" <td>3.034537</td>\n",
" <td>3.063736</td>\n",
" <td>3.176150</td>\n",
" <td>2.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" feature_1 feature_2 feature_3 feature_4 feature_5 \\\n",
"count 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 \n",
"mean -0.240523 -0.240523 -0.014877 -0.286865 -0.002084 \n",
"std 1.740357 1.740357 1.016059 1.280307 1.274211 \n",
"min -4.860176 -4.860176 -3.420193 -4.168268 -5.516052 \n",
"25% -1.648212 -1.648212 -0.653600 -1.147666 -1.048022 \n",
"50% -0.310771 -0.310771 -0.027639 -0.393898 0.364254 \n",
"75% 1.063454 1.063454 0.611241 0.792766 0.995891 \n",
"max 4.867679 4.867679 3.731691 3.484043 3.063736 \n",
"\n",
" feature_6 feature_7 feature_8 feature_9 feature_10 \\\n",
"count 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 \n",
"mean 0.302418 -0.240523 0.008057 0.489984 -0.036351 \n",
"std 1.378021 1.740357 0.979214 1.418114 1.018115 \n",
"min -4.584735 -4.860176 -3.302371 -4.767524 -2.749158 \n",
"25% -0.705697 -1.648212 -0.652252 -0.492640 -0.737058 \n",
"50% 0.425762 -0.310771 0.051077 0.352261 -0.054474 \n",
"75% 1.298732 1.063454 0.673262 1.413612 0.616095 \n",
"max 3.883626 4.867679 3.541373 5.350297 2.909366 \n",
"\n",
" ... feature_12 feature_13 feature_14 feature_15 \\\n",
"count ... 1000.000000 1000.000000 1000.000000 1000.000000 \n",
"mean ... -0.020501 0.020434 -0.009898 0.035657 \n",
"std ... 0.998543 1.051217 0.964432 1.027410 \n",
"min ... -2.890801 -3.875438 -2.670310 -3.302156 \n",
"25% ... -0.659614 -0.674910 -0.681390 -0.658821 \n",
"50% ... -0.035559 0.095247 0.007506 0.026846 \n",
"75% ... 0.627179 0.702403 0.648514 0.689837 \n",
"max ... 3.716621 3.413228 2.638109 3.401899 \n",
"\n",
" feature_16 feature_17 feature_18 feature_19 feature_20 \\\n",
"count 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 \n",
"mean 0.024025 -0.038217 -0.035582 -0.002084 0.062132 \n",
"std 1.002159 0.966398 1.030402 1.274211 0.942712 \n",
"min -2.909946 -3.580472 -3.857274 -5.516052 -3.239109 \n",
"25% -0.633144 -0.670834 -0.738395 -1.048022 -0.547774 \n",
"50% -0.010368 -0.090358 -0.027527 0.364254 0.058986 \n",
"75% 0.714789 0.597136 0.660691 0.995891 0.693148 \n",
"max 3.149994 3.580943 3.034537 3.063736 3.176150 \n",
"\n",
" class \n",
"count 1000.000000 \n",
"mean 0.999000 \n",
"std 0.817109 \n",
"min 0.000000 \n",
"25% 0.000000 \n",
"50% 1.000000 \n",
"75% 2.000000 \n",
"max 2.000000 \n",
"\n",
"[8 rows x 21 columns]"
]
},
"execution_count": 172,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Lucky for us, Pandas comes pre-boxed with a super convenient function for univariate analysis\n",
"df.describe()\n",
"# This shows us Measures of Central Tendency and Measures of Dispersion"
]
},
{
"cell_type": "code",
"execution_count": 173,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>feature_1</th>\n",
" <th>feature_2</th>\n",
" <th>feature_7</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-1.929568</td>\n",
" <td>-1.929568</td>\n",
" <td>-1.929568</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-0.609266</td>\n",
" <td>-0.609266</td>\n",
" <td>-0.609266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-1.290105</td>\n",
" <td>-1.290105</td>\n",
" <td>-1.290105</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.149862</td>\n",
" <td>1.149862</td>\n",
" <td>1.149862</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-1.620887</td>\n",
" <td>-1.620887</td>\n",
" <td>-1.620887</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" feature_1 feature_2 feature_7\n",
"0 -1.929568 -1.929568 -1.929568\n",
"1 -0.609266 -0.609266 -0.609266\n",
"2 -1.290105 -1.290105 -1.290105\n",
"3 1.149862 1.149862 1.149862\n",
"4 -1.620887 -1.620887 -1.620887"
]
},
"execution_count": 173,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[['feature_1', 'feature_2', 'feature_7']].head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At a quick glance it looks like features 1, 2, and 7 are repeated. Later in this exercise we'll discuss how to quantitatively determine the usefulness of our features. In a real world scenario with potentially scores or hundreds of features, **this kind of qualitative analysis won't be sufficient to extract any useful insight**."
]
},
{
"cell_type": "code",
"execution_count": 174,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0 334\n",
"1.0 333\n",
"2.0 333\n",
"Name: class, dtype: int64"
]
},
"execution_count": 174,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's count the number of observations we have for each of our classes\n",
"# In the real world, our different classifiers would be defined ahead of time - not cheating\n",
"df['class'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 175,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x115f8f910>"
]
},
"execution_count": 175,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116014310>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create boxplots for only our 20 features(no classes) and rotate x-axis labels by 45 degrees\n",
"df.ix[:,:20].boxplot(rot=45)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Multivariate Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Correlation matrices and scatterplot matrices (aka pairplots) are a good way to see if we have any linear correlation between pairs of features. If we do, then we'll want to be careful later on when we begin deciding which features to use as predictors."
]
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>feature_1</th>\n",
" <th>feature_2</th>\n",
" <th>feature_3</th>\n",
" <th>feature_4</th>\n",
" <th>feature_5</th>\n",
" <th>feature_6</th>\n",
" <th>feature_7</th>\n",
" <th>feature_8</th>\n",
" <th>feature_9</th>\n",
" <th>feature_10</th>\n",
" <th>feature_11</th>\n",
" <th>feature_12</th>\n",
" <th>feature_13</th>\n",
" <th>feature_14</th>\n",
" <th>feature_15</th>\n",
" <th>feature_16</th>\n",
" <th>feature_17</th>\n",
" <th>feature_18</th>\n",
" <th>feature_19</th>\n",
" <th>feature_20</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>feature_1</th>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.045530</td>\n",
" <td>0.764539</td>\n",
" <td>-0.660441</td>\n",
" <td>0.274660</td>\n",
" <td>1.000000</td>\n",
" <td>-0.038481</td>\n",
" <td>-0.448171</td>\n",
" <td>0.012549</td>\n",
" <td>-0.040712</td>\n",
" <td>-0.017576</td>\n",
" <td>0.000514</td>\n",
" <td>0.030654</td>\n",
" <td>0.037900</td>\n",
" <td>0.022573</td>\n",
" <td>0.009779</td>\n",
" <td>0.021653</td>\n",
" <td>-0.660441</td>\n",
" <td>-0.060091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_2</th>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.045530</td>\n",
" <td>0.764539</td>\n",
" <td>-0.660441</td>\n",
" <td>0.274660</td>\n",
" <td>1.000000</td>\n",
" <td>-0.038481</td>\n",
" <td>-0.448171</td>\n",
" <td>0.012549</td>\n",
" <td>-0.040712</td>\n",
" <td>-0.017576</td>\n",
" <td>0.000514</td>\n",
" <td>0.030654</td>\n",
" <td>0.037900</td>\n",
" <td>0.022573</td>\n",
" <td>0.009779</td>\n",
" <td>0.021653</td>\n",
" <td>-0.660441</td>\n",
" <td>-0.060091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_3</th>\n",
" <td>0.045530</td>\n",
" <td>0.045530</td>\n",
" <td>1.000000</td>\n",
" <td>0.024853</td>\n",
" <td>-0.038473</td>\n",
" <td>0.030608</td>\n",
" <td>0.045530</td>\n",
" <td>0.033996</td>\n",
" <td>0.000536</td>\n",
" <td>0.000264</td>\n",
" <td>0.049583</td>\n",
" <td>-0.002597</td>\n",
" <td>0.060267</td>\n",
" <td>-0.011430</td>\n",
" <td>-0.013752</td>\n",
" <td>-0.032952</td>\n",
" <td>0.046623</td>\n",
" <td>-0.022227</td>\n",
" <td>-0.038473</td>\n",
" <td>-0.040506</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_4</th>\n",
" <td>0.764539</td>\n",
" <td>0.764539</td>\n",
" <td>0.024853</td>\n",
" <td>1.000000</td>\n",
" <td>-0.032055</td>\n",
" <td>0.188367</td>\n",
" <td>0.764539</td>\n",
" <td>-0.027634</td>\n",
" <td>-0.614840</td>\n",
" <td>0.014111</td>\n",
" <td>-0.039239</td>\n",
" <td>-0.032651</td>\n",
" <td>0.030831</td>\n",
" <td>0.021979</td>\n",
" <td>0.047607</td>\n",
" <td>0.046129</td>\n",
" <td>0.008667</td>\n",
" <td>-0.005517</td>\n",
" <td>-0.032055</td>\n",
" <td>-0.073294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_5</th>\n",
" <td>-0.660441</td>\n",
" <td>-0.660441</td>\n",
" <td>-0.038473</td>\n",
" <td>-0.032055</td>\n",
" <td>1.000000</td>\n",
" <td>-0.052216</td>\n",
" <td>-0.660441</td>\n",
" <td>0.019143</td>\n",
" <td>0.112288</td>\n",
" <td>-0.003193</td>\n",
" <td>0.016828</td>\n",
" <td>-0.016072</td>\n",
" <td>0.033437</td>\n",
" <td>-0.027170</td>\n",
" <td>-0.001045</td>\n",
" <td>0.022242</td>\n",
" <td>-0.008476</td>\n",
" <td>-0.039166</td>\n",
" <td>1.000000</td>\n",
" <td>0.016642</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_6</th>\n",
" <td>0.274660</td>\n",
" <td>0.274660</td>\n",
" <td>0.030608</td>\n",
" <td>0.188367</td>\n",
" <td>-0.052216</td>\n",
" <td>1.000000</td>\n",
" <td>0.274660</td>\n",
" <td>-0.060530</td>\n",
" <td>0.648227</td>\n",
" <td>0.002934</td>\n",
" <td>-0.015723</td>\n",
" <td>-0.038729</td>\n",
" <td>-0.006640</td>\n",
" <td>-0.023131</td>\n",
" <td>0.026138</td>\n",
" <td>0.030458</td>\n",
" <td>-0.017632</td>\n",
" <td>0.008633</td>\n",
" <td>-0.052216</td>\n",
" <td>0.033475</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_7</th>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.045530</td>\n",
" <td>0.764539</td>\n",
" <td>-0.660441</td>\n",
" <td>0.274660</td>\n",
" <td>1.000000</td>\n",
" <td>-0.038481</td>\n",
" <td>-0.448171</td>\n",
" <td>0.012549</td>\n",
" <td>-0.040712</td>\n",
" <td>-0.017576</td>\n",
" <td>0.000514</td>\n",
" <td>0.030654</td>\n",
" <td>0.037900</td>\n",
" <td>0.022573</td>\n",
" <td>0.009779</td>\n",
" <td>0.021653</td>\n",
" <td>-0.660441</td>\n",
" <td>-0.060091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_8</th>\n",
" <td>-0.038481</td>\n",
" <td>-0.038481</td>\n",
" <td>0.033996</td>\n",
" <td>-0.027634</td>\n",
" <td>0.019143</td>\n",
" <td>-0.060530</td>\n",
" <td>-0.038481</td>\n",
" <td>1.000000</td>\n",
" <td>-0.024812</td>\n",
" <td>0.012664</td>\n",
" <td>0.051741</td>\n",
" <td>-0.024080</td>\n",
" <td>0.004424</td>\n",
" <td>0.033681</td>\n",
" <td>-0.016057</td>\n",
" <td>0.024427</td>\n",
" <td>0.029118</td>\n",
" <td>-0.013006</td>\n",
" <td>0.019143</td>\n",
" <td>0.014110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_9</th>\n",
" <td>-0.448171</td>\n",
" <td>-0.448171</td>\n",
" <td>0.000536</td>\n",
" <td>-0.614840</td>\n",
" <td>0.112288</td>\n",
" <td>0.648227</td>\n",
" <td>-0.448171</td>\n",
" <td>-0.024812</td>\n",
" <td>1.000000</td>\n",
" <td>-0.008811</td>\n",
" <td>0.019492</td>\n",
" <td>-0.008152</td>\n",
" <td>-0.024433</td>\n",
" <td>-0.038715</td>\n",
" <td>-0.015500</td>\n",
" <td>-0.007910</td>\n",
" <td>-0.021771</td>\n",
" <td>0.006016</td>\n",
" <td>0.112288</td>\n",
" <td>0.084663</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_10</th>\n",
" <td>0.012549</td>\n",
" <td>0.012549</td>\n",
" <td>0.000264</td>\n",
" <td>0.014111</td>\n",
" <td>-0.003193</td>\n",
" <td>0.002934</td>\n",
" <td>0.012549</td>\n",
" <td>0.012664</td>\n",
" <td>-0.008811</td>\n",
" <td>1.000000</td>\n",
" <td>-0.025078</td>\n",
" <td>-0.008516</td>\n",
" <td>0.026575</td>\n",
" <td>0.071213</td>\n",
" <td>-0.035613</td>\n",
" <td>-0.014038</td>\n",
" <td>0.063435</td>\n",
" <td>0.002797</td>\n",
" <td>-0.003193</td>\n",
" <td>0.032644</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_11</th>\n",
" <td>-0.040712</td>\n",
" <td>-0.040712</td>\n",
" <td>0.049583</td>\n",
" <td>-0.039239</td>\n",
" <td>0.016828</td>\n",
" <td>-0.015723</td>\n",
" <td>-0.040712</td>\n",
" <td>0.051741</td>\n",
" <td>0.019492</td>\n",
" <td>-0.025078</td>\n",
" <td>1.000000</td>\n",
" <td>0.037603</td>\n",
" <td>-0.007266</td>\n",
" <td>0.044407</td>\n",
" <td>0.030219</td>\n",
" <td>-0.001727</td>\n",
" <td>-0.011188</td>\n",
" <td>-0.021356</td>\n",
" <td>0.016828</td>\n",
" <td>-0.012094</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_12</th>\n",
" <td>-0.017576</td>\n",
" <td>-0.017576</td>\n",
" <td>-0.002597</td>\n",
" <td>-0.032651</td>\n",
" <td>-0.016072</td>\n",
" <td>-0.038729</td>\n",
" <td>-0.017576</td>\n",
" <td>-0.024080</td>\n",
" <td>-0.008152</td>\n",
" <td>-0.008516</td>\n",
" <td>0.037603</td>\n",
" <td>1.000000</td>\n",
" <td>-0.013600</td>\n",
" <td>-0.001059</td>\n",
" <td>-0.034427</td>\n",
" <td>-0.015834</td>\n",
" <td>-0.041619</td>\n",
" <td>0.019533</td>\n",
" <td>-0.016072</td>\n",
" <td>-0.027201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_13</th>\n",
" <td>0.000514</td>\n",
" <td>0.000514</td>\n",
" <td>0.060267</td>\n",
" <td>0.030831</td>\n",
" <td>0.033437</td>\n",
" <td>-0.006640</td>\n",
" <td>0.000514</td>\n",
" <td>0.004424</td>\n",
" <td>-0.024433</td>\n",
" <td>0.026575</td>\n",
" <td>-0.007266</td>\n",
" <td>-0.013600</td>\n",
" <td>1.000000</td>\n",
" <td>-0.031218</td>\n",
" <td>0.024563</td>\n",
" <td>-0.025734</td>\n",
" <td>-0.008673</td>\n",
" <td>0.004822</td>\n",
" <td>0.033437</td>\n",
" <td>-0.036306</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_14</th>\n",
" <td>0.030654</td>\n",
" <td>0.030654</td>\n",
" <td>-0.011430</td>\n",
" <td>0.021979</td>\n",
" <td>-0.027170</td>\n",
" <td>-0.023131</td>\n",
" <td>0.030654</td>\n",
" <td>0.033681</td>\n",
" <td>-0.038715</td>\n",
" <td>0.071213</td>\n",
" <td>0.044407</td>\n",
" <td>-0.001059</td>\n",
" <td>-0.031218</td>\n",
" <td>1.000000</td>\n",
" <td>0.028376</td>\n",
" <td>0.050158</td>\n",
" <td>0.050940</td>\n",
" <td>-0.029396</td>\n",
" <td>-0.027170</td>\n",
" <td>0.012677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_15</th>\n",
" <td>0.037900</td>\n",
" <td>0.037900</td>\n",
" <td>-0.013752</td>\n",
" <td>0.047607</td>\n",
" <td>-0.001045</td>\n",
" <td>0.026138</td>\n",
" <td>0.037900</td>\n",
" <td>-0.016057</td>\n",
" <td>-0.015500</td>\n",
" <td>-0.035613</td>\n",
" <td>0.030219</td>\n",
" <td>-0.034427</td>\n",
" <td>0.024563</td>\n",
" <td>0.028376</td>\n",
" <td>1.000000</td>\n",
" <td>0.008981</td>\n",
" <td>0.000977</td>\n",
" <td>-0.015887</td>\n",
" <td>-0.001045</td>\n",
" <td>0.015157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_16</th>\n",
" <td>0.022573</td>\n",
" <td>0.022573</td>\n",
" <td>-0.032952</td>\n",
" <td>0.046129</td>\n",
" <td>0.022242</td>\n",
" <td>0.030458</td>\n",
" <td>0.022573</td>\n",
" <td>0.024427</td>\n",
" <td>-0.007910</td>\n",
" <td>-0.014038</td>\n",
" <td>-0.001727</td>\n",
" <td>-0.015834</td>\n",
" <td>-0.025734</td>\n",
" <td>0.050158</td>\n",
" <td>0.008981</td>\n",
" <td>1.000000</td>\n",
" <td>-0.051292</td>\n",
" <td>0.016791</td>\n",
" <td>0.022242</td>\n",
" <td>-0.014158</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_17</th>\n",
" <td>0.009779</td>\n",
" <td>0.009779</td>\n",
" <td>0.046623</td>\n",
" <td>0.008667</td>\n",
" <td>-0.008476</td>\n",
" <td>-0.017632</td>\n",
" <td>0.009779</td>\n",
" <td>0.029118</td>\n",
" <td>-0.021771</td>\n",
" <td>0.063435</td>\n",
" <td>-0.011188</td>\n",
" <td>-0.041619</td>\n",
" <td>-0.008673</td>\n",
" <td>0.050940</td>\n",
" <td>0.000977</td>\n",
" <td>-0.051292</td>\n",
" <td>1.000000</td>\n",
" <td>0.005205</td>\n",
" <td>-0.008476</td>\n",
" <td>0.011309</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_18</th>\n",
" <td>0.021653</td>\n",
" <td>0.021653</td>\n",
" <td>-0.022227</td>\n",
" <td>-0.005517</td>\n",
" <td>-0.039166</td>\n",
" <td>0.008633</td>\n",
" <td>0.021653</td>\n",
" <td>-0.013006</td>\n",
" <td>0.006016</td>\n",
" <td>0.002797</td>\n",
" <td>-0.021356</td>\n",
" <td>0.019533</td>\n",
" <td>0.004822</td>\n",
" <td>-0.029396</td>\n",
" <td>-0.015887</td>\n",
" <td>0.016791</td>\n",
" <td>0.005205</td>\n",
" <td>1.000000</td>\n",
" <td>-0.039166</td>\n",
" <td>-0.019856</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_19</th>\n",
" <td>-0.660441</td>\n",
" <td>-0.660441</td>\n",
" <td>-0.038473</td>\n",
" <td>-0.032055</td>\n",
" <td>1.000000</td>\n",
" <td>-0.052216</td>\n",
" <td>-0.660441</td>\n",
" <td>0.019143</td>\n",
" <td>0.112288</td>\n",
" <td>-0.003193</td>\n",
" <td>0.016828</td>\n",
" <td>-0.016072</td>\n",
" <td>0.033437</td>\n",
" <td>-0.027170</td>\n",
" <td>-0.001045</td>\n",
" <td>0.022242</td>\n",
" <td>-0.008476</td>\n",
" <td>-0.039166</td>\n",
" <td>1.000000</td>\n",
" <td>0.016642</td>\n",
" </tr>\n",
" <tr>\n",
" <th>feature_20</th>\n",
" <td>-0.060091</td>\n",
" <td>-0.060091</td>\n",
" <td>-0.040506</td>\n",
" <td>-0.073294</td>\n",
" <td>0.016642</td>\n",
" <td>0.033475</td>\n",
" <td>-0.060091</td>\n",
" <td>0.014110</td>\n",
" <td>0.084663</td>\n",
" <td>0.032644</td>\n",
" <td>-0.012094</td>\n",
" <td>-0.027201</td>\n",
" <td>-0.036306</td>\n",
" <td>0.012677</td>\n",
" <td>0.015157</td>\n",
" <td>-0.014158</td>\n",
" <td>0.011309</td>\n",
" <td>-0.019856</td>\n",
" <td>0.016642</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" feature_1 feature_2 feature_3 feature_4 feature_5 feature_6 \\\n",
"feature_1 1.000000 1.000000 0.045530 0.764539 -0.660441 0.274660 \n",
"feature_2 1.000000 1.000000 0.045530 0.764539 -0.660441 0.274660 \n",
"feature_3 0.045530 0.045530 1.000000 0.024853 -0.038473 0.030608 \n",
"feature_4 0.764539 0.764539 0.024853 1.000000 -0.032055 0.188367 \n",
"feature_5 -0.660441 -0.660441 -0.038473 -0.032055 1.000000 -0.052216 \n",
"feature_6 0.274660 0.274660 0.030608 0.188367 -0.052216 1.000000 \n",
"feature_7 1.000000 1.000000 0.045530 0.764539 -0.660441 0.274660 \n",
"feature_8 -0.038481 -0.038481 0.033996 -0.027634 0.019143 -0.060530 \n",
"feature_9 -0.448171 -0.448171 0.000536 -0.614840 0.112288 0.648227 \n",
"feature_10 0.012549 0.012549 0.000264 0.014111 -0.003193 0.002934 \n",
"feature_11 -0.040712 -0.040712 0.049583 -0.039239 0.016828 -0.015723 \n",
"feature_12 -0.017576 -0.017576 -0.002597 -0.032651 -0.016072 -0.038729 \n",
"feature_13 0.000514 0.000514 0.060267 0.030831 0.033437 -0.006640 \n",
"feature_14 0.030654 0.030654 -0.011430 0.021979 -0.027170 -0.023131 \n",
"feature_15 0.037900 0.037900 -0.013752 0.047607 -0.001045 0.026138 \n",
"feature_16 0.022573 0.022573 -0.032952 0.046129 0.022242 0.030458 \n",
"feature_17 0.009779 0.009779 0.046623 0.008667 -0.008476 -0.017632 \n",
"feature_18 0.021653 0.021653 -0.022227 -0.005517 -0.039166 0.008633 \n",
"feature_19 -0.660441 -0.660441 -0.038473 -0.032055 1.000000 -0.052216 \n",
"feature_20 -0.060091 -0.060091 -0.040506 -0.073294 0.016642 0.033475 \n",
"\n",
" feature_7 feature_8 feature_9 feature_10 feature_11 \\\n",
"feature_1 1.000000 -0.038481 -0.448171 0.012549 -0.040712 \n",
"feature_2 1.000000 -0.038481 -0.448171 0.012549 -0.040712 \n",
"feature_3 0.045530 0.033996 0.000536 0.000264 0.049583 \n",
"feature_4 0.764539 -0.027634 -0.614840 0.014111 -0.039239 \n",
"feature_5 -0.660441 0.019143 0.112288 -0.003193 0.016828 \n",
"feature_6 0.274660 -0.060530 0.648227 0.002934 -0.015723 \n",
"feature_7 1.000000 -0.038481 -0.448171 0.012549 -0.040712 \n",
"feature_8 -0.038481 1.000000 -0.024812 0.012664 0.051741 \n",
"feature_9 -0.448171 -0.024812 1.000000 -0.008811 0.019492 \n",
"feature_10 0.012549 0.012664 -0.008811 1.000000 -0.025078 \n",
"feature_11 -0.040712 0.051741 0.019492 -0.025078 1.000000 \n",
"feature_12 -0.017576 -0.024080 -0.008152 -0.008516 0.037603 \n",
"feature_13 0.000514 0.004424 -0.024433 0.026575 -0.007266 \n",
"feature_14 0.030654 0.033681 -0.038715 0.071213 0.044407 \n",
"feature_15 0.037900 -0.016057 -0.015500 -0.035613 0.030219 \n",
"feature_16 0.022573 0.024427 -0.007910 -0.014038 -0.001727 \n",
"feature_17 0.009779 0.029118 -0.021771 0.063435 -0.011188 \n",
"feature_18 0.021653 -0.013006 0.006016 0.002797 -0.021356 \n",
"feature_19 -0.660441 0.019143 0.112288 -0.003193 0.016828 \n",
"feature_20 -0.060091 0.014110 0.084663 0.032644 -0.012094 \n",
"\n",
" feature_12 feature_13 feature_14 feature_15 feature_16 \\\n",
"feature_1 -0.017576 0.000514 0.030654 0.037900 0.022573 \n",
"feature_2 -0.017576 0.000514 0.030654 0.037900 0.022573 \n",
"feature_3 -0.002597 0.060267 -0.011430 -0.013752 -0.032952 \n",
"feature_4 -0.032651 0.030831 0.021979 0.047607 0.046129 \n",
"feature_5 -0.016072 0.033437 -0.027170 -0.001045 0.022242 \n",
"feature_6 -0.038729 -0.006640 -0.023131 0.026138 0.030458 \n",
"feature_7 -0.017576 0.000514 0.030654 0.037900 0.022573 \n",
"feature_8 -0.024080 0.004424 0.033681 -0.016057 0.024427 \n",
"feature_9 -0.008152 -0.024433 -0.038715 -0.015500 -0.007910 \n",
"feature_10 -0.008516 0.026575 0.071213 -0.035613 -0.014038 \n",
"feature_11 0.037603 -0.007266 0.044407 0.030219 -0.001727 \n",
"feature_12 1.000000 -0.013600 -0.001059 -0.034427 -0.015834 \n",
"feature_13 -0.013600 1.000000 -0.031218 0.024563 -0.025734 \n",
"feature_14 -0.001059 -0.031218 1.000000 0.028376 0.050158 \n",
"feature_15 -0.034427 0.024563 0.028376 1.000000 0.008981 \n",
"feature_16 -0.015834 -0.025734 0.050158 0.008981 1.000000 \n",
"feature_17 -0.041619 -0.008673 0.050940 0.000977 -0.051292 \n",
"feature_18 0.019533 0.004822 -0.029396 -0.015887 0.016791 \n",
"feature_19 -0.016072 0.033437 -0.027170 -0.001045 0.022242 \n",
"feature_20 -0.027201 -0.036306 0.012677 0.015157 -0.014158 \n",
"\n",
" feature_17 feature_18 feature_19 feature_20 \n",
"feature_1 0.009779 0.021653 -0.660441 -0.060091 \n",
"feature_2 0.009779 0.021653 -0.660441 -0.060091 \n",
"feature_3 0.046623 -0.022227 -0.038473 -0.040506 \n",
"feature_4 0.008667 -0.005517 -0.032055 -0.073294 \n",
"feature_5 -0.008476 -0.039166 1.000000 0.016642 \n",
"feature_6 -0.017632 0.008633 -0.052216 0.033475 \n",
"feature_7 0.009779 0.021653 -0.660441 -0.060091 \n",
"feature_8 0.029118 -0.013006 0.019143 0.014110 \n",
"feature_9 -0.021771 0.006016 0.112288 0.084663 \n",
"feature_10 0.063435 0.002797 -0.003193 0.032644 \n",
"feature_11 -0.011188 -0.021356 0.016828 -0.012094 \n",
"feature_12 -0.041619 0.019533 -0.016072 -0.027201 \n",
"feature_13 -0.008673 0.004822 0.033437 -0.036306 \n",
"feature_14 0.050940 -0.029396 -0.027170 0.012677 \n",
"feature_15 0.000977 -0.015887 -0.001045 0.015157 \n",
"feature_16 -0.051292 0.016791 0.022242 -0.014158 \n",
"feature_17 1.000000 0.005205 -0.008476 0.011309 \n",
"feature_18 0.005205 1.000000 -0.039166 -0.019856 \n",
"feature_19 -0.008476 -0.039166 1.000000 0.016642 \n",
"feature_20 0.011309 -0.019856 0.016642 1.000000 "
]
},
"execution_count": 176,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Correlation matrices (aka bivariate correlation matrices) show us the correlation\n",
"# coefficients between each pair of variables. Coefficients range between [0,1]\n",
"df.ix[:,:20].corr()\n",
"# Note what happens when we pair up our known redundant features - we can see a correlation\n",
"# of 1!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Now let's take a look at pairplots for a subset of our features (even 20 is a lot)\n",
"sns.pairplot(df.ix[:,:7])\n",
"# Again, take a look at the intersections of our known redundant features. They produce\n",
"# a straigt line - perfect linear correlation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The two cells above show us an extreme example of what happens when have linearly correlated data. In the case of features 1, 2, and 7 we see a correlation coefficient of `1`, which is as \"extreme\" as we can get. It would be too broad of a statement to say avoid using pairs of linearly correlated features in a classification model, but the magnitude of correlation between the variables we chose is important.\n",
"\n",
"If we find ourselves in a scenario where we have a limited number of training samples and a bunch of highly correlated features, we may want to lean out the number of features we use to classify our observations. **Having too many features for too few samples results in something called undersampling - meaning the model is trained to make complicated decisions off of too few data points.** In the case of an undersampled model, we can look to our correlated features and decide which to remove (more on this later)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Feature Selection"
]
},
{
"cell_type": "code",
"execution_count": 178,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Feature Name: Is Significant? -> P-Value -> Score\n",
"Feature 1: False -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 2: False -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 3: False -> 0.256577843577 -> 1.3621809134\n",
"Feature 4: True -> 3.10475254731e-36 -> 88.847057783\n",
"Feature 5: False -> 0.933793617904 -> 0.068504537573\n",
"Feature 6: True -> 2.45685288084e-141 -> 455.900373583\n",
"Feature 7: True -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 8: False -> 0.227103203294 -> 1.48455688658\n",
"Feature 9: False -> 5.19038348527e-16 -> 36.466698916\n",
"Feature 10: False -> 0.654626889221 -> 0.42386994469\n",
"Feature 11: False -> 0.633552907091 -> 0.45662076947\n",
"Feature 12: False -> 0.0865668072662 -> 2.45285369726\n",
"Feature 13: False -> 0.112582981333 -> 2.18885620461\n",
"Feature 14: False -> 0.531962532216 -> 0.631581978751\n",
"Feature 15: False -> 0.307921718187 -> 1.17930243298\n",
"Feature 16: False -> 0.234005285055 -> 1.45452948149\n",
"Feature 17: False -> 0.157611686465 -> 1.85104916081\n",
"Feature 18: False -> 0.254712844489 -> 1.36949619346\n",
"Feature 19: False -> 0.933793617904 -> 0.068504537573\n",
"Feature 20: False -> 0.228369036436 -> 1.47898201754\n"
]
}
],
"source": [
"# Select most important features using scores\n",
"selector = feature_selection.SelectKBest(feature_selection.f_classif, k=3)\n",
"transformer = selector.fit(features, classes)\n",
"\n",
"print 'Feature Name: Is Significant? -> P-Value -> Score'\n",
"\n",
"index = 0\n",
"for i in transformer.get_support():\n",
" index += 1\n",
" print 'Feature {index}: {i} -> {pval} -> {score}'.format(index=index,\n",
" i=i,\n",
" pval=transformer.pvalues_[index-1],\n",
" score=transformer.scores_[index-1]\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This output shows us that the 3 best features to use for classification are `feature_4`, `feature_6`, and `feature_7`. It's *important* to note, however, that this analysis is univariate; this means that our feature selection algorithm does NOT consider redundant fields. This little issue can be observed in the test below - the same code is run as above, except we tell the algorithm to provide us with the top 5 features instead of the top 3."
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Feature Name: Is Significant? -> P-Value -> Score\n",
"Feature 1: True -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 2: True -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 3: False -> 0.256577843577 -> 1.3621809134\n",
"Feature 4: True -> 3.10475254731e-36 -> 88.847057783\n",
"Feature 5: False -> 0.933793617904 -> 0.068504537573\n",
"Feature 6: True -> 2.45685288084e-141 -> 455.900373583\n",
"Feature 7: True -> 1.46645899746e-28 -> 68.391738204\n",
"Feature 8: False -> 0.227103203294 -> 1.48455688658\n",
"Feature 9: False -> 5.19038348527e-16 -> 36.466698916\n",
"Feature 10: False -> 0.654626889221 -> 0.42386994469\n",
"Feature 11: False -> 0.633552907091 -> 0.45662076947\n",
"Feature 12: False -> 0.0865668072662 -> 2.45285369726\n",
"Feature 13: False -> 0.112582981333 -> 2.18885620461\n",
"Feature 14: False -> 0.531962532216 -> 0.631581978751\n",
"Feature 15: False -> 0.307921718187 -> 1.17930243298\n",
"Feature 16: False -> 0.234005285055 -> 1.45452948149\n",
"Feature 17: False -> 0.157611686465 -> 1.85104916081\n",
"Feature 18: False -> 0.254712844489 -> 1.36949619346\n",
"Feature 19: False -> 0.933793617904 -> 0.068504537573\n",
"Feature 20: False -> 0.228369036436 -> 1.47898201754\n"
]
}
],
"source": [
"# Check to see whether our algorithm is intelligent enough to know whether it's recommending redundant data\n",
"selector = feature_selection.SelectKBest(feature_selection.f_classif, k=5)\n",
"transformer = selector.fit(features, classes)\n",
"\n",
"print 'Feature Name: Is Significant? -> P-Value -> Score'\n",
"\n",
"index = 0\n",
"for i in transformer.get_support():\n",
" index += 1\n",
" print 'Feature {index}: {i} -> {pval} -> {score}'.format(index=index,\n",
" i=i,\n",
" pval=transformer.pvalues_[index-1],\n",
" score=transformer.scores_[index-1]\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the output above and compare it to our previous cell. Since one of our original top 3 features was a known redundant feature (`feature_7`), selecting the top 5 features actually caused the algorithm to give us back the other two redundant fields (`feature_1` and `feature_2`). This is a problem.\n",
"\n",
"In order to fix this in the future, we have a few options:\n",
"- go back to our correlation matrix and remove the highly correlated(redundant) fields\n",
"- use a multivariate feature selection algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Classification Model"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x123077a50>"
]
},
"execution_count": 210,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1228b3990>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df[['feature_4', 'feature_6', 'feature_7', 'class']].plot.scatter(x = 'feature_4', y = 'feature_7', c='class')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model Visualization"
]
},
{
"cell_type": "code",
"execution_count": 220,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "unbound method scatter() must be called with Axes3D instance as first argument (got nothing instead)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-220-651e91cb748e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmpl_toolkits\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmplot3d\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAxes3D\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mAxes3D\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_4\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_6\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_7\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: unbound method scatter() must be called with Axes3D instance as first argument (got nothing instead)"
]
}
],
"source": [
"from mpl_toolkits.mplot3d import Axes3D\n",
"Axes3D.scatter(xs = df.feature_4.values, ys = df.feature_6.values, zs = df.feature_7.values)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment