From 0bfa366f77cf6a2f8a8b49ac343102db07261fb1 Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 11:53:04 -0400 Subject: [PATCH 1/6] anscombe example --- examples/examples.ipynb | 139 ++++++++++++++++++++++++++++++++++++++++ requirements.txt | 7 ++ yellowbrick/__init__.py | 1 + yellowbrick/anscombe.py | 63 ++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 examples/examples.ipynb create mode 100644 yellowbrick/anscombe.py diff --git a/examples/examples.ipynb b/examples/examples.ipynb new file mode 100644 index 000000000..1e561a4a9 --- /dev/null +++ b/examples/examples.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Yellowbrick Examples \n", + "\n", + "Ths notebook is a sample of the examples that yellowbrick provids." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import os\n", + "import sys \n", + "\n", + "# Modify the path \n", + "sys.path.append(\"..\")\n", + "\n", + "import yellowbrick as yb \n", + "import seaborn as sns \n", + "import matplotlib as mpl \n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(,\n", + " ,\n", + " ,\n", + " )" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yb.anscombe()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/site-packages/matplotlib/__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", + " warnings.warn(self.msg_depr % (key, alt_key))\n" + ] + }, + { + "ename": "TypeError", + "evalue": "'int' object has no attribute '__getitem__'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlmplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mlmplot\u001b[0;34m(x, y, data, hue, col, row, palette, col_wrap, size, aspect, markers, sharex, sharey, hue_order, col_order, row_order, legend, legend_out, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, x_jitter, y_jitter, scatter_kws, line_kws)\u001b[0m\n\u001b[1;32m 570\u001b[0m \u001b[0mscatter_kws\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mscatter_kws\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mline_kws\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mline_kws\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 571\u001b[0m )\n\u001b[0;32m--> 572\u001b[0;31m \u001b[0mfacets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmap_dataframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mregplot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mregplot_kws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 573\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 574\u001b[0m \u001b[0;31m# Add a legend\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/axisgrid.pyc\u001b[0m in \u001b[0;36mmap_dataframe\u001b[0;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[1;32m 790\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 791\u001b[0m \u001b[0;31m# Draw the plot\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 792\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_facet_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 793\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 794\u001b[0m \u001b[0;31m# Finalize the annotations and layout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/axisgrid.pyc\u001b[0m in \u001b[0;36m_facet_plot\u001b[0;34m(self, func, ax, plot_args, plot_kwargs)\u001b[0m\n\u001b[1;32m 808\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 809\u001b[0m \u001b[0;31m# Draw the plot\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 810\u001b[0;31m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mplot_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mplot_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[0;31m# Sort out the supporting information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mregplot\u001b[0;34m(x, y, data, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, dropna, x_jitter, y_jitter, label, color, marker, scatter_kws, line_kws, ax)\u001b[0m\n\u001b[1;32m 762\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogistic\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlowess\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrobust\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 763\u001b[0m \u001b[0mx_partial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_partial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtruncate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdropna\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 764\u001b[0;31m x_jitter, y_jitter, color, label)\n\u001b[0m\u001b[1;32m 765\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 766\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0max\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, x, y, data, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, dropna, x_jitter, y_jitter, color, label)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0;31m# Drop null observations\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdropna\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdropna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"x\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"y\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"units\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"x_partial\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"y_partial\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;31m# Regress nuisance variables out of the data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mdropna\u001b[0;34m(self, *vars)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0mval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 62\u001b[0;31m \u001b[0msetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnot_na\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: 'int' object has no attribute '__getitem__'" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.lmplot(0,1,pd.DataFrame([[1,2,3,4], [1,3,2,1,2]]) )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/requirements.txt b/requirements.txt index afcd9625d..e81cb880c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,12 @@ +# Dependencies +matplotlib==1.5.1 +scikit-learn==0.17.1 +numpy==1.11.0 ## Utilities +#cycler==0.10.0 +#pyparsing==2.1.4 +#pytz==2016.4 #python-dateutil==2.5.3 #six==1.10.0 diff --git a/yellowbrick/__init__.py b/yellowbrick/__init__.py index aed43bcbb..b4743d4b9 100644 --- a/yellowbrick/__init__.py +++ b/yellowbrick/__init__.py @@ -19,6 +19,7 @@ ########################################################################## from .version import get_version +from .anscombe import anscombe ########################################################################## ## Package Version diff --git a/yellowbrick/anscombe.py b/yellowbrick/anscombe.py new file mode 100644 index 000000000..91915cabc --- /dev/null +++ b/yellowbrick/anscombe.py @@ -0,0 +1,63 @@ +# yellowbrick.anscombe +# Plots Anscombe's Quartet as an illustration of the importance of visualization. +# +# Author: Benjamin Bengfort +# Created: Wed May 18 11:38:25 2016 -0400 +# +# Copyright (C) 2016 District Data Labs +# For license information, see LICENSE.txt +# +# ID: anscombe.py [] benjamin@bengfort.com $ + +""" +Plots Anscombe's Quartet as an illustration of the importance of visualization. +""" + +########################################################################## +## Imports +########################################################################## + + +import numpy as np +import matplotlib.pyplot as plt + + +########################################################################## +## Anscombe Data Arrays +########################################################################## + +ANSCOMBE = [ + np.array([ + [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0], + [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68] + ]), + np.array([ + [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0], + [9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74] + ]), + np.array([ + [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0], + [7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73] + ]), + np.array([ + [8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 19.0, 8.0, 8.0, 8.0], + [6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89] + ]) +] + + +def anscombe(): + """ + Creates 2x2 grid plot of the 4 anscombe datasets for illustration. + """ + fig, ((axa, axb), (axc, axd)) = plt.subplots(2, 2, sharex='col', sharey='row') + for arr, ax in zip(ANSCOMBE, (axa, axb, axc, axd)): + x = arr[0] + y = arr[1] + + ax.scatter(x, y, c='g') + m,b = np.polyfit(x, y, 1) + X = np.linspace(ax.get_xlim()[0], ax.get_xlim()[1], 100) + ax.plot(X, m*X+b, '-') + + return (axa, axb, axc, axd) From 1f73d2be0c8777332b8f7de822bfcc5a0656c355 Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 12:11:41 -0400 Subject: [PATCH 2/6] download example data --- examples/.gitignore | 1 + examples/download.py | 64 ++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 66 insertions(+) create mode 100644 examples/.gitignore create mode 100644 examples/download.py diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 000000000..60baa9cb8 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +data/* diff --git a/examples/download.py b/examples/download.py new file mode 100644 index 000000000..96252d1e4 --- /dev/null +++ b/examples/download.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# download +# Downloads the example datasets for running the examples. +# +# Author: Rebecca Bilbro +# Created: Wed May 18 11:54:45 2016 -0400 +# +# Copyright (C) 2016 District Data Labs +# For license information, see LICENSE.txt +# +# ID: download.py [] benjamin@bengfort.com $ + +""" +Downloads the example datasets for running the examples. +""" + +########################################################################## +## Imports +########################################################################## + +import os +import sys +import zipfile + +try: + import requests +except ImportError: + print(( + "The requests module is required to download data --\n" + "please install it with pip install requests." + )) + sys.exit(1) + +########################################################################## +## Links to data sets +########################################################################## + +OCCUPANCY = ('http://bit.ly/ddl-occupancy-dataset', 'occupancy.zip') +CREDIT = ('http://bit.ly/ddl-credit-dataset', 'credit.xls') +CONCRETE = ('http://bit.ly/ddl-concrete-dataset', 'concrete.xls') + + +def download_data(url, name, path='data'): + if not os.path.exists(path): + os.mkdir(path) + + response = requests.get(url) + with open(os.path.join(path, name), 'w') as f: + f.write(response.content) + + +def download_all(path='data'): + for href, name in (OCCUPANCY, CREDIT, CONCRETE): + download_data(href, name, path) + + # Extract the occupancy zip data + z = zipfile.ZipFile(os.path.join(path, 'occupancy.zip')) + z.extractall(os.path.join(path, 'occupancy')) + + +if __name__ == '__main__': + path='data' + download_all(path) + print("Downloaded datasets to {}".format(os.path.abspath(path))) diff --git a/requirements.txt b/requirements.txt index e81cb880c..c3504e684 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ numpy==1.11.0 #pytz==2016.4 #python-dateutil==2.5.3 #six==1.10.0 +#requests==2.10.0 ## Testing Requirements (uncomment for development) #nose==1.3.7 From 998b4e0d2421ce0eb38581c1af675cdb86db209c Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 12:21:40 -0400 Subject: [PATCH 3/6] download fixes --- examples/download.py | 2 +- examples/examples.ipynb | 69 +++++++++++++---------------------------- 2 files changed, 23 insertions(+), 48 deletions(-) diff --git a/examples/download.py b/examples/download.py index 96252d1e4..b878fc57d 100644 --- a/examples/download.py +++ b/examples/download.py @@ -37,7 +37,7 @@ OCCUPANCY = ('http://bit.ly/ddl-occupancy-dataset', 'occupancy.zip') CREDIT = ('http://bit.ly/ddl-credit-dataset', 'credit.xls') -CONCRETE = ('http://bit.ly/ddl-concrete-dataset', 'concrete.xls') +CONCRETE = ('http://bit.ly/ddl-concrete-data', 'concrete.xls') def download_data(url, name, path='data'): diff --git a/examples/examples.ipynb b/examples/examples.ipynb index 1e561a4a9..188ef0094 100644 --- a/examples/examples.ipynb +++ b/examples/examples.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -25,10 +25,9 @@ "# Modify the path \n", "sys.path.append(\"..\")\n", "\n", + "import pandas as pd\n", "import yellowbrick as yb \n", - "import seaborn as sns \n", "import matplotlib as mpl \n", - "import pandas as pd\n", "import matplotlib.pyplot as plt " ] }, @@ -42,10 +41,10 @@ { "data": { "text/plain": [ - "(,\n", - " ,\n", - " ,\n", - " )" + "(,\n", + " ,\n", + " ,\n", + " )" ] }, "execution_count": 2, @@ -56,7 +55,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -67,51 +66,27 @@ "yb.anscombe()" ] }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Load Datasets for Example Code" + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/site-packages/matplotlib/__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", - " warnings.warn(self.msg_depr % (key, alt_key))\n" - ] - }, - { - "ename": "TypeError", - "evalue": "'int' object has no attribute '__getitem__'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlmplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mlmplot\u001b[0;34m(x, y, data, hue, col, row, palette, col_wrap, size, aspect, markers, sharex, sharey, hue_order, col_order, row_order, legend, legend_out, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, x_jitter, y_jitter, scatter_kws, line_kws)\u001b[0m\n\u001b[1;32m 570\u001b[0m \u001b[0mscatter_kws\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mscatter_kws\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mline_kws\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mline_kws\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 571\u001b[0m )\n\u001b[0;32m--> 572\u001b[0;31m \u001b[0mfacets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmap_dataframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mregplot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mregplot_kws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 573\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 574\u001b[0m \u001b[0;31m# Add a legend\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/axisgrid.pyc\u001b[0m in \u001b[0;36mmap_dataframe\u001b[0;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[1;32m 790\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 791\u001b[0m \u001b[0;31m# Draw the plot\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 792\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_facet_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 793\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 794\u001b[0m \u001b[0;31m# Finalize the annotations and layout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/axisgrid.pyc\u001b[0m in \u001b[0;36m_facet_plot\u001b[0;34m(self, func, ax, plot_args, plot_kwargs)\u001b[0m\n\u001b[1;32m 808\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 809\u001b[0m \u001b[0;31m# Draw the plot\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 810\u001b[0;31m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mplot_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mplot_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[0;31m# Sort out the supporting information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mregplot\u001b[0;34m(x, y, data, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, dropna, x_jitter, y_jitter, label, color, marker, scatter_kws, line_kws, ax)\u001b[0m\n\u001b[1;32m 762\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogistic\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlowess\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrobust\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 763\u001b[0m \u001b[0mx_partial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_partial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtruncate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdropna\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 764\u001b[0;31m x_jitter, y_jitter, color, label)\n\u001b[0m\u001b[1;32m 765\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 766\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0max\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, x, y, data, x_estimator, x_bins, x_ci, scatter, fit_reg, ci, n_boot, units, order, logistic, lowess, robust, logx, x_partial, y_partial, truncate, dropna, x_jitter, y_jitter, color, label)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0;31m# Drop null observations\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdropna\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdropna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"x\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"y\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"units\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"x_partial\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"y_partial\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;31m# Regress nuisance variables out of the data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python2.7/site-packages/seaborn/linearmodels.pyc\u001b[0m in \u001b[0;36mdropna\u001b[0;34m(self, *vars)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0mval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 62\u001b[0;31m \u001b[0msetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnot_na\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: 'int' object has no attribute '__getitem__'" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "ax = sns.lmplot(0,1,pd.DataFrame([[1,2,3,4], [1,3,2,1,2]]) )" + "FIXTURES = os.path.join(os.getcwd(), \"data\")\n", + "credit = pd.read_excel(os.path.join(FIXTURES, \"credit.xls\"), header=1)\n", + "concrete = pd.read_excel(os.path.join(FIXTURES, \"concrete.xls\"))\n", + "occupancy = pd.read_csv(os.path.join('data','occupancy','datatraining.txt'))" ] } ], From 5eee25b8260ab56319d765b96d200b97c362e687 Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 12:57:20 -0400 Subject: [PATCH 4/6] classification report --- examples/examples.ipynb | 132 ++++++++++++++++++++++++++++++++++++-- yellowbrick/__init__.py | 1 + yellowbrick/classifier.py | 82 +++++++++++++++++++++++ yellowbrick/color.py | 30 +++++++++ 4 files changed, 239 insertions(+), 6 deletions(-) create mode 100644 yellowbrick/classifier.py create mode 100644 yellowbrick/color.py diff --git a/examples/examples.ipynb b/examples/examples.ipynb index 188ef0094..ed9cf1c20 100644 --- a/examples/examples.ipynb +++ b/examples/examples.ipynb @@ -41,10 +41,10 @@ { "data": { "text/plain": [ - "(,\n", - " ,\n", - " ,\n", - " )" + "(,\n", + " ,\n", + " ,\n", + " )" ] }, "execution_count": 2, @@ -55,7 +55,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -88,6 +88,126 @@ "concrete = pd.read_excel(os.path.join(FIXTURES, \"concrete.xls\"))\n", "occupancy = pd.read_csv(os.path.join('data','occupancy','datatraining.txt'))" ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Rename the columns of the datasets for ease of use. \n", + "credit.columns = [\n", + " 'id', 'limit', 'sex', 'edu', 'married', 'age', 'apr_delay', 'may_delay',\n", + " 'jun_delay', 'jul_delay', 'aug_delay', 'sep_delay', 'apr_bill', 'may_bill',\n", + " 'jun_bill', 'jul_bill', 'aug_bill', 'sep_bill', 'apr_pay', 'may_pay', 'jun_pay',\n", + " 'jul_pay', 'aug_pay', 'sep_pay', 'default'\n", + "]\n", + "\n", + "concrete.columns = [\n", + " 'cement', 'slag', 'ash', 'water', 'splast',\n", + " 'coarse', 'fine', 'age', 'strength'\n", + "]\n", + "\n", + "occupancy.columns = [\n", + " 'date', 'temp', 'humid', 'light', 'co2', 'hratio', 'occupied'\n", + "]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Build models to use in visualization \n", + "\n", + "from sklearn.svm import LinearSVC\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.datasets.base import Bunch\n", + "from sklearn.preprocessing import StandardScaler \n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.metrics import classification_report as clsr\n", + "from sklearn.cross_validation import train_test_split as tts \n", + "\n", + "def build_model(data, features, target, model):\n", + " \"\"\"\n", + " A helper function to quickly buiild a model from the data frames. \n", + "\n", + " data: the data frame of the object to build. \n", + " features: the names of the attributes to extract as features. \n", + " target: the name of the column that is the target.\n", + " model: an instance of the model to fit. \n", + " \n", + " returns: the fitted model, as well as a Bunch: (X_train, X_test, y_train, y_test). \n", + " \"\"\"\n", + " X = data[features]\n", + " y = data[target]\n", + " \n", + " X_train, X_test, y_train, y_test = tts(X, y, test_size=0.2)\n", + " \n", + " model = Pipeline([\n", + " ('scale', StandardScaler()), \n", + " ('model', model)\n", + " ])\n", + " \n", + " model.fit(X_train, y_train)\n", + " \n", + " return model, Bunch(\n", + " X_train = X_train,\n", + " X_test = X_test,\n", + " y_train = y_train,\n", + " y_test = y_test,\n", + " )\n", + "\n", + "\n", + "oclm, oclm_data = build_model(occupancy, ['temp', 'humid', 'light', 'co2', 'hratio'], 'occupied', LinearSVC())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nhvp/pekEcvJUWQwAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_pred = oclm.predict(oclm_data.X_test)\n", + "yb.crplot(oclm, oclm_data.y_test, y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/yellowbrick/__init__.py b/yellowbrick/__init__.py index b4743d4b9..560866a10 100644 --- a/yellowbrick/__init__.py +++ b/yellowbrick/__init__.py @@ -20,6 +20,7 @@ from .version import get_version from .anscombe import anscombe +from .classifier import crplot ########################################################################## ## Package Version diff --git a/yellowbrick/classifier.py b/yellowbrick/classifier.py new file mode 100644 index 000000000..ae1b609d9 --- /dev/null +++ b/yellowbrick/classifier.py @@ -0,0 +1,82 @@ +# yellowbrick.classifier +# Visualizations related to evaluating Scikit-Learn classification models +# +# Author: Benjamin Bengfort +# Created: Wed May 18 12:39:40 2016 -0400 +# +# Copyright (C) 2016 District Data Labs +# For license information, see LICENSE.txt +# +# ID: classifier.py [] benjamin@bengfort.com $ + +""" +Visualizations related to evaluating Scikit-Learn classification models +""" + +########################################################################## +## Imports +########################################################################## + +import numpy as np +import matplotlib.pyplot as plt + +from sklearn.metrics import classification_report + +from .color import ddlheatmap + + +########################################################################## +## Classification Report +########################################################################## + +def crplot(model, y_true, y_pred, **kwargs): + """ + Plots a classification report as a heatmap. (More to follow). + """ + + # Get classification report arguments + # TODO: Do a better job of guessing defaults from the model + cr_kwargs = { + 'labels': kwargs.pop('labels', None), + 'target_names': kwargs.pop('target_names', None), + 'sample_weight': kwargs.pop('sample_weight', None), + 'digits': kwargs.pop('digits', 2) + } + + # Generate the classification report + report = classification_report(y_true, y_pred, **cr_kwargs) + cmap = kwargs.pop('cmap', ddlheatmap) + title = kwargs.pop('title', '{} Classification Report'.format(model.__class__.__name__)) + + + # Parse classification report: move to it's own function + # TODO: make a bit more robust, or look for the sklearn util that doesn't stringify + lines = report.split('\n') + classes = [] + matrix = [] + + for line in lines[2:(len(lines)-3)]: + s = line.split() + classes.append(s[0]) + value = [float(x) for x in s[1: len(s) - 1]] + matrix.append(value) + + # Generate plots and figure + fig, ax = plt.subplots(1) + + for column in range(len(matrix)+1): + for row in range(len(classes)): + txt = matrix[row][column] + ax.text(column,row,matrix[row][column],va='center',ha='center') + + fig = plt.imshow(matrix, interpolation='nearest', cmap=cmap) + plt.title(title) + plt.colorbar() + x_tick_marks = np.arange(len(classes)+1) + y_tick_marks = np.arange(len(classes)) + plt.xticks(x_tick_marks, ['precision', 'recall', 'f1-score'], rotation=45) + plt.yticks(y_tick_marks, classes) + plt.ylabel('Classes') + plt.xlabel('Measures') + + return ax diff --git a/yellowbrick/color.py b/yellowbrick/color.py new file mode 100644 index 000000000..a1c5fcbd2 --- /dev/null +++ b/yellowbrick/color.py @@ -0,0 +1,30 @@ +# yellowbrick.color +# Defines color definitions and color maps specific to DDL and Yellowbrick. +# +# Author: Rebecca Bilbro +# Created: Wed May 18 12:41:35 2016 -0400 +# +# Copyright (C) 2016 District Data Labs +# For license information, see LICENSE.txt +# +# ID: color.py [] benjamin@bengfort.com $ + +""" +Defines color definitions and color maps specific to DDL and Yellowbrick. +""" + +########################################################################## +## Imports +########################################################################## + +from matplotlib import colors +from matplotlib.colors import ListedColormap + +########################################################################## +## Colors +########################################################################## + +ddl_heat = ['#DBDBDB','#DCD5CC','#DCCEBE','#DDC8AF','#DEC2A0','#DEBB91',\ + '#DFB583','#DFAE74','#E0A865','#E1A256','#E19B48','#E29539'] + +ddlheatmap = colors.ListedColormap(ddl_heat) From 4f050577adc939548a0b90622a83703efc7b29bc Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 14:28:34 -0400 Subject: [PATCH 5/6] roc curves --- examples/examples.ipynb | 79 ++++++++++++++++++++++++++++++++++----- yellowbrick/__init__.py | 2 +- yellowbrick/classifier.py | 48 ++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 11 deletions(-) diff --git a/examples/examples.ipynb b/examples/examples.ipynb index ed9cf1c20..7794e91ab 100644 --- a/examples/examples.ipynb +++ b/examples/examples.ipynb @@ -41,10 +41,10 @@ { "data": { "text/plain": [ - "(,\n", - " ,\n", - " ,\n", - " )" + "(,\n", + " ,\n", + " ,\n", + " )" ] }, "execution_count": 2, @@ -55,7 +55,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -177,7 +177,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -186,9 +186,9 @@ }, { "data": { - "image/png": "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\nhvp/pekEcvJUWQwAAAAASUVORK5CYII=\n", + "image/png": "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\nYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -202,12 +202,71 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], - "source": [] + "source": [ + "ocknn, ocknn_data = build_model(occupancy, ['temp', 'humid', 'light', 'co2', 'hratio'], 'occupied', KNeighborsClassifier())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([,\n", + " ], dtype=object)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yb.rocplot_compare(\n", + " [oclm, ocknn], [oclm_data.y_test, ocknn_data.y_test], \n", + " [oclm.predict(oclm_data.X_test), ocknn.predict(ocknn_data.X_test)]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", + " metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n", + " weights='uniform')\n" + ] + } + ], + "source": [ + "print ocknn.steps[-1][1]" + ] } ], "metadata": { diff --git a/yellowbrick/__init__.py b/yellowbrick/__init__.py index 560866a10..f7e1e28ff 100644 --- a/yellowbrick/__init__.py +++ b/yellowbrick/__init__.py @@ -20,7 +20,7 @@ from .version import get_version from .anscombe import anscombe -from .classifier import crplot +from .classifier import crplot, rocplot_compare ########################################################################## ## Package Version diff --git a/yellowbrick/classifier.py b/yellowbrick/classifier.py index ae1b609d9..6f4353bea 100644 --- a/yellowbrick/classifier.py +++ b/yellowbrick/classifier.py @@ -20,6 +20,8 @@ import numpy as np import matplotlib.pyplot as plt +from sklearn.pipeline import Pipeline +from sklearn.metrics import roc_curve, auc from sklearn.metrics import classification_report from .color import ddlheatmap @@ -80,3 +82,49 @@ def crplot(model, y_true, y_pred, **kwargs): plt.xlabel('Measures') return ax + + +########################################################################## +## Receiver Operating Characteristics +########################################################################## + +def rocplot_compare(models, y_true, y_pred, **kwargs): + """ + Plots a side by size comparison of the ROC plot with AUC metric embedded. + """ + if len(models) != len(y_true) and len(models) != len(y_pred): + raise ValueError( + "Pass in two models, two sets of target and predictions" + ) + + # Set up split subplots for the curve comparison. + # TODO: ensure that the number of models is only 2 + fig, axes = plt.subplots(1, 2, sharey=True) + + # Zip together each plot to generate them independently. + for model, y, yhat, ax in zip(models, y_true, y_pred, axes): + + # Figure out the name of the model + if isinstance(model, Pipeline): + name = model.steps[-1][1].__class__.__name__ + else: + name = model.__class__.__name__ + + fpr, tpr, thresholds = roc_curve(y, yhat) + roc_auc = auc(fpr, tpr) + + # Plot the ROC Curve with the specified AUC label. + ax.plot(fpr, tpr, c='#2B94E9', label='AUC = {:0.2f}'.format(roc_auc)) + + # Plot the line of no discrimination to compare the curve to. + ax.plot([0,1],[0,1],'m--',c='#666666') + + # Set the title and create the legend. + ax.set_title('ROC for {}'.format(name)) + ax.legend(loc='lower right') + + # Refactor the limits of the plot + plt.xlim([0,1]) + plt.ylim([0,1.1]) + + return axes From c4f3ba7a06e8e12009427f659262b47795da72fd Mon Sep 17 00:00:00 2001 From: Benjamin Bengfort Date: Wed, 18 May 2016 14:51:15 -0400 Subject: [PATCH 6/6] distribution setup --- .travis.yml | 1 + DESCRIPTION.txt | 15 ++++++ setup.cfg | 2 + setup.py | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 DESCRIPTION.txt create mode 100644 setup.cfg create mode 100755 setup.py diff --git a/.travis.yml b/.travis.yml index 549d56e66..9d066827a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ python: - '3.5' before_install: + - apt-get install -qq python-numpy python-scipy python-matplotlib - pip install coveralls install: pip install -r requirements.txt diff --git a/DESCRIPTION.txt b/DESCRIPTION.txt new file mode 100644 index 000000000..342718999 --- /dev/null +++ b/DESCRIPTION.txt @@ -0,0 +1,15 @@ +Yellowbrick is a suite of visual analysis and diagnostic tools designed to facilitate machine learning with Scikit-Learn. The package includes visualizations that can help users navigate the feature selection process, build intuition around model selection, diagnose common problems like bias, heteroscedasticity, underfit, and overtraining, and support hyperparameter tuning to steer predictive models toward more successful results. + +Some of the available tools include: + +- histograms +- scatter plot matrices +- parallel coordinates +- jointplots +- ROC curves +- classification heatmaps +- residual plots +- validation curves +- gridsearch heatmaps + +For more, please see the full documentation at: http://yellowbrick.readthedocs.org/en/latest/ diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..b88034e41 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[metadata] +description-file = README.md diff --git a/setup.py b/setup.py new file mode 100755 index 000000000..fb48d830a --- /dev/null +++ b/setup.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# setup +# Setup script for installing yellowbrick +# +# Author: Benjamin Bengfort +# Created: Wed May 18 14:33:26 2016 -0400 +# +# Copyright (C) 2016 District Data Labs +# For license information, see LICENSE.txt and NOTICE.md +# +# ID: setup.py [] benjamin@bengfort.com $ + +""" +Setup script for installing yellowbrick. +See http://bbengfort.github.io/programmer/2016/01/20/packaging-with-pypi.html +""" + +########################################################################## +## Imports +########################################################################## + +import os +import re +import codecs + +from setuptools import setup +from setuptools import find_packages + +########################################################################## +## Package Information +########################################################################## + +## Basic information +NAME = "yellowbrick" +DESCRIPTION = "A suite of visual analysis and diagnostic tools for machine learning." +AUTHOR = "Rebecca Bilbro" +EMAIL = "rbilbro@districtdatalabs.com" +LICENSE = "Apache 2" +REPOSITORY = "https://github.com/districtdatalabs/yellowbrick" +PACKAGE = "yellowbrick" + +## Define the keywords +KEYWORDS = ('visualization', 'machine learning', 'scikit-learn', 'matplotlib', 'data science') + +## Define the classifiers +## See https://pypi.python.org/pypi?%3Aaction=list_classifiers +CLASSIFIERS = ( + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', + 'Topic :: Software Development', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: Scientific/Engineering :: Visualization', +) + +## Important Paths +PROJECT = os.path.abspath(os.path.dirname(__file__)) +REQUIRE_PATH = "requirements.txt" +VERSION_PATH = os.path.join(PACKAGE, "version.py") +PKG_DESCRIBE = "DESCRIPTION.txt" + +## Directories to ignore in find_packages +EXCLUDES = ( + "tests", "bin", "docs", "fixtures", "register", "notebooks", "examples", +) + +########################################################################## +## Helper Functions +########################################################################## + +def read(*parts): + """ + Assume UTF-8 encoding and return the contents of the file located at the + absolute path from the REPOSITORY joined with *parts. + """ + with codecs.open(os.path.join(PROJECT, *parts), 'rb', 'utf-8') as f: + return f.read() + + +def get_version(path=VERSION_PATH): + """ + Reads the __init__.py defined in the VERSION_PATH to find the get_version + function, and executes it to ensure that it is loaded correctly. + """ + namespace = {} + exec(read(path), namespace) + return namespace['get_version']() + + +def get_requires(path=REQUIRE_PATH): + """ + Yields a generator of requirements as defined by the REQUIRE_PATH which + should point to a requirements.txt output by `pip freeze`. + """ + for line in read(path).splitlines(): + line = line.strip() + if line and not line.startswith('#'): + yield line + +########################################################################## +## Define the configuration +########################################################################## + +config = { + "name": NAME, + "version": get_version(), + "description": DESCRIPTION, + "long_description": read(PKG_DESCRIBE), + "license": LICENSE, + "author": AUTHOR, + "author_email": EMAIL, + "maintainer": AUTHOR, + "maintainer_email": EMAIL, + "url": REPOSITORY, + "download_url": "{}/tarball/v{}".format(REPOSITORY, get_version()), + "packages": find_packages(where=PROJECT, exclude=EXCLUDES), + "install_requires": list(get_requires()), + "classifiers": CLASSIFIERS, + "keywords": KEYWORDS, + "zip_safe": False, + "scripts": [], +} + +########################################################################## +## Run setup script +########################################################################## + +if __name__ == '__main__': + setup(**config)