{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Prepare the Data " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import addutils.toc ; addutils.toc.js(ipy_notebook=True)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import scipy.io\n", "import numpy as np\n", "import pandas as pd\n", "from io import StringIO\n", "from sklearn import datasets\n", "from addutils import css_notebook\n", "css_notebook()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", " var JS_MIME_TYPE = 'application/javascript';\n", " var HTML_MIME_TYPE = 'text/html';\n", " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " var CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " var script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " var cell = handle.cell;\n", "\n", " var id = cell.output_area._bokeh_element_id;\n", " var server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id !== undefined) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd, {\n", " iopub: {\n", " output: function(msg) {\n", " var element_id = msg.content.text.trim();\n", " Bokeh.index[element_id].model.document.clear();\n", " delete Bokeh.index[element_id];\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[0].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[0].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[0]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", "\n", " \n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"
    \\n\"+\n", " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " var el = document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\");\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " }\n", " finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '2e4b794c-965c-45dc-898a-e00ca1131237' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-0.12.13.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };var element = document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\");\n if (element == null) {\n console.log(\"Bokeh: ERROR: autoload.js configured with elementid '2e4b794c-965c-45dc-898a-e00ca1131237' but no matching script tag was found. \")\n return false;\n }\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-0.12.13.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.13.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.13.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.13.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"2e4b794c-965c-45dc-898a-e00ca1131237\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import bokeh.plotting as bk\n", "bk.output_notebook()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1 Introduction: Building Good Training Sets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The quality of the data and the amount of useful information that it contains are key\n", "factors that determine how well a machine learning algorithm performs. It is absolutely critical that we make sure to examine and preprocess a dataset before we feed it to a learning algorithm. In this notebook, we will show the essential data preprocessing steps that are useful to a ML pipeline:\n", "\n", "- Removing and imputing missing values from the dataset\n", "- Getting categorical data into shape for machine learning algorithms\n", "- Selecting relevant features for the model construction\n", "\n", "The first step in data analysis is usually " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2 Exploratory Data Analysis (EDA)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most machine learning algorithms implemented in scikit-learn expect data to be stored in a\n", "**two-dimensional array or matrix**. The arrays can be\n", "either ``numpy`` arrays, pandas ``DataFrame``, or in some cases ``scipy.sparse`` matrices.\n", "The size of the array is expected to be `[n_samples, n_features]`\n", "\n", "The number of features must be fixed in advance. However it can be very high dimensional\n", "(e.g. millions of features) with most of them being zeros for a given sample. This is a case where `scipy.sparse` matrices can be useful, in that they are much more memory-efficient than numpy arrays.\n", "\n", "Although it is not required, in many cases it can be easier to manage the data pre-processing with **pandas**. We use the *iris* dataset for this simple exploratory analysis.\n", "\n", "Once we have loaded the dataset, we transform it to a Pandas DataFrame and then we can have a look at the first few columns (default to 5)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)y
05.13.51.40.20
14.93.01.40.20
24.73.21.30.20
34.63.11.50.20
45.03.61.40.20
\n", "
" ], "text/plain": [ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) y\n", "0 5.1 3.5 1.4 0.2 0\n", "1 4.9 3.0 1.4 0.2 0\n", "2 4.7 3.2 1.3 0.2 0\n", "3 4.6 3.1 1.5 0.2 0\n", "4 5.0 3.6 1.4 0.2 0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.options.display.notebook_repr_html = True\n", "d = datasets.load_iris()\n", "df = pd.DataFrame(d.data, columns=d.feature_names)\n", "df['y'] = d.target\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is usually wise to look at the dimension of the DataFrame, and the name of the columns." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(150, 5)\n", "Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',\n", " 'petal width (cm)', 'y'],\n", " dtype='object')\n" ] } ], "source": [ "print(df.shape)\n", "print(df.columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we can look at summary of numerical features by using `describe` function. It provides count, mean, standard deviation (std), min, quartiles and max as output." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
count150.000150.000150.000150.000
mean5.8433.0543.7591.199
std0.8280.4341.7640.763
min4.3002.0001.0000.100
25%5.1002.8001.6000.300
50%5.8003.0004.3501.300
75%6.4003.3005.1001.800
max7.9004.4006.9002.500
\n", "
" ], "text/plain": [ " sepal length (cm) sepal width (cm) petal length (cm) \\\n", "count 150.000 150.000 150.000 \n", "mean 5.843 3.054 3.759 \n", "std 0.828 0.434 1.764 \n", "min 4.300 2.000 1.000 \n", "25% 5.100 2.800 1.600 \n", "50% 5.800 3.000 4.350 \n", "75% 6.400 3.300 5.100 \n", "max 7.900 4.400 6.900 \n", "\n", " petal width (cm) \n", "count 150.000 \n", "mean 1.199 \n", "std 0.763 \n", "min 0.100 \n", "25% 0.300 \n", "50% 1.300 \n", "75% 1.800 \n", "max 2.500 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.set_option('precision',3)\n", "df.drop('y', axis=1).describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For non-numerical values we can look at frequency distribution to understand whether they make sense or not. The frequency table can be printed by the command `value_counts` (in this case the only discrete variable we have is the output `y`). " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 50\n", "1 50\n", "0 50\n", "Name: y, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['y'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`value_counts` works only on `pandas.Series` objects (i.e. only on columns). Another method is to convert the target column to a category and then use the `describe` function. Note however that `descibe` exclude categorical columns by default." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 150\n", "unique 3\n", "top 2\n", "freq 50\n", "Name: y, dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['y'] = df['y'].astype('category')\n", "df['y'].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we can see a two dimensional plot. On the x and y axes you can choose whatever feature to plot, while the color of the dot represents the label." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"3191efbb-df55-477a-a645-6e30430b44b7\":{\"roots\":{\"references\":[{\"attributes\":{},\"id\":\"e65c151a-f32f-4edf-877a-5a3f96333abf\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"bcd2889c-45eb-47f6-b060-02a33e3cdf11\",\"type\":\"DataRange1d\"},{\"attributes\":{\"below\":[{\"id\":\"42cab2ca-21f2-4a92-8dd0-b5cfd1840f13\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"b80f0e7f-f2ce-4245-816d-64198c3c607b\",\"type\":\"LinearAxis\"}],\"plot_height\":500,\"renderers\":[{\"id\":\"42cab2ca-21f2-4a92-8dd0-b5cfd1840f13\",\"type\":\"LinearAxis\"},{\"id\":\"72209fa6-916c-456b-bcfa-0250bb6f97b6\",\"type\":\"Grid\"},{\"id\":\"b80f0e7f-f2ce-4245-816d-64198c3c607b\",\"type\":\"LinearAxis\"},{\"id\":\"2d65e69b-a202-40aa-99ca-4ea75bcfb6f9\",\"type\":\"Grid\"},{\"id\":\"f9b43970-888c-40fb-9391-5b0e4ff5a22a\",\"type\":\"BoxAnnotation\"},{\"id\":\"2ab57d9f-6ba8-49c9-b8d8-d2ac4bd97557\",\"type\":\"GlyphRenderer\"}],\"title\":null,\"toolbar\":{\"id\":\"5df3fa3b-ee3a-4b2e-82b4-45c6af36ed46\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"bcd2889c-45eb-47f6-b060-02a33e3cdf11\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"956b062e-2387-4175-9368-54b1345cdc5c\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"4e2cc7cb-7ba0-498f-b5ac-12b87b00fcfd\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"bbd74898-1b90-43aa-9829-738c24f54402\",\"type\":\"LinearScale\"}},\"id\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"f9b43970-888c-40fb-9391-5b0e4ff5a22a\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"5fd14cc6-a66d-48f2-8fe2-8ce550c4c718\",\"type\":\"PanTool\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"x\",\"y\",\"fill_color\"],\"data\":{\"fill_color\":[\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#006CD1\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#26D100\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\",\"#D10000\"],\"x\":{\"__ndarray__\":\"ZmZmZmZm9j9mZmZmZmb2P83MzMzMzPQ/AAAAAAAA+D9mZmZmZmb2PzMzMzMzM/s/ZmZmZmZm9j8AAAAAAAD4P2ZmZmZmZvY/AAAAAAAA+D8AAAAAAAD4P5qZmZmZmfk/ZmZmZmZm9j+amZmZmZnxPzMzMzMzM/M/AAAAAAAA+D/NzMzMzMz0P2ZmZmZmZvY/MzMzMzMz+z8AAAAAAAD4PzMzMzMzM/s/AAAAAAAA+D8AAAAAAADwPzMzMzMzM/s/ZmZmZmZm/j+amZmZmZn5P5qZmZmZmfk/AAAAAAAA+D9mZmZmZmb2P5qZmZmZmfk/mpmZmZmZ+T8AAAAAAAD4PwAAAAAAAPg/ZmZmZmZm9j8AAAAAAAD4PzMzMzMzM/M/zczMzMzM9D8AAAAAAAD4P83MzMzMzPQ/AAAAAAAA+D/NzMzMzMz0P83MzMzMzPQ/zczMzMzM9D+amZmZmZn5P2ZmZmZmZv4/ZmZmZmZm9j+amZmZmZn5P2ZmZmZmZvY/AAAAAAAA+D9mZmZmZmb2P83MzMzMzBJAAAAAAAAAEkCamZmZmZkTQAAAAAAAABBAZmZmZmZmEkAAAAAAAAASQM3MzMzMzBJAZmZmZmZmCkBmZmZmZmYSQDMzMzMzMw9AAAAAAAAADEDNzMzMzMwQQAAAAAAAABBAzczMzMzMEkDNzMzMzMwMQJqZmZmZmRFAAAAAAAAAEkBmZmZmZmYQQAAAAAAAABJAMzMzMzMzD0AzMzMzMzMTQAAAAAAAABBAmpmZmZmZE0DNzMzMzMwSQDMzMzMzMxFAmpmZmZmZEUAzMzMzMzMTQAAAAAAAABRAAAAAAAAAEkAAAAAAAAAMQGZmZmZmZg5AmpmZmZmZDUAzMzMzMzMPQGZmZmZmZhRAAAAAAAAAEkAAAAAAAAASQM3MzMzMzBJAmpmZmZmZEUBmZmZmZmYQQAAAAAAAABBAmpmZmZmZEUBmZmZmZmYSQAAAAAAAABBAZmZmZmZmCkDNzMzMzMwQQM3MzMzMzBBAzczMzMzMEEAzMzMzMzMRQAAAAAAAAAhAZmZmZmZmEEAAAAAAAAAYQGZmZmZmZhRAmpmZmZmZF0BmZmZmZmYWQDMzMzMzMxdAZmZmZmZmGkAAAAAAAAASQDMzMzMzMxlAMzMzMzMzF0BmZmZmZmYYQGZmZmZmZhRAMzMzMzMzFUAAAAAAAAAWQAAAAAAAABRAZmZmZmZmFEAzMzMzMzMVQAAAAAAAABZAzczMzMzMGkCamZmZmZkbQAAAAAAAABRAzczMzMzMFkCamZmZmZkTQM3MzMzMzBpAmpmZmZmZE0DNzMzMzMwWQAAAAAAAABhAMzMzMzMzE0CamZmZmZkTQGZmZmZmZhZAMzMzMzMzF0BmZmZmZmYYQJqZmZmZmRlAZmZmZmZmFkBmZmZmZmYUQGZmZmZmZhZAZmZmZmZmGEBmZmZmZmYWQAAAAAAAABZAMzMzMzMzE0CamZmZmZkVQGZmZmZmZhZAZmZmZmZmFEBmZmZmZmYUQJqZmZmZmRdAzczMzMzMFkDNzMzMzMwUQAAAAAAAABRAzczMzMzMFECamZmZmZkVQGZmZmZmZhRA\",\"dtype\":\"float64\",\"shape\":[150]},\"y\":{\"__ndarray__\":\"mpmZmZmZyT+amZmZmZnJP5qZmZmZmck/mpmZmZmZyT+amZmZmZnJP5qZmZmZmdk/MzMzMzMz0z+amZmZmZnJP5qZmZmZmck/mpmZmZmZuT+amZmZmZnJP5qZmZmZmck/mpmZmZmZuT+amZmZmZm5P5qZmZmZmck/mpmZmZmZ2T+amZmZmZnZPzMzMzMzM9M/MzMzMzMz0z8zMzMzMzPTP5qZmZmZmck/mpmZmZmZ2T+amZmZmZnJPwAAAAAAAOA/mpmZmZmZyT+amZmZmZnJP5qZmZmZmdk/mpmZmZmZyT+amZmZmZnJP5qZmZmZmck/mpmZmZmZyT+amZmZmZnZP5qZmZmZmbk/mpmZmZmZyT+amZmZmZm5P5qZmZmZmck/mpmZmZmZyT+amZmZmZm5P5qZmZmZmck/mpmZmZmZyT8zMzMzMzPTPzMzMzMzM9M/mpmZmZmZyT8zMzMzMzPjP5qZmZmZmdk/MzMzMzMz0z+amZmZmZnJP5qZmZmZmck/mpmZmZmZyT+amZmZmZnJP2ZmZmZmZvY/AAAAAAAA+D8AAAAAAAD4P83MzMzMzPQ/AAAAAAAA+D/NzMzMzMz0P5qZmZmZmfk/AAAAAAAA8D/NzMzMzMz0P2ZmZmZmZvY/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPA/ZmZmZmZm9j/NzMzMzMz0P2ZmZmZmZvY/AAAAAAAA+D8AAAAAAADwPwAAAAAAAPg/mpmZmZmZ8T/NzMzMzMz8P83MzMzMzPQ/AAAAAAAA+D8zMzMzMzPzP83MzMzMzPQ/ZmZmZmZm9j9mZmZmZmb2PzMzMzMzM/s/AAAAAAAA+D8AAAAAAADwP5qZmZmZmfE/AAAAAAAA8D8zMzMzMzPzP5qZmZmZmfk/AAAAAAAA+D+amZmZmZn5PwAAAAAAAPg/zczMzMzM9D/NzMzMzMz0P83MzMzMzPQ/MzMzMzMz8z9mZmZmZmb2PzMzMzMzM/M/AAAAAAAA8D/NzMzMzMz0PzMzMzMzM/M/zczMzMzM9D/NzMzMzMz0P5qZmZmZmfE/zczMzMzM9D8AAAAAAAAEQGZmZmZmZv4/zczMzMzMAEDNzMzMzMz8P5qZmZmZmQFAzczMzMzMAEAzMzMzMzP7P83MzMzMzPw/zczMzMzM/D8AAAAAAAAEQAAAAAAAAABAZmZmZmZm/j/NzMzMzMwAQAAAAAAAAABAMzMzMzMzA0BmZmZmZmYCQM3MzMzMzPw/mpmZmZmZAUBmZmZmZmYCQAAAAAAAAPg/ZmZmZmZmAkAAAAAAAAAAQAAAAAAAAABAzczMzMzM/D/NzMzMzMwAQM3MzMzMzPw/zczMzMzM/D/NzMzMzMz8P83MzMzMzABAmpmZmZmZ+T9mZmZmZmb+PwAAAAAAAABAmpmZmZmZAUAAAAAAAAD4P2ZmZmZmZvY/ZmZmZmZmAkAzMzMzMzMDQM3MzMzMzPw/zczMzMzM/D/NzMzMzMwAQDMzMzMzMwNAZmZmZmZmAkBmZmZmZmb+P2ZmZmZmZgJAAAAAAAAABEBmZmZmZmYCQGZmZmZmZv4/AAAAAAAAAEBmZmZmZmYCQM3MzMzMzPw/\",\"dtype\":\"float64\",\"shape\":[150]}}},\"id\":\"0d2030bb-919c-48d4-a1f3-37c5be26959c\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"fba83c2c-789d-46bc-a53e-a36667b11ef2\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"5fd14cc6-a66d-48f2-8fe2-8ce550c4c718\",\"type\":\"PanTool\"},{\"id\":\"fba83c2c-789d-46bc-a53e-a36667b11ef2\",\"type\":\"WheelZoomTool\"},{\"id\":\"dc6ec81c-2a9e-4706-b7f0-0eef5c621e5b\",\"type\":\"BoxZoomTool\"},{\"id\":\"c8936993-0ad4-419b-aaf6-64c244c0e725\",\"type\":\"SaveTool\"},{\"id\":\"f9ca8a47-c631-4070-8110-e9c67845a459\",\"type\":\"ResetTool\"},{\"id\":\"2a597924-d0b7-4ff1-9e0f-393940df4b5b\",\"type\":\"HelpTool\"}]},\"id\":\"5df3fa3b-ee3a-4b2e-82b4-45c6af36ed46\",\"type\":\"Toolbar\"},{\"attributes\":{\"overlay\":{\"id\":\"f9b43970-888c-40fb-9391-5b0e4ff5a22a\",\"type\":\"BoxAnnotation\"}},\"id\":\"dc6ec81c-2a9e-4706-b7f0-0eef5c621e5b\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"c8936993-0ad4-419b-aaf6-64c244c0e725\",\"type\":\"SaveTool\"},{\"attributes\":{\"callback\":null},\"id\":\"4e2cc7cb-7ba0-498f-b5ac-12b87b00fcfd\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"f9ca8a47-c631-4070-8110-e9c67845a459\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"956b062e-2387-4175-9368-54b1345cdc5c\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2a597924-d0b7-4ff1-9e0f-393940df4b5b\",\"type\":\"HelpTool\"},{\"attributes\":{\"data_source\":{\"id\":\"0d2030bb-919c-48d4-a1f3-37c5be26959c\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"555903e1-ef1b-43f5-83ea-86b9d45af790\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"62a386ce-ef4f-461e-9b1f-173c2e309480\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"aa47afa1-9541-45bb-a211-31b70f809d49\",\"type\":\"CDSView\"}},\"id\":\"2ab57d9f-6ba8-49c9-b8d8-d2ac4bd97557\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis_label\":\"petal length (cm)\",\"formatter\":{\"id\":\"ce654801-4df9-4ed4-a412-18ff1c43d561\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"de54a6cb-d0f5-4215-94b7-48f8a7c8d072\",\"type\":\"BasicTicker\"}},\"id\":\"42cab2ca-21f2-4a92-8dd0-b5cfd1840f13\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"0d2030bb-919c-48d4-a1f3-37c5be26959c\",\"type\":\"ColumnDataSource\"}},\"id\":\"aa47afa1-9541-45bb-a211-31b70f809d49\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"bbd74898-1b90-43aa-9829-738c24f54402\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"ce654801-4df9-4ed4-a412-18ff1c43d561\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"de54a6cb-d0f5-4215-94b7-48f8a7c8d072\",\"type\":\"BasicTicker\"},{\"attributes\":{\"plot\":{\"id\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"de54a6cb-d0f5-4215-94b7-48f8a7c8d072\",\"type\":\"BasicTicker\"}},\"id\":\"72209fa6-916c-456b-bcfa-0250bb6f97b6\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"petal width (cm)\",\"formatter\":{\"id\":\"e65c151a-f32f-4edf-877a-5a3f96333abf\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"b6dcebb9-57a9-4155-b9a1-97f7959873ef\",\"type\":\"BasicTicker\"}},\"id\":\"b80f0e7f-f2ce-4245-816d-64198c3c607b\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_color\":{\"field\":\"fill_color\"},\"line_color\":{\"value\":null},\"radius\":{\"units\":\"data\",\"value\":0.08},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"555903e1-ef1b-43f5-83ea-86b9d45af790\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"b6dcebb9-57a9-4155-b9a1-97f7959873ef\",\"type\":\"BasicTicker\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"b6dcebb9-57a9-4155-b9a1-97f7959873ef\",\"type\":\"BasicTicker\"}},\"id\":\"2d65e69b-a202-40aa-99ca-4ea75bcfb6f9\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"radius\":{\"units\":\"data\",\"value\":0.08},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"62a386ce-ef4f-461e-9b1f-173c2e309480\",\"type\":\"Circle\"}],\"root_ids\":[\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\"]},\"title\":\"Bokeh Application\",\"version\":\"0.12.13\"}};\n", " var render_items = [{\"docid\":\"3191efbb-df55-477a-a645-6e30430b44b7\",\"elementid\":\"a25bc63a-80d9-4ac7-9e54-9b4b820844b9\",\"modelid\":\"4fdf71dd-a8cf-417a-a484-dedcb95bca47\"}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\")\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "4fdf71dd-a8cf-417a-a484-dedcb95bca47" } }, "output_type": "display_data" } ], "source": [ "x_feat, y_feat = 2, 3 # Choose the features to plot (0-3)\n", "fig = bk.figure(title=None, plot_width=600, plot_height=500)\n", "colors = ['#006CD1', '#26D100', '#D10000']\n", "color_series = [ colors[i] for i in df['y'] ]\n", "fig.scatter(df[df.columns[x_feat]], df[df.columns[y_feat]], \n", " line_color=None, fill_color=color_series,\n", " radius=0.08)\n", "fig.xaxis.axis_label = df.columns[x_feat]\n", "fig.yaxis.axis_label = df.columns[y_feat]\n", "\n", "bk.show(fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas contains some utility functions and plotting functions that can help in previewing the data. In this case we use a `scatter_matrix` pandas plot to plot the four features one versus the other:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pd.plotting.scatter_matrix(df[df.columns[:4]], figsize=(7, 7),\n", " c=color_series, diagonal='hist', marker='.')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is an example of a scatterplot matrix. Each variable is plotted against each other. For example, the middle square in the first column is an individual scatterplot of `petal lenght` and `sepal lenght`, with `petal lenght` as the X-axis and `sepal lenght` as the Y-axis. This same plot is replicated in the middle of the top row. In essence, the boxes on the upper right hand side of the whole scatterplot are mirror images of the plots on the lower left hand. The diagonal line can be choosen to be either histogram or density of the variable at hand.\n", "\n", "If we would like to change the histogram, for example by changing the number of bins, we cal draw single features with the function `hist`" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df.hist('sepal length (cm)', bins=20)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively we can also plot an estimated density of the distribution." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(7,5))\n", "ax = df['sepal length (cm)'].plot.kde()\n", "fig.axes.append(ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we look at box plots to understand the distributions. Box plot for fare can be plotted by `boxplot` function." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(7,5))\n", "ax = df.boxplot(['sepal length (cm)', 'sepal width (cm)', \n", " 'petal length (cm)', 'petal width (cm)'])\n", "fig.axes.append(ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The box plot (a.k.a. box and whisker diagram) is a standardized way of displaying the distribution of data based on the five number summary: minimum, first quartile, median, third quartile, and maximum. In the simplest box plot the central rectangle spans the first quartile to the third quartile (the interquartile range or IQR). A segment inside the rectangle shows the median and \"whiskers\" above and below the box show the locations of the minimum and maximum. \n", "\n", "This simplest possible box plot displays the full range of variation (from min to max), the likely range of variation (the IQR), and a typical value (the median). Not uncommonly real datasets will display surprisingly high maximums or surprisingly low minimums called outliers. John Tukey has provided a precise definition for two types of outliers:\n", "\n", "- Outliers are either 3×IQR or more above the third quartile or 3×IQR or more below the first quartile.\n", "\n", "- Suspected outliers are are slightly more central versions of outliers: either 1.5×IQR or more above the third quartile or 1.5×IQR or more below the first quartile. \n", "\n", "If either type of outlier is present the whisker on the appropriate side is taken to 1.5×IQR from the quartile (the \"inner fence\") rather than the max or min, and individual outlying data points are displayed as unfilled circles (for suspected outliers) or filled circles (for outliers). (The \"outer fence\" is 3×IQR from the quartile.) \n", "\n", "Although scikit-learn was developed for working with NumPy arrays, it can sometimes be more convenient to preprocess data using pandas' DataFrame. We can always access the underlying NumPy array of the DataFrame via the values attribute before we feed it into a scikit-learn estimator:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[5.1, 3.5, 1.4, 0.2, 0],\n", " [4.9, 3.0, 1.4, 0.2, 0],\n", " [4.7, 3.2, 1.3, 0.2, 0],\n", " [4.6, 3.1, 1.5, 0.2, 0],\n", " [5.0, 3.6, 1.4, 0.2, 0]], dtype=object)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3 Missing Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is not uncommon in real-world applications that our samples are missing one\n", "or more values for various reasons. There could have been an error in the data\n", "collection process, certain measurements are not applicable, particular fields could\n", "have been simply left blank in a survey, for example. We typically see missing\n", "values as the blank spaces in our data table or as placeholder strings such as NaN\n", "(Not A Number).\n", "\n", "Unfortunately, most computational tools are unable to handle such missing values\n", "or would produce unpredictable results if we simply ignored them. Therefore, it\n", "is crucial that we take care of those missing values before we proceed with further\n", "analyses. But before we discuss several techniques for dealing with missing values,\n", "let's create a simple example data frame." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.421NaN-0.156NaN-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171NaN-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.042NaN0.1670.406-1.653
70.9960.942-1.088NaN-0.248
8-2.078NaN-0.561-0.191NaN
9NaN1.104NaN1.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 NaN -0.156 NaN -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 NaN -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 NaN 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 NaN -0.248\n", "8 -2.078 NaN -0.561 -0.191 NaN\n", "9 NaN 1.104 NaN 1.393 1.608" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(10,5), columns=list('ABCDE'))\n", "#let's put some NaNs\n", "nans = np.vstack([np.random.choice(10, size=10), \n", " np.random.choice(5, size=10)]).T\n", "for el in nans:\n", " df.iloc[el[0], el[1]] = np.nan\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the preceding code, we read CSV-formatted data into a pandas DataFrame\n", "via the read_csv function and noticed that the two missing cells were replaced by\n", "NaN . The StringIO function in the preceding code example was simply used for the\n", "purposes of illustration. It allows us to read the string assigned to csv_data into a\n", "pandas DataFrame as if it was a regular CSV file on our hard drive.\n", "\n", "For a larger DataFrame , it can be tedious to look for missing values manually; in this\n", "case, we can use the isnull method to return a DataFrame with Boolean values that\n", "indicate whether a cell contains a numeric value ( False ) or if data is missing ( True ).\n", "Using the sum method, we can then return the number of missing values per column\n", "as follows:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "A 1\n", "B 3\n", "C 1\n", "D 3\n", "E 1\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This way, we can count the number of missing values per column; in the following subsections, we will take a look at different strategies for how to deal with this missing data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 Removal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the easiest ways to deal with missing data is to simply remove the corresponding features (columns) or samples (rows) from the dataset entirely; rows with missing values can be easily dropped via the dropna method:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
2-1.5440.446-1.231-2.0390.055
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, we can drop columns that have at least one NaN in any row by setting the axis argument to 1 :" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
1
2
3
4
5
6
7
8
9
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dropna method supports several additional parameters that can come in handy: \n", "\n", "- Only drop rows where all columns are NaN" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.421NaN-0.156NaN-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171NaN-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.042NaN0.1670.406-1.653
70.9960.942-1.088NaN-0.248
8-2.078NaN-0.561-0.191NaN
9NaN1.104NaN1.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 NaN -0.156 NaN -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 NaN -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 NaN 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 NaN -0.248\n", "8 -2.078 NaN -0.561 -0.191 NaN\n", "9 NaN 1.104 NaN 1.393 1.608" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(how='all')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- drop rows that have not at least 4 non-NaN values" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171NaN-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.042NaN0.1670.406-1.653
70.9960.942-1.088NaN-0.248
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 NaN -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 NaN 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 NaN -0.248" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(thresh=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- only drop rows where NaN appear in specific columns (here: 'C')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.421NaN-0.156NaN-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171NaN-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.042NaN0.1670.406-1.653
70.9960.942-1.088NaN-0.248
8-2.078NaN-0.561-0.191NaN
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 NaN -0.156 NaN -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 NaN -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 NaN 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 NaN -0.248\n", "8 -2.078 NaN -0.561 -0.191 NaN" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(subset=['C'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although the removal of missing data seems to be a convenient approach, it also comes with certain disadvantages; for example, we may end up removing too many samples, which will make a reliable analysis impossible. Or, if we remove too many feature columns, we will run the risk of losing valuable information that our classifier needs to discriminate between classes. In the next section, we will thus look at one of the most commonly used alternatives for dealing with missing values: interpolation techniques." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Imputation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Often, the removal of samples or dropping of entire feature columns is simply not feasible, because we might lose too much valuable data. In this case, we can use different interpolation techniques to estimate the missing values from the other training samples in our dataset. One of the most common interpolation techniques is mean imputation, where we simply replace the missing value by the mean value of the entire feature column. A convenient way to achieve this is by using the Imputer class from scikit-learn, as shown in the following code:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.43596163, 2.07273946, -0.82357386, 0.34461453, 1.13283823],\n", " [-0.42094437, 0.61379908, -0.15633857, 0.10962151, -0.64672154],\n", " [-1.5443615 , 0.44591183, -1.23064652, -2.03852024, 0.05549635],\n", " [ 1.05904825, -1.10321429, 1.1707748 , 0.10962151, -1.13310892],\n", " [ 0.64676756, -0.53115378, 2.09282298, 0.5529385 , -0.91191471],\n", " [ 0.47314789, 1.36630622, -0.8737133 , 0.30059829, -1.10393012],\n", " [-1.04213811, 0.61379908, 0.16749461, 0.40612596, -1.65329471],\n", " [ 0.99649002, 0.94220845, -1.08839407, 0.10962151, -0.24847718],\n", " [-2.07812138, 0.61379908, -0.56116135, -0.1909431 , -0.32237504],\n", " [-0.16379444, 1.10379563, -0.14474837, 1.39253664, 1.60773726]])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import Imputer\n", "imr = Imputer(missing_values='NaN', strategy='mean', axis=0)\n", "imr = imr.fit(df)\n", "imputed_data = imr.transform(df.values)\n", "imputed_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we replaced each NaN value by the corresponding mean, which is separately calculated for each feature column. If we changed the setting axis=0 to axis=1 , we'd calculate the row means. Other options for the strategy parameter are median or most_frequent , where the latter replaces the missing values by the most frequent values. This is useful for imputing categorical feature values. \n", "\n", "Pandas has its own ways ot impute values. The fillna function can \"fill in\" NA values with non-null data in a couple of ways:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.4210.000-0.1560.000-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.1710.000-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.0420.0000.1670.406-1.653
70.9960.942-1.0880.000-0.248
8-2.0780.000-0.561-0.1910.000
90.0001.1040.0001.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 0.000 -0.156 0.000 -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 0.000 -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 0.000 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 0.000 -0.248\n", "8 -2.078 0.000 -0.561 -0.191 0.000\n", "9 0.000 1.104 0.000 1.393 1.608" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Fill gaps forward or backward, we can propagate non-null values forward or backward:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.4212.073-0.1560.345-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171-2.039-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.0421.3660.1670.406-1.653
70.9960.942-1.0880.406-0.248
8-2.0780.942-0.561-0.191-0.248
9-2.0781.104-0.5611.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 2.073 -0.156 0.345 -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 -2.039 -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 1.366 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 0.406 -0.248\n", "8 -2.078 0.942 -0.561 -0.191 -0.248\n", "9 -2.078 1.104 -0.561 1.393 1.608" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.ffill()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.4210.446-0.156-2.039-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.1710.553-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.0420.9420.1670.406-1.653
70.9960.942-1.088-0.191-0.248
8-2.0781.104-0.561-0.1911.608
9NaN1.104NaN1.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 0.446 -0.156 -2.039 -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 0.553 -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 0.942 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 -0.191 -0.248\n", "8 -2.078 1.104 -0.561 -0.191 1.608\n", "9 NaN 1.104 NaN 1.393 1.608" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.bfill()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both Series and Dataframe objects have an interpolate method that, by default, performs linear interpolation at missing datapoints." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
00.4362.073-0.8240.3451.133
1-0.4211.259-0.156-0.847-0.647
2-1.5440.446-1.231-2.0390.055
31.059-1.1031.171-0.743-1.133
40.647-0.5312.0930.553-0.912
50.4731.366-0.8740.301-1.104
6-1.0421.1540.1670.406-1.653
70.9960.942-1.0880.108-0.248
8-2.0781.023-0.561-0.1910.680
9-2.0781.104-0.5611.3931.608
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0.436 2.073 -0.824 0.345 1.133\n", "1 -0.421 1.259 -0.156 -0.847 -0.647\n", "2 -1.544 0.446 -1.231 -2.039 0.055\n", "3 1.059 -1.103 1.171 -0.743 -1.133\n", "4 0.647 -0.531 2.093 0.553 -0.912\n", "5 0.473 1.366 -0.874 0.301 -1.104\n", "6 -1.042 1.154 0.167 0.406 -1.653\n", "7 0.996 0.942 -1.088 0.108 -0.248\n", "8 -2.078 1.023 -0.561 -0.191 0.680\n", "9 -2.078 1.104 -0.561 1.393 1.608" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.interpolate()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4 Feature Engineering" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This section is about changing the dataset to meet model requirements. For example the majority of machine learning and optimization algorithms behave much better if features are on the same scale" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 Standardizing = Mean Removal + Variance Scaling:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Standardization of datasets is a common requirement for many machine learning estimators: they might behave badly if the individual feature do not more or less look like *standard normally distributed data*: Gaussian with zero mean and unit variance. In practice we often ignore the shape of the distribution and just transform the data to center and scale by dividing by the standard deviation.\n", "\n", "*If the input variables are combined via a distance function* (such as Euclidean distance), standardizing inputs can be crucial. If\n", "one input has a range of 0 to 1, while another input has a range of 0 to 1,000,000, then the contribution of the first input to the distance will be swamped by the second input.\n", "\n", "It is sometimes not enough to center and scale the features independently, since a downstream model can further make some assumption on the linear independence of the features. To address this issue you can use `sklearn.decomposition.PCA` or `sklearn.decomposition.RandomizedPCA` with `whiten=True` to further remove the linear correlation across features.\n", "\n", "`scale` and `StandardScaler` work out-of-the-box with 1d arrays. \n", "\n", "`preprocessing.scale` scales each column of the features matric to **mean=0 and std=1**. This is also called **\"STANDARDIZATION\"**." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn import preprocessing\n", "X = np.array([[ 10., 1., 0.],\n", " [ 20., 0., 2.]])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10. 1. 0.]\n", " [20. 0. 2.]]\n", "\n", "Scaled Values: \n", "[[-1. 1. -1.]\n", " [ 1. -1. 1.]]\n" ] } ], "source": [ "X_sc_1 = preprocessing.scale(X)\n", "print(X)\n", "print('\\nScaled Values: ')\n", "print(X_sc_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`preprocessing.StandardScaler` keeps the values of `.mean_` and `.std_` to allow lately `transform` and `inverse_transform` **mean** and **std** scaling can be controlled independently:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Scaled Values: \n", "[[-1. 1. -1.]\n", " [ 1. -1. 1.]]\n", "\n", "Standard Scaler Mean: [15. 0.5 1. ]\n", "Standard Scaler Std: [5. 0.5 1. ]\n", "\n", "Inverse Transform: \n", "[[10. 1. 0.]\n", " [20. 0. 2.]]\n" ] } ], "source": [ "scaler = preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)\n", "scaler.fit(X)\n", "X_sc_2 = scaler.transform(X)\n", "print('\\nScaled Values: ')\n", "print(X_sc_2)\n", "print('\\nStandard Scaler Mean: ', scaler.mean_)\n", "print('Standard Scaler Std: ', scaler.scale_)\n", "print('\\nInverse Transform: ')\n", "print(scaler.inverse_transform(X_sc_2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 Using the preprocessing.StandardScaler with pandas:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
010.01.00.0
120.00.02.0
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 10.0 1.0 0.0\n", "1 20.0 0.0 2.0" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[ 10., 1., 0.],\n", " [ 20., 0., 2.]])\n", "df = pd.DataFrame(X)\n", "df" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
mean15.0000.5001.000
std7.0710.7071.414
\n", "
" ], "text/plain": [ " 0 1 2\n", "mean 15.000 0.500 1.000\n", "std 7.071 0.707 1.414" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe().iloc[[1,2]]" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Standard Scaler Mean: [15. 0.5 1. ]\n", "Standard Scaler Std: [5. 0.5 1. ]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
0-1.01.0-1.0
11.0-1.01.0
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 -1.0 1.0 -1.0\n", "1 1.0 -1.0 1.0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scaler = preprocessing.StandardScaler(copy=False, with_mean=True, with_std=True).fit(df)\n", "print('\\nStandard Scaler Mean: ', scaler.mean_)\n", "print('Standard Scaler Std: ', scaler.scale_)\n", "df_sc_2 = pd.DataFrame(scaler.transform(df))\n", "df_sc_2" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
010.01.00.0
120.00.02.0
\n", "
" ], "text/plain": [ " 0 1 2\n", "0 10.0 1.0 0.0\n", "1 20.0 0.0 2.0" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_inv = pd.DataFrame(scaler.inverse_transform(df_sc_2))\n", "df_inv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 Normalizing = Dividing by a Norm of the Vector:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`preprocessing.normalize` sets thenorm of the vector =1.\n", "\n", "By default `(axis=1)`, so if it's necessary to normalize the columns and not the rows, `axis` must be set to 0." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Normalized Values: \n", "[[0.33333333 1. 0. ]\n", " [0.66666667 0. 1. ]\n", " [0.66666667 0. 0. ]]\n" ] } ], "source": [ "X = np.array([[ 10., 1., 0.],\n", " [ 20., 0., 2.],\n", " [ 20., 0., 0.]])\n", "X_nrm = preprocessing.normalize(X, norm='l2', axis=0)\n", "print('\\nNormalized Values: ')\n", "print(X_nrm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5 Features Selection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finding a good data representation is very domain specific and related to available measurements. \n", "\n", "Human expertise, which is often required to convert \"raw\" data into a set of useful features, can be complemented by automatic feature construction methods. In some approaches, feature construction is integrated in the modeling process. For examples the hidden layers of a Deep Neural Network compute internal representations someway analogous to constructed features. In other approaches, feature construction is a preprocessing step that must be perform in order for the algorithm to perform well.\n", "\n", "We have already seen two examples of feature engineering that regards standardization and normalization. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 Derived Features (feature construction)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Features extraction (module `sklearn.feature_extraction`) consists in transforming arbitrary data, such as text or images, into numerical features usable for machine learning.\n", "\n", "Derived features are obtained by pre-processing the data to generate features that are somehow more informative. Derived features may be linear or nonlinear combinations of features (such as in Polynomial regression), or may be some more sophisticated transform of the features. The latter is often used in image processing.\n", "\n", "For example, [scikit-image](http://scikit-image.org/) provides a variety of feature\n", "extractors designed for image data: see the ``skimage.feature`` submodule. \n", "\n", "Derived features may include:\n", "\n", "- *Signal enhancement:* the signal-to-noise ratio may be improved by applying signal or image-processing filters. These operations include baseline or background removal, de-noising, smoothing, or sharpening. The Fourier transform and wavelet transforms are popular methods\n", "\n", "- *Extraction of local features:* For sequential, spatial or other structured data, specific techniques like convolutional methods using hand-crafted kernels or syntactic and structural methods are used. These techniques encode problem specific knowledge into the features. \n", "\n", "- *Linear and non-linear space embedding methods:* When the dimensionality of the data is very high, some techniques might be used to project or embed the data into a lower dimensional space while retaining as much information as possible. Classical examples are Principal Component Analysis (PCA) and Multidimensional Scaling (MDS). The coordinates of the data points in the lower dimension space might be used as features or simply as a means of data visualization.\n", "\n", "- *Non-linear expansions:* Although dimensionality reduction is often summoned when speaking about complex data, it is sometimes better to increase the dimensionality. This happens when the problem is very complex and first order interactions are not enough to derive good results. \n", "\n", "- *Categorical Data Enconding*: how do we treat categorical data? Some algorithms cannot use data where a ordering realtion is not clear or not present!\n", "\n", "How do we know when a feature is relevant or informative? This is what \"feature selection\" is about." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 One-hot encoding of categorical features:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Often features are not given as continuous values but categorical. For example a person could have features [\"male\", \"female\"], [\"from Europe\", \"from US\", \"from Asia\"], [\"uses Firefox\", \"uses Chrome\", \"uses Safari\", \"uses Internet Explorer\"]. Such features can be efficiently coded as integers, for instance [\"male\", \"from US\", \"uses Internet Explorer\"] could be expressed as [0, 1, 3] while [\"female\", \"from Asia\", \"uses Chrome\"] would be [1, 2, 1].\n", "\n", "Such integer representation can not be used directly with scikit-learn estimators, as these expect continuous input, and would interpret the categories as being ordered, which is often not desired (i.e. the set of browsers was ordered arbitrarily).\n", "\n", "One possibility to convert categorical features to features that can be used with scikit-learn estimators is to use a one-of-K or one-hot encoding, which is implemented in OneHotEncoder. This estimator transforms each categorical feature with m possible values into m binary features, with only one active." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 3]\n", " [1 1 0]\n", " [0 2 1]\n", " [1 0 2]]\n" ] } ], "source": [ "data_in = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])\n", "print(data_in)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OneHotEncoder(categorical_features='all', dtype=,\n", " handle_unknown='error', n_values='auto', sparse=True)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc = preprocessing.OneHotEncoder()\n", "enc.fit(data_in) " ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 1., 0., 0., 0., 0., 0., 1.],\n", " [0., 1., 0., 1., 0., 1., 0., 0., 0.],\n", " [1., 0., 0., 0., 1., 0., 1., 0., 0.],\n", " [0., 1., 1., 0., 0., 0., 0., 1., 0.]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc.transform(data_in).toarray()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc.transform([[0, 1, 3]]).toarray()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`DictVectorizer` implements what is called one-of-K or “one-hot” coding for categorical (aka nominal, discrete) features, without the need to first transform the variables from text to categorical.\n", "\n", "In the following code the method `vec.fit_transform(temp)` returns a sparse matrix that is tranformed to dense by `.toarray()`." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
citytemperature
0Dubai33.0
1London12.0
2San Fransisco18.0
\n", "
" ], "text/plain": [ " city temperature\n", "0 Dubai 33.0\n", "1 London 12.0\n", "2 San Fransisco 18.0" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.feature_extraction import DictVectorizer, text\n", "t = [{'city': 'Dubai', 'temperature': 33.},\n", " {'city': 'London', 'temperature': 12.},\n", " {'city': 'San Fransisco', 'temperature': 18.},]\n", "\n", "pd.DataFrame(t)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
city=Dubaicity=Londoncity=San Fransiscotemperature
01.00.00.033.0
10.01.00.012.0
20.00.01.018.0
\n", "
" ], "text/plain": [ " city=Dubai city=London city=San Fransisco temperature\n", "0 1.0 0.0 0.0 33.0\n", "1 0.0 1.0 0.0 12.0\n", "2 0.0 0.0 1.0 18.0" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vec = DictVectorizer()\n", "t_vec = vec.fit_transform(t)\n", "df = pd.DataFrame(t_vec.toarray(), columns=vec.get_feature_names())\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 The Bag of Words representation:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Text Analysis is a major application field for machine learning algorithms. However the raw data, a sequence of symbols cannot be fed directly to the algorithms themselves as most of them expect numerical feature vectors with a fixed size rather than the raw text documents with variable length.\n", "\n", "In order to address this, scikit-learn provides utilities for the most common ways to extract numerical features from text content, namely:\n", "\n", "- tokenizing strings and giving an integer id for each possible token, for instance by using white-spaces and punctuation as token separators.\n", "- counting the occurrences of tokens in each document.\n", "- normalizing and weighting with diminishing importance tokens that occur in the majority of samples / documents.\n", "\n", "In this scheme, features and samples are defined as follows:\n", "\n", "- each individual token occurrence frequency (normalized or not) is treated as a feature.\n", "- the vector of all the token frequencies for a given document is considered a multivariate sample.\n", "\n", "A corpus of documents can thus be represented by a matrix with one row per document and one column per token (e.g. word) occurring in the corpus.\n", "\n", "We call **vectorization** the general process of turning a collection of text documents into numerical feature vectors. *This specific strategy (tokenization, counting and normalization) is called the Bag of Words or “Bag of n-grams” representation*. Documents are described by word occurrences while completely ignoring the relative position information of the words in the document.\n", "\n", "`CountVectorizer` implements both tokenization and occurrence counting in a single class:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#feature_extraction.text.CountVectorizer?" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
anddocumentfirstisonesecondthethirdthis
0011100101
1010102101
2100010130
3011100101
\n", "
" ], "text/plain": [ " and document first is one second the third this\n", "0 0 1 1 1 0 0 1 0 1\n", "1 0 1 0 1 0 2 1 0 1\n", "2 1 0 0 0 1 0 1 3 0\n", "3 0 1 1 1 0 0 1 0 1" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "corpus = ['This is the x-first document.', 'This is the second second document.',\n", " 'And the third third third one.', 'Is this the first document?']\n", "vec = text.CountVectorizer()\n", "X = vec.fit_transform(corpus)\n", "df = pd.DataFrame(X.toarray(), columns=vec.get_feature_names())\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default configuration tokenizes the string by extracting words of at least 2 letters. The specific function that does this step can be requested explicitly:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['this', 'is', 'the', 'first', 'document']" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analyzer = vec.build_analyzer()\n", "analyzer(\"This is the x-first document.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Words that were not seen in the training corpus will be completely ignored in future calls to the transform method:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0 0 0 0 0 0 0]]\n" ] } ], "source": [ "print(vec.transform(['Something completely new.']).toarray())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in the previous corpus we lose the information that the last document is an interrogative form because each word is encoded individually. To preserve the local ordering information we can extract 2-grams of words in addition to the 1-grams (the word themselves):" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
andand thedocumentfirstfirst documentisis theis thisonesecondsecond documentsecond secondthethe firstthe secondthe thirdthirdthird onethird thirdthisthis isthis the
00011111000001100000110
10010011002111010000110
21100000010001001312000
30011110100001100000101
\n", "
" ], "text/plain": [ " and and the document first first document is is the is this one \\\n", "0 0 0 1 1 1 1 1 0 0 \n", "1 0 0 1 0 0 1 1 0 0 \n", "2 1 1 0 0 0 0 0 0 1 \n", "3 0 0 1 1 1 1 0 1 0 \n", "\n", " second second document second second the the first the second \\\n", "0 0 0 0 1 1 0 \n", "1 2 1 1 1 0 1 \n", "2 0 0 0 1 0 0 \n", "3 0 0 0 1 1 0 \n", "\n", " the third third third one third third this this is this the \n", "0 0 0 0 0 1 1 0 \n", "1 0 0 0 0 1 1 0 \n", "2 1 3 1 2 0 0 0 \n", "3 0 0 0 0 1 0 1 " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vec_bi = text.CountVectorizer(min_df=1, ngram_range=(1, 2))\n", "X_bi = vec_bi.fit_transform(corpus)\n", "pd.set_option('display.max_columns', None)\n", "df_bi = pd.DataFrame(X_bi.toarray(), columns=vec_bi.get_feature_names())\n", "df_bi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a large text corpus, some words will be very present (e.g. “the”, “a”, “is” in English) hence carrying very little meaningful information. For this reason it is very common to use the `tf–idf` (term-frequency / inverse document-frequency) transform: each row is normalized to have unit euclidean norm. The weights of each feature computed by the fit method call are stored in a model attribute:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.66052121 0. 0.40395613 0.63287533 0. ]\n", " [0.63295194 0. 0.77419109 0. 0. ]\n", " [0.31878155 0.61087812 0.38991559 0. 0.61087812]\n", " [1. 0. 0. 0. 0. ]]\n" ] } ], "source": [ "corpus2 = [ 'aa aa cc dd', 'aa cc',\n", " 'aa bb cc ff', \"aa aa\"]\n", "tfidf = text.TfidfVectorizer()\n", "X = tfidf.fit_transform(corpus2)\n", "print(X.toarray())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check scikit-learn documentation for additional information on feature extraction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 Feature Hashing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The idea is very simple: convert data into a vector of features. When this is done using hashing we call the method \"feature hashing\" or \"the hashing trick\".\n", "\n", "I'll explain how it works with a simple example using text as data.\n", "\n", "Let's say our text is:\n", "\n", "\"the quick brown fox\"\n", "\n", "We would like to represent this as a vector. The first thing we need is to fix the length of the vector, the number of dimensions, we are going to use, let's say we would like to use 5 dimensions.\n", "\n", "Once we fix the number of dimensions we need a hash function that will take a string and return a number between 0 and n-1, in our case between 0 and 4. Any good hash function can be used and you just use h(string) mod n to make it return a number between 0 and n-1.\n", "\n", "I'll invent the results for each word in our text:\n", "\n", "h(the) mod 5 = 0
\n", "h(quick) mod 5 = 1
\n", "h(brown) mod 5 = 1
\n", "h(fox) mod 5 = 3
\n", "\n", "Once we have this we can simply construct our vector as:\n", "\n", "(1,2,0,1,0)\n", "\n", "Notice that we just add 1 to the nth dimension of the vector each time our hash function returns that dimension for a word in the text.\n", "\n", "And that's feature hashing or \"the hashing trick\". You can skip the rest but I can’t resist giving up a few extra pointers:\n", "\n", "* In general the number of dimensions we use for our vectors can be VERY large, for example 225 or similar.\n", "\n", "* The vectors will be very sparse so store them in a format that saves space, for example one vector for the values that are not zero and another vector for the column number for each of those values.\n", "\n", "* It is possible to use a 2nd hash function that returns +1 or -1 to decide if you add or substract from the vector. This will minimize collisions making a dimension of the vector taking a very large value.\n", "\n", "Implements feature hashing, aka the hashing trick.\n", "\n", "This class turns sequences of symbolic feature names (strings) into scipy.sparse matrices, using a hash function to compute the matrix column corresponding to a name. The hash function employed is the signed 32-bit version of Murmurhash3.\n", "\n", "Feature names of type byte string are used as-is. Unicode strings are converted to UTF-8 first, but no Unicode normalization is done. Feature values must be (finite) numbers.\n", "\n", "This class is a low-memory alternative to DictVectorizer and CountVectorizer, intended for large-scale (online) learning and situations where memory is tight, e.g. when running prediction code on embedded devices." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 5., -8., 0., 0.],\n", " [ 4., -9., 0., 4.],\n", " [ 3., -5., 1., 3.],\n", " [ 5., -4., 0., -2.]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.feature_extraction import FeatureHasher\n", "n_features = 4\n", "hasher = FeatureHasher(n_features=n_features, input_type=\"string\")\n", "X = hasher.transform(corpus)\n", "X.toarray()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.5 Feature Extraction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In preceding paragraphs we used hand-crafted features as additional features. There are other automated ways to perform this kind of task. Automated feature selection, can be used for: \n", "- *dimensionality reduction*\n", "- *performance improvement*\n", "- *data understanding*\n", "\n", "we will briefly sketch the main ideas of these approaches because some of the methods require particular algorithms that will be explained in future sections. We will highlight each of those during the explanation of each algorithm. \n", "\n", "In general there are three kind of automated feature extraction methods:\n", "- *filter methods:* use of statistical methods to rank feature based on some metric or score.\n", "- *wrapper methods:* utilize a learning machine as a \"black box\" to score subsets of features according to their predictive power with different models.\n", "- *embedded methods:* perform feature selection in the process of training and are usually specific to given machine learning algorithm." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### 5.5.1 Recursive Feature Elimination\n", "\n", "This is an example of a wrapper method. This is an example of a *backward selection strategy* called Recursive Feature Elimination. We'll use an algoirthm called SVM (it will be the main topic of another notebook don't worry if you don't understand how it works), that will try to predict the target having decision function $f(x) = w^Tx + b$, the\n", "method iteratively removes the feature $x_i$ with the smallest weight in absolute value $\\mid w_i \\mid$ and retraining the model. At the expense of some sub-optimality, the method can be sped up by removing several features at a time at each iteration. The method can also be extended to the non-linear SVM and other methods as well." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal number of features : 3\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.svm import SVC\n", "from sklearn.model_selection import StratifiedKFold\n", "from sklearn.feature_selection import RFECV\n", "from sklearn.datasets import make_classification\n", "\n", "# Build a classification task using 3 informative features\n", "X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,\n", " n_redundant=2, n_repeated=0, n_classes=8,\n", " n_clusters_per_class=1, random_state=0)\n", "\n", "# Create the RFE object and compute a cross-validated score.\n", "svc = SVC(kernel=\"linear\")\n", "# The \"accuracy\" scoring is proportional to the number of correct classifications\n", "rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),\n", " scoring='accuracy')\n", "rfecv.fit(X, y)\n", "\n", "print(\"Optimal number of features : %d\" % rfecv.n_features_)\n", "\n", "# Plot number of features VS. cross-validation scores\n", "plt.figure()\n", "plt.xlabel(\"Number of features selected\")\n", "plt.ylabel(\"Cross validation score (nb of correct classifications)\")\n", "plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "Visit [www.add-for.com]() for more tutorials and updates.\n", "\n", "This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda env:addfor_tutorials]", "language": "python", "name": "conda-env-addfor_tutorials-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }