{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Comparing Machine Learning algorithms\n", "\n", "In our paper, we chose the [Decision Tree classifier](http://scikit-learn.org/stable/modules/tree.html) provided by the [scikit-learn package](http://scikit-learn.org/) to test our Provenance Network Analytics approach on three applications (see the [Overview](Overview.ipynb) for links to those). It [implements an optimised version of the CART algorithm](http://scikit-learn.org/stable/modules/tree.html#tree-algorithms-id3-c4-5-c5-0-and-cart) and performs quite fast compared to other classification algorithms.\n", "\n", "In this notebook, we explore other classification algorithms also available in the scikit-learn package and compare their performance with Decision Tree classifiers in our three applications. The algorithms tested against Decision Tree classifiers are:\n", "* [Support Vector Machine](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification) (`SVC`)\n", "* [Nearest Neighbors Classification](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification) (`KNeighborsClassifier`)\n", "* [Random Forests](http://scikit-learn.org/stable/modules/ensemble.html#random-forests) (`RandomForestClassifier`)\n", "* [AdaBoost](http://scikit-learn.org/stable/modules/ensemble.html#adaboost) (`AdaBoostClassifier`)\n", "* [Gradient Tree Boosting](http://scikit-learn.org/stable/modules/ensemble.html#gradient-tree-boosting) (`GradientBoostingClassifier`)\n", "* [Gaussian Naive Bayes](http://scikit-learn.org/stable/modules/naive_bayes.html#gaussian-naive-bayes) (`GaussianNB`),\n", "* [Quadratic Discriminant Analysis](http://scikit-learn.org/stable/modules/lda_qda.html) (`QuadraticDiscriminantAnalysis`)\n", "* [Stochastic Gradient Descent](http://scikit-learn.org/stable/modules/sgd.html) (`SGDClassifier`)\n", "* [Multi-layer Perceptron (neural network)](http://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification) (`MLPClassifier`)\n", "\n", "Since our main purpose is to gain a rough understanding of the relative benefit (accuracy) vs cost (time) of the above algorithms against Decision Tree classifiers, optimising the parameters of those algorithms is not in the scope of our experiments. We will use the default settings as specified by scikit-learn (which are normally sensible, anyway)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from scipy import stats\n", "from analytics import balance_smote\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\", category=UserWarning)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading and preparing data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "datasets = [] # list of the datasets to be tested with the above classifiers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ProvStore Documents\n", "\n", "See [Application 1 - ProvStore Documents.ipynb](Application%201%20-%20ProvStore%20Documents.ipynb) for more details." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.read_csv(\"provstore/data.csv\")\n", "datasets.append(('ProvStore', df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### CollabMap Datasets\n", "\n", "There are three datasets from CollabMap: buildings, routes, and route sets. See [Application 2 - CollabMap Data Quality.ipynb](Application%202%20-%20CollabMap%20Data%20Quality.ipynb) for more details." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.read_csv(\"collabmap/depgraphs.csv\", index_col='id')\n", "trust_threshold = 0.75\n", "df['label'] = df.apply(lambda row: 'Trusted' if row.trust_value >= trust_threshold else 'Uncertain', axis=1)\n", "df.drop('trust_value', axis=1, inplace=True)\n", "\n", "datasets.append(('CollabMap/Buildings', df.filter(like=\"Building\", axis=0)))\n", "datasets.append(('CollabMap/Routes', df.filter(regex=\"^Route\\d\", axis=0)))\n", "datasets.append(('CollabMap/Routesets', df.filter(like=\"RouteSet\", axis=0)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Radiation Response Game Dataset\n", "\n", "[Application 3 - RRG Messages.ipynb](Application%203%20-%20RRG%20Messages.ipynb)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "filepath = lambda k: \"rrg/depgraphs-%d.csv\" % k\n", "label = lambda l: 'other' if l != 'instruction' else l\n", "df = pd.read_csv(filepath(11), index_col=0)\n", "df.label = df.label.apply(label).astype('category')\n", "datasets.append(('RRG/k=11', df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testing and collecting measurements\n", "\n", "First, we define the `Timer` class (below, taken from [this recipe](http://code.activestate.com/recipes/577896-benchmark-code-with-the-with-statement/)) to measure the computing time of training and classification. Note that this class allows us to disable garbage collection between measurements for more consistent results." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import gc\n", "import timeit\n", "\n", "class Timer:\n", " def __init__(self, timer=None, disable_gc=False, verbose=True):\n", " if timer is None:\n", " timer = timeit.default_timer\n", " self.timer = timer\n", " self.disable_gc = disable_gc\n", " self.gc_state = None\n", " self.verbose = verbose\n", " self.start = self.end = self.interval = None\n", " \n", " def __enter__(self):\n", " if self.disable_gc:\n", " self.gc_state = gc.isenabled()\n", " gc.disable()\n", " self.start = self.timer()\n", " return self\n", "\n", " def __exit__(self, *args):\n", " self.end = self.timer()\n", " if self.disable_gc and self.gc_state:\n", " gc.enable()\n", " self.gc_state = None \n", " self.interval = self.end - self.start\n", " if self.verbose:\n", " print('time taken: %f seconds' % self.interval)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we list the classifiers to be trained and tested in our experiment in `classifier_classes`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.model_selection import StratifiedKFold\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.svm import SVC\n", "from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis\n", "from sklearn.linear_model import SGDClassifier\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "classifier_classes = [\n", " DecisionTreeClassifier,\n", " SVC,\n", " KNeighborsClassifier,\n", " RandomForestClassifier,\n", " AdaBoostClassifier,\n", " GradientBoostingClassifier,\n", " GaussianNB,\n", " QuadraticDiscriminantAnalysis,\n", " SGDClassifier,\n", " MLPClassifier\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For each dataset, we balance the data using the SMOTE method (as described in [here](Cross%20Validation%20Code.ipynb)). We then carry out 10-fold cross validation tests, splitting the balanced dataset into training set and test set in 10 iterations. In each iteration, every classifier from the `classifier_classes` list above is trained and tested with the same training set and test set. The results are returned in a DataFrame whose rows tell us the dataset and classifier used along with its accuracy and computing time." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "columns = ['dataset', 'classifier', 'accuracy', 'time']\n", "def run_test_on(dataset_name, df):\n", " df = balance_smote(df)\n", " X = df.drop('label', axis=1)\n", " Y = df.label\n", " results = []\n", " \n", " skf = StratifiedKFold(n_splits=10, shuffle=True)\n", " for train, test in skf.split(X, Y):\n", " for clf_cls in classifier_classes:\n", " classifier_name = clf_cls.__name__\n", " timer = Timer(disable_gc=True, verbose=False)\n", " with timer:\n", " clf = clf_cls()\n", " clf.fit(X.iloc[train], Y.iloc[train])\n", " accuracy_score = clf.score(X.iloc[test], Y.iloc[test])\n", " results.append((dataset_name, classifier_name, accuracy_score, timer.interval))\n", " print(results[-1])\n", " \n", " performance = pd.DataFrame(results, columns=columns)\n", " performance.classifier = performance.classifier.astype('category')\n", " return performance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we want to compare the other classifier against Decision Tree classifiers, we use the performance of the Decision Tree classifiers as the base line. The normalisation function below divides the accuracy and computing time of all classifiers by the mean accuracy and mean computing time of Decision Tree classifiers, respectively." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def normalise_accuracy_time(performance, baseline_classifier=\"DecisionTreeClassifier\"):\n", " baseline_accuracy, baseline_time = performance[performance.classifier == baseline_classifier].mean()\n", " performance.accuracy = performance.accuracy / baseline_accuracy\n", " performance.time = performance.time / baseline_time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Experiment**: Using the two functions above, the code below iterates over the 5 datasets loaded in the `datasets` list in the previous section, it run the performance test on each dataset, normalise the results, and append it to the `performance` DataFrame.\n", "\n", "*Caution:* Running the code below may take about 50 minutes to finish.\n", "\n", "*Note on warnings below*: A few data points are not suitable for certain algorithms (e.g. `GradientBoostingClassifier`, `QuadraticDiscriminantAnalysis`) and generate warnings. For our purpose of comparing the accuracy and computation cost of the selected algorithms, they can be safely ignored." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original data shapes: (13870, 22) (13870,)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/imblearn/base.py:306: UserWarning: The target type should be binary.\n", " warnings.warn('The target type should be binary.')\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Balanced data shapes: (94430, 22) (94430,)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98433862433862429, 0.6282739690504968)\n", "('ProvStore', 'SVC', 0.97724867724867726, 54.664983707945794)\n", "('ProvStore', 'KNeighborsClassifier', 0.97798941798941796, 0.6841244460083544)\n", "('ProvStore', 'RandomForestClassifier', 0.98529100529100533, 0.9375908700749278)\n", "('ProvStore', 'AdaBoostClassifier', 0.24137566137566138, 11.694342364091426)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/ensemble/gradient_boosting.py:583: RuntimeWarning: overflow encountered in double_scalars\n", " tree.value[leaf, 0, 0] = numerator / denominator\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/utils/extmath.py:410: RuntimeWarning: invalid value encountered in subtract\n", " out = np.log(np.sum(np.exp(arr - vmax), axis=0))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/ensemble/gradient_boosting.py:558: RuntimeWarning: invalid value encountered in multiply\n", " return np.sum(-1 * sample_weight * (Y * pred).sum(axis=1) +\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'GradientBoostingClassifier', 0.96719576719576716, 177.97722859308124)\n", "('ProvStore', 'GaussianNB', 0.63534391534391532, 0.1893952637910843)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.2196116358973086)\n", "('ProvStore', 'SGDClassifier', 0.58592592592592596, 0.95608109398745)\n", "('ProvStore', 'MLPClassifier', 0.97873015873015878, 7.766927886987105)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98317460317460315, 0.6422885661013424)\n", "('ProvStore', 'SVC', 0.97523809523809524, 56.62782682082616)\n", "('ProvStore', 'KNeighborsClassifier', 0.98232804232804238, 0.7215720429085195)\n", "('ProvStore', 'RandomForestClassifier', 0.9838095238095238, 0.9315545791760087)\n", "('ProvStore', 'AdaBoostClassifier', 0.23883597883597885, 12.325766609050333)\n", "('ProvStore', 'GradientBoostingClassifier', 0.98126984126984129, 205.08686965494417)\n", "('ProvStore', 'GaussianNB', 0.63195767195767194, 0.19474898418411613)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.21984002296812832)\n", "('ProvStore', 'SGDClassifier', 0.63460317460317461, 1.0515488469973207)\n", "('ProvStore', 'MLPClassifier', 0.97894179894179889, 17.490266302833334)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98042328042328042, 0.7004924649372697)\n", "('ProvStore', 'SVC', 0.97492063492063497, 60.00700272107497)\n", "('ProvStore', 'KNeighborsClassifier', 0.97492063492063497, 0.7562006588559598)\n", "('ProvStore', 'RandomForestClassifier', 0.98137566137566135, 1.017202251125127)\n", "('ProvStore', 'AdaBoostClassifier', 0.24116402116402116, 12.618408649927005)\n", "('ProvStore', 'GradientBoostingClassifier', 0.98052910052910058, 191.60630124108866)\n", "('ProvStore', 'GaussianNB', 0.63100529100529101, 0.18379174708388746)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.20788549608550966)\n", "('ProvStore', 'SGDClassifier', 0.56105820105820103, 0.9839116588700563)\n", "('ProvStore', 'MLPClassifier', 0.97915343915343911, 13.864243179094046)\n", "('ProvStore', 'DecisionTreeClassifier', 0.982010582010582, 0.6382025182247162)\n", "('ProvStore', 'SVC', 0.97587301587301589, 54.57399194291793)\n", "('ProvStore', 'KNeighborsClassifier', 0.982010582010582, 0.7025791951455176)\n", "('ProvStore', 'RandomForestClassifier', 0.98370370370370375, 0.9280164430383593)\n", "('ProvStore', 'AdaBoostClassifier', 0.24359788359788359, 12.009571711998433)\n", "('ProvStore', 'GradientBoostingClassifier', 0.98243386243386244, 187.4014346669428)\n", "('ProvStore', 'GaussianNB', 0.64074074074074072, 0.1926153169479221)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.20157398888841271)\n", "('ProvStore', 'SGDClassifier', 0.66264550264550259, 0.9724252661690116)\n", "('ProvStore', 'MLPClassifier', 0.97978835978835976, 24.709092132980004)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98116402116402113, 0.6377822048962116)\n", "('ProvStore', 'SVC', 0.97576719576719573, 55.80485440604389)\n", "('ProvStore', 'KNeighborsClassifier', 0.97798941798941796, 0.7254003388807178)\n", "('ProvStore', 'RandomForestClassifier', 0.98222222222222222, 0.9230234220158309)\n", "('ProvStore', 'AdaBoostClassifier', 0.23904761904761904, 12.039744910085574)\n", "('ProvStore', 'GradientBoostingClassifier', 0.98126984126984129, 189.90324166906066)\n", "('ProvStore', 'GaussianNB', 0.63417989417989418, 0.1964319630060345)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.20328653207980096)\n", "('ProvStore', 'SGDClassifier', 0.39915343915343915, 0.9719647150486708)\n", "('ProvStore', 'MLPClassifier', 0.97746031746031747, 11.966222131159157)\n", "('ProvStore', 'DecisionTreeClassifier', 0.97838066977532856, 0.6494953420478851)\n", "('ProvStore', 'SVC', 0.97329376854599403, 55.16984712891281)\n", "('ProvStore', 'KNeighborsClassifier', 0.9358838490885969, 0.7060083199758083)\n", "('ProvStore', 'RandomForestClassifier', 0.97965239508266211, 0.9225535469595343)\n", "('ProvStore', 'AdaBoostClassifier', 0.24258160237388723, 12.090174629818648)\n", "('ProvStore', 'GradientBoostingClassifier', 0.97700296735905046, 190.71470193611458)\n", "('ProvStore', 'GaussianNB', 0.63342518016108518, 0.19647060008719563)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.20877749798819423)\n", "('ProvStore', 'SGDClassifier', 0.40525646460364562, 0.9651722251437604)\n", "('ProvStore', 'MLPClassifier', 0.97806273844849512, 28.429929216858)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98346757100466298, 0.6399862139951438)\n", "('ProvStore', 'SVC', 0.97657905892327257, 54.96170974592678)\n", "('ProvStore', 'KNeighborsClassifier', 0.97912250953793978, 0.7141891859937459)\n", "('ProvStore', 'RandomForestClassifier', 0.98389147944044086, 0.918852160917595)\n", "('ProvStore', 'AdaBoostClassifier', 0.24459516744383214, 12.048601221991703)\n", "('ProvStore', 'GradientBoostingClassifier', 0.98325561678677409, 177.18023935798556)\n", "('ProvStore', 'GaussianNB', 0.6300339126748622, 0.18278415803797543)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.1987031849566847)\n", "('ProvStore', 'SGDClassifier', 0.62484103433658333, 0.9174390151165426)\n", "('ProvStore', 'MLPClassifier', 0.98071216617210677, 17.275759185198694)\n", "('ProvStore', 'DecisionTreeClassifier', 0.97997032640949555, 0.6224692738614976)\n", "('ProvStore', 'SVC', 0.97286986011021614, 53.502078492892906)\n", "('ProvStore', 'KNeighborsClassifier', 0.97456549385332769, 0.6719589701388031)\n", "('ProvStore', 'RandomForestClassifier', 0.98050021195421788, 0.8765174869913608)\n", "('ProvStore', 'AdaBoostClassifier', 0.23749470114455279, 11.357924479059875)\n", "('ProvStore', 'GradientBoostingClassifier', 0.95803306485799067, 171.1285808600951)\n", "('ProvStore', 'GaussianNB', 0.63183552352691819, 0.1877018720842898)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.1983064040541649)\n", "('ProvStore', 'SGDClassifier', 0.14444679949130987, 0.9076564291026443)\n", "('ProvStore', 'MLPClassifier', 0.97742687579482834, 18.265281066996977)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98050021195421788, 0.6138428659178317)\n", "('ProvStore', 'SVC', 0.97424756252649425, 52.9012228010688)\n", "('ProvStore', 'KNeighborsClassifier', 0.97965239508266211, 0.6679396738763899)\n", "('ProvStore', 'RandomForestClassifier', 0.98134802882577366, 0.8896840901579708)\n", "('ProvStore', 'AdaBoostClassifier', 0.20199236964815601, 11.323103261878714)\n", "('ProvStore', 'GradientBoostingClassifier', 0.97986434930055111, 171.47252991888672)\n", "('ProvStore', 'GaussianNB', 0.63543874523103006, 0.18165320483967662)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.19786123000085354)\n", "('ProvStore', 'SGDClassifier', 0.54069520983467567, 0.9000884960405529)\n", "('ProvStore', 'MLPClassifier', 0.97816871555743956, 22.837120848009363)\n", "('ProvStore', 'DecisionTreeClassifier', 0.98081814328105132, 0.6138826361857355)\n", "('ProvStore', 'SVC', 0.97371767698177192, 53.480530600994825)\n", "('ProvStore', 'KNeighborsClassifier', 0.97615515048749468, 0.6645809879992157)\n", "('ProvStore', 'RandomForestClassifier', 0.98166596015260699, 0.8876681609544903)\n", "('ProvStore', 'AdaBoostClassifier', 0.24003815175922, 11.361000906908885)\n", "('ProvStore', 'GradientBoostingClassifier', 0.97816871555743956, 171.13530291896313)\n", "('ProvStore', 'GaussianNB', 0.63702840186519716, 0.18148943991400301)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('ProvStore', 'QuadraticDiscriminantAnalysis', 0.071428571428571425, 0.19680562405847013)\n", "('ProvStore', 'SGDClassifier', 0.58488766426451888, 0.8985274231527001)\n", "('ProvStore', 'MLPClassifier', 0.9773208986858839, 15.01476671709679)\n", "Original data shapes: (5175, 22) (5175,)\n", "Balanced data shapes: (8982, 22) (8982,)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.88777777777777778, 0.016987378941848874)\n", "('CollabMap/Buildings', 'SVC', 0.88777777777777778, 0.654363403795287)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.88555555555555554, 0.05372064607217908)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.88777777777777778, 0.034585230983793736)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.88666666666666671, 0.5658830350730568)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.88666666666666671, 0.3947491920553148)\n", "('CollabMap/Buildings', 'GaussianNB', 0.81444444444444442, 0.012314618099480867)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.018667222931981087)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.86111111111111116, 0.008864692877978086)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.87666666666666671, 0.6421780500095338)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90423162583518935, 0.01484856684692204)\n", "('CollabMap/Buildings', 'SVC', 0.90645879732739421, 0.6500226748175919)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.9031180400890868, 0.053719501942396164)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.90757238307349664, 0.03554195910692215)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.90645879732739421, 0.5695940731093287)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.90979955456570161, 0.3946095979772508)\n", "('CollabMap/Buildings', 'GaussianNB', 0.81514476614699327, 0.012178122997283936)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.016865471145138144)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.89755011135857465, 0.009447709890082479)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.85968819599109136, 0.6124980931635946)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90423162583518935, 0.015430834144353867)\n", "('CollabMap/Buildings', 'SVC', 0.9031180400890868, 0.6543858039658517)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.90200445434298437, 0.05414189305156469)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.90534521158129178, 0.03505380009301007)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.9031180400890868, 0.5720462128520012)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.90423162583518935, 0.39682423789054155)\n", "('CollabMap/Buildings', 'GaussianNB', 0.83518930957683746, 0.012489131884649396)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.01576193398796022)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.89977728285077951, 0.008987564826384187)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.88641425389755013, 0.5565136370714754)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.88752783964365256, 0.01517017581500113)\n", "('CollabMap/Buildings', 'SVC', 0.88864142538975499, 0.6576030489522964)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.88864142538975499, 0.05321069899946451)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.88864142538975499, 0.034273005090653896)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.88975501113585742, 0.5650485181249678)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.88975501113585742, 0.3973813729826361)\n", "('CollabMap/Buildings', 'GaussianNB', 0.80178173719376389, 0.011975385947152972)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015171959064900875)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.79955456570155903, 0.008932056836783886)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.88084632516703787, 0.6642728180158883)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90089086859688194, 0.015501237008720636)\n", "('CollabMap/Buildings', 'SVC', 0.89643652561247211, 0.6675954160746187)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.89420935412026725, 0.05456989607773721)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.90089086859688194, 0.03459863387979567)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.89866369710467708, 0.5672015990130603)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.90089086859688194, 0.4064055010676384)\n", "('CollabMap/Buildings', 'GaussianNB', 0.7984409799554566, 0.011983428848907351)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015305576846003532)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.5, 0.009027238003909588)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.88975501113585742, 0.8404242810793221)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.9164810690423163, 0.015215085120871663)\n", "('CollabMap/Buildings', 'SVC', 0.91202672605790647, 0.6739825340919197)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.91202672605790647, 0.05468761106021702)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.9164810690423163, 0.03474461194127798)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.9164810690423163, 0.5646350081078708)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.9164810690423163, 0.3944222799036652)\n", "('CollabMap/Buildings', 'GaussianNB', 0.80957683741648112, 0.01192634692415595)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015321757178753614)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.91091314031180404, 0.008777210023254156)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.9031180400890868, 0.5597613728605211)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90423162583518935, 0.015363594982773066)\n", "('CollabMap/Buildings', 'SVC', 0.89977728285077951, 0.6706824710126966)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.89977728285077951, 0.055158216040581465)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.9031180400890868, 0.03474282193928957)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.90423162583518935, 0.5641248559113592)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.9031180400890868, 0.40329694002866745)\n", "('CollabMap/Buildings', 'GaussianNB', 0.8229398663697105, 0.012779850978404284)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.01747719501145184)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.89643652561247211, 0.010938325896859169)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.89643652561247211, 0.4319399781525135)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.91425389755011133, 0.01533547998405993)\n", "('CollabMap/Buildings', 'SVC', 0.91202672605790647, 0.674257131991908)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.91202672605790647, 0.05335550894960761)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.9164810690423163, 0.03643997898325324)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.91202672605790647, 0.5689118970185518)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.91425389755011133, 0.39761419710703194)\n", "('CollabMap/Buildings', 'GaussianNB', 0.80846325167037858, 0.01226760190911591)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015477162087336183)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.86748329621380849, 0.009108009049668908)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.90423162583518935, 0.35561410686932504)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90979955456570161, 0.01639224193058908)\n", "('CollabMap/Buildings', 'SVC', 0.90868596881959907, 0.6748741089832038)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.90868596881959907, 0.0544117649551481)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.90868596881959907, 0.03523489483632147)\n", "('CollabMap/Buildings', 'AdaBoostClassifier', 0.90757238307349664, 0.5674329781904817)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.90868596881959907, 0.3978273479733616)\n", "('CollabMap/Buildings', 'GaussianNB', 0.80066815144766146, 0.011915349867194891)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015337583143264055)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.90423162583518935, 0.008761785924434662)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.89866369710467708, 0.5861516550648957)\n", "('CollabMap/Buildings', 'DecisionTreeClassifier', 0.90868596881959907, 0.015345130814239383)\n", "('CollabMap/Buildings', 'SVC', 0.91091314031180404, 0.6742275769356638)\n", "('CollabMap/Buildings', 'KNeighborsClassifier', 0.90979955456570161, 0.05475896107964218)\n", "('CollabMap/Buildings', 'RandomForestClassifier', 0.9131403118040089, 0.03464117995463312)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('CollabMap/Buildings', 'AdaBoostClassifier', 0.91091314031180404, 0.565354464109987)\n", "('CollabMap/Buildings', 'GradientBoostingClassifier', 0.9131403118040089, 0.39780942001380026)\n", "('CollabMap/Buildings', 'GaussianNB', 0.8229398663697105, 0.012065473012626171)\n", "('CollabMap/Buildings', 'QuadraticDiscriminantAnalysis', 0.5, 0.015248610870912671)\n", "('CollabMap/Buildings', 'SGDClassifier', 0.5, 0.008899723878130317)\n", "('CollabMap/Buildings', 'MLPClassifier', 0.90200445434298437, 0.43090497702360153)\n", "Original data shapes: (4997, 22) (4997,)\n", "Balanced data shapes: (7816, 22) (7816,)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.97186700767263423, 0.020979539956897497)\n", "('CollabMap/Routes', 'SVC', 0.95524296675191811, 0.44960711104795337)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.97186700767263423, 0.04359858902171254)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.97058823529411764, 0.0408935840241611)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.95524296675191811, 0.5249527900014073)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96035805626598469, 0.3884893278591335)\n", "('CollabMap/Routes', 'GaussianNB', 0.88363171355498726, 0.010736207943409681)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013698538998141885)\n", "('CollabMap/Routes', 'SGDClassifier', 0.86700767263427114, 0.008162094047293067)\n", "('CollabMap/Routes', 'MLPClassifier', 0.89002557544757033, 0.35570379719138145)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.95524296675191811, 0.021168424980714917)\n", "('CollabMap/Routes', 'SVC', 0.95652173913043481, 0.43363479105755687)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.94629156010230175, 0.04332349495962262)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.96803069053708435, 0.04138321802020073)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.94757033248081846, 0.5245488719083369)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.9578005115089514, 0.38526863185688853)\n", "('CollabMap/Routes', 'GaussianNB', 0.87340153452685421, 0.010610869154334068)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.50383631713554988, 0.013361826073378325)\n", "('CollabMap/Routes', 'SGDClassifier', 0.84015345268542196, 0.008047211915254593)\n", "('CollabMap/Routes', 'MLPClassifier', 0.92199488491048598, 0.6466054818592966)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.979539641943734, 0.021141943987458944)\n", "('CollabMap/Routes', 'SVC', 0.96547314578005117, 0.45452029700390995)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.95652173913043481, 0.04406040208414197)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.97570332480818411, 0.04175944998860359)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.96163682864450128, 0.5209596098866314)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96930946291560105, 0.3918162831105292)\n", "('CollabMap/Routes', 'GaussianNB', 0.88618925831202044, 0.010599188972264528)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013487095013260841)\n", "('CollabMap/Routes', 'SGDClassifier', 0.88874680306905374, 0.008146509062498808)\n", "('CollabMap/Routes', 'MLPClassifier', 0.91048593350383633, 0.5307393870316446)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.9578005115089514, 0.021546280942857265)\n", "('CollabMap/Routes', 'SVC', 0.95652173913043481, 0.45405340497381985)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.96035805626598469, 0.0447120419703424)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.97698209718670082, 0.04188215802423656)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.9578005115089514, 0.525707176188007)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96930946291560105, 0.39176974119618535)\n", "('CollabMap/Routes', 'GaussianNB', 0.88363171355498726, 0.010745926992967725)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.50127877237851659, 0.013412278145551682)\n", "('CollabMap/Routes', 'SGDClassifier', 0.86700767263427114, 0.008297739084810019)\n", "('CollabMap/Routes', 'MLPClassifier', 0.9156010230179028, 0.5349720451049507)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.97058823529411764, 0.021594892954453826)\n", "('CollabMap/Routes', 'SVC', 0.95907928388746799, 0.4563536951318383)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.95396419437340152, 0.043562589911744)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.97186700767263423, 0.04198571410961449)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.95268542199488493, 0.523284254828468)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96419437340153458, 0.3914957919623703)\n", "('CollabMap/Routes', 'GaussianNB', 0.87851662404092068, 0.010639494052156806)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013480408117175102)\n", "('CollabMap/Routes', 'SGDClassifier', 0.89258312020460362, 0.00814447202719748)\n", "('CollabMap/Routes', 'MLPClassifier', 0.92199488491048598, 0.6447383579798043)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.96675191815856776, 0.021754767978563905)\n", "('CollabMap/Routes', 'SVC', 0.96675191815856776, 0.46761976298876107)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.9578005115089514, 0.044905869057402015)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.98337595907928388, 0.04145476594567299)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.95524296675191811, 0.5204397179186344)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.97058823529411764, 0.39297017781063914)\n", "('CollabMap/Routes', 'GaussianNB', 0.8964194373401535, 0.011470217956230044)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013653832953423262)\n", "('CollabMap/Routes', 'SGDClassifier', 0.88874680306905374, 0.009221930988132954)\n", "('CollabMap/Routes', 'MLPClassifier', 0.93222506393861893, 0.7108156781177968)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.97698209718670082, 0.022520752158015966)\n", "('CollabMap/Routes', 'SVC', 0.95140664961636834, 0.45409965910948813)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.95012787723785164, 0.04357666801661253)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.97698209718670082, 0.04129388392902911)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.96035805626598469, 0.5216042711399496)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96803069053708435, 0.3901908420957625)\n", "('CollabMap/Routes', 'GaussianNB', 0.87212276214833762, 0.010740266181528568)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013356228126212955)\n", "('CollabMap/Routes', 'SGDClassifier', 0.76086956521739135, 0.008141199825331569)\n", "('CollabMap/Routes', 'MLPClassifier', 0.89130434782608692, 0.6191923918668181)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.96291560102301788, 0.021467959973961115)\n", "('CollabMap/Routes', 'SVC', 0.94757033248081846, 0.44973524613305926)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.95140664961636834, 0.044122966937720776)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.96675191815856776, 0.04133962909691036)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.94501278772378516, 0.5265291421674192)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.9578005115089514, 0.3895133410114795)\n", "('CollabMap/Routes', 'GaussianNB', 0.87723785166240409, 0.010711267124861479)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.50127877237851659, 0.013615763979032636)\n", "('CollabMap/Routes', 'SGDClassifier', 0.86956521739130432, 0.008239500923082232)\n", "('CollabMap/Routes', 'MLPClassifier', 0.91943734015345269, 0.6894009760580957)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.95641025641025645, 0.020868079969659448)\n", "('CollabMap/Routes', 'SVC', 0.95641025641025645, 0.4549294929020107)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.95897435897435901, 0.043662518030032516)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.96923076923076923, 0.04213361884467304)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.95512820512820518, 0.5255626440048218)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.95897435897435901, 0.3892016881145537)\n", "('CollabMap/Routes', 'GaussianNB', 0.87564102564102564, 0.010490303160622716)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.52692307692307694, 0.013371005887165666)\n", "('CollabMap/Routes', 'SGDClassifier', 0.87435897435897436, 0.007904492085799575)\n", "('CollabMap/Routes', 'MLPClassifier', 0.93333333333333335, 0.8296690708957613)\n", "('CollabMap/Routes', 'DecisionTreeClassifier', 0.97692307692307689, 0.021202150965109468)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('CollabMap/Routes', 'SVC', 0.96025641025641029, 0.4666906089987606)\n", "('CollabMap/Routes', 'KNeighborsClassifier', 0.96153846153846156, 0.04472280712798238)\n", "('CollabMap/Routes', 'RandomForestClassifier', 0.982051282051282, 0.04239291697740555)\n", "('CollabMap/Routes', 'AdaBoostClassifier', 0.95641025641025645, 0.5244158839341253)\n", "('CollabMap/Routes', 'GradientBoostingClassifier', 0.96410256410256412, 0.3946032510139048)\n", "('CollabMap/Routes', 'GaussianNB', 0.87820512820512819, 0.010561563074588776)\n", "('CollabMap/Routes', 'QuadraticDiscriminantAnalysis', 0.5, 0.013449113117530942)\n", "('CollabMap/Routes', 'SGDClassifier', 0.86282051282051286, 0.007984800031408668)\n", "('CollabMap/Routes', 'MLPClassifier', 0.92307692307692313, 0.6299189948476851)\n", "Original data shapes: (4710, 22) (4710,)\n", "Balanced data shapes: (6038, 22) (6038,)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.95364238410596025, 0.022387400036677718)\n", "('CollabMap/Routesets', 'SVC', 0.95033112582781454, 0.2934609961230308)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.94867549668874174, 0.01796406600624323)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.96357615894039739, 0.04233773797750473)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.94536423841059603, 0.40487608104012907)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.95364238410596025, 0.33734262199141085)\n", "('CollabMap/Routesets', 'GaussianNB', 0.70529801324503316, 0.007951893145218492)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.5, 0.009763133013620973)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.80629139072847678, 0.006294980179518461)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.91225165562913912, 0.6456035568844527)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.95529801324503316, 0.022938868962228298)\n", "('CollabMap/Routesets', 'SVC', 0.93543046357615889, 0.2891701660118997)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.9387417218543046, 0.01761500397697091)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.96192052980132448, 0.039801802951842546)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.9370860927152318, 0.40900831390172243)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.95364238410596025, 0.3370290780439973)\n", "('CollabMap/Routesets', 'GaussianNB', 0.72350993377483441, 0.008051329059526324)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.5298013245033113, 0.009809479117393494)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.9056291390728477, 0.0062596299685537815)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.91059602649006621, 0.848628485109657)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.9668874172185431, 0.02195188100449741)\n", "('CollabMap/Routesets', 'SVC', 0.95529801324503316, 0.29088515089824796)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95364238410596025, 0.01778050302527845)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.9668874172185431, 0.04070160584524274)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.95695364238410596, 0.41058047697879374)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.9701986754966887, 0.3366008100565523)\n", "('CollabMap/Routesets', 'GaussianNB', 0.71026490066225167, 0.00804082490503788)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.62086092715231789, 0.009874872863292694)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.80132450331125826, 0.00629096501506865)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.86258278145695366, 0.4127837170381099)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.94039735099337751, 0.022793053183704615)\n", "('CollabMap/Routesets', 'SVC', 0.94867549668874174, 0.29284341912716627)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.94370860927152322, 0.017488260054960847)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.95033112582781454, 0.040734926937147975)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.9387417218543046, 0.40877815312705934)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.94370860927152322, 0.3369099551346153)\n", "('CollabMap/Routesets', 'GaussianNB', 0.71357615894039739, 0.008098769001662731)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.69867549668874174, 0.009835758013650775)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.7483443708609272, 0.006303105968981981)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.91887417218543044, 0.5536460909061134)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.96026490066225167, 0.022474762052297592)\n", "('CollabMap/Routesets', 'SVC', 0.95033112582781454, 0.2905781001318246)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95529801324503316, 0.018090395024046302)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.9668874172185431, 0.040718986885622144)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.95529801324503316, 0.4052738829050213)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.95860927152317876, 0.3364135539159179)\n", "('CollabMap/Routesets', 'GaussianNB', 0.73013245033112584, 0.008031239965930581)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.55960264900662249, 0.009823711821809411)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.51986754966887416, 0.006246552104130387)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.92384105960264906, 0.6654085628688335)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.95695364238410596, 0.02247065701521933)\n", "('CollabMap/Routesets', 'SVC', 0.96192052980132448, 0.2903721600305289)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95695364238410596, 0.017271067947149277)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.9701986754966887, 0.03956448216922581)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.95198675496688745, 0.4108170981053263)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.96026490066225167, 0.33951162500306964)\n", "('CollabMap/Routesets', 'GaussianNB', 0.74006622516556286, 0.007972134975716472)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.5, 0.009750866796821356)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.80629139072847678, 0.006307743955403566)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.91887417218543044, 0.6905629721004516)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.96357615894039739, 0.02231321996077895)\n", "('CollabMap/Routesets', 'SVC', 0.95198675496688745, 0.29159425594843924)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95364238410596025, 0.01769202691502869)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.97185430463576161, 0.0407216539606452)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.95033112582781454, 0.40757188596762717)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.96192052980132448, 0.3426747820340097)\n", "('CollabMap/Routesets', 'GaussianNB', 0.72682119205298013, 0.007955130888149142)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.61092715231788075, 0.00976023287512362)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.82284768211920534, 0.006251373095437884)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.88245033112582782, 0.4838518360629678)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.94867549668874174, 0.021686450811102986)\n", "('CollabMap/Routesets', 'SVC', 0.94039735099337751, 0.28616546490229666)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95198675496688745, 0.017545380163937807)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.96192052980132448, 0.03954092087224126)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.95198675496688745, 0.4065771880559623)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.9668874172185431, 0.34199658781290054)\n", "('CollabMap/Routesets', 'GaussianNB', 0.72350993377483441, 0.00795102003030479)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.51821192052980136, 0.009783991845324636)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.82947019867549665, 0.006266012089326978)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.92218543046357615, 0.4708578719291836)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.96192052980132448, 0.02254656609147787)\n", "('CollabMap/Routesets', 'SVC', 0.95033112582781454, 0.2978651749435812)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95033112582781454, 0.017515859100967646)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.97682119205298013, 0.04210781003348529)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.94701986754966883, 0.4084370299242437)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.96192052980132448, 0.34344770293682814)\n", "('CollabMap/Routesets', 'GaussianNB', 0.72847682119205293, 0.00797056290321052)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.67052980132450335, 0.009791651042178273)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.92715231788079466, 0.006243706913664937)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.92549668874172186, 0.5744108147919178)\n", "('CollabMap/Routesets', 'DecisionTreeClassifier', 0.9700996677740864, 0.02246780996210873)\n", "('CollabMap/Routesets', 'SVC', 0.95182724252491691, 0.29382482497021556)\n", "('CollabMap/Routesets', 'KNeighborsClassifier', 0.95681063122923593, 0.017376876901835203)\n", "('CollabMap/Routesets', 'RandomForestClassifier', 0.96677740863787376, 0.04088546405546367)\n", "('CollabMap/Routesets', 'AdaBoostClassifier', 0.94850498338870437, 0.4093765649013221)\n", "('CollabMap/Routesets', 'GradientBoostingClassifier', 0.96511627906976749, 0.33941993792541325)\n", "('CollabMap/Routesets', 'GaussianNB', 0.74252491694352163, 0.007861454971134663)\n", "('CollabMap/Routesets', 'QuadraticDiscriminantAnalysis', 0.71594684385382057, 0.009866333100944757)\n", "('CollabMap/Routesets', 'SGDClassifier', 0.84053156146179397, 0.006350570125505328)\n", "('CollabMap/Routesets', 'MLPClassifier', 0.9169435215946844, 0.8341562729328871)\n", "Original data shapes: (69, 22) (69,)\n", "Balanced data shapes: (74, 22) (74,)\n", "('RRG/k=11', 'DecisionTreeClassifier', 1.0, 0.0014888178557157516)\n", "('RRG/k=11', 'SVC', 0.75, 0.0013928350526839495)\n", "('RRG/k=11', 'KNeighborsClassifier', 1.0, 0.001620562979951501)\n", "('RRG/k=11', 'RandomForestClassifier', 1.0, 0.011498658917844296)\n", "('RRG/k=11', 'AdaBoostClassifier', 1.0, 0.0583934560418129)\n", "('RRG/k=11', 'GradientBoostingClassifier', 1.0, 0.03988169599324465)\n", "('RRG/k=11', 'GaussianNB', 0.875, 0.0019737021066248417)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0019838321022689342)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.0014307887759059668)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.003501111175864935)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.625, 0.001395893981680274)\n", "('RRG/k=11', 'SVC', 0.625, 0.00147455302067101)\n", "('RRG/k=11', 'KNeighborsClassifier', 0.75, 0.0016390657983720303)\n", "('RRG/k=11', 'RandomForestClassifier', 0.75, 0.011266457848250866)\n", "('RRG/k=11', 'AdaBoostClassifier', 0.75, 0.05869359220378101)" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.75, 0.041996494168415666)\n", "('RRG/k=11', 'GaussianNB', 0.875, 0.001696938183158636)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0019595439080148935)\n", "('RRG/k=11', 'SGDClassifier', 0.75, 0.0013615519274026155)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.006086983950808644)\n", "('RRG/k=11', 'DecisionTreeClassifier', 1.0, 0.0012267990969121456)\n", "('RRG/k=11', 'SVC', 1.0, 0.0015221829526126385)\n", "('RRG/k=11', 'KNeighborsClassifier', 1.0, 0.001708680996671319)\n", "('RRG/k=11', 'RandomForestClassifier', 0.875, 0.011418401962146163)\n", "('RRG/k=11', 'AdaBoostClassifier', 1.0, 0.06060530710965395)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.875, 0.040803274139761925)\n", "('RRG/k=11', 'GaussianNB', 1.0, 0.001698334002867341)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.00198193802498281)\n", "('RRG/k=11', 'SGDClassifier', 0.625, 0.0013500789646059275)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.0035098791122436523)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.875, 0.0012260228395462036)\n", "('RRG/k=11', 'SVC', 1.0, 0.0013764961622655392)\n", "('RRG/k=11', 'KNeighborsClassifier', 1.0, 0.0016852649860084057)\n", "('RRG/k=11', 'RandomForestClassifier', 1.0, 0.011407349957153201)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('RRG/k=11', 'AdaBoostClassifier', 1.0, 0.059438828844577074)\n", "('RRG/k=11', 'GradientBoostingClassifier', 1.0, 0.04061459400691092)\n", "('RRG/k=11', 'GaussianNB', 0.875, 0.0016240121331065893)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0018182999920099974)\n", "('RRG/k=11', 'SGDClassifier', 0.75, 0.001461958047002554)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.003513803007081151)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.875, 0.0012086979113519192)\n", "('RRG/k=11', 'SVC', 0.75, 0.0013758628629148006)\n", "('RRG/k=11', 'KNeighborsClassifier', 0.875, 0.0016258079558610916)\n", "('RRG/k=11', 'RandomForestClassifier', 0.875, 0.011359950061887503)\n", "('RRG/k=11', 'AdaBoostClassifier', 0.875, 0.059313332894816995)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.875, 0.04020914598368108)\n", "('RRG/k=11', 'GaussianNB', 0.375, 0.0016456039156764746)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0017497390508651733)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.0018051520455628633)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.006517163012176752)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.625, 0.0013907940592616796)\n", "('RRG/k=11', 'SVC', 0.625, 0.0014790929853916168)\n", "('RRG/k=11', 'KNeighborsClassifier', 1.0, 0.0017442090902477503)\n", "('RRG/k=11', 'RandomForestClassifier', 1.0, 0.01228414406068623)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('RRG/k=11', 'AdaBoostClassifier', 0.75, 0.061202650889754295)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.5, 0.04074292699806392)\n", "('RRG/k=11', 'GaussianNB', 1.0, 0.0016191198956221342)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0019401400350034237)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.001365691889077425)\n", "('RRG/k=11', 'MLPClassifier', 0.75, 0.004001813009381294)\n", "('RRG/k=11', 'DecisionTreeClassifier', 1.0, 0.0012713468167930841)\n", "('RRG/k=11', 'SVC', 0.875, 0.001363782910630107)\n", "('RRG/k=11', 'KNeighborsClassifier', 0.875, 0.0017453581094741821)\n", "('RRG/k=11', 'RandomForestClassifier', 0.875, 0.011464271927252412)\n", "('RRG/k=11', 'AdaBoostClassifier', 0.875, 0.05868331203237176)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.875, 0.04217184684239328)\n", "('RRG/k=11', 'GaussianNB', 0.75, 0.0016572889871895313)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0017651650123298168)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.001581565011292696)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.0035655731335282326)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.66666666666666663, 0.0013633829075843096)\n", "('RRG/k=11', 'SVC', 0.5, 0.001506275963038206)\n", "('RRG/k=11', 'KNeighborsClassifier', 0.66666666666666663, 0.0017049508169293404)\n", "('RRG/k=11', 'RandomForestClassifier', 0.66666666666666663, 0.011329544940963387)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "('RRG/k=11', 'AdaBoostClassifier', 0.66666666666666663, 0.0598211910109967)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.66666666666666663, 0.04210941190831363)\n", "('RRG/k=11', 'GaussianNB', 0.66666666666666663, 0.0017534890212118626)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0018699930515140295)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.0013889288529753685)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.006494611036032438)\n", "('RRG/k=11', 'DecisionTreeClassifier', 0.83333333333333337, 0.0012138860765844584)\n", "('RRG/k=11', 'SVC', 0.83333333333333337, 0.0013793460093438625)\n", "('RRG/k=11', 'KNeighborsClassifier', 0.83333333333333337, 0.0017623151652514935)\n", "('RRG/k=11', 'RandomForestClassifier', 0.83333333333333337, 0.011491863988339901)\n", "('RRG/k=11', 'AdaBoostClassifier', 0.83333333333333337, 0.05878868489526212)\n", "('RRG/k=11', 'GradientBoostingClassifier', 0.83333333333333337, 0.041642566910013556)\n", "('RRG/k=11', 'GaussianNB', 0.66666666666666663, 0.0016783999744802713)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0017852059099823236)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.001595557201653719)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.003532076021656394)\n", "('RRG/k=11', 'DecisionTreeClassifier', 1.0, 0.0012313551269471645)\n", "('RRG/k=11', 'SVC', 0.83333333333333337, 0.0013750740326941013)\n", "('RRG/k=11', 'KNeighborsClassifier', 1.0, 0.0016042978968471289)\n", "('RRG/k=11', 'RandomForestClassifier', 1.0, 0.011315866140648723)\n", "('RRG/k=11', 'AdaBoostClassifier', 0.83333333333333337, 0.059280174784362316)\n", "('RRG/k=11', 'GradientBoostingClassifier', 1.0, 0.043036176823079586)\n", "('RRG/k=11', 'GaussianNB', 1.0, 0.0016102669760584831)\n", "('RRG/k=11', 'QuadraticDiscriminantAnalysis', 0.5, 0.0018779360689222813)\n", "('RRG/k=11', 'SGDClassifier', 0.5, 0.0015114808920770884)\n", "('RRG/k=11', 'MLPClassifier', 0.5, 0.00437734485603869)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: divide by zero encountered in power\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:719: RuntimeWarning: invalid value encountered in multiply\n", " X2 = np.dot(Xm, R * (S ** (-0.5)))\n", "/Users/tdh/.virtualenvs/datasets-provanalytics-dmkd/lib/python3.6/site-packages/sklearn/discriminant_analysis.py:722: RuntimeWarning: divide by zero encountered in log\n", " u = np.asarray([np.sum(np.log(s)) for s in self.scalings_])\n" ] } ], "source": [ "performance = pd.DataFrame(columns=columns)\n", "for dataset_name, df in datasets:\n", " results = run_test_on(dataset_name, df)\n", " normalise_accuracy_time(results)\n", " performance = performance.append(results, ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Saving the results to a file so that we will not need to run the lengthy tests above again the next time:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "performance.to_pickle('performance.pkl')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "performance = pd.read_pickle('performance.pkl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Charting the relative performance\n", "\n", "In this section, we plot the measurements (accuracy and time) collected above to compare the relative difference in the performance of the tested against that of Decision Tree classifiers.\n", "\n", "Since we have normalised the measurements agains those of Decision Tree classifiers, the measurements of Decision Tree classifiers average at 1.0 (for both accuracy and time). Therefore, to simplify the charts, we remove them from the plotted data." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Dropping measurements of DecisionTreeClassifier\n", "performance = performance[~(performance.classifier == 'DecisionTreeClassifier')]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import seaborn as sns\n", "sns.set_style(\"whitegrid\")\n", "sns.set_context(\"poster\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparing Accuracy Score" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8IAAAKBCAYAAACcUBLbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcTun/+PFXu6UUJsLYsoQUpSKlkqXITmYmIpOSRkio\nxpI921CK0KLImLKFso1lLKGMdRgMYT5kLKlU1rbfH/06X3eLYhhmXM/Hw+Ohc537Otc59znXfd7n\nWo5cYWFhIYIgCIIgCIIgCILwmZD/2AUQBEEQBEEQBEEQhH+SCIQFQRAEQRAEQRCEz4oIhAVBEARB\nEARBEITPigiEBUEQBEEQBEEQhM+KCIQFQRAEQRAEQRCEz4oIhAVBEARBEARBEITPigiEBUEQBEEQ\nBEEQhM+KCIQFQRAEQRAEQRCEz4oIhAVBEARBEARBEITPigiEBUEQBEEQBEEQhM+KCIQFQRAEQRAE\nQRCEz4oIhAVBEARBEARBEITPigiEBUEQBOEjKSws/NhFEAThIxDX/qdDfBefL8WPXQDhw+swZf1H\n3f6ZJSPe+bMnT54kLCyMixcv8uLFCxo0aICNjQ0uLi5kZWVhbW2Nm5sbEydOLPPzCxcuZPPmzRw/\nfpyqVasCcOXKFdatW0dycjLp6enUq1cPa2trXFxcqFWr1juXVRA+hiMWlh91+5ZHj7yXfAYMGMCV\nK1fYvHkz+vr6b1z37t27dOvWjcDAQGxtbSuV/7Zt2/D19ZVZVq1aNZo3b46bmxvdunV757K/q9jY\nWFJTU/H09JRZ/r///Y9169Zx9OhRHj16hKamJp07d2bs2LHUr19fWk9HR4epU6fi7Oz8j5S3+Bie\nPHmSWrVqkZWVhZeXF0lJSaiqqjJhwgRmzpwppQuflivzD33U7beeZv23Pr97925iYmK4du0aL1++\npEmTJvTr1w8HBwdUVFTeUynLFxQUREREBOfOnftb+WRlZTF79mxGjRpF27Ztgbe7lpOSkhgxQva+\nSkVFhfr169OjRw/GjBmDqqqqlGZtbY2VlRUzZ878W+V+k79bFxXv05YtW9DT03vPpXuzAwcOcPTo\nUebMmVNm2nfffYeFhQWhoaEfrAzvsy4vWU8LbyYCYeGTdeTIEdzc3Bg0aBDDhw+nSpUqXLlyhTVr\n1pCUlMTGjRsxMTFhz549ZQbCBQUFJCQkYGtrKwXBO3bsYNq0aRgYGDBp0iTq1KlDSkoKa9eu5dCh\nQ2zcuJEvvvjin95VQfis/fHHH1y9epXmzZtXKhD+O8LCwlBTU6OgoIDs7Gz27NmDh4cHGzZsoEOH\nDh9su2VZvXo1VlZWMstOnDiBh4cHDRs2ZOzYsXz55ZekpqYSFhbGkCFDiI6ORltb+x8tZzErKyti\nYmKoUaMGUFSfHj16lIULF9K4cWOaNGmCjo6OlC4I70NhYSHe3t7Ex8czePBgRo0ahZKSEqdPnyYo\nKIiEhATWrl37r7npv3LlCvHx8Tg5OUnLYmJiZB5yVYa/vz/a2toUFhby7NkzLly4QGhoKImJiURH\nR1OtWjUAgoODP/g1+S7lf52uri4xMTE0a9bsPZaqcqKioqRjVdKOHTto0aIFx48f5/79+2hpaf3D\npXt7Jetp4c1EICx8ssLCwjAzM2P+/PnSMlNTU7S1tRkzZgzHjx9n4MCB+Pj48Pvvv9OmTRuZzycl\nJfHw4UMGDhwIwM2bN5kxYwa2trYsWbIEOTk5ADp16kSXLl3o378/y5YtY8GCBf/cTgqCwPbt22nV\nqhUDBgxgxYoV+Pr6lntj8nfp6urK3DBbWlpy+vRptmzZ8o8HwiWlp6fj5eVFmzZtCA8PR1lZWUqz\ntramf//+zJ49m6ioqI9Svlq1askcuydPnlC1alWpji1eRxDepw0bNrBjxw6WL19O7969peVmZmbY\n2tryzTff4OfnR1BQ0Ecs5d/Tvn37t/5MixYtZFpPzczMaN++Pd9++y2hoaFMmDABoNS90YfwLuV/\nnaqq6t/O43178uQJhw8fZunSpfj5+bFlyxbGjRv3sYtVoZL1tPBmYoyw8MlKT08vc9yGmZkZnp6e\n1K1bl549e1KtWjV2795dar2dO3fSqFEjjIyMANi4cSMFBQX4+PhIQXCxRo0aMXny5H/kB0MQhP+T\nn59PfHw8Xbp0oVevXjx//rzU9XzhwgW++eYb2rVrR9++ffn9999L5XPs2DGGDx+OgYEBenp69O/f\nn/3791eqDGpqajJ1TWFhIbGxsfTt2xd9fX169uxJZGSkzGdyc3NZu3YtNjY26Onp0bdvX3bt2iWz\nzpEjRxg0aBDt2rXD1NQUX19fMjMzgaLANjU1lY0bN6KjowNAXFwc6enp+Pr6ygTBADVr1sTb2xtT\nU1Py8vLK3I+LFy/i4uKCkZERbdu2xcbGhp9++klmnbCwMHr06IGenh7du3dn5cqVFBQUVCp927Zt\n6OjokJ6ejqOjI0FBQTx//hwdHR2CgoJk0ovFx8fTt29f2rZtS/fu3dmwYYNMeXR0dFi9ejV2dna0\nb9++zLpc+HwVFBQQGhqKlZWVTBBcrFWrVnz77bfs37+flJQUfHx86NOnj8w6Bw4cQEdHh7t37wJF\n13dUVBR9+/ZFT08PAwMDRo0axbVr12Q+Fx4eTteuXWnfvj1TpkzhxYsXMunW1tYsXbqUoUOHoq+v\nT1hYGPDmuuj1bs1DhgzBx8cHKLoOwsPDpbyvXr3K6NGjMTQ0pHPnzjJ1x5t07tyZDh06sHnzZply\nvt7tt6I6IDU1lQkTJmBiYoKJiQkeHh7cu3cPKKoDOnbsSFhYGB07dsTS0pJnz57JlD8oKIhBgwYR\nFxdHjx490NfXx8nJiYcPH/LTTz9hZWVFhw4dmDx5Ms+fP5eOi46ODr/99hsAjo6O+Pv7s3z5cszM\nzGjXrh3u7u48ePBAKmdubi4rVqzAxsaGtm3bYmxszLhx4/jrr79k9j00NBQ/Pz9MTEwwNDTE29ub\nnJwcaTvJycn88ssvMucIQEJCAnJycpibm2Nra8u2bdtK3ZNWlD9ATk4O8+bNo2vXrrRt25ZOnTrh\n7e1NVlZWqe8vLy8PMzOzUt2079+/T+vWrTl06FCF32HJevjmzZuMHj0aIyMjDA0NcXZ25urVq2Wd\nPp8lEQgLnywLCwuOHz+Om5sbCQkJPHr0CAAlJSXc3Nxo1aoV1atXp0ePHuzZs0fmsy9fvmT//v0M\nGDBAWnb8+HF0dXXL7fo8bNgwhg8f/uF2SBCEUk6cOMHDhw/p27cvdevWxdTUlC1btkjpd+/excnJ\nCRUVFVasWMHgwYOlm8diFy9exNXVlRYtWrBq1SqWL19O1apV8fLykgnKoOjGOi8vj7y8PDIzM9m4\ncSPXr19n6NCh0jrLli1j1qxZWFtbs2rVKmxtbVm0aBHLly+X1vH29mbVqlUMHTqUkJAQDAwMmDx5\nsnQD+ueffzJu3DgMDQ1Zu3Yt3t7eHD58WLrBCQ4ORlNTExsbG2JiYgBITExEU1Oz3AdydnZ2uLm5\noahYujPXvXv3GDFiBNWqVSMwMJCVK1fStGlT/Pz8pBv8HTt2EBgYiJOTE+Hh4djb2xMUFERsbGyl\n0l/n5+fHkCFDqFKlCjExMdjb25daZ/v27Xh5eWFsbMzq1asZMGAA/v7+UsBQLCQkhBEjRrBw4UJM\nTEzK3Hfh83T58mUePnyItXX544t79uwJwC+//FKpPCMiIli6dClDhgwhPDycGTNmcOPGDZk5BMLD\nw/nhhx8YOHAgK1asIDc3t8yeGOvWrZPmK7C2tq6wLtLV1ZXG6vr7++Pu7l4qz9TUVBwcHMjJyWHx\n4sVMnz6dxMREvLy8KrV/pqamPHr0SCaoK1bRNZ6Tk4ODgwPXrl3Dz8+PhQsXcvPmTVxcXMjPzwcg\nOzubXbt2sXTp0nJ779y6dYvQ0FCmTp3KvHnzuHDhAo6OjmzdupVZs2bh4eFBfHw869eXP4fN1q1b\nuXDhAgsWLGDWrFkkJSXh7+8vpfv7+xMdHY2LiwsRERFMnDiRkydPlurVt2bNGrKysli2bBkTJ04k\nISGBkJAQoKgea9OmDYaGhsTExFCnTh2ZY9W1a1dUVVXp378/qampJCYmlirnm/IH8PLy4tChQ3h5\neREeHs63335LfHw8q1atKpWXoqIidnZ27N27VzreUPRAUUNDAwsLi7eqpwsKChg7diz5+fksX76c\n5cuXk5GRwZgxY2Ty/5yJrtHCJ8vT05PMzEzi4uI4fPgwANra2tjY2DBq1CjU1dUBGDhwIDt27ODC\nhQu0a9cOgMOHD/P06VOZQPjBgweixVcQPjFxcXG0adOGli1bAtC/f3+mTp3KjRs3aN68ORs2bEBZ\nWZmQkBCqVq2KpaUlhYWFLFy4UMrj+vXr9OjRAz8/P2lZ/fr1GThwIBcuXKBr167ScjMzs1JlcHR0\nxMDAAICMjAzWrVuHs7OzNImVubk5hYWFhIeHM3LkSB49ekRCQgKzZ8/m66+/ltbJyclh2bJlDBo0\niEuXLvHq1StcXV2lm6vq1auTmpoKFHVXVFZW5osvvpC6BN6/f/+dx9ldv36d9u3bs3TpUpSUlICi\n7oomJiacPn0aHR0dzpw5Q4MGDXBwcEBOTg4TExMUFRWl8lWU/rrmzZujpaWFvLx8mV0aCwoKWLZs\nGX379pVu/M3NzZGTk2PVqlU4ODhIN9CdO3fmq6++eqf9Fv7bilsi33RdNGzYEECmJfBN/vrrL9zd\n3Rk5ciQAJiYmZGVl4e/vz9OnT6latSqhoaHY29szfvx4AGn41J07d2TyatasGWPGjJH+3rp1a4V1\nUfPmzYGirs2NGjUqVb6oqCgUFBQICwuTJr1SUVFh8eLFZGRkVLh/xd1iHz9+zJdffimTVtE1vnXr\nVtLS0ti7d690XOvVq8d3333HzZs3gaJePOPGjaNLly7lluHZs2csWLBAuif75ZdfSEhI4NChQzRo\n0ACA/fv3c+HChXLzUFBQYM2aNdJEaFevXpUJ9tLT05k6dSpDhgwBir7HW7duleqZo6WlxbJly6TW\n3eTkZI4ePcqUKVNo3rw5qqqqVKtWTaYeu337NufPn5eCVUNDQxo3bszmzZsxNzevdP4vX74kNzeX\nWbNmYWFhAUDHjh05d+4cycnJZe73wIEDiYqK4sSJE9Ix3rVrF3Z2digqKr5VPf348WNu376Nh4eH\nlFe9evWIj4/n2bNnqKmplXv8PxciEBY+WcrKyvj7+zNhwgQOHTrEiRMnSE5OJiQkhK1bt/Ljjz/S\nsGFDOnbsSL169di9e7dU6e7atQsTExOpwgWQl5eX6f4jCMLHlZOTw8GDB3F1dZW6iXXq1ImqVauy\nefNmfH19OXv2LMbGxtKEd1DUAvR6IDx48GAGDx7Ms2fPSElJ4fbt25w6dQqAV69eyWwzMjJSurnM\nycnhxIkThIWFoaCggK+vLxcuXCA3N7fUbNR2dnasXbuWCxcuSDfnJdfp3bs3CQkJpKSkoK+vj7Ky\nMvb29vTu3RsrKyusra1RUFAo93j8nTrK0tISS0tLXr58ydWrV7l9+zYXL16UOQZGRkbExMQwePBg\nbG1tsbKykpmltKL0t3Hr1i0ePnyIlZWVTFduCwsLVqxYwcWLF+nUqRMATZs2fadtCAIUXTdApVu4\npk+fDhQFUjdv3uTmzZtSl9NXr15x//59MjIypMAFQE5Ojp49e8p0X4bS5+7b1EXlOXfuHMbGxjIz\nP3fr1u29zGxf0TV+7tw5mjdvLgXBgEyX3OKuyxVds3JyctKM2AC1a9emVq1aMvdkGhoaZGdnl5uH\njo6OzGzgWlpaUldqgICAAKCokaP4ezx79myp46ynpyczHE5LS4srV668sfxxcXHUqFEDAwMD6bep\neIhMenq6zBjcN+WvoqJCREQEUNS76fbt21y/fp2UlJRyZzpv3bo1LVu2JCEhgS5dunD9+nWuXr3K\n3Llzgberp2vXrk2TJk2YMWMGJ06cwNLSEnNzcyZNmvTG/f+ciK7RwidPS0sLBwcHgoODOXHiBAsW\nLCAjI4Pg4GCg6EewX79+7N27l8LCQrKysjh69CiDBg2SyadBgwZvfGKcmZkpU8kKgvBh7du3j+fP\nnxMYGIixsTHGxsZYWFjw/PlzduzYwatXr8jKyqJmzZoyn9PU1JT5+9mzZ0yePBljY2O+/vpr1qxZ\nw8uXL4HS74fU0dFBT08PPT09TE1N8fLywt7eng0bNvDo0SOePHkCUGoIRe3atYGi4PnJkycoKiqi\noaEhs07xZ3JycmjYsCGRkZG0atWK6OhoRowYgYWFBXFxceUej4rqqJycnHJvHPPz85k/fz7GxsYM\nHDiQ5cuXS/tSfAz69evHwoULkZeXl1pr+/XrJ93cVpT+NorHM3p5eaGrqyv9K269KR7qAv93bAWh\npOKW4OKeFGUp7gJcr169SuWZkpKCg4MDpqamjB49mm3btkm9KAoLC6XrpmS9U9awqpLn7tvUReV5\n8uTJ37omisfR1q1bt1RaRdd4Zbdd0WRMVatWLfXQ7/WHmZVRcn05OTmZY3j27Fn69euHhYUFHh4e\n7N27t8zgsqJ8SiosLGTnzp1kZWVhamoq/TaFhoaSm5vLjh073ir/gwcP0r17d7p168bkyZNJTEyk\nSpUqbyzDwIED+fnnn3n58iU7d+6kadOm0tsU3qaelpeXJzIykl69enHw4EHGjx9P586d8ff3Fw1D\n/58IhIVP0vnz5+ncuXOpbjOKiooMHjwYS0tLUlJSpOUDBgzg/v37nDlzhn379qGoqCiNGyrWuXNn\nLl++XGrMYLHAwEDMzc15+vTp+98hQRBKiYuLQ09Pj/Xr18v8mzlzJhkZGRw4cAANDQ0eP34s87mS\n3QPnzp1LYmIia9eu5dy5c8THx+Pm5lbpcujo6JCfn09qaqoU3KalpcmsU/y3hoYG6urq0hjj8tYB\n6NChA2vWrJF6sjRu3Jjvv/9eZsKX13Xu3Jm0tLRyWyt++uknOnXqVKp7JhSNs42NjWXRokVSPVjc\n8vW6gQMHsmXLFhITE5k3bx5ZWVlMnTq10umVVdzlbubMmWzZsqXUv5LdCwWhLLq6utStW5cDBw7I\nLL9165b04Lo4rbjrfckb/Nd/04vHTObl5bFr1y7Onj3LTz/9JDMGufj6LXmvUJnJqv5uXQRFMyiX\n3ParV684cuRImRMslZSUlESDBg3KfdXPm65xNTW1Mu+Rjhw5UqpO/Jiys7Nxc3Ojfv367N+/n19/\n/ZUNGzZIQ1z+jtOnT5OamsrMmTNL/Ta1bdtWZg6Lity+fZsJEyZgamrKkSNHOHXqFGFhYRW2qPft\n25fnz5+TmJjI/v376d+/v0z629TT9erVY8GCBZw8eZJNmzbRu3dvIiMj2bt3b6X3479MBMLCJ6lJ\nkyY8ffq0zIkU8vPzuXPnDi1atJCWaWtro6+vz4EDB9i/fz+2tralJnAoHk+xaNGiUk/iUlJSiIuL\no1u3blSvXv3D7JQgCJJ79+5x+vRp+vfvT8eOHWX+ff3112hqarJlyxY6duxIUlKSzA3g0aNHZfI6\nf/48Xbp0wczMTJpt+dixY0DlWmEuXbqEvLw8X375JXp6eigpKZW6Sdi9ezeKioro6+tLr1kqa53i\nrmibN2/G2tqa3NxcqlatirW1NRMnTiQ/P18KhIu7dBbr378/GhoaLFq0qFT3vrS0NKKiomjfvr1M\nt8XXj0Hbtm3p1auXVPeVPAbTpk2TxjzWrl0be3t7hgwZIrVCV5T+NrS1tdHQ0ODBgwdSC7yenh6Z\nmZkEBgbKzKoqCOWRl5dnzJgxHDt2jPj4eGl5QEAAVlZWREZGEhYWRpcuXWjTpg3Vq1fn8ePHMsHw\nmTNnpP+np6fz559/MnToUFq2bCldg8XXChR1+61Tp06pWeePHDlSYXkrUxe9aXgEFI1HPX36tEwA\nf/LkSVxdXUs9FCwpKSmJc+fOlTl5HVR8jRsYGHD9+nWZFviUlBRcXV0/qZmGb968yZMnTxg5ciSN\nGzcGih5ynDhxotIt78VK1sNxcXHUrl2br7/+utRv06BBg7hx4wZnz56tVN6///47ubm5uLq6Sg8m\nnj17xpkzZ95YTk1NTTp37kx4eDh//vkn/fr1k9Lepp6+evUq5ubmXL58GXl5eQwNDZk3bx6KiorS\nEJ/PnRgjLHySNDQ08PT0xN/fn8zMTAYOHIiWlpY0/f6DBw+krtHFBgwYQFhYGGlpaaXG8QA0btwY\nHx8f5s2bx4MHD7C3t6dWrVpcvnyZsLAw6taty/fff/9P7aIgfNZ27NiBnJwcNjY2pdIUFBTo1asX\n0dHRzJ07l5iYGFxcXHBzc+P+/fulrn09PT0OHTrE9u3bqVevHqdOnZLqgJKvPLl8+bLUWpmXl8ex\nY8fYvn07/fv3l7o+Ojo6Eh4ejoKCAsbGxpw+fZrw8HCcnJxQV1dHXV0dGxsbFi5cyNOnT9HR0eHg\nwYMkJCQwc+ZM5OXlMTIyIi0tjQkTJuDg4EBubi4hISF8+eWXtG7dGoAaNWpw+fJlkpOTMTY2Rl1d\n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\nev3119WyZUtJkre3t7777jslJCSoUqVKKlmypP7880/jUKwLFy4Y9yW7Ll68KE9PT73zzjvG31nz\n5s21Y8cO7dmzR71799b//vc/JSYmasCAASpbtqyk+yMBUr8Nz6r9QY899phxqGn16tVVrVo1nTt3\nzqRPZGSkSpcurYULFxqH4fr4+KhXr17as2ePnnzySeM23n77bTk68j1iTty4cUM3b95MM9TYYDCY\njFSQ7k+SZ+7feVZiY2P11FNPqX379pLuXytYunRp4xdiWbU/yJzjOFX79u01ZMgQSVLTpk21ceNG\n/fjjj2k+ZLdp00Zt2rTRjBkzFBQUlOGH/ISEhDSvjdL9L8u4PhgFTbt27RQVFaVTp04Z58zYsGGD\n8e80u1K/ZE99fOnSJX322Wc6cuSIceLK1Pe4R7nG9p9//lFSUpLGjx9v/LK4adOm2rdvn3GirlOn\nTun69evq3bu3cSRLiRIl9MsvvyglJSXL9gffg0qWLGk8a125cuU0Q8glKTo6Wv/8848WLVpkHDLt\n5+enZ599VuvWrVOnTp0k3f+Cbfz48fL09Mz2fgP5DUEYeVqjRo2Mb0onT57UtGnT1Lx5c02fPt0Y\nVrp06aIuXbooISFBp06dUlxcnH755RdJMvmW09nZWXXr1jX+nPoB886dO7pz546OHj2qt99+22T7\nzz77rDEI//7777p69WqaYVipwfjXX381fhj29fU1DvV0c3NT0aJFTbadegbswSFS0v3ZYR++njb1\njGrqEOeHtx8cHKzvv/9ep06dUpEiRSRJjz/+uLH9zp07OnjwoN58802TD/OtWrVSSkqKdu3apc6d\nO8vHx0fvvvuufv75ZwUEBKhFixbpfvOcysnJSdL9s2LZ5e3trWXLliklJUVxcXGKi4vTsWPHdOXK\nFeOHDj8/P7m6uqpbt24KDg5W69atFRgYaNxuVu3ZtWvXLgUFBcnR0dH4e6pfv77c3d21c+dOYxCu\nVKkSIdgCHg67qdatW5fmuEv9Msicv/OsNG7cWKtWrdJff/2lp59+Wq1btzYZ0ZFV+4PMOY5TPXgt\nn6Ojo8qWLZvhpFvvvvuugoOD9d5776U7hFq6/7qyfPlySfc/yN+4cUM//PCDpk2bJmdnZ73yyitm\n/06AvM7X11fe3t7atGmTBg0apPj4eB08eFDh4eHauXNntp8voy/Z+/TpY7w+OPW95FEvU1i0aJGk\n+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\nZYratWun+Ph4zZ8/X4mJicbbFTVu3FiXL1/W0KFD1bNnTyUlJWn+/PmqUKGCatWqJQ8Pj0zbsxuG\nBw8erBdffFFDhw5Vly5dlJiYqMjISMXHx6c78Qhyrk6dOpo0aZLGjh2rkydPqlu3bvLx8dHff/+t\nrVu36ptvvpG3t7eefPJJHT9+PMu/85YtW+r999/XO++8o169eunYsWMmsy87OTnJz89P8+bNU6FC\nhVSlShUdOHBAsbGxeu+997Jsf5g5x3FOVKtWTQMHDkx3BtjUkRupEhMT9d1332n37t167bXX5OzM\n2zsKFkdHR7Vp00ZLliwxflGZnuvXrxu/zHpQo0aNsjwL/LARI0bo4MGD6tWrl1599VU1bNhQN2/e\n1Jo1a7R161aNHTs23S+ha9WqJScnJ33wwQd66aWXdO3aNS1atEiXL182fpHn5+cng8GgsLAwhYaG\nysXFRdHR0SpWrJiaNm1qvHwio/bs6tu3r9auXav+/fvrlVdekYuLixYtWqT9+/enuTsCYC94p7QD\nP73+k61LsLhXX31Vn332mebPn69Nmzbp7t27mjJliqT7t1yZO3eupkyZon379qlz585mPedTTz2l\niIgIzZ49W9999518fX01YsQIk9vxvPzyy3Jzc9OiRYu0evVqlS1bVn379tXgwYOtsp8P+/DDDzV7\n9mwtWbJE169fV5UqVfTBBx+oY8eOma4XFBSkyMhIzZs3T1999ZXc3d3l7++v4cOHG4ekfvzxx5o2\nbZrGjx+vhIQE1ahRQwsWLDBeG9WjRw9t3bpVAwcO1PTp0xUcHCwfHx+tXr1aUVFR+vzzz3Xx4kXj\nkLPPP//cOEP3w1Jn/V66dKm+/PJLPfbYY2rfvr2cnZ0VHR2txMREPf744/roo480Z84ck9l2P/zw\nQ7m4uGTZnl1169ZVdHS0wsPDNWTIEBUqVEgNGzbU9OnT5eXlle3nyy3vLP8i6055WKdOneTr66tl\ny5YZRxe4ubmpRo0aGj16tF544QUVLlxY//nPf7L8O69ataomTZqk+fPnKzQ0VPXq1dOcOXNMhhaP\nGTNGRYoU0UcffaQrV66ofPnyGjVqlLp162ZW+4PMOY5zauDAgVq/fn2a2zfdvXtXPXr0MP5cqFAh\nVa5cWSNHjlTfvn1zvF0UPN277bZ1CTnWtm1brVixItN7B1+6dEnvv/9+muXDhg3LdhAuWbKkVqxY\n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\nWqh379569dVXtXLlShkMBrO3DQAAAACwX2YH4QMHDqh379564oknJElbtmxRrVq1VLVqVTk6OqpN\nmzY6efKk2Rs+ffq0zp8/r8DAQOMyFxcXtW7dWjt27Eh3ncTERDk7O8vNzc24rHjx4kpISFBiYqLZ\n2wYAAAAA2C/n7HRODaDHjx/Xn3/+qY4dOxrb7ty5YxJQsxIXFydJqly5ssnyihUr6syZM0pOTpaT\nk5NJW8eOHRUdHa0ZM2YoNDRUZ86cUXR0tNq0aaNChQplZ1eMjh49+kjrFRS23n9bb9+W7HnfYSq/\nHwv5vX5YTn4+FvJz7UjLnv8/7Xnf7cWuSzd0+16KJGlL/DUVdXZU0zKeafpxLGTO7CBcvXp1rV+/\nXh06dNDixYvl4OCgtm3bSpKuXr2qlStXqnbt2mZv+NatW5KkokWLmiwvWrSoUlJSdOfOHbm7u5u0\nVapUSSNHjtTYsWP1ySefSJLq1Kmj999/3+ztAgAAAEB+lV7oRfaZHYSHDBmiwYMH68knn5TBYFBQ\nUJBq166tvXv3qm/fvnJ0dMxWIE29ptfBwSHd9vSWr169WmPGjFGPHj3Uvn17/fXXX5ozZ44GDBig\nJUuWyNXV1eztp6pVq1a210lrjwWewzZyuv8x+s2m27elQ//L2fp5b9/z73Gc3+W9YyF78l79HMu2\nkveOBfPlvdo5jnMi7/1/5p68t+/pH8seR9bK6e514+ObtZ/PzaLsQt47FnJfbGxshm1mB2F/f399\n8cUX2rx5sx577DF16NBBkuTt7a0uXbqoZ8+eqlatmtlFeXh4SJJu376t0qVLG5ffvn1bTk5Oac4U\nS9LChQsVEBCgCRMmGJfVrVtXwcHB+uabb9S1a1eztw8AAADANgi+sLVsXSNcrVq1NGHX29tbY8eO\nzfaGU68NPnv2rMl1wmfPnpWPj0+668THx6tTp04my6pWrarixYvr1KlT2a4BAAAAAGB/MgzCkyZN\nUqdOnVS3bl3jz+YYM2aMWf18fHzk7e2tzZs3q0WLFpKkpKQkbdu2Ta1bt053nccff1z79u0zWXb6\n9Gldv35dFSpUMGu7AAAAAAD7lmEQXr58uerVq2cMwsuXL8/yyRwcHMwOwg4ODgoNDdXEiRPl6emp\nhg0bavny5bp27Zr69OkjSTpz5oyuXr2q+vXrS5IGDx6sN954Q++8846ee+45Xbp0SXPnzlX58uX1\n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\nz/3Tz89PCxcufO3bfds9vX88Z84cdevWTYcPH5a3t7cePXpktB01alSctuPHj1e+fPn0448/asGC\nBXHWu3TpUn322WcKDQ1Vjx49NGvWLH333Xd69OiR2rZtm+A+SVBQkCpXrmz19xgWFqZu3brp77//\nTrTNtWvX5OPjo/v371t9+2+LlEldAGwnQ4YMKlWqVJxpFSpU0PHjxxUYGKg2bdrYbNszZsxQpUqV\nNGLECGOah4eH8ufPL19fXwUFBcnT09Nm28eLW7VqlRYuXKhhw4apRYsWxvSKFSuqcOHC6t27t9au\nXavGjRsnYZXxlS5dWps3b1b37t3jTL9w4YIuXLigQoUK2WzbQUFBqlSpkvE6TZo08f7mihcvLi8v\nL23btk2ffPKJRetNnz59vPW8iFddPrn7/vvvtXjxYjVu3FgtW7bUO++8owMHDmjs2LHav3+/Jk6c\nKAcHh6QuM47YAZ8iRYrEm/e6B3zSpEmjuXPnGvOjo6P1999/KyAgQF988YWWL1+uokWLWm37p06d\n0rp169ShQwerrfNNRv98MfbcP6dMmaKvv/76tW/3bZfQ/nG5cuWUNm1affvtt/r999+VJk0aSVKh\nQoVUokSJOG09PT1Vo0YNrVy5Uq1bt5YknT59WsOGDVP9+vU1evRomUwmo32dOnXUs2dPff/996pW\nrZpSpUplzAsKCtLw4cOt+v4OHDigIUOG6NatW4m22bRpk4YPH66IiAirbvttwxFhO5MiRQoVLVpU\nf//9tzGSu3jxYlWqVEnly5dXSEiIzGazli5dqgYNGqhkyZKqWbOm5syZY6xjwIABqlWrVrx1N23a\nVP369ZMk3b59O8HTdSpVqqTevXvr3Xff1ZUrV1S9enVJUs+ePdW2bVtJeu72pcenj0ybNk316tVT\nqVKltH79eknS8ePH1b59e7m5ualChQoaPny4Hjx4YI2PLtmbOXOmihQpEicEx6pbt646depk7Ghc\nuXJFPXv2NI5WfP7557p06ZLF27p48aJ69OihChUqGEFx6tSp8frMiRMn1KRJE5UoUUJNmjTRnj17\n4q2rVq1aOnPmjIKDg+NM37hxo8qXL2/UHOv69esaMGCAKleuLFdXV1WuXFkjRowwvgyuXLmiIkWK\naMOGDWrTpo1KliypunXrGn3sSXv27HnuSG6GDBkk/e/0tdj1P32qUqNGjfTNN99Iev6RmBs3bqhH\n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\numrevHnx7soYy9HRUdWqVdO6desSPAohybgj5Lx587R8+XLlzJlTderUUcqUKTV37tw4o8C9evXS\nli1bNGPGDON5fKVLl9bVq1cVHBys8uXLx1t/SEhInDuZp02bVgUKFNDIkSPVtGlTY/qoUaM0dOhQ\nffXVV8qePbu6dOmivXv3Pvezkx7/nvz9/TVy5EiNGDFCKVOmVKdOnbRlyxaLlk9M9+7dFR0drblz\n5yosLExVq1Y17kArPb604eeff9aYMWM0dOhQ3b9/X0WKFNH06dPjXGP3pmvUqJF27Nih7777Tn/8\n8YeqV69u7FQvWrTIGPC5evWqVq5cqU6dOhkDd/7+/i804LN48WL5+fmpXLlyunDhgqZOnZrogE/q\n1KmVO3duzZo1y+IBn9ibCCW07dgBn9q1ays0NFT+/v6JDvhkyZJFpUuX1qpVq3TmzBnj+sqgoCD1\n7dv3ue811jfffKPmzZsbj0Vr0qSJ5s6dKx8fH/Xq1UtOTk6aM2eObt68adydvHz58kqdOrVGjBih\nzz//XH///bfxOceKDWo7d+7UO++8owIFCqht27YaPXq07t69q5IlS+r06dOaMGGCqlevrvTp06ts\n2bK6efOmevbsqVatWikyMlL+/v567733Ejyl+E1B/6R/FitWTI6OjqpVq5b69eun7t27q0CBAsaR\n486dOxsBOEOGDDp06JDKli0rNzc35cuXTyNGjND9+/fl7OysHTt26O+//7bK/SnsQfv27bVo0SL5\n+/tr+PDhibZLnz69evTooSFDhmj69OnGDbEaN26sEiVKaP78+ZoxY4auXbumNGnSqEiRIhowYICa\nNGmitGnTavXq1SpevPhzB8AHDRqk+vXr68cff9SIESOs+l7x/5kBAIaQkBBz4cKFzRs2bEjqUl6b\nR48emVeuXGm+ceNGnOl9+vQxN27cOImqsp3o6GjzokWLzM2aNTOXK1fOXLp0afMnn3xiXrRokTky\nMtJod/bsWbOPj4+5VKlSZnd3d3O3bt3MFy9eNOZPnjzZXKpUKeN1tWrVzN9//72xjR9//NFcqVIl\ns5ubm7lu3brmWbNmmQcNGmSuXbu22Ww2m3///Xdz4cKFzRs3bjTXq1fPXLx4cXOLFi3Mf/75p7HO\n2DZ//PGHMa1fv37mYsWKmW/dumVMa9OmjblLly7G69mzZ5urVatmLlGihPnjjz82jx8/3jx58mSz\nu7u7+dGjR0Y/DwgIMDdr1sxcokQJc9OmTc179+41m81mc2hoqNnV1dUcuhT27AAACNRJREFUFhYW\n57N7+j0/rXfv3ubChQubd+/ebaynV69eZnd3d3OpUqXMHTp0MB87dizOMtu2bTPXqVPH7Orqam7c\nuLH54MGD5nLlypmXL19ufJb9+vUzFy9e3Ozr62tMCwgIMNeoUcPs6upqrlatmnncuHHmR48eGevd\ns2ePuUWLFubSpUubS5cube7atas5ODg40drfFPRP+qfZ/Pj/5bFjx5qrVKlidnV1NdesWdP8888/\nm2NiYow28+bNM5cpU8b84YcfmiMjI803b940f/311+ZKlSqZXV1dzfXr1zevXbs20c8DsHcms/mp\n81AAwI7F3plx0qRJiZ5inRzV/H/t3W9oleUfx/H3Npl/qKDlTqkbMWf7U2E+CFMnpiV7UIalTOc/\nCCc0FijVsIQKKcs4Zdg/Q/HBHigaWuOw49GpJeTGGC7QMnG5tWLKUR/MUbp0a1sPxu/mt/7Xb7bz\n67xfcOBw39d13d9zc558uK/ruouLyczMZNWqVYwePZqGhga2bdvGhg0bBj3N1r9Dsv7P9f/B/6ek\nf4JToyVJbN26lTfeeIN169bR1dVFTk4Or776Ko899thwlyZJkjTkDMKS9F+ysrJobm4e7jL+cTk5\nOcFGLpIkSf92To2WJEmSJCUVX58kSZIkSUoqBmFJkiRJUlIxCEuSJEmSkoqbZUmSNAyee+45qqur\nBx1LT08nMzOTGTNmUF5eTlZW1t8au729nezs7KEo829LhBokSfotBmFJkoZROBwOvnd1dXHmzBk+\n/PBDamtr2bVrF5MmTfpL473wwgvE43G2b98+1KX+aXv37uW1116jqalp2GqQJOn3GIQlSRpG8+fP\n/8WxkpISSktLWbNmDTU1NaSm/vmVTPX19eTk5AxliX9ZU1MT165dG9YaJEn6Pa4RliQpwRQWFvLE\nE0/Q0tLCkSNHhrscSZL+dQzCkiQloEceeQSAo0ePAtDd3c27777Lww8/zOTJk5kyZQqLFi0aFJTz\n8/M5d+4cdXV15Ofn09jYCMCFCxd48cUXmT17NnfffTdTp06lvLyc1tbWQdfcsWNHMP706dOprKwk\nHo8PatPe3s5TTz3F1KlTueeeeygtLaWhoSE4v2LFCqqrq+nu7iY/P5933nnnutwfSZL+F06NliQp\nAWVnZzN69GhOnz4NDGyudfDgQZYvX05ubi4XLlxg9+7dPPnkk0SjUSZOnEg4HGbjxo2EQiHKysrI\nzc3l6tWrLFu2jGvXrrF06VLGjh1Lc3MzH3zwAc3NzRw+fJi0tDQikQgvv/wyCxYs4PHHHycej1NV\nVcWpU6eIRqOkpqYSj8dZvHgxo0aNYtWqVaSnpxONRikrK+O9995jzpw5lJeX09fXx4kTJ3jllVfI\nz88f5jspSdIvGYQlSUpQN910E52dnVy8eJFYLMbq1aupqKgIzk+ZMoWysjIaGhqYOHEi8+fP5623\n3iIzMzNYexyLxWhvb2fnzp3ce++9Qd8xY8awdetW2tramDRpEtFolLy8PDZu3Bi0GTduHDt27OD8\n+fOMHz+eN998ExjYDCsjIwOAZcuWsWLFCjZs2MD9999PUVERNTU1fP7557+6/lmSpETg1GhJkhLU\njz/+SEpKCqFQiKamJlauXBmc6+3tpbu7GxjYbfq3PPTQQzQ0NAwKwT/88AMpKSmD+t522220trby\n/vvvc/78eWBg065IJML48ePp6+vjk08+Ydq0aQB0dHTQ0dHB999/zwMPPMDZs2dpaWkZ2hsgSdJ1\n4hNhSZISUG9vL999912wA3R6ejqRSIS6ujq+/vprvv3222Bn5v7+/j8cb8uWLRw/fpy2tjbOnTtH\nb28vAH19fQBUVFTw2WefsXnzZjZv3sydd97J3LlzKSkpIRQKcenSJS5fvsy+ffvYt2/fr14jHo+T\nl5c3FD9fkqTryiAsSVICamlpoaenh4KCAq5evcqSJUs4c+YM06ZNY/bs2RQWFpKVlUVJScnvjtPa\n2srSpUvp7+9nxowZLFiwgLvuuov29nZeeumloN24ceOoqamhvr6ejz/+mKNHj/L2229TVVXFnj17\nGDNmDADz5s1j4cKFv3qtgoKCobsBkiRdRwZhSZIS0IEDBwCYM2cO+/fv59SpU2zatIl58+YFbY4f\nP/6H42zfvp0rV65QW1vLhAkTguPbtm0b1O6rr74CYNasWcyaNSuoYc2aNXz00UesXr2aUaNGBYH6\n533j8TgjR478ez9WkqR/mGuEJUlKMC0tLVRVVVFQUEBRURGdnZ0A5ObmBm36+/vZuXMnMLCW+D9S\nU1MHTZW+dOkSN9xwA7feemtw7PLly1RXVw/qW1lZydq1a4Mp0wCTJ08GIC0tjREjRjBz5kwOHTpE\nW1tb0Kanp4d169bx9NNPB+uOf16DJEmJxifCkiQNo0gkEnzv6uqiubmZSCTCyJEj2bRpEykpKUyf\nPp0RI0ZQWVnJkiVLANi/fz8nTpwgNTWVK1euBGNkZGTw5Zdfsnv37uDp7pEjR6ioqGDu3Ll0dHSw\nd+9eLl68CBD0XblyJc8++yxlZWUUFxfT3d0dTIl+9NFHAXjmmWdobGyktLSU5cuXc8sttxCNRjl5\n8iTPP/98MH06IyODnp4etmzZwsyZM4NALUlSokhbv379+uEuQpKkZHP48GFOnz7NoUOHgk99fT2d\nnZ0UFxfz+uuvc/vttwMwduxY8vLyOHbsGLFYjC+++IIJEyYQDoc5efIk8XicRYsWARAKhairq6O2\ntpbCwkIWLlxIWloadXV1HDhwgG+++Yb77ruPcDjMrl27CIVCFBUVUVBQQHZ2No2NjcRiMY4dO0Ze\nXh7hcJg77rgDgJtvvpkHH3yQs2fPEovF+PTTT7nxxhtZu3ZtcH0YeAdyU1MTtbW1wMD0bkmSEklK\nv3OXJEmSJElJxDXCkiRJkqSkYhCWJEmSJCUVg7AkSZIkKakYhCVJkiRJScUgLEmSJElKKgZhSZIk\nSVJSMQhLkiRJkpKKQViSJEmSlFQMwpIkSZKkpPITOPOydz7RVm0AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot = sns.barplot(x='dataset', y='accuracy', hue='classifier', data=performance, errwidth=1, capsize=0.02)\n", "plot.hlines(1, -0.5, 4.5, linestyle='--', linewidth=1)\n", "plot.legend(loc='upper center', bbox_to_anchor=(0.5, 1.2), ncol=3)\n", "plot.set_xlabel('Dataset')\n", "plot.set_ylabel('Relative Accuracy (over 1.0 is better)')\n", "plot.figure.set_size_inches(16, 9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Results**: The chart above shows that, with *all* the 5 datasets, *all* other classifiers yield the same level of accuracy as that of Decision Tree classifiers (1.0) or worse, with the *only exception* of the performance of Random Forest classifiers on the `CollabMap/Routes` and `CollabMap/Routesets` datasets. Having said that, the improvement in accuracy is only about 1% as shown below.\n", "\n", "Some algorithms have better mean accuracy on the `RRG/k=11` dataset, but the 95% confidence intervals are too broad for us to say conclusively that they are actually better than the decision tree classifier." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "accuracy 1.006878\n", "time 1.944126\n", "dtype: float64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "performance[\n", " (performance.classifier == 'RandomForestClassifier') & (performance.dataset == 'CollabMap/Routes')\n", "].mean()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "accuracy 1.008296\n", "time 1.817231\n", "dtype: float64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "performance[\n", " (performance.classifier == 'RandomForestClassifier') & (performance.dataset == 'CollabMap/Routesets')\n", "].mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparing Computing Time" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nEzQ1NZk7dy7jx4/nm2++YejQodSpU4e0tDQiIyMpKCiQG1v98jGIiIggLi6O5s2b8/vvv7Ns2TIU\nFBSkY2BiYoKPjw+BgYF07NiR27dvs27dOrp161au9DehrKyMp6enVF4zMzNu3brFjz/+SKNGjUpM\nCCQIr+Po6Mj58+eZPHkyqampdOnSha+//pr//e9/BAQEoKioKM3YbGlpyZo1a5g5cyY9e/bk+PHj\ncq3N1atXp06dOsTGxlK9enWUlJRITEyUZrR+8uQJ1apVY+zYsUybNo3q1atjbm7Ozp07uXDhQplB\nbXnqI1kddPDgQSpVqkSTJk3k8hg+fDibN2/Gzc0NFxcXHj9+zOLFi+nevTuNGzfm7t27QPGke7Jx\n1Y8ePeLMmTNER0djYGDAiBEjSi1fWdf5wIEDiYmJYdSoUXh6eqKkpERwcDAGBgZ06NCBrVu3lvt7\n+5B0dHSoXLkyy5cvp7CwkKdPn/LTTz9x6dIlqSvzy6/lfJUqVapw8eJFUlJSaNOmDbt376ZXr16l\nftc9evRg3rx5rF+/HiMjozLzbtmyJUpKSixatIhvv/2WzMxMoqOjycjIKPFavpf179+fCRMmYGJi\nIjc2+03q6qZNm1K5cmV8fHwYM2YMmpqaJCYmoqCggLW1ddkH5wsgAuMvzMlFwz52Ed6as7MzDRs2\nJC4ujjlz5pCTk0PVqlUxNzdn7ty5JVpO7O3tCQgIoFatWpiYmJSa59ChQ2ncuDGxsbEEBASQnZ1N\nnTp1GDRoEK6urtJM14LwubA6VHYrxqdmy5YtGBkZlTqLJhR3I1u9ejUbNmwgLi5OChi1tbWZOXMm\n33//vbSur68vT58+lV7R0aRJE0JDQ5k3bx6nT5+mf//+0rojR46U/q+iokLdunUZNWqU3CtTJk2a\nRNWqVYmPjycyMpK6devi4+MjvXsUYPHixQQHBxMTE0NWVhY6OjosWrRIeqrfuHFjVqxYwdKlS6Un\n++3bt5ebNXrUqFH4+/vj6urK7t270dbWpmvXrvz0009ERUURHBzMgwcPqFWrFp06deL7778vdcwg\ngJubG/fu3SM0NJRnz57RqFEjpk+fzrZt2zh9+jRQ/OAwNzeXtWvXEhMTg4aGBra2tlJAUVb6mxo6\ndCgVKlQgJiaG6OhotLS0sLOzw8vLq9w3rML703LKq1939KlTUFAgICCATp06sW7dOiZNmkReXh4N\n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\nYKR169bSMYL/e7DxNq+FUlNTIzo6Gijusn3jxg2uXLlCWlqaNJ9E06ZN0dLSwt3dHXt7e6ysrDAz\nM8PU1LRc6W8qJSWFtm3bUqVKFekcqV27Nk2aNOHYsWNSQFGtWjURTLwnqqqqBAQEMG7cOPbv38/R\no0dJTU0lLCyMjRs38tNPP72yTnF1deXIkSNyy44dO/bG423FeSwI/01ijLHw2dDR0WHVqlV06NCB\n0aNHs2vXrhLjA19kbW1Njx49WLp0aYkxfbJxdd7e3ujp6Un/Bg0aBBSPQ3xZZmZmiR/Pr776qsR6\nampqck9rZf9/MSB9+XMKCgpoaWmRk5MjTThVvXp1uXU0NDRQVVWVG//78jqymTAzMzOZN28eXbt2\nxdHRkf/9739AcZCelZX1yplmnz9/Ljem6GVhYWGYmZlhb2/PvHnz+Ouvv1BWVpZuDoyNjVm+fDk1\natRg5cqVODg40LVrVw4fPlyu9DeRnZ1NYWEhP/74o9x3aGZmBsh/hy8fJ+HTUq1aNSpVqlSiR4CF\nhQUbNmyQ/r2oUqVKJXo+rF+/nk6dOmFra8vUqVP5/fffUVNTk87P7OxsuRloZWrUqFFqud7kHJP1\nypApq1eLjK6uLvr6+ujr62NmZoa3tzcODg6sWbOGe/fuSfXBy3WG7JzOzc3l4cOHKCsrl+iGLvtM\nbm4u9evXJyYmhhYtWhAXF8ewYcOwtLR8bR1amgoVKsj9raioKO1nVlZWqQHGi2WXPaSQBfOlkbXG\nlWbfvn107dqVLl26MHHiRJKTk6lQoYJUBnV1deLi4jAzM2Pz5s1Sd9OIiIhypb+prKwsDh8+LHd+\n6Onp8eeff4o66APT1tbG0dGR0NBQjh49yrx588jMzCQ0NPSV59m0adOk+mTMmDFvtL07d+5Qq1Yt\nQJzHgvBfJVqMhc+GmZmZdNM1atQo9u3bx+zZszE2NpZrkXjR1KlTOXr0KP7+/nIzVMvGJk+fPl2u\ndVemtPxq1apVImh8XRD5OrKbXZnCwkIp8Jbd3L48GVd2djbPnz9/7WQhSkpKODs74+zszN9//83e\nvXsJCQlh1qxZ0mRfcXFxHD16lK5du5b4/L59+/Dy8mL16tUlnjwnJiYSHByMv78/vXr1ko6hLEiQ\nsbGxwcbGhpycHA4dOkRYWBheXl4cPXoUVVXV16a/icqVKwMwevToUt/5+uI4TuHTZ2VlRXJyMk+e\n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\nv2bMmKGbN2/qjTfesJTaTZs2adiwYWrcuLFmzZqlsmXLavLkyZnyrFixQv3791dISIhmzpyprl27\nasGCBVmmd3322WdKS0vTzJkz1apVK82aNUsdOnRQqVKlNHv2bD3xxBMaNWqU5c03Q3p6eqbnm5qa\nmumP3GHDhmn27Nnq1KmT5syZYznXOiYmJtP9zJ49W2+//bZGjhypkJAQ7dq1S6+99prKli2rmTNn\nKiIiQgsXLtTYsWMtjxsZGam0tDRNmTJFU6ZMUWJiovr06aO0tDT17dtXoaGh8vf314oVK1S1alXt\n2HHr3HFr5z4HBgZq6NCh8vPzyzKWnp6uXr16KT4+Xu+//77mz5+vtm3basmSJVqxYoWkW2/e/fv3\nV82aNTVv3jwNGzZM27Zt04cffmho/HYdO3bUqFGjJN06z/j999/Pss+xY8fUtWtXmUwmTZ06VW+/\n/bY2btyoQYMGZdpvzZo1Kl++vGbPnq22bdtm+9xhzPfff68GDRqoWLFi2Y4//vjjmj59unx9fQ3/\nnOfko48+0u7du/Xee+9p3rx5evzxx/XGG2/o+PHjhsZvZ+R1nOHdd99VtWrV9Nlnn+mpp57S1KlT\n9cMPP2Tax9PTU6NGjdL+/fu1fPnyHJ9Lxu+IlJQUXbx4UVOnTlVycjKvSzyUWrRooe+++y7Tts2b\nN6tatWoqXbq0zR7n999/V9myZSXdOmc5LS3N6sw0X19fjRgxQk888US244MHD9bWrVs1ePBgRUVF\n6dVXX9U333yj2bNnS7o19bl3797y9fXV7NmzNWbMGMXHx+utt94yNH67Zs2aWdYeeOutt7KsQyBJ\nFy5cUJcuXXT69GlNmDBBo0eP1oEDBxQREZHlQ+n09HTNmTNH3bt3z8V3Dyh4mEqNAuOHH35Q1apV\nM21zd3e3HB0sUqSIjh49qmeeeSZT2SlTpozatWungwcP6qmnnpIkXb16VYsWLbJMo80ofEeOHFFQ\nUJDmzZunJk2aaOTIkZKkJk2a6MyZM9q2bZtl/6lTp+q5556zPFbjxo3l5eWl999/X7169VLlypUl\nSaVLl9a4ceNkMplUo0YNrVixQr6+vpbzmR599FE988wzio+Pz3S0tVGjrAulZSya8d///lcbNmzQ\n6NGj9fLLL1se/8qVK5o8ebJefPFFy79p06aNWrdubbk9depUVatWTVOmTJF0q8x6e3vr3XffVURE\nhAoVKqSEhAQNGDBATZo0kST5+fnpm2++0bVr11SuXDn5+Pjo9OnTlmlbZ8+etTyX3Dp37py8vb31\n3nvvWb5nDRo00I8//qh///vfeuWVV/Tzzz8rOTlZvXv31iOPPCLp1kyBjE/Kcxq/XenSpS1TU594\n4glVrFhRf/75Z6Z9Zs+erZIlS2revHmWabsBAQEKDw/Xv//9b9WpU8fyGMOHD5eTE58x3o+//vpL\nf//9d5apyWazOdNMBunWontGf85zEhcXp0aNGqlVq1aSbp1nWLJkScsHZDmN387I6zhDq1atNHDg\nQElSvXr1tHnzZm3fvj3LH9zPPPOMnnnmGU2aNElhYWFW/+C/du1alt+N0q0Pzzi/GA+jli1bKioq\nSsePH7esu/HPf/7T8rOaWxkfvGd8ff78eX3xxReKj4+3LIaZ8T53L+fo3rx5UykpKfrggw8sHyDX\nq1dP+/fvtyz8dfz4cSUlJemVV16xzHYpXry4du/erfT09BzHb38f8vHxsRzVfuyxx7JMOZekxYsX\n6+bNm1qwYIFlinVISIieffZZbdy4US+88IKkWx+6ffDBB/L29s718wYKGooxCoxatWpZ3qCOHj2q\nTz75RA0aNNCECRMs5aV9+/Zq3769rl27puPHjyshIUG7d++WpEyfgLq4uCgoKMhyO+MPzuvXr+v6\n9es6fPiwhg8fnunxn332WUsxPnHihC5dupRlylZGUf7pp58sfxwHBwdbpoa6u7urSJEimR474wjZ\n7dOppFurz955Pm7GEdeMKdF3Pn7r1q21YcMGHT9+XB4eHpKk8uXLW8avX7+uQ4cO6c0338z0x33T\npk2Vnp6uPXv2qF27dgoICNDIkSO1c+dOhYaGqnHjxtl+Kp3B2dlZ0q2jZrnl5+en6OhopaenKyEh\nQQkJCTpy5IguXrxo+QMkJCREbm5u6tixo1q3bq1mzZqpefPmlsfNaTy39uzZo7CwMDk5OVm+T9Wr\nV5enp6d27dplKcblypWjFNvAneU3w8aNG7O87jI+HDLyc56T2rVra+XKlfrf//6np556Ss2aNcs0\n4yOn8dsZeR1nuP08QCcnJz3yyCNWF/EaOXKkWrdurdGjR2c75Vq69Xtl6dKlkm79Uf/XX3/pu+++\n0yeffCIXFxd169bN8PcEKAiCg4Pl5+enb7/9VpGRkTpz5owOHTqkqVOnateuXbm+P2sfvPfo0cNy\nfnHG+8m9ntqwYMECSbdOqUhISNDRo0d1/Phxy6KhFStWVLFixfT666/rueeeU2hoqBo0aKC6desa\nGs+tPXv2qHr16ipatKjlfc7Pz0+PP/64du3aZSnGPj4+lGI4DIoxCgwvLy8FBwdL+r83xZ49e8rN\nzU0TJkyQdOvIyahRo7Rp0yZJt0phRkG9/c3Mzc0tU6HJ+Do9Pd2yYEXx4sUzPX7JkiUtX2cs3lSi\nRIksGd3c3HTlyhXLtjvPgZakwoUL5/h8K1WqZHWhjL/++ksuLi5Zpp1mZLxy5YqlGN+e8fLly0pP\nT9ekSZM0adKkLPd7/vx5OTk5adGiRZoxY4ZiY2O1evVqubu76+WXX9awYcOyLYIZf/ifPn3a6qrZ\nZ8+etXrEKyYmRlOnTtWFCxdUqlQpVatWLdP5kf7+/lq0aJHmzZunpUuXasGCBSpZsqSGDBmiF154\nIcfx3EpKStKKFSuyTIHN+B5luPP/P+6Nj4+PPDw8dObMmUzbGzdurFWr/u/yTx063LoUldGf85yM\nGDFCjzzyiNatW6dt27bJyclJoaGhGjdunHx8fHIcv1NOr+MM7u7umW47OTlZze3r66vBgwdr9OjR\nlud7JycnJ8vvxgxNmjTRqVOnNG3aNIWHh9/zh0TAg8hkMlmmU0dGRmrz5s0KCQnJ9nQdI27/4N1k\nMsnDw0P+/v5ydXW17HP7+5y1BfHu9j4XGxur8ePH6+TJkypevLiCgoLk7u5u+UDZ09NTS5cu1axZ\ns7R27VotW7ZMRYsWVe/evfXaa6/lOJ5bSUlJOnjwYLazTUqVKmX5mvc5OBKKMQqsBg0aqEOHDoqJ\niVHLli3VvHlzjRkzRjt27NC8efNUp04dubm56dixY5kWpcqJt7e3TCaTLl68mGn77Qs9ZRTSO/e5\nfPmykpOTrZ4naSve3t5KTU1VUlJSpse6cOFCpnx3yijpkZGRCgsLyzKeMQ3Zz89P48aNU3p6ug4c\nOKCYmBgtWrRI1apVyzQtO0PDhg0l3VoQKbtifOjQIXXs2FGffPJJlqK6d+9ejRw5Un379lXXrl0t\nhSOjBGWoVauW5s6dq+vXr2vXrl2aP3++hg8frgYNGsjX1/eu47nl6empsLAwde7cOcvYnR+YwDZC\nQ0O1Y8cOXb9+3fLBkbe3d5bCJ8nQz7nJZMoyg+Hq1auZbru7u2vgwIEaOHCgTpw4oc2bN2v27Nma\nNm2aRo8eneP47Yy+ju9F586dtX79en300Ufq1KmT4X9XqVIl/etf/9KlS5cy/aELPAxatGihxYsX\n688//9TmzZvveRq1lPmDd2vq1asnFxcX/fjjj9mup3H+/Hk1b95c/fr1U79+/TKNJSQk6I033lC7\ndu20dOlSS3m+c82CJ554wrI+QFxcnBYvXqxPP/1UdevWVbVq1XIczw1PT081bdrUclrH7bL7QB9w\nBMwBRIH21ltvycvLSx9//LGSk5N14MABNWnSRI0aNbJMr/7xxx8lGT+S5O7ururVq2vLli2Ztt++\nOE758uVVvHjxTKsYS7emfkq3zkW0p1q1aklSto9fokQJq9fj9fT0VOXKlXXy5EkFBwdb/nN1ddXk\nyZN19uxZHTlyRI0bN9Yvv/wiJycn1axZU2PHjpWLi4tlgbA7jxpXrlxZ9erV0/z583Xu3LlMY+np\n6Zo2bZo8PDyyLeMHDhyQyWRSZGSkpUycO3dOv/76q+X/WUxMjJo3b66UlBQVLlxYzZs316BBg5SW\nlqZz587lOH4v398TJ04oKCjI8j3y8/PTpEmTdPTo0VzfH3L22muv6fr16/rwww+znVp97Ngxy9dG\nfs49PT1148aNTKcoxMXFWb5OS0vT888/r0WLFkmSKlSooMjISFWvXl1nzpzJcfxORl7H98pkMmnM\nmDFKSkqyXK/YiP/85z/y8vLiwxw8lGrWrKlSpUrpyy+/1MGDB+1+jfNixYrpH//4h1auXKlff/01\ny/jUqVNlNpv13HPPZRmLj49XSkqKevfubSnF165dU1xcnOX3w/bt29WgQQNdunRJbm5uatCggWWd\nk9OnT+c4nlsZ73OVKlWyvM89+eSTmjlzZqbflYAj4YgxCjQfHx/16dNHn376qaKjoxUcHKytW7dq\n7dq18vPz0+7duy2XJrB2CYXsDBgwQL169dK7776r1q1ba/fu3ZmKsrOzs/r3768xY8bI29tbYWFh\n+u9//6sZM2aoZcuWevLJJ23+XG9XuXJlPfvss/r444919epVVapUSbGxsdqwYYNGjRp11/NeBw4c\nqH79+snT01PPPPOMEhMTNXXqVDk5OenJJ5+Uq6urihQpomHDhql///7y9vbWV199JZPJpGbNmkm6\ndc3Hs2fPaseOHQoKCpK3t7c+/PBDvfLKK+rQoYN69uypwMBAXbx4UcuWLdPBgwc1Y8YMeXl5ZckT\n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\nx8m4WrdurZJ7GV++fBkzZszIU75nzx54e3vju+++g4mJCTZv3gw3Nzfs3btXKo4ePXqgR48e3xzH\njRs3vnkd9PXU/fVX9/0vSQr7vSzM7Rf2vpNyqfP7WdL2vaTtT36o874D3H8qGQrkOBby6d27d8Lz\n58+FZ8+eiX9PnjwR7t69K2zdujVf60pPTxdCQ0MFIyMjoU2bNoKZmZm4LDs7W+jUqZOwYMECsSwj\nI0Owt7cXfH198xv2F128eFEAIP7t3LlT2Llzp1SZp6enEB8fL+jq6oplhoaGQnx8vDBgwACpusbj\nVgmN+kyRKqvfZZRgPn2TVFnFRmaC+fRNQsVGZlLliQuNBf+etaXKwofWF85PM5AqG2JRRUhcaCwY\n65URy7Qqagk2q22Eut3rStVtOb2l0HJ6S6myut3rCjarbQStilpiWTMdHSGmQ0fBuVYtqbo/W1oJ\nSwyNpMqmNWkqxHToKL3vjdoIa7z2CcaN2kiVr/HaJwzu7ClVNrbXPGHx2A1SZQMGDBDi4+MFQ0ND\nsUxXV1eIj48XPD2ln/+t71NMTIwQHBwsVebs7Cx4e3tLlTVr1kzw9vYWmjVrJlXu7e0tODs7S5XN\nnNlUWPujqVSZg4OusH1HG6Fhw3JiWZUqWsL2HW2E/v1rq3yffHx8hPj4eKkyOzs7IT4+XrCzs5Mq\nj4+PF3x8fKTKGvWZIhiPWyVVVq2lrWA+fZNQtmaDf4+98pUF8+mbhFrWvaXqHvBoLBzwaCxVNsVO\nV0hcaCzUqFDq32NHr4yQuNBYqGlTU6pua9/WQnP35tIxDWok2Ky2kSqrYlRFsFltI1hXrSr9mnTo\nKExr0lSqbImhkfCzpZX0e1+rlhDToaNQr8a/sVYsX1VY47VP6NF2sFTdGcNWCDOGrZAq69F2sLDG\na59y3yeDtkL84mjBzqCtYGlpKdjb24t/zp0dpeoGu/gKMTO3K/Xz1L9/bWH7jjZClSr/fkc0bFhO\n2L6jjeDgoCtVd+2Ppko/9oKDg4WYmJiv3qfmLj5Ccxfpdday7i2YT98kaJWvLJaVrdlAMJ++SajW\n0laq7vlpBkL40PpSZf49awuJC42lP+PNKgiJC40Fh2YVpMptVtsIjQY1ko7JvbnQ2re1VFlNm5qC\nzWoboXzd8v9+nipqCTEdOgoj60tvP8SslRBi1kqqbGT9+kJMh45CNW1tsayZjo6wxmufYGPSVaru\n4rEbhLG95kmVDe7sKazx2idVZtyoTYG9T6r43nMf20DYvkP6d8jcvJKwfUcbwdy8klT59h1tBPex\nDYr8PuXnPMJ8+iahfpdRSt0nRc8jytctL9istsnzXa7oeYR11apCTIeOeb7LFT2PsDHpKqzx2if1\nXV6Q75Mqvvfycx7hv9RQ8F9qWOT3KT/nEbK+yz93HjHEoopUXVnf5Z87j6hiJP18Wd/lnzuPaKaj\n8+9+amvL/C7/3HlExfL/Hvv1ajSW+V0+s4+j4GJrLVXWy7KVsHhYP6kygzq1hMXD+gkGdaTP6+MX\nRws+vaZKv0+yziNaOwnxi6MFPT09sUxHR0fw9vYWbG2lfzPd3d0Fd3d3qTJbW1vB29tb4fOImTOl\nz9dkfZd/y7F38eJFufmgRBAEAQpITk6Gl5cXLl++/Nl6+cnmjx8/jjlz5mDixIl4+fIlNmzYIA6l\nTkhIQLdu3RAaGgpbW1vxOb6+voiNjcWRI0cU3o4iLl26pJQLx+VOQ6+gPRV++KbnD/nG2zUt2fnZ\nQQRf9Geb6V/93AnLe37Ttr+VIjcu/xxDo4Pf9PyBA85/0/OVrTCP5eJ8HAPffiwrMpT6c751KPWO\nnZZf/Vwex9LU/VguTN9yHAMl71i+9MOIb3p+uzV5L6VTFI/jb1OSjmV+J3/bsfwqedM3Pb9vC8+v\nfu72zN++adtF5Tz5czmfwrdrCggIwO+//w5HR0f06tULgiBg7NixGDBgACpXrozSpUtj69at+QrM\nxMQE0dHRGDFiRJ5bLOXc5LtBgwZS5fXq1cP9+/eRlZWVr20RERERERERyaJwYhwXF4c+ffpg+fLl\nmDt3LiQSCdq3b49FixYhKioKOjo6+e7FrVmzJipWlN1y8+bNGwBA+fLlpcrLly+P7OxsvHv3Ll/b\nIiIiIiIiIpJF4cT49evXMDMzAwBUqFABenp6+OOPPwB8THAHDBiAX3/9VWmB5Yzw/rQnOYe8ciIi\nIiIiIqL8UDgxrly5Mt6+fSs+btiwIW7fvi0+rl27NpKTk5UWWIUKFQBAaps5jzU1NfP0JBMRERER\nERF9DYUTYysrK2zfvh1JSUkAAENDQ5w5c0Yc8nzhwgVUqlRJaYHlXFv84MEDqfIHDx5AX19fadsh\nIiIiIiIi9aZwYjxhwgQ8f/4cXbp0QWpqKoYOHYpXr16he/fu6Nu3L/bv34/u3bsrLTB9fX3o6enh\n+PHjYllmZiZiYmJgbW2ttO0QERERERGRelN4zvGGDRvil19+QVRUFKpUqQIACA0NRVBQEF69egU3\nNzdMmjRJaYFJJBK4u7vD19cXlSpVgrm5OSIjI5GamopRo0YpbTtERERERESk3vJ1My5dXV24u7uL\nj62srGBlZaX0oHIMGzYM6enpiIiIwMaNG9GiRQuEh4ejXr16KtsmERERERERqRe5iXHOjNP51bJl\ny6963sSJEzFx4sQ85a6urnB1df2qdRIRERERERF9idzEeODAgfm6JZIgCJBIJLhx44ZSAiMiIiIi\nIiIqCHITY39//4KMg4iIiIiIiKhQyE2M+/TpU5BxEBERERERERWKfE2+lZ2djb179yImJgZPnjzB\n3LlzUbZsWRw/fhzDhg1DxYoVVRUnERERERERkUoonBinpaXB3d0dly5dQqVKlfD69Wu8ffsWjx8/\nRmBgIPbu3YuIiAjUqFFDlfESERVbbm5uSEhIEB/r6+sjPDy88AIiIrVxf5GJzPJ5F6riUdrH08E6\n5T5gcZsXsldQhZ0fRFSyKZwYBwYG4o8//kBISAhMTExgY2MDAOjevTvWrFmDmTNnIjAwEH5+fioL\nloioOPBz6S+zPCXllfTjh/dl1u3bwlMlcRERERGRbAonxocOHcKwYcNga2uL1NRUqWVdunSBi4sL\n9u3bp/QAiYhKCivdSoUdAhGRFLk9xEREakZD0Yqpqalo2LCh3OV6enp5EmYiIiIiIiKiok7hxFhf\nXx+XL1+Wu/zkyZOoX7++UoIiIiIiIiIiKigKJ8ZDhw7Fvn378OOPPyI5ORnAx1mqExIS8P333+O3\n337DwIEDVRYoERERERERkSoofI3xkCFDkJSUhMDAQAQGBgIAxowZAwAQBAGDBg3CiBEjVBMlERER\nERERkYrk6z7GXl5e6NevH6Kjo/HgwQNkZWWhdu3asLOzQ/PmzVUVIxEREREREZHK5CsxBoAGDRrA\n1dVV5rI//vgDLVu2/OagiIiIiIiIiArKFxPjP//8E1evXoUgCGjRogVat26dp05aWhqWL1+Obdu2\n4fr16yoJlIiIiIiIiEgV5CbGb968wZQpU3D69GkIggAAkEgksLGxwf/+9z+ULl0aABATE4OFCxci\nKSkJDRo0KJioiYiIiIiIiJRE7qzUgYGBiI2NRceOHbFixQr8+OOPGDJkCM6ePYuAgAAAgL+/P8aP\nH4+UlBR4eHhg//79BRY4ERERERERkTLI7TH+9ddfYW1tjZCQELHMzs4Ourq62LhxI3R0dLBp0ya0\nbNkSfn5+aNq0aYEETERERERERKRMcnuMnz17Bnt7+zzl3bp1w6tXr7Bu3TqMGTMGW7duZVJMRERE\nRERExZbcHuP379+jcuXKecpzypydnTF9+nTVRUZERETF1g2/E3KX+Z0LRdLbFACAXnldzLUam6dO\ni7l5G+eJiIhURW6PsTwSiQQA4OjoqPRgiIiIiIiIiApavu9jnCNnVmoiIioe3NzckJCQAADQ19dH\neHh44QZEaktWDzEREVFh+myPcU7vcH6XERFR0RMeHo7o6GjxfyIiIiL66LM9xjNmzMCMGTNkLhs9\nenSeMolEgvj4eOVERkRERERERFQA5CbGffr0Kcg4iIhISXx8fL6pjqGR8mIhIiIiKg7kJsb+/v4F\nGQcRERERERFRocj3rNRERFQ8Xbp0CadOnRL/JyIiIqKPvnpWaiIiKl4sLCwKOwQiIiKiIok9xkRE\nRERERKTWmBgTERERERGRWmNiTERERERERGqNiTERERERERGpNSbGREREREREpNY4KzURERHli5ub\nGxISEgAA+vr6CA8PL9yAiIiIvhETYyIiIpLJz6W/zPJGABIA2OtVAdJfyazXt4WnSmMjIiJSJg6l\nJiIionw5l/IKAHAiKVX8n4iIqDhjjzERERHli5VupcIOgYiISKnYY0xERERERERqjYkxERERERER\nqTUmxkRERERERKTWmBgTERERERGRWmNiTERERERERGqNiTERERERERGpNd6uiYiIiIhIjht+J2SW\nT/l1KT4IWeLjUhJNrOo0O0+9FnPtVRYbESkPE2MiIiIionySlQQTUfHFodRERERERESk1pgYExER\nERERkVpjYkxERERERERqjYkxERERERERqTVOvkVERETFhpubGxISEsTH+vr6CA8PL7yAiIioRGBi\nTERERMVGThLs4OCA6OjoQo6GiIhKCibGREREVOT4+Ph8Ux1DI+XFQkREJR8TYyIiIio2Ll26hLS0\nNADAqVOnUK5cOVhYWBRyVEREVNwxMSYiIqJig0kwERGpAmelJiIiIiIiIrXGHmMiIiIiUjuc4ZyI\ncmNiTEREREQllp9Lf5nlKSmvpB8/vC+zbt8WniqJi4iKFibGRERERKR2rHQrFXYIRFSE8BpjIiIi\n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\neXzmHJ8VKlSARCLB9u3bZa5DXmN/5cqVMXfuXMTGxiIqKgrDhw/Hvn37ZJ6PkTQvLy9UqFABS5cu\n/ewtjOrXrw9XV1dcu3YNu3fvFsvd3d3x7t07LFq0SObQ6k8brOSdQ1SrVg2lS5fG999/j/Pnz2PP\nnj0APo5myDm3lfX3pXkFSD4mxiRX1apVMXz4cISHh2PVqlU4ffo0Vq1aJU58ValSJbGus7Mzrl+/\njuvXr6Nnz55ieeXKlTF16lQcOHAAbm5uOHDgAC5evIiDBw9i9OjRSE5Oxvjx4wH8+wNy5swZ3Lx5\nM1/b/5SnpyeuXbuGyZMn4+TJk+K1Tjdv3hSvv6HP69WrF3r06IEFCxZg/vz5iImJwcmTJ+Hn54e5\nc+eiR48e6NevH0aNGgUtLS24urriyJEjOHLkCFxdXaGtrY2RI0d+cTsmJiZISkpCUFAQzp8/j61b\nt8LDwwMSiQTv37+XqhsSEoKffvoJJ0+ehIeHB969eyc1uUtuNjY2KF++PDZt2pTnOvXc287OzsaS\nJUtw7tw5REVFYcSIEcjIyMhza6+dO3di9erVOHXqFKZNm4Zbt27hu+++AyD/R+39+/e4cuWK+Hfm\nzBlMmTIFiYmJGD16NICPJ2SmpqZYv349jhw5guPHj8PDw0PhybnatWuHNm3aYMaMGYiKihLv4fzp\nZRL5UaFCBYwcORIhISEIDQ3FqVOnMH36dFy/fl08OWzSpAnKly+PWbNm4fDhw4iLi8P3338PiUQC\nOzu7r952QWLjj2oaf/7zn//A3NwckZGRuHfvHoCPJ/537tyRGiGUkZGB48ePi6+hrEaiixcvSq37\n0wZUU1NTaGlp4fnz51Inhrdv30ZwcDCAj59de3t7ZGZmomzZsrC3t8eUKVOQlZVVZBNjgMcnj8+P\nx6eFhQUEQcCbN2+k1hEXF4eNGzeKDRi5L1958eIF7OzsxLsztGjRArNmzULt2rU/OwqBPqpatSo8\nPDyQmJgo9tLK4+7ujmrVqmHVqlXi6AIjIyMsXrwYv/zyCwYNGoTt27fj3LlzOHbsGL7//nv07t0b\nenp6aNOmDZ4/f46//vpL6jrlTzk4OMDW1hbLli0r8rPpF3ccSk2fNWPGDFSpUgXbt29HWFgY6tSp\ng1mzZom3JMjRtGlTNGvWDBkZGXkSz1GjRqFBgwaIjIzE4sWL8c8//4izVvv5+YktvDo6OnB3d0dk\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot = sns.barplot(x='dataset', y='time', hue='classifier', data=performance, errwidth=1, capsize=0.02)\n", "plot.figure.set_size_inches(16, 9)\n", "plot.hlines(1, -0.5, 4.5, linestyle='--', linewidth=1)\n", "plot.legend(loc='upper center', bbox_to_anchor=(0.5, 1.2), ncol=3)\n", "plot.set_xlabel('Dataset')\n", "plot.set_ylabel('Relative Computing Time (over 1.0 is slower)')\n", "plot.set_yscale('log')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Results**: The algorithms that are faster than decision tree classification in some cases (GaussianNB, QuadraticDiscriminantAnalysis, and SGDCClassifier) are those that performed significantly worse in our previous chart (across 5 datasets). The slightly more accurate algorithm (RandomForestClassifier) takes nearly double the time compared to the decision tree classifier.\n", "\n", "**Conclusion**: From the available classification algorithms provided by the scikit-learn package, DecisionTreeClassifier is the best choice for our work as it is fast and provides high accuracy on the datasets that we investigate." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }