{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pairwise Ranking of Features\n", "\n", "![Rank 1D Histogram](../figures/rank_1d_hist.png)\n", "\n", "![Rank 1D Histogram](../figures/rank_1d_box.png)\n", "\n", "![Rank 1D Histogram](../figures/rank_2d.png)\n", "\n", "![Rank 1D Histogram](../figures/joint.png)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Imports \n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "from collections import OrderedDict\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import Imputer \n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.metrics import mean_squared_error as mse\n", "from ipywidgets import interact, interactive, fixed\n", "\n", "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Data Loading \n", "columns = OrderedDict([\n", " (\"DAY\", \"the day of data collection\"),\n", " (\"Q-E\", \"input flow to plant\"),\n", " (\"ZN-E\", \"input Zinc to plant\"),\n", " (\"PH-E\", \"input pH to plant\"),\n", " (\"DBO-E\", \"input Biological demand of oxygen to plant\"),\n", " (\"DQO-E\", \"input chemical demand of oxygen to plant\"),\n", " (\"SS-E\", \"input suspended solids to plant\"),\n", " (\"SSV-E\", \"input volatile supended solids to plant\"),\n", " (\"SED-E\", \"input sediments to plant\"),\n", " (\"COND-E\", \"input conductivity to plant\"),\n", " (\"PH-P\", \"input pH to primary settler\"),\n", " (\"DBO-P\", \"input Biological demand of oxygen to primary settler\"),\n", " (\"SS-P\", \"input suspended solids to primary settler\"),\n", " (\"SSV-P\", \"input volatile supended solids to primary settler\"),\n", " (\"SED-P\", \"input sediments to primary settler\"),\n", " (\"COND-P\", \"input conductivity to primary settler\"),\n", " (\"PH-D\", \"input pH to secondary settler\"),\n", " (\"DBO-D\", \"input Biological demand of oxygen to secondary settler\"),\n", " (\"DQO-D\", \"input chemical demand of oxygen to secondary settler\"),\n", " (\"SS-D\", \"input suspended solids to secondary settler\"),\n", " (\"SSV-D\", \"input volatile supended solids to secondary settler\"),\n", " (\"SED-D\", \"input sediments to secondary settler\"),\n", " (\"COND-S\", \"input conductivity to secondary settler\"),\n", " (\"PH-S\", \"output pH\"),\n", " (\"DBO-S\", \"output Biological demand of oxygen\"),\n", " (\"DQO-S\", \"output chemical demand of oxygen\"),\n", " (\"SS-S\", \"output suspended solids\"),\n", " (\"SSV-S\", \"output volatile supended solids\"),\n", " (\"SED-S\", \"output sediments\"),\n", " (\"COND-\", \"output conductivity\"),\n", " (\"RD-DB-P\", \"performance input Biological demand of oxygen in primary settler\"),\n", " (\"RD-SSP\", \"performance input suspended solids to primary settler\"),\n", " (\"RD-SE-P\", \"performance input sediments to primary settler\"),\n", " (\"RD-DB-S\", \"performance input Biological demand of oxygen to secondary settler\"),\n", " (\"RD-DQ-S\", \"performance input chemical demand of oxygen to secondary settler\"),\n", " (\"RD-DB-G\", \"global performance input Biological demand of oxygen\"),\n", " (\"RD-DQ-G\", \"global performance input chemical demand of oxygen\"),\n", " (\"RD-SSG\", \"global performance input suspended solids\"),\n", " (\"RD-SED-G\", \"global performance input sediments\"),\n", "])\n", "\n", "data = pd.read_csv(\"../data/water-treatment.data\", names=columns.keys())\n", "data = data.replace('?', np.nan)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [], "source": [ "# Capture only the numeric columns in the data set. \n", "numeric_columns = [col for col in columns.keys() if col != \"DAY\"]\n", "data = data[numeric_columns].apply(pd.to_numeric)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2D Rank Features " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [], "source": [ "def apply_column_pairs(func):\n", " \"\"\"\n", " Applies a function to a pair of columns and returns a new \n", " dataframe that contains the result of the function as a matrix\n", " of each pair of columns. \n", " \"\"\"\n", " \n", " def inner(df):\n", " cols = pd.DataFrame([\n", " [\n", " func(df[acol], df[bcol]) for bcol in df.columns\n", " ] for acol in df.columns\n", " ])\n", "\n", " cols.columns = df.columns\n", " cols.index = df.columns \n", " return cols\n", "\n", " return inner \n", "\n", "\n", "@apply_column_pairs\n", "def least_square_error(cola, colb):\n", " \"\"\"\n", " Computes the Root Mean Squared Error of a linear regression \n", " between two columns of data. \n", " \"\"\"\n", " x = cola.fillna(np.nanmean(cola))\n", " y = colb.fillna(np.nanmean(colb))\n", " \n", " m, b = np.polyfit(x, y, 1)\n", " yh = (x * m) + b \n", " return ((y-yh) ** 2).mean()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzcAAALoCAYAAABFzguUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xt8zvX/x/HntYOdzA6MkG8SbWNsszGaUywhRemMJKeK\n6vtNvqx8qZRJOghN5JTD9ysiEiV8kSWHHHLMIWnUmBgbs7F9fn/s5/pac7jmc+306XG/3a7bretz\nfa7nXtcht732PnxshmEYAgAAAIAyzqWkCwAAAAAAZ6C5AQAAAGAJNDcAAAAALIHmBgAAAIAl0NwA\nAAAAsASaGwAAAACWQHMDAAAAwBJobgAAAABYAs0NAAAAAEuguQH+Qrp3764nnniiwPGMjAw9/PDD\natCggVatWlUstbRu3Vrx8fE3/JyNGzcqJCREmzZtKoryruvAgQN69NFHr3vewoULFRoaqt9++60Y\nqipbjh07phdffFFNmzZVVFSUBgwYoMOHD+c7Jzc3V1OnTlW7du0UGRmpzp07a+nSpdfN3rBhg+6+\n+27Vr19fffv2dWrd8+bN01tvveXUTACAc7iVdAEAStbZs2fVu3dv7du3Tx9++KGaNWtW0iU5zGaz\nldjP/uqrr7R9+/brnteqVSvNnTtXQUFBxVBV2ZGZmakePXrI1dVVr7/+utzd3TVhwgR169ZNX375\npSpUqCBJSkxM1IQJEzRgwAA1bNhQK1as0Isvvih3d3fdddddV80fPXq0JGny5MmqWLGiU2tPTExU\nTEyMUzMBAM5BcwP8hZ09e1a9evXSTz/9pMTERDVt2rSkSyozDMNw6LyAgAAFBAQUcTVlz9dff63D\nhw9ryZIluu222yRJderUUZs2bfTVV1/p4YcfliTNnz9f9913n5599llJUpMmTbRz507NmjXrms1N\nWlqaGjdurCZNmhT9iwEAlBpMSwP+os6dO2cfsZk8efIVG5t58+apY8eOql+/vu68806NHz9eubm5\n9sfj4+PVs2dPLViwwD4FqHPnzvr222/z5ezdu1c9e/ZUZGSkWrdurS+++KLAzzp16pRee+01tW7d\nWmFhYYqJidGAAQN09OjRG36NrVu31vjx45WQkKAmTZqoYcOGeumll3Tu3DlNmjRJLVu2VHR0tJ5/\n/nmdPn36uq/9UkMzfvx4TZgwQYZhKDQ0VOPHj5ckhYSEaPz48erSpYvCw8P14YcfauHChQoJCck3\n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\nlDctTVK+6VM///yzTpw4oQ4dOuT7eTVq1FBERIT9OTExMXrnnXfUtWtXtW7dWq1atcrXaDVu3Fjv\nv/++OnbsqLvvvlstWrRQbGysmjdvftXXdLn+/furT58++uKLLzRkyBDl5OSoS5cuys3N1dNPP619\n+/ZpxIgRuvXWW7VlyxYlJibKy8tLr7zyikP5Ut7uaTExMfLw8LB/rt7e3oqKitJ3330nSYqNjVVs\nbKwuXryogwcP6vDhw9q3b59OnjzptHVTf/5+OFJXTEyM5s6dq/vvv19xcXFq2bKlOnbs6JR6AMBq\naG6Avxg/Pz/NmDFDderU0dtvv63HH39c//znPzVlyhT7OWlpaTIMQ3379i2wcN5ms+VbS+Hp6Znv\n8UuNxKXnpaWl5Wt+Lvnz7mGLFy/We++9p5SUFPn5+alu3br2v56b8ef1GpKumXv69GmHX/uVXPrr\n+5Vcel8Lu3vXjh079Nprr2nnzp3y8vJSnTp1VLVqVUn53+fr5dpstnz1XfrL/5V2cgsKCtLu3bsl\nSX369JGPj48+++wzvfPOO3r77bdVp04dDR06VDExMYqIiNDkyZM1bdo0TZ8+XZMmTVKlSpX09NNP\nq1u3btd9fQ0bNpSUt1nAkSNHNHHiRHXp0kUrV67Ud999p+nTp9s3BoiOjlb58uU1YsQIPfLII6pd\nu/Z18y+9P0uXLtWXX35Z4D259L4ZhqF33nlHc+bMUWZmpqpWrar69evLw8PD4Q0krufP30dH6rrU\nfM6ZM0eJiYkaN26cqlevrpdeeumaTTEA/BXR3AB/McHBwapTp46kvFGNfv36acKECZoyZYp69eol\nSfbpRu+8845uueWWAhmXTxu6noCAAP3xxx8Fjl++IHzz5s0aMmSIevTooaeeesr+y/bbb79tny5W\nXJz52v/M19dXNptNJ0+ezHc8Oztb33//vSIiIuw//5KMjAz7dKilS5eqVq1akvKm0i1fvjxf9p9z\nL51Xt25dSQV3eLs0mpaamlrgeampqflGKx5//HE9/vjjOnnypNauXavExEQ9//zzSkpKkpubm33U\nIysrS99//70++eQTvfnmm4qIiFBYWFiB/B07dujIkSMFfjmvW7eutm3bJkk6dOiQbDabvfm5pFGj\nRjIMQ/v373e4ufH19dUdd9yhXr16FXgfXF1dJUkfffSRZsyYoREjRiguLk7ly5eXJD300EMO/QzD\nMOzbk18auXRGXVJeg9OhQwdlZGQoKSlJkydP1qBBgxQdHc024wBwGXZLA/7inn32WdWvX1/vv/++\nfY1EeHi43N3dlZKSonr16tlvbm5uevfddwvs5HQtTZs21datW/ONeBw4cCBfxrZt22QYhvr372//\nRS0nJ0dJSUlOepWOc/S1Xz7VzVHe3t4KDQ21Tym7ZPXq1erbt+8VR4V+/vlnpaWlqXv37vbGRpLW\nrl0rSfbd66Kjo5WUlJRvB7Ndu3apX79+9hGYP18XqFatWqpUqVKBUYPk5GRt3bpV0dHRkvIu/vrG\nG29IypuG2LlzZ3Xt2lVnzpxRRkaG3n33XT344IOSJA8PD7Vs2VKDBg2SYRhXvXjpmjVrNGjQIPtu\nbpdey/fff2+fOlejRg1Jec3v5X744QfZbDb7445o1KiRDh48qJCQkHyf64wZM+xT97Zs2aI6deqo\nc+fO9sbm2LFj2rdvX77G4/KmQ5L93Mt3mPtzzWbqGjRokAYMGGD/WXfffbeeeeYZ5eTkXHckEQD+\nahi5Af7iXF1d9fbbb+v+++/XwIEDtXDhQvn7+6t3794aO3as0tPT1bhxYx07dkwffPCBbDbbFbe9\nvZoePXros88+U69evfTcc8/p4sWLGjt2rDw8POznXFqY/frrr6tLly5KS0vTnDlz7L+4nTt37orT\nvZw1Vehy13rtLi4u9td+aYRlyZIlCg8Pd/gX7eeff17PPvusBg4cqM6dO+v48eN677331LZt2yuO\nQtSqVUvly5fXxIkT5erqKjc3N3399ddauXKlpLyLYUp5Teqjjz6qvn37qnv37srMzNTYsWMVERGh\n2NhYbdmy5YrT7AYOHKiXX35ZAwcOVKdOnXTy5ElNmDBBAQEB9o0RYmJiNHHiRAUFBSkyMlIpKSma\nNm2aGjduLH9/f8XGxmrKlCkaMmSI7rvvPmVnZ+vjjz+Wv7//Va8z8+ijj2ru3Lnq16+f+vfvLzc3\nN82ZM0f79+/XtGnTJEl33XWXQkND7b/c16pVS9u3b1diYqLatGlzxRGhq+nfv7/9/XnsscdUrlw5\nzZ07V6tWrbJv7tCgQQMlJiZq0qRJioyM1C+//KJJkybJx8cn30iMr6+v9uzZo40bN6pBgwZq1aqV\nRo0apaFDh6p379767bffNGHCBHvTY7au2NhYxcfH66233lLLli11+vRpjR8/Xrfcckuh/l8EgL8C\n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\nvfHGG33+j4//duWVVzZ6AP/tb39rjR49uslpvv76ayspKckqLi62LMv9R0uvXr2sffv2NciaNWuW\nNX78+CZr+Km5ycrKOml4dXW11a9fP+uFF17wer7OBU0t+5tvvtmaPXu2cXNzuvXqq053fLj77rut\nu++++5QZTR2DDxw4YCUnJ1tpaWlNvrep/Ndff9266KKLrNzcXA/n5NzTUsfmMWPGNDgO5OTkWElJ\nSVZGRoZ9M9CKmtpn33777fpjbVO/o5YtW2b97Gc/a/If4YqLi62kpCRr9+7dDbL79OlT/9qT5dzU\ncem9996zkpKSrKKiotPP7BnSksvUspo+Dt9www3WrbfeWv+6uX8LWpZl5efnW/369bNWrFjRYNy2\nbdusnj17WseOHWvy/fA9rXrPzYkTJ/Thhx9qxowZDU4ZxsfHa+zYsXrttddaqbpzm8Ph0GeffXbS\nJSV9+/bVu+++q7Zt28rhcCgjI0NlZWX144OCgrRu3TqfvcTJbr/85S+1d+9eZWZmNjo+JCTkpO36\n9ddf17Bhw5SYmNhg2lmzZmnnzp3avXu3VzUEBLivLP3PSyb+LwgICGixef5pvR46dKhF8s8Gpzs+\nmOjatasGDBigDRs2eP3ea6+9VgEBAUpPTzeq4WzWUsdmh8Ohbdu2qbq6un5YbGys3nvvvZMuDfJF\nPx0LTnXp0oQJE3Ts2DFt3769yWkcDoc+/fTTk4aNGDFCa9euPWma5i5nPz8/ORyOc+J4bdcybcr1\n11+vzZs3q6qqyvhvwfXr1ysgIEBTp05tMK5///764IMPGlweDt/Wqs3Nrl27VFtb2+C6y5/0799f\n3333nWpqas5wZee+yZMna/Xq1Ro2bJgeeughpaWlqby8XImJiQoICNANN9ygnTt36oorrtBvfvMb\nvf7668rNzVWnTp1Oea08/p/u3btLkvbt29dgXGlpqVasWKErr7xS4eHhkqRvvvmmyW09OTlZoaGh\n2rlzp8efX1paqqVLl6qmpsbn7xH5SU1NjdLS0vTJJ580uAfJLt27d5dlWY2uV19xuuODqe7duzdr\n+QUFBaljx47av3+/cQ1nq5Y6Nk+aNElpaWkaMmSI7rnnHr399tsqLCxUt27dFBQUdAbn8MzKzMzU\ns88+qyuuuEKhoaFNThcXFyen09nkthUeHq4xY8bo8ccf18iRI7Vw4UKlp6fL4XCoS5cu9dM1dzkf\n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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labeled_metrics = {\n", " 'Pearson': 'pearson', \n", " 'Kendall Tao': 'kendall', \n", " 'Spearman': 'spearman', \n", " 'Pairwise Covariance': 'covariance',\n", " 'Least Squares Error': 'lse', \n", "}\n", "\n", "@interact(metric=labeled_metrics, data=fixed(data))\n", "def rank2d(data, metric='pearson'):\n", " \"\"\"\n", " Creates a visualization of pairwise ranking by column in the data. \n", " \"\"\"\n", " \n", " # The different rank by 2d metrics. \n", " metrics = {\n", " \"pearson\": lambda df: df.corr('pearson'), \n", " \"kendall\": lambda df: df.corr('kendall'), \n", " \"spearman\": lambda df: df.corr('spearman'), \n", " \"covariance\": lambda df: df.cov(), \n", " \"lse\": least_square_error,\n", " }\n", " \n", " # Quick check to make sure a valid metric is passed in. \n", " if metric not in metrics:\n", " raise ValueError(\n", " \"'{}' not a valid metric, specify one of {}\".format(\n", " metric, \", \".join(metrics.keys())\n", " )\n", " )\n", " \n", " \n", " # Compute the correlation matrix\n", " corr = metrics[metric](data)\n", "\n", " # Generate a mask for the upper triangle\n", " mask = np.zeros_like(corr, dtype=np.bool)\n", " mask[np.triu_indices_from(mask)] = True\n", "\n", " # Set up the matplotlib figure\n", " f, ax = plt.subplots(figsize=(11, 9))\n", " ax.set_title(\"{} metric across {} features\".format(metric.title(), len(data.columns)))\n", " \n", " # Draw the heatmap with the mask and correct aspect ratio\n", " sns.heatmap(corr, mask=mask, vmax=.3,\n", " square=True, xticklabels=5, yticklabels=5,\n", " linewidths=.5, cbar_kws={\"shrink\": .5}, ax=ax)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" }, "widgets": { "state": { "0b77aeeb082046d2bcd2554c3c48429b": { "views": [ { "cell_index": 7 } ] } }, "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 0 }