\n",
+ " Whenever you see these signs below, understand that you need to do more:\n",
+ " \n",
+ " ## ??\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {
+ "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
+ "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
+ },
+ "source": [
+ "# This Python 3 environment comes with many helpful analytics libraries installed\n",
+ "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
+ "# For example, here's several helpful packages to load in \n",
+ "\n",
+ "import numpy as np # linear algebra\n",
+ "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
+ "\n",
+ "# Input data files are available in the \"../input/\" directory.\n",
+ "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n",
+ "\n",
+ "import os\n",
+ "for dirname, _, filenames in os.walk('/kaggle/input'):\n",
+ " for filename in filenames:\n",
+ " print(os.path.join(dirname, filename))\n",
+ "\n",
+ "# Any results you write to the current directory are saved as output."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Importing Libraries\n",
+ "\n",
+ "
\n",
+ "\n",
+ "## ?? Your importing is causing errors:\n",
+ "\n",
+ "You import pandas without pd, but later you use the alias pd. Why?\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
+ "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
+ },
+ "outputs": [],
+ "source": [
+ "###Importing libraries\n",
+ "import pandas\n",
+ "import scipy\n",
+ "import numpy\n",
+ "import matplotlib\n",
+ "import sklearn\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading some libraries\n",
+ "### These are some of the libraries I think I will need\n",
+ "\n",
+ "
\n",
+ " \n",
+ " #### I think your notes below would look better in markdown, if you intend to write long sentences\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pandas import read_csv #for reading in csv files\n",
+ "from pandas.plotting import scatter_matrix #for showing how one variable is affected by another\n",
+ "from matplotlib import pyplot #for plotting graphs\n",
+ "from sklearn.model_selection import train_test_split # for splitting my data into train and test\n",
+ "from sklearn.model_selection import cross_val_score #to estimate the skill of a machine learning model on unseen data\n",
+ "from sklearn.model_selection import StratifiedKFold #he folds are selected so that the mean response value is approximately equal in all the folds. In the case of a dichotomous classification, this means that each fold contains roughly the same proportions of the two types of class labels\n",
+ "from sklearn.metrics import classification_report #Visual classification reports are used to compare classification models to select models that are “redder”, e.g. have stronger classification metrics or that are more balanced.\n",
+ "from sklearn.metrics import confusion_matrix #A confusion matrix is a table that is often used to describe the performance of a classification model (or “classifier”) on a set of test data for which the true values are known. It allows the visualization of the performance of an algorithm.\n",
+ "from sklearn.metrics import accuracy_score #It is the ratio of number of correct predictions to the total number of input samples\n",
+ "from sklearn.linear_model import LogisticRegression #an algorithm for classification\n",
+ "from sklearn.tree import DecisionTreeClassifier #create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n",
+ "from sklearn.neighbors import KNeighborsClassifier #for classification\n",
+ "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis #used for modeling differences in groups i.e. separating two or more classes\n",
+ "from sklearn.naive_bayes import GaussianNB #an algorithm that estimates the mean and the standard deviation from your training data,\n",
+ "from sklearn.svm import SVC #an algorithm that creates a line or a hyperplane which separates the data into classes\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.linear_model import SGDClassifier\n",
+ "from sklearn.neighbors import NearestCentroid\n",
+ "from sklearn.neural_network import MLPClassifier"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this suprreses unnecesary warnings from my output\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading My Dataset\n",
+ "\n",
+ "##### I am going to first use my training dataset, then the test dataset last."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "The way you are commenting in the code is fine.\n",
+ " \n",
+ " It would be better to write shorter explanation there and longer with markdown.\n",
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#visualizing using histograms\n",
+ "train.hist(figsize=(16,16))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### These histograms show that FullAcidicMolPerc is exponentially distributed while the rest are have a Gaussian distribution except for NT_EFC195 and CLASS. Histograms also help us identify outliers. From this output, I can say there are no outliers.\n",
+ "\n",
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#plotting a heatmap to show correlation of data\n",
+ "pyplot.figure(figsize=(10,10))\n",
+ "sns.heatmap(train.corr(method='pearson'))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### i did this plot in order to see which features are highly correlated as this can be a problem in soome models if some features are used together whereas they are highly correlated."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "\n",
+ "## This plot takes a lot of time to draw, is it the best way to do this?\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py\u001b[0m in \u001b[0;36mpairplot\u001b[0;34m(data, hue, hue_order, palette, vars, x_vars, y_vars, kind, diag_kind, markers, height, aspect, dropna, plot_kws, diag_kws, grid_kws, size)\u001b[0m\n\u001b[1;32m 2082\u001b[0m \u001b[0mhue_order\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhue_order\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpalette\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpalette\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2083\u001b[0m \u001b[0mdiag_sharey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdiag_sharey\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2084\u001b[0;31m height=height, aspect=aspect, dropna=dropna, **grid_kws)\n\u001b[0m\u001b[1;32m 2085\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2086\u001b[0m \u001b[0;31m# Add the markers here as PairGrid has figured out how many levels of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, hue, hue_order, palette, hue_kws, vars, x_vars, y_vars, diag_sharey, height, aspect, despine, dropna, size)\u001b[0m\n\u001b[1;32m 1304\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdespine\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1305\u001b[0m \u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdespine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfig\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1306\u001b[0;31m \u001b[0mfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtight_layout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1307\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/figure.py\u001b[0m in \u001b[0;36mtight_layout\u001b[0;34m(self, renderer, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 2473\u001b[0m kwargs = get_tight_layout_figure(\n\u001b[1;32m 2474\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubplotspec_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrenderer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2475\u001b[0;31m pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)\n\u001b[0m\u001b[1;32m 2476\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2477\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots_adjust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36mget_tight_layout_figure\u001b[0;34m(fig, axes_list, subplotspec_list, renderer, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 360\u001b[0m \u001b[0msubplot_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubplot_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[0max_bbox_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0max_bbox_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 362\u001b[0;31m pad=pad, h_pad=h_pad, w_pad=w_pad)\n\u001b[0m\u001b[1;32m 363\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 364\u001b[0m \u001b[0;31m# kwargs can be none if tight_layout fails...\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36mauto_adjust_subplotpars\u001b[0;34m(fig, renderer, nrows_ncols, num1num2_list, subplot_list, ax_bbox_list, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 109\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 111\u001b[0;31m tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots\n\u001b[0m\u001b[1;32m 112\u001b[0m if ax.get_visible()])\n\u001b[1;32m 113\u001b[0m tight_bbox = TransformedBbox(tight_bbox_raw,\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots\n\u001b[0;32m--> 112\u001b[0;31m if ax.get_visible()])\n\u001b[0m\u001b[1;32m 113\u001b[0m tight_bbox = TransformedBbox(tight_bbox_raw,\n\u001b[1;32m 114\u001b[0m fig.transFigure.inverted())\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36mget_tightbbox\u001b[0;34m(self, renderer, call_axes_locator, bbox_extra_artists)\u001b[0m\n\u001b[1;32m 4354\u001b[0m \u001b[0mbb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbb_yaxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4356\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_title_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4357\u001b[0m \u001b[0mbb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_window_extent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4358\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_update_title_position\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 2545\u001b[0m if (ax.xaxis.get_label_position() == 'top' or\n\u001b[1;32m 2546\u001b[0m ax.xaxis.get_ticks_position() in choices):\n\u001b[0;32m-> 2547\u001b[0;31m \u001b[0mbb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_tightbbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2548\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2549\u001b[0m \u001b[0mbb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_window_extent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_tightbbox\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1163\u001b[0m \u001b[0mticks_to_draw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1165\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_label_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1166\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1167\u001b[0m \u001b[0;31m# go back to just this axis's tick labels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_update_label_position\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1985\u001b[0m \u001b[0;31m# get bounding boxes for this axis and any siblings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1986\u001b[0m \u001b[0;31m# that have been set by `fig.align_xlabels()`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1987\u001b[0;31m \u001b[0mbboxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbboxes2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick_boxes_siblings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1988\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1989\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_tick_boxes_siblings\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1969\u001b[0m \u001b[0;31m# if we want to align labels from other axes:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1970\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_siblings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1971\u001b[0;31m \u001b[0mticks_to_draw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1972\u001b[0m \u001b[0mtlb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtlb2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick_bboxes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mticks_to_draw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1973\u001b[0m \u001b[0mbboxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtlb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_update_ticks\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1078\u001b[0m \u001b[0mthe\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mReturn\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mlist\u001b[0m \u001b[0mof\u001b[0m \u001b[0mticks\u001b[0m \u001b[0mthat\u001b[0m \u001b[0mwill\u001b[0m \u001b[0mbe\u001b[0m \u001b[0mdrawn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1079\u001b[0m \"\"\"\n\u001b[0;32m-> 1080\u001b[0;31m \u001b[0mmajor_locs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_majorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1081\u001b[0m \u001b[0mmajor_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformatter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmajor_locs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1082\u001b[0m \u001b[0mmajor_ticks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_major_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmajor_locs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_majorticklocs\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1323\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_majorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1324\u001b[0m \u001b[0;34m\"\"\"Get the array of major tick locations in data coordinates.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1325\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlocator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1326\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1327\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_minorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2076\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2077\u001b[0m \u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_view_interval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2078\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2079\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2080\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtick_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36mtick_values\u001b[0;34m(self, vmin, vmax)\u001b[0m\n\u001b[1;32m 2084\u001b[0m vmin, vmax = mtransforms.nonsingular(\n\u001b[1;32m 2085\u001b[0m vmin, vmax, expander=1e-13, tiny=1e-14)\n\u001b[0;32m-> 2086\u001b[0;31m \u001b[0mlocs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_raw_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2087\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2088\u001b[0m \u001b[0mprune\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prune\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36m_raw_ticks\u001b[0;34m(self, vmin, vmax)\u001b[0m\n\u001b[1;32m 2023\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_nbins\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'auto'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2024\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2025\u001b[0;31m nbins = np.clip(self.axis.get_tick_space(),\n\u001b[0m\u001b[1;32m 2026\u001b[0m max(1, self._min_n_ticks - 1), 9)\n\u001b[1;32m 2027\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_tick_space\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2173\u001b[0m \u001b[0mends\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransAxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2174\u001b[0m \u001b[0mlength\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mends\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mends\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m72\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2175\u001b[0;31m \u001b[0mtick\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2176\u001b[0m \u001b[0;31m# There is a heuristic here that the aspect ratio of tick text\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2177\u001b[0m \u001b[0;31m# is no more than 3:1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_tick\u001b[0;34m(self, major)\u001b[0m\n\u001b[1;32m 1904\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1905\u001b[0m \u001b[0mtick_kw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_minor_tick_kw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1906\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mXTick\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmajor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mtick_kw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1907\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1908\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_label\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, axes, loc, label, size, width, color, tickdir, pad, labelsize, labelcolor, zorder, gridOn, tick1On, tick2On, label1On, label2On, major, labelrotation, grid_color, grid_linestyle, grid_linewidth, grid_alpha, **kw)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick1line\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick1line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick2line\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick2line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgridline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_gridline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 161\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_gridline\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_grid_alpha\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0mmarkersize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m **self._grid_kw)\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_xaxis_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwhich\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'grid'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_interpolation_steps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGRIDLINE_INTERPOLATION_STEPS\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/lines.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, xdata, ydata, linewidth, linestyle, color, marker, markersize, markeredgewidth, markeredgecolor, markerfacecolor, markerfacecoloralt, fillstyle, antialiased, dash_capstyle, solid_capstyle, dash_joinstyle, solid_joinstyle, pickradius, drawstyle, markevery, **kwargs)\u001b[0m\n\u001b[1;32m 334\u001b[0m \u001b[0mdash_capstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.dash_capstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 335\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdash_joinstyle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 336\u001b[0;31m \u001b[0mdash_joinstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.dash_joinstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 337\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msolid_capstyle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[0msolid_capstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.solid_capstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswitch_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrcsetup\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_auto_backend_sentinel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 822\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 823\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 824\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#scatter plot\n",
+ "\n",
+ "import seaborn as sns\n",
+ "sns.pairplot(train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### A scatter plot shows the relationship between two variables as dots in two dimensions. So from this output, i can be able to see the relationship between variables. If they show a good correlation, then they ccan be removed in feature selection."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EVALUATING ALGORITHMS\n",
+ "#### I will now evaluate some algorithms and estimate their accuracy on unseen data.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "## ??\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Building models"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will first split my train data into test and train, so that I test the effectiveness of my model using the test data.\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "### random seed generator gets you the same numbers each time.\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values #first create a variable for extracting the values from the train dataset to be used\n",
+ "X = array[:,0:11] #selecting which columns to use, in this case all of them\n",
+ "Y = array[:,11] #selecting the label for our data, which is the last column\n",
+ "test_size = 0.32 #this is the size of my test data, meaning my train data is 68%\n",
+ "seed = 3 #this is to initialize the random generator. So everytime i run this with a different seed number, i will get a different output\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## IMPORTING MODELS\n",
+ "\n",
+ "#### I will now use the models I imported in the beginning from sklearn to use for my algorithm.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "I think this is a great move to take,but I would like to know why you are doing this this way.\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This will be my first submission. It gave me a score of 99%\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'pd' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CLASS\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mOUTPUT\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mOUTPUT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"CLASS\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Index\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "Y=train.CLASS\n",
+ "X=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X, Y).predict(test.values)\n",
+ "OUTPUT_1=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_1.columns=[\"CLASS\"]\n",
+ "OUTPUT_1.index.name=\"Index\"\n",
+ "OUTPUT_1[\"CLASS\"]=OUTPUT_1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_1.to_csv(\"output\") #converting my output file into a csv\n",
+ "print(OUTPUT_1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0.0920619 0.12139276 0.09773584 0.08602068 0.05565946 0.07725613\n",
+ " 0.03620132 0.30737167 0.0480203 0.03222133 0.04605861]\n"
+ ]
+ },
+ {
+ "ename": "NameError",
+ "evalue": "name 'pd' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_importances_\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#use inbuilt class feature_importances of tree based classifiers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m#plot graph of feature importances for better visualization\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mfeat_importances\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_importances_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mfeat_importances\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlargest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'barh'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "#feature selection using feature importance\n",
+ "X = train.iloc[:,0:11] #independent columns\n",
+ "y = train.iloc[:,-1] #target column\n",
+ "from sklearn.ensemble import ExtraTreesClassifier\n",
+ "import matplotlib.pyplot as plt\n",
+ "model = ExtraTreesClassifier()\n",
+ "model.fit(X,y)\n",
+ "print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers\n",
+ "#plot graph of feature importances for better visualization\n",
+ "feat_importances = pd.Series(model.feature_importances_, index=X.columns)\n",
+ "feat_importances.nlargest(10).plot(kind='barh')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### I will select the features with the highest bars. The number of features selected will depend on the accuracy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"out1\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### This gave me a score of 85%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this is how i checked the accuracy from the features selected\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#i will now select 6 features to see if my score improves\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,1,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### the accuracy deacreases. let me try 4 features instead"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values\n",
+ "X = array[:,[1,2,3,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### accuracy deacreases even further. so if i weere to feature select, I would use 5 features because they give me the best accuracy."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Let me try the RTC model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### this actually gives me a better score than the one from GaussianNB. Let me submit it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new2=train.CLASS\n",
+ "X_new2=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT2=model.fit(X_new2, Y_new2).predict(test.values)\n",
+ "OUTPUT_new1=pd.DataFrame(OUTPUT2)\n",
+ "OUTPUT_new1.columns=[\"CLASS\"]\n",
+ "OUTPUT_new1.index.name=\"Index\"\n",
+ "OUTPUT_new1[\"CLASS\"]=OUTPUT_new1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new1.to_csv(\"outputRTC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 83%. let me feature select the 5 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### this gives me a lower score than when all features are selected. So i will stop here."
+ ]
+ }
+ ],
+ "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.7.4"
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini -corrected-checkpoint.ipynb b/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini -corrected-checkpoint.ipynb
new file mode 100644
index 0000000..66d5836
--- /dev/null
+++ b/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini -corrected-checkpoint.ipynb
@@ -0,0 +1,1058 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Please use this link to learn Markdown\n",
+ "\n",
+ "[Link](https://www.earthdatascience.org/courses/intro-to-earth-data-science/file-formats/use-text-files/format-text-with-markdown-jupyter-notebook/)\n",
+ "\n",
+ "
\n",
+ " Please use it to write your report.\n",
+ " \n",
+ " So far its easy to follow your thought which is good.\n",
+ " \n",
+ " It would be better to explain more on the concepts, you have done it well in some parts ,others neglected.\n",
+ " \n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
+ "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
+ },
+ "outputs": [],
+ "source": [
+ "# This Python 3 environment comes with many helpful analytics libraries installed\n",
+ "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
+ "# For example, here's several helpful packages to load in \n",
+ "\n",
+ "#import seaborn as sb\n",
+ "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
+ "\n",
+ "# Input data files are available in the \"../input/\" directory.\n",
+ "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n",
+ "\n",
+ "import os\n",
+ "for dirname, _, filenames in os.walk('/kaggle/input'):\n",
+ " for filename in filenames:\n",
+ " print(os.path.join(dirname, filename))\n",
+ "\n",
+ "# Any results you write to the current directory are saved as output."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Importing Libraries"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
+ "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
+ },
+ "outputs": [],
+ "source": [
+ "###Importing libraries\n",
+ "import pandas\n",
+ "import scipy\n",
+ "import numpy\n",
+ "import matplotlib.pyplot as plt\n",
+ "import sklearn\n",
+ "import seaborn as sns\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading some libraries\n",
+ "### These are some of the libraries I think I will need"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pandas import read_csv #for reading in csv files\n",
+ "from pandas.plotting import scatter_matrix \n",
+ "from matplotlib import pyplot \n",
+ "from sklearn.model_selection import train_test_split \n",
+ "from sklearn.model_selection import cross_val_score \n",
+ "from sklearn.model_selection import StratifiedKFold\n",
+ "from sklearn.metrics import classification_report \n",
+ "from sklearn.metrics import confusion_matrix\n",
+ "from sklearn.metrics import accuracy_score \n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "from sklearn.neighbors import KNeighborsClassifier \n",
+ "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis \n",
+ "from sklearn.naive_bayes import GaussianNB \n",
+ "from sklearn.svm import SVC \n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.linear_model import SGDClassifier\n",
+ "from sklearn.neighbors import NearestCentroid\n",
+ "from sklearn.neural_network import MLPClassifier"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Brief description of the codes above:\n",
+ "#### 1.**read_csv**: for reading in csv files\n",
+ "#### 2.**scatter matrix**: for showing how one variable is affected by another\n",
+ "#### 3.**pyplot** : for plotting graphs\n",
+ "#### 4.**train_test_split**: for splitting my data into train and test\n",
+ "#### 5.**cross_val_score**: to estimate the skill of a machine learning model on unseen data\n",
+ "#### 6.**StratifiedKFold**: the folds are selected so that the mean response value is approximately equal in all the folds. In the case of a dichotomous classification, this means that each fold contains roughly the same proportions of the two types of class labels\n",
+ "#### 7.**classification_report**: Visual classification reports are used to compare classification models to select models that are “redder”, e.g. have stronger classification metrics or that are more balanced.\n",
+ "#### 8.**confusion_matrix**: A confusion matrix is a table that is often used to describe the performance of a classification model (or “classifier”) on a set of test data for which the true values are known. It allows the visualization of the performance of an algorithm.\n",
+ "#### 9.**accuracy_score**: It is the ratio of number of correct predictions to the total number of input samples\n",
+ "#### 10.**LogisticRegression**: an algorithm for classification\n",
+ "#### 11.**DecisionTreeClassifier**: create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n",
+ "#### 12.**KNeighborsClassifier**: for classification\n",
+ "#### 13.**LinearDiscriminantAnalysis**: used for modeling differences in groups i.e. separating two or more classes\n",
+ "#### 14.**GaussianNB**: an algorithm that estimates the mean and the standard deviation from your training data,\n",
+ "#### 15.**SVC**: an algorithm that creates a line or a hyperplane which separates the data into classes\n",
+ "#### 16.**RandomForestClassifier**: Random forests creates decision trees on randomly selected data samples, gets prediction from each tree and selects the best solution by means of voting\n",
+ "#### 17.**SGDClassifier**: Stochastic Gradient Descent Classifier (SGDC) is an incremental Gradient Descent method falling under the broad classification of Supervised Learning Model that helps converge faster and is thus very fast as compared to other iterative models capable of delivering similar performance\n",
+ "#### 18.**NearestCentroid**: assigns to observations the label of the class of training samples whose mean (centroid) is closest to the observation\n",
+ "#### 19.**MLPClassifier**: It can distinguish data that is not linearly separable\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this suprreses unnecesary warnings from my output\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading My Dataset\n",
+ "\n",
+ "##### I am going to first use my training dataset, then the test dataset last."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train = pandas.read_csv('/kaggle/input/ace-class-assignment/AMP_TrainSet.csv')#reading in my train dataset\n",
+ "train\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test= pandas.read_csv('/kaggle/input/ace-class-assignment/Test.csv') #reading in my test dataset\n",
+ "test"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Inspecting my train dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.shape #a tuple that gives you an indication of the number of dimensions in the array."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.isnull().sum() ###this will show the number of null values in my data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.count() #returns number of non-null values in my data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### It seems i have no missing values in my data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.describe() #returns summary of the whole data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.info() #It returns range, column, number of non-null objects of each column, datatype and memory usage"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### This shows that my dataset has 3038 rows (instances) and 12 columns (attributes)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### I will also take a look at how many instances i have for each class"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.groupby('CLASS').size()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.groupby('CLASS').size().plot(kind='bar') #i can also show this in a graph form\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I have two groups of classes, each with 1519 instances"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# DATA VISUALISATION"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will start with univariate plots to see each individual variable"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1. HISTOGRAMS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#visualizing using histograms\n",
+ "train.hist(figsize=(16,16))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### These histograms show that FullAcidicMolPerc is exponentially distributed while the rest are have a Gaussian distribution except for NT_EFC195 and CLASS. Histograms also help us identify outliers. From this output, I can say there are no outliers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.corr(method='pearson')['CLASS'] #Here I tried to see the correlation of all attributes with the class"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### According to literature,Pearson’s correlation coefficient is the test statistics that measures the statistical relationship, or association, between two continuous variables. It is known as the best method of measuring the association between variables of interest because it is based on the method of covariance. It gives information about the magnitude of the association, or correlation, as well as the direction of the relationship.\n",
+ "\n",
+ "### So from the above results, i can see that most attributes have a negative correlation with the class. Only two have a high degree of correlation as they are between +o.5 and +1.0. AS_FUKS010112 has moderate corrlation as the range is between 0.30-0.49"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Multivariate "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#plotting a heatmap to show correlation of data\n",
+ "pyplot.figure(figsize=(10,10))\n",
+ "sns.heatmap(train.corr(method='pearson'))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### i did this plot in order to see which features are highly correlated as this can be a problem in soome models if some features are used together whereas they are highly correlated."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#scatter plot\n",
+ "\n",
+ "import seaborn as sns\n",
+ "sns.pairplot(train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### A scatter plot shows the relationship between two variables as dots in two dimensions. So from this output, i can be able to see the relationship between variables. If they show a good correlation, then they ccan be removed in feature selection."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EVALUATING ALGORITHMS\n",
+ "#### I will now evaluate some algorithms and estimate their accuracy on unseen data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Building models"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will first split my train data into test and train, so that I test the effectiveness of my model using the test data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values #first create a variable for extracting the values from the train dataset to be used\n",
+ "X = array[:,0:11] #selecting which columns to use, in this case all of them\n",
+ "Y = array[:,11] #selecting the label for our data, which is the last column\n",
+ "test_size = 0.32 #this is the size of my test data, meaning my train data is 68%\n",
+ "seed = 3 #this is to initialize the random generator, to ensure i get the same numbers each time.\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## IMPORTING MODELS\n",
+ "\n",
+ "#### I will now use the models I imported in the beginning from sklearn to use for my algorithm."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "from sklearn.ensemble import GradientBoostingClassifier\n",
+ "models = []\n",
+ "models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))\n",
+ "models.append(('LDA', LinearDiscriminantAnalysis()))\n",
+ "models.append(('KNN', KNeighborsClassifier()))\n",
+ "models.append(('CART', DecisionTreeClassifier()))\n",
+ "models.append(('NB', GaussianNB()))\n",
+ "models.append(('SVM', SVC(gamma='auto')))\n",
+ "models.append(('RTC', RandomForestClassifier()))\n",
+ "models.append(('SGD',SGDClassifier()))\n",
+ "models.append(('NC', NearestCentroid()))\n",
+ "models.append(('MLPC',MLPClassifier()))\n",
+ "models.append(('GBC', GradientBoostingClassifier()))\n",
+ "# evaluate each model in turn\n",
+ "results = []\n",
+ "names = []\n",
+ "for name, model in models:\n",
+ " kfold = StratifiedKFold(n_splits=10)\n",
+ " cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')\n",
+ " results.append(cv_results)\n",
+ " names.append(name)\n",
+ " print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Compare Algorithms\n",
+ "pyplot.boxplot(results, labels=names)\n",
+ "pyplot.title('Algorithm Comparison')\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### from here, RTC is the best performing, followed by gradient boosting then NB.\n",
+ "\n",
+ "### Irecently added Gradient boosting. It relies on the intuition that the best possible next model, when combined with previous models, minimizes the overall prediction error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(NB)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(RTC)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### The MCC gives a score close to 100."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(GBC)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will now test the performance of my model first using all the features, then with some selected ones to see if my performance increases or decreases with either the addition of or dropping of some features.\n",
+ "#### I started with all features because my features are not that much for me to consider dropping."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gives me a good score of 93.6%. I will now try selecting some features based on feature importance."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This will be my first submission. It gave me a score of 99%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y=train.CLASS\n",
+ "X=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X, Y).predict(test.values)\n",
+ "OUTPUT_1=pandas.DataFrame(OUTPUT)\n",
+ "OUTPUT_1.columns=[\"CLASS\"]\n",
+ "OUTPUT_1.index.name=\"Index\"\n",
+ "OUTPUT_1[\"CLASS\"]=OUTPUT_1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_1.to_csv(\"output\") #converting my output file into a csv\n",
+ "print(OUTPUT_1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#feature selection using feature importance\n",
+ "X = train.iloc[:,0:11] #independent columns\n",
+ "y = train.iloc[:,-1] #target column\n",
+ "from sklearn.ensemble import ExtraTreesClassifier\n",
+ "import matplotlib.pyplot as plt\n",
+ "model = ExtraTreesClassifier()\n",
+ "model.fit(X,y)\n",
+ "print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers\n",
+ "#plot graph of feature importances for better visualization\n",
+ "feat_importances = pd.Series(model.feature_importances_, index=X.columns)\n",
+ "feat_importances.nlargest(10).plot(kind='barh')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### I will select the features with the highest bars. The number of features selected will depend on the accuracy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"out1\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### This gave me a score of 85%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this is how i checked the accuracy from the features selected\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#i will now select 6 features to see if my score improves\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,1,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### the accuracy deacreases. let me try 4 features instead"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values\n",
+ "X = array[:,[1,2,3,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### accuracy deacreases even further. so if i weere to feature select, I would use 5 features because they give me the best accuracy."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Let me try the RTC model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### this actually gives me a better score than the one from GaussianNB. Let me submit it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new2=train.CLASS\n",
+ "X_new2=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT2=model.fit(X_new2, Y_new2).predict(test.values)\n",
+ "OUTPUT_new1=pd.DataFrame(OUTPUT2)\n",
+ "OUTPUT_new1.columns=[\"CLASS\"]\n",
+ "OUTPUT_new1.index.name=\"Index\"\n",
+ "OUTPUT_new1[\"CLASS\"]=OUTPUT_new1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new1.to_csv(\"outputRTC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 83%. let me feature select the 5 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### this gives me a lower score than when all features are selected. So i will stop here."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### GBC "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#submission with all features\n",
+ "Y_new4=train.CLASS\n",
+ "X_new4=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT4=model.fit(X_new4, Y_new4).predict(test.values)\n",
+ "OUTPUT_new4=pd.DataFrame(OUTPUT4)\n",
+ "OUTPUT_new4.columns=[\"CLASS\"]\n",
+ "OUTPUT_new4.index.name=\"Index\"\n",
+ "OUTPUT_new4[\"CLASS\"]=OUTPUT_new4[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new4.to_csv(\"outputGBC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new4[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new4[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new4.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new4.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 82%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ " \n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### i get accuracy of 92,4 if i choose 5 features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#submission with dropped\n",
+ "train.columns\n",
+ "newtrain2=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest2=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array2 = newtrain2.values\n",
+ "X2 = array2[:,0:5]\n",
+ "Y2 = array2[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X2, Y2, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"RTC_DROP\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### GBC gave me a score of 81%"
+ ]
+ }
+ ],
+ "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.7.4"
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Assignment Colab/Fezile Dlamini (2).ipynb b/Assignment Colab/Fezile Dlamini (2).ipynb
new file mode 100644
index 0000000..8c8fc2d
--- /dev/null
+++ b/Assignment Colab/Fezile Dlamini (2).ipynb
@@ -0,0 +1,3695 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ " Whenever you see these signs below, understand that you need to do more:\n",
+ " \n",
+ " ## ??\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {
+ "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
+ "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
+ },
+ "source": [
+ "# This Python 3 environment comes with many helpful analytics libraries installed\n",
+ "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
+ "# For example, here's several helpful packages to load in \n",
+ "\n",
+ "import numpy as np # linear algebra\n",
+ "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
+ "\n",
+ "# Input data files are available in the \"../input/\" directory.\n",
+ "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n",
+ "\n",
+ "import os\n",
+ "for dirname, _, filenames in os.walk('/kaggle/input'):\n",
+ " for filename in filenames:\n",
+ " print(os.path.join(dirname, filename))\n",
+ "\n",
+ "# Any results you write to the current directory are saved as output."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Importing Libraries\n",
+ "\n",
+ "
\n",
+ "\n",
+ "## ?? Your importing is causing errors:\n",
+ "\n",
+ "You import pandas without pd, but later you use the alias pd. Why?\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
+ "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
+ },
+ "outputs": [],
+ "source": [
+ "###Importing libraries\n",
+ "import pandas\n",
+ "import scipy\n",
+ "import numpy\n",
+ "import matplotlib\n",
+ "import sklearn\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading some libraries\n",
+ "### These are some of the libraries I think I will need\n",
+ "\n",
+ "
\n",
+ " \n",
+ " #### I think your notes below would look better in markdown, if you intend to write long sentences\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pandas import read_csv #for reading in csv files\n",
+ "from pandas.plotting import scatter_matrix #for showing how one variable is affected by another\n",
+ "from matplotlib import pyplot #for plotting graphs\n",
+ "from sklearn.model_selection import train_test_split # for splitting my data into train and test\n",
+ "from sklearn.model_selection import cross_val_score #to estimate the skill of a machine learning model on unseen data\n",
+ "from sklearn.model_selection import StratifiedKFold #he folds are selected so that the mean response value is approximately equal in all the folds. In the case of a dichotomous classification, this means that each fold contains roughly the same proportions of the two types of class labels\n",
+ "from sklearn.metrics import classification_report #Visual classification reports are used to compare classification models to select models that are “redder”, e.g. have stronger classification metrics or that are more balanced.\n",
+ "from sklearn.metrics import confusion_matrix #A confusion matrix is a table that is often used to describe the performance of a classification model (or “classifier”) on a set of test data for which the true values are known. It allows the visualization of the performance of an algorithm.\n",
+ "from sklearn.metrics import accuracy_score #It is the ratio of number of correct predictions to the total number of input samples\n",
+ "from sklearn.linear_model import LogisticRegression #an algorithm for classification\n",
+ "from sklearn.tree import DecisionTreeClassifier #create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n",
+ "from sklearn.neighbors import KNeighborsClassifier #for classification\n",
+ "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis #used for modeling differences in groups i.e. separating two or more classes\n",
+ "from sklearn.naive_bayes import GaussianNB #an algorithm that estimates the mean and the standard deviation from your training data,\n",
+ "from sklearn.svm import SVC #an algorithm that creates a line or a hyperplane which separates the data into classes\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.linear_model import SGDClassifier\n",
+ "from sklearn.neighbors import NearestCentroid\n",
+ "from sklearn.neural_network import MLPClassifier"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this suprreses unnecesary warnings from my output\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading My Dataset\n",
+ "\n",
+ "##### I am going to first use my training dataset, then the test dataset last."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "The way you are commenting in the code is fine.\n",
+ " \n",
+ " It would be better to write shorter explanation there and longer with markdown.\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#plotting a heatmap to show correlation of data\n",
+ "pyplot.figure(figsize=(10,10))\n",
+ "sns.heatmap(train.corr(method='pearson'))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### i did this plot in order to see which features are highly correlated as this can be a problem in soome models if some features are used together whereas they are highly correlated."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "\n",
+ "## This plot takes a lot of time to draw, is it the best way to do this?\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpairplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py\u001b[0m in \u001b[0;36mpairplot\u001b[0;34m(data, hue, hue_order, palette, vars, x_vars, y_vars, kind, diag_kind, markers, height, aspect, dropna, plot_kws, diag_kws, grid_kws, size)\u001b[0m\n\u001b[1;32m 2082\u001b[0m \u001b[0mhue_order\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhue_order\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpalette\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpalette\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2083\u001b[0m \u001b[0mdiag_sharey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdiag_sharey\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2084\u001b[0;31m height=height, aspect=aspect, dropna=dropna, **grid_kws)\n\u001b[0m\u001b[1;32m 2085\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2086\u001b[0m \u001b[0;31m# Add the markers here as PairGrid has figured out how many levels of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, hue, hue_order, palette, hue_kws, vars, x_vars, y_vars, diag_sharey, height, aspect, despine, dropna, size)\u001b[0m\n\u001b[1;32m 1304\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdespine\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1305\u001b[0m \u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdespine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfig\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1306\u001b[0;31m \u001b[0mfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtight_layout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1307\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/figure.py\u001b[0m in \u001b[0;36mtight_layout\u001b[0;34m(self, renderer, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 2473\u001b[0m kwargs = get_tight_layout_figure(\n\u001b[1;32m 2474\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubplotspec_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrenderer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2475\u001b[0;31m pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)\n\u001b[0m\u001b[1;32m 2476\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2477\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots_adjust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36mget_tight_layout_figure\u001b[0;34m(fig, axes_list, subplotspec_list, renderer, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 360\u001b[0m \u001b[0msubplot_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubplot_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[0max_bbox_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0max_bbox_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 362\u001b[0;31m pad=pad, h_pad=h_pad, w_pad=w_pad)\n\u001b[0m\u001b[1;32m 363\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 364\u001b[0m \u001b[0;31m# kwargs can be none if tight_layout fails...\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36mauto_adjust_subplotpars\u001b[0;34m(fig, renderer, nrows_ncols, num1num2_list, subplot_list, ax_bbox_list, pad, h_pad, w_pad, rect)\u001b[0m\n\u001b[1;32m 109\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 111\u001b[0;31m tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots\n\u001b[0m\u001b[1;32m 112\u001b[0m if ax.get_visible()])\n\u001b[1;32m 113\u001b[0m tight_bbox = TransformedBbox(tight_bbox_raw,\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/tight_layout.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots\n\u001b[0;32m--> 112\u001b[0;31m if ax.get_visible()])\n\u001b[0m\u001b[1;32m 113\u001b[0m tight_bbox = TransformedBbox(tight_bbox_raw,\n\u001b[1;32m 114\u001b[0m fig.transFigure.inverted())\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36mget_tightbbox\u001b[0;34m(self, renderer, call_axes_locator, bbox_extra_artists)\u001b[0m\n\u001b[1;32m 4354\u001b[0m \u001b[0mbb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbb_yaxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4356\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_title_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4357\u001b[0m \u001b[0mbb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_window_extent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4358\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_update_title_position\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 2545\u001b[0m if (ax.xaxis.get_label_position() == 'top' or\n\u001b[1;32m 2546\u001b[0m ax.xaxis.get_ticks_position() in choices):\n\u001b[0;32m-> 2547\u001b[0;31m \u001b[0mbb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_tightbbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2548\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2549\u001b[0m \u001b[0mbb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_window_extent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_tightbbox\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1163\u001b[0m \u001b[0mticks_to_draw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1165\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_label_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1166\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1167\u001b[0m \u001b[0;31m# go back to just this axis's tick labels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_update_label_position\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1985\u001b[0m \u001b[0;31m# get bounding boxes for this axis and any siblings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1986\u001b[0m \u001b[0;31m# that have been set by `fig.align_xlabels()`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1987\u001b[0;31m \u001b[0mbboxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbboxes2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick_boxes_siblings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1988\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1989\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_position\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_tick_boxes_siblings\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 1969\u001b[0m \u001b[0;31m# if we want to align labels from other axes:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1970\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_siblings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1971\u001b[0;31m \u001b[0mticks_to_draw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1972\u001b[0m \u001b[0mtlb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtlb2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maxx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick_bboxes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mticks_to_draw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrenderer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1973\u001b[0m \u001b[0mbboxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtlb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_update_ticks\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1078\u001b[0m \u001b[0mthe\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mReturn\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mlist\u001b[0m \u001b[0mof\u001b[0m \u001b[0mticks\u001b[0m \u001b[0mthat\u001b[0m \u001b[0mwill\u001b[0m \u001b[0mbe\u001b[0m \u001b[0mdrawn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1079\u001b[0m \"\"\"\n\u001b[0;32m-> 1080\u001b[0;31m \u001b[0mmajor_locs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_majorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1081\u001b[0m \u001b[0mmajor_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformatter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmajor_locs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1082\u001b[0m \u001b[0mmajor_ticks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_major_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmajor_locs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_majorticklocs\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1323\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_majorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1324\u001b[0m \u001b[0;34m\"\"\"Get the array of major tick locations in data coordinates.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1325\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlocator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1326\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1327\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_minorticklocs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2076\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2077\u001b[0m \u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_view_interval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2078\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2079\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2080\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtick_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36mtick_values\u001b[0;34m(self, vmin, vmax)\u001b[0m\n\u001b[1;32m 2084\u001b[0m vmin, vmax = mtransforms.nonsingular(\n\u001b[1;32m 2085\u001b[0m vmin, vmax, expander=1e-13, tiny=1e-14)\n\u001b[0;32m-> 2086\u001b[0;31m \u001b[0mlocs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_raw_ticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2087\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2088\u001b[0m \u001b[0mprune\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prune\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/ticker.py\u001b[0m in \u001b[0;36m_raw_ticks\u001b[0;34m(self, vmin, vmax)\u001b[0m\n\u001b[1;32m 2023\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_nbins\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'auto'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2024\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2025\u001b[0;31m nbins = np.clip(self.axis.get_tick_space(),\n\u001b[0m\u001b[1;32m 2026\u001b[0m max(1, self._min_n_ticks - 1), 9)\n\u001b[1;32m 2027\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mget_tick_space\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2173\u001b[0m \u001b[0mends\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransAxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2174\u001b[0m \u001b[0mlength\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mends\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mends\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m72\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2175\u001b[0;31m \u001b[0mtick\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2176\u001b[0m \u001b[0;31m# There is a heuristic here that the aspect ratio of tick text\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2177\u001b[0m \u001b[0;31m# is no more than 3:1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_tick\u001b[0;34m(self, major)\u001b[0m\n\u001b[1;32m 1904\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1905\u001b[0m \u001b[0mtick_kw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_minor_tick_kw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1906\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mXTick\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmajor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmajor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mtick_kw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1907\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1908\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_label\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, axes, loc, label, size, width, color, tickdir, pad, labelsize, labelcolor, zorder, gridOn, tick1On, tick2On, label1On, label2On, major, labelrotation, grid_color, grid_linestyle, grid_linewidth, grid_alpha, **kw)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick1line\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick1line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtick2line\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tick2line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgridline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_gridline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 161\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36m_get_gridline\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_grid_alpha\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0mmarkersize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m **self._grid_kw)\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_xaxis_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwhich\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'grid'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_interpolation_steps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGRIDLINE_INTERPOLATION_STEPS\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/lines.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, xdata, ydata, linewidth, linestyle, color, marker, markersize, markeredgewidth, markeredgecolor, markerfacecolor, markerfacecoloralt, fillstyle, antialiased, dash_capstyle, solid_capstyle, dash_joinstyle, solid_joinstyle, pickradius, drawstyle, markevery, **kwargs)\u001b[0m\n\u001b[1;32m 334\u001b[0m \u001b[0mdash_capstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.dash_capstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 335\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdash_joinstyle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 336\u001b[0;31m \u001b[0mdash_joinstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.dash_joinstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 337\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msolid_capstyle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[0msolid_capstyle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'lines.solid_capstyle'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswitch_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrcsetup\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_auto_backend_sentinel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 822\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 823\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 824\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#scatter plot\n",
+ "\n",
+ "import seaborn as sns\n",
+ "sns.pairplot(train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### A scatter plot shows the relationship between two variables as dots in two dimensions. So from this output, i can be able to see the relationship between variables. If they show a good correlation, then they ccan be removed in feature selection."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EVALUATING ALGORITHMS\n",
+ "#### I will now evaluate some algorithms and estimate their accuracy on unseen data.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "## ??\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Building models"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will first split my train data into test and train, so that I test the effectiveness of my model using the test data.\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "### random seed generator gets you the same numbers each time.\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values #first create a variable for extracting the values from the train dataset to be used\n",
+ "X = array[:,0:11] #selecting which columns to use, in this case all of them\n",
+ "Y = array[:,11] #selecting the label for our data, which is the last column\n",
+ "test_size = 0.32 #this is the size of my test data, meaning my train data is 68%\n",
+ "seed = 3 #this is to initialize the random generator. So everytime i run this with a different seed number, i will get a different output\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## IMPORTING MODELS\n",
+ "\n",
+ "#### I will now use the models I imported in the beginning from sklearn to use for my algorithm.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "I think this is a great move to take,but I would like to know why you are doing this this way.\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This will be my first submission. It gave me a score of 99%\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'pd' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CLASS\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mOUTPUT\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mOUTPUT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"CLASS\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mOUTPUT_1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"Index\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "Y=train.CLASS\n",
+ "X=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X, Y).predict(test.values)\n",
+ "OUTPUT_1=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_1.columns=[\"CLASS\"]\n",
+ "OUTPUT_1.index.name=\"Index\"\n",
+ "OUTPUT_1[\"CLASS\"]=OUTPUT_1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_1.to_csv(\"output\") #converting my output file into a csv\n",
+ "print(OUTPUT_1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0.0920619 0.12139276 0.09773584 0.08602068 0.05565946 0.07725613\n",
+ " 0.03620132 0.30737167 0.0480203 0.03222133 0.04605861]\n"
+ ]
+ },
+ {
+ "ename": "NameError",
+ "evalue": "name 'pd' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_importances_\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#use inbuilt class feature_importances of tree based classifiers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m#plot graph of feature importances for better visualization\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mfeat_importances\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeature_importances_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mfeat_importances\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlargest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'barh'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "#feature selection using feature importance\n",
+ "X = train.iloc[:,0:11] #independent columns\n",
+ "y = train.iloc[:,-1] #target column\n",
+ "from sklearn.ensemble import ExtraTreesClassifier\n",
+ "import matplotlib.pyplot as plt\n",
+ "model = ExtraTreesClassifier()\n",
+ "model.fit(X,y)\n",
+ "print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers\n",
+ "#plot graph of feature importances for better visualization\n",
+ "feat_importances = pd.Series(model.feature_importances_, index=X.columns)\n",
+ "feat_importances.nlargest(10).plot(kind='barh')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### I will select the features with the highest bars. The number of features selected will depend on the accuracy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"out1\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### This gave me a score of 85%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this is how i checked the accuracy from the features selected\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#i will now select 6 features to see if my score improves\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,1,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### the accuracy deacreases. let me try 4 features instead"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values\n",
+ "X = array[:,[1,2,3,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### accuracy deacreases even further. so if i weere to feature select, I would use 5 features because they give me the best accuracy."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Let me try the RTC model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### this actually gives me a better score than the one from GaussianNB. Let me submit it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new2=train.CLASS\n",
+ "X_new2=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT2=model.fit(X_new2, Y_new2).predict(test.values)\n",
+ "OUTPUT_new1=pd.DataFrame(OUTPUT2)\n",
+ "OUTPUT_new1.columns=[\"CLASS\"]\n",
+ "OUTPUT_new1.index.name=\"Index\"\n",
+ "OUTPUT_new1[\"CLASS\"]=OUTPUT_new1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new1.to_csv(\"outputRTC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 83%. let me feature select the 5 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### this gives me a lower score than when all features are selected. So i will stop here."
+ ]
+ }
+ ],
+ "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.7.4"
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Assignment Colab/Fezile Dlamini -Final Submission.ipynb b/Assignment Colab/Fezile Dlamini -Final Submission.ipynb
new file mode 100644
index 0000000..a5e2e01
--- /dev/null
+++ b/Assignment Colab/Fezile Dlamini -Final Submission.ipynb
@@ -0,0 +1 @@
+{"cells":[{"metadata":{},"cell_type":"markdown","source":"## DLAMINI FEZILE SENAMILE\n## 2019/HD07/30568X\n## BIG_BIO DATA ASSIGNMENT 1"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\n#import seaborn as sb\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n for filename in filenames:\n print(os.path.join(dirname, filename))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Importing Libraries"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#Importing libraries\nimport pandas\nimport scipy\nimport numpy\nimport matplotlib.pyplot as plt\nimport sklearn\nimport seaborn as sns\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Loading some libraries\n### These are some of the libraries I think I will need"},{"metadata":{"trusted":true},"cell_type":"code","source":"from pandas import read_csv #for reading in csv files\nfrom pandas.plotting import scatter_matrix \nfrom matplotlib import pyplot \nfrom sklearn.model_selection import train_test_split \nfrom sklearn.model_selection import cross_val_score \nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import classification_report \nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import accuracy_score \nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.neighbors import KNeighborsClassifier \nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis \nfrom sklearn.naive_bayes import GaussianNB \nfrom sklearn.svm import SVC \nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.neighbors import NearestCentroid\nfrom sklearn.neural_network import MLPClassifier","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Brief description of the codes above:\n1. **read_csv**: for reading in csv files\n- **scatter matrix**: for showing how one variable is affected by another\n- **pyplot** : for plotting graphs\n- **train_test_split**: for splitting my data into train and test\n- **cross_val_score**: to estimate the skill of a machine learning model on unseen data\n- **StratifiedKFold**: the folds are selected so that the mean response value is approximately equal in all the folds. In the case of a dichotomous classification, this means that each fold contains roughly the same proportions of the two types of class labels\n- **classification_report**: Visual classification reports are used to compare classification models to select models that are “redder”, e.g. have stronger classification metrics or that are more balanced.\n- **confusion_matrix**: A confusion matrix is a table that is often used to describe the performance of a classification model (or “classifier”) on a set of test data for which the true values are known. It allows the visualization of the performance of an algorithm.\n- **accuracy_score**: It is the ratio of number of correct predictions to the total number of input samples\n- **LogisticRegression**: an algorithm for classification\n- **DecisionTreeClassifier**: create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n- **KNeighborsClassifier**: for classification\n- **LinearDiscriminantAnalysis**: used for modeling differences in groups i.e. separating two or more classes\n- **GaussianNB**: an algorithm that estimates the mean and the standard deviation from your training data,\n- **SVC**: an algorithm that creates a line or a hyperplane which separates the data into classes\n- **RandomForestClassifier**: Random forests creates decision trees on randomly selected data samples, gets prediction from each tree and selects the best solution by means of voting\n- **SGDClassifier**: Stochastic Gradient Descent Classifier (SGDC) is an incremental Gradient Descent method falling under the broad classification of Supervised Learning Model that helps converge faster and is thus very fast as compared to other iterative models capable of delivering similar performance\n- **NearestCentroid**: assigns to observations the label of the class of training samples whose mean (centroid) is closest to the observation\n- **MLPClassifier**: It can distinguish data that is not linearly separable\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"#this suprreses unnecesary warnings from my output\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Loading My Dataset\n\n##### I am going to first use my training dataset, then the test dataset last."},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pandas.read_csv('/kaggle/input/ace-class-assignment/AMP_TrainSet.csv')#reading in my train dataset\ntrain\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test= pandas.read_csv('/kaggle/input/ace-class-assignment/Test.csv') #reading in my test dataset\ntest","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Inspecting my train dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.shape #a tuple that gives you an indication of the number of dimensions in the array.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.isnull().sum() #this will show the number of null values in my data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.count() #returns number of non-null values in my data","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### It seems i have no missing values in my data"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.describe() #returns summary of the whole data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.info() #It returns range, column, number of non-null objects of each column, datatype and memory usage","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### This shows that my dataset has 3038 rows (instances) and 12 columns (attributes)"},{"metadata":{},"cell_type":"markdown","source":"##### I will also take a look at how many instances i have for each class"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.groupby('CLASS').size()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.groupby('CLASS').size().plot(kind='bar') #I can also show this in a graph form\npyplot.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### I have two groups of classes, each with 1519 instances"},{"metadata":{},"cell_type":"markdown","source":"# DATA VISUALISATION"},{"metadata":{},"cell_type":"markdown","source":"#### I will start with univariate plots to see each individual variable"},{"metadata":{},"cell_type":"markdown","source":"## 1. HISTOGRAMS"},{"metadata":{"trusted":true},"cell_type":"code","source":"#visualizing using histograms\ntrain.hist(figsize=(16,16))\npyplot.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### These histograms show that FullAcidicMolPerc is exponentially distributed while the rest are have a Gaussian distribution except for NT_EFC195 and CLASS. Histograms also help us identify outliers. From this output, I can say there are no outliers."},{"metadata":{"trusted":true},"cell_type":"code","source":"train.corr(method='pearson')['CLASS'] #Here I tried to see the correlation of all attributes with the class","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"According to literature,Pearson’s correlation coefficient is the test statistics that measures the statistical relationship, or association, between two continuous variables. It is known as the best method of measuring the association between variables of interest because it is based on the method of covariance. It gives information about the magnitude of the association, or correlation, as well as the direction of the relationship.\n\nSo from the above results, i can see that most attributes have a negative correlation with the class. Only two have a high degree of correlation as they are between +o.5 and +1.0. AS_FUKS010112 has moderate corrlation as the range is between 0.30-0.49"},{"metadata":{},"cell_type":"markdown","source":"## Multivariate "},{"metadata":{"trusted":true},"cell_type":"code","source":"#plotting a heatmap to show correlation of data\npyplot.figure(figsize=(10,10))\nsns.heatmap(train.corr(method='pearson'))\npyplot.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I did this plot in order to see which features are highly correlated as this can be a problem in soome models if some features are used together whereas they are highly correlated."},{"metadata":{"trusted":true},"cell_type":"code","source":"#scatter plot\n\nimport seaborn as sns\nsns.pairplot(train)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A scatter plot shows the relationship between two variables as dots in two dimensions. So from this output, i can be able to see the relationship between variables. If they show a good correlation, then they ccan be removed in feature selection."},{"metadata":{},"cell_type":"markdown","source":"# EVALUATING ALGORITHMS\nI will now evaluate some algorithms and estimate their accuracy on unseen data."},{"metadata":{},"cell_type":"markdown","source":"### Building models"},{"metadata":{},"cell_type":"markdown","source":"I will first split my train data into test and train, so that I test the effectiveness of my model using the test data."},{"metadata":{"trusted":true},"cell_type":"code","source":"array = train.values #first create a variable for extracting the values from the train dataset to be used\nX = array[:,0:11] #selecting which columns to use, in this case all of them\nY = array[:,11] #selecting the label for our data, which is the last column\ntest_size = 0.32 #this is the size of my test data, meaning my train data is 68%\nseed = 3 #this is to initialize the random generator, to ensure i get the same numbers each time.\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## IMPORTING MODELS\n\nI will now use the models I imported in the beginning from sklearn to use for my algorithm."},{"metadata":{"trusted":true},"cell_type":"code","source":"\nfrom sklearn.ensemble import GradientBoostingClassifier\nmodels = []\nmodels.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))\nmodels.append(('LDA', LinearDiscriminantAnalysis()))\nmodels.append(('KNN', KNeighborsClassifier()))\nmodels.append(('CART', DecisionTreeClassifier()))\nmodels.append(('NB', GaussianNB()))\nmodels.append(('SVM', SVC(gamma='auto')))\nmodels.append(('RTC', RandomForestClassifier()))\nmodels.append(('SGD',SGDClassifier()))\nmodels.append(('NC', NearestCentroid()))\nmodels.append(('MLPC',MLPClassifier()))\nmodels.append(('GBC', GradientBoostingClassifier()))\n# evaluate each model in turn\nresults = []\nnames = []\nfor name, model in models:\n kfold = StratifiedKFold(n_splits=10) #First, StratifiedKFold shuffles your data, after that splits the data into 10_splits parts and Done. Now, it will use each part as a test set\n cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')\n results.append(cv_results)\n names.append(name)\n print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))\n ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Compare Algorithms using box plot\npyplot.boxplot(results, labels=names)\npyplot.title('Algorithm Comparison')\npyplot.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"from here, RTC is the best performing, followed by gradient boosting then NB.\n\nI recently added Gradient boosting. It relies on the intuition that the best possible next model, when combined with previous models, minimizes the overall prediction error."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Make predictions on validation dataset, using my selected model from above(NB)\nmodel = GaussianNB()\nmodel.fit(X_train, Y_train)\npredictions = model.predict(X_test)\n\nfrom sklearn.metrics import matthews_corrcoef\nprint('MCC', matthews_corrcoef(model.predict(X_test), Y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Make predictions on validation dataset, using my selected model from above(RTC)\nmodel = RandomForestClassifier()\nmodel.fit(X_train, Y_train)\npredictions = model.predict(X_test)\n\nfrom sklearn.metrics import matthews_corrcoef\nprint('MCC', matthews_corrcoef(model.predict(X_test), Y_test))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"The MCC gives a score close to 100."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Make predictions on validation dataset, using my selected model from above(GBC)\nmodel = GradientBoostingClassifier()\nmodel.fit(X_train, Y_train)\npredictions = model.predict(X_test)\n\nfrom sklearn.metrics import matthews_corrcoef\nprint('MCC', matthews_corrcoef(model.predict(X_test), Y_test))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I will now test the performance of my model first using all the features, then with some selected ones to see if my performance increases or decreases with either the addition of or dropping of some features.\nI started with all features because my features are not that much for me to consider dropping."},{"metadata":{"trusted":true},"cell_type":"code","source":"#with all features\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.naive_bayes import GaussianNB\n\narray = train.values\nX = array[:,0:11]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GaussianNB()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Evaluate predictions\nprint(accuracy_score(Y_test, predictions))\nprint(confusion_matrix(Y_test, predictions))\nprint(classification_report(Y_test, predictions))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"This gives me a good score of 93.6%. I will now try selecting some features based on feature importance."},{"metadata":{},"cell_type":"markdown","source":"This will be my first submission. It gave me a score of 99%"},{"metadata":{"trusted":true},"cell_type":"code","source":"Y=train.CLASS\nX=train.drop(\"CLASS\",axis=1)\nOUTPUT=model.fit(X, Y).predict(test.values)\nOUTPUT_1=pandas.DataFrame(OUTPUT)\nOUTPUT_1.columns=[\"CLASS\"]\nOUTPUT_1.index.name=\"Index\"\nOUTPUT_1[\"CLASS\"]=OUTPUT_1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\nOUTPUT_1.to_csv(\"output\") #converting my output file into a csv\nprint(OUTPUT_1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\nprint(OUTPUT_1[\"CLASS\"].nunique()) #the sum of unique values\nprint(OUTPUT_1.groupby(\"CLASS\").size()[0].sum())\nprint(OUTPUT_1.groupby(\"CLASS\").size()[1].sum())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#feature selection using feature importance\nX = train.iloc[:,0:11] #independent columns\ny = train.iloc[:,-1] #target column\nfrom sklearn.ensemble import ExtraTreesClassifier\nimport matplotlib.pyplot as plt\nmodel = ExtraTreesClassifier()\nmodel.fit(X,y)\nprint(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers\n#plot graph of feature importances for better visualization\nfeat_importances = pd.Series(model.feature_importances_, index=X.columns)\nfeat_importances.nlargest(10).plot(kind='barh')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I will select the features with the highest bars. The number of features selected will depend on the accuracy."},{"metadata":{"trusted":true},"cell_type":"code","source":"train.columns\nnewtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\nnewtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\narray = newtrain.values\nX = array[:,0:5]\nY = array[:,-1]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_new=newtrain.CLASS\nX_new=newtrain.drop(\"CLASS\",axis=1)\nOUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\nOUTPUT_new=pd.DataFrame(OUTPUT)\nOUTPUT_new.columns=[\"CLASS\"]\nOUTPUT_new.index.name=\"Index\"\nOUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\nOUTPUT_new.to_csv(\"out1\")\nprint(OUTPUT_new[\"CLASS\"].unique())\nprint(OUTPUT_new[\"CLASS\"].nunique())\nprint(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\nprint(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"This gave me a score of 85%"},{"metadata":{"trusted":true},"cell_type":"code","source":"#this is how i checked the accuracy from the features selected\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.naive_bayes import GaussianNB\n\narray = train.values\nX = array[:,[0,2,3,5,7]]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GaussianNB()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#i will now select 6 features to see if my score improves\n\narray = train.values\nX = array[:,[0,1,2,3,5,7]]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GaussianNB()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"The accuracy deacreases. let me try 4 features instead"},{"metadata":{"trusted":true},"cell_type":"code","source":"array = train.values\nX = array[:,[1,2,3,7]]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GaussianNB()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Accuracy deacreases even further. so if i weere to feature select, I would use 5 features because they give me the best accuracy."},{"metadata":{},"cell_type":"markdown","source":"### Let me try the RTC model"},{"metadata":{"trusted":true},"cell_type":"code","source":"#with all features\nfrom sklearn.model_selection import train_test_split\n\n\narray = train.values\nX = array[:,0:11]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = RandomForestClassifier()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"This actually gives me a better score than the one from GaussianNB. Let me submit it"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Evaluate predictions\nprint(accuracy_score(Y_test, predictions))\nprint(confusion_matrix(Y_test, predictions))\nprint(classification_report(Y_test, predictions))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_new2=train.CLASS\nX_new2=train.drop(\"CLASS\",axis=1)\nOUTPUT2=model.fit(X_new2, Y_new2).predict(test.values)\nOUTPUT_new1=pd.DataFrame(OUTPUT2)\nOUTPUT_new1.columns=[\"CLASS\"]\nOUTPUT_new1.index.name=\"Index\"\nOUTPUT_new1[\"CLASS\"]=OUTPUT_new1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\nOUTPUT_new1.to_csv(\"outputRTC\") #converting my output file into a csv\nprint(OUTPUT_new1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\nprint(OUTPUT_new1[\"CLASS\"].nunique()) #the sum of unique values\nprint(OUTPUT_new1.groupby(\"CLASS\").size()[0].sum())\nprint(OUTPUT_new1.groupby(\"CLASS\").size()[1].sum())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"This gave me a score of 83%. let me feature select the 5 "},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n\narray = train.values\nX = array[:,[0,2,3,5,7]]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = RandomForestClassifier()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### this gives me a lower score than when all features are selected. So i will stop here."},{"metadata":{},"cell_type":"markdown","source":"### GBC "},{"metadata":{"trusted":true},"cell_type":"code","source":"#with all features\nfrom sklearn.model_selection import train_test_split\n\n\narray = train.values\nX = array[:,0:11]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GradientBoostingClassifier()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#submission with all features\nY_new4=train.CLASS\nX_new4=train.drop(\"CLASS\",axis=1)\nOUTPUT4=model.fit(X_new4, Y_new4).predict(test.values)\nOUTPUT_new4=pd.DataFrame(OUTPUT4)\nOUTPUT_new4.columns=[\"CLASS\"]\nOUTPUT_new4.index.name=\"Index\"\nOUTPUT_new4[\"CLASS\"]=OUTPUT_new4[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\nOUTPUT_new4.to_csv(\"outputGBC\") #converting my output file into a csv\nprint(OUTPUT_new4[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\nprint(OUTPUT_new4[\"CLASS\"].nunique()) #the sum of unique values\nprint(OUTPUT_new4.groupby(\"CLASS\").size()[0].sum())\nprint(OUTPUT_new4.groupby(\"CLASS\").size()[1].sum())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"This gave me a score of 82%"},{"metadata":{"trusted":true},"cell_type":"code","source":" \narray = train.values\nX = array[:,[0,2,3,5,7]]\nY = array[:,11]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)\nmodel = GradientBoostingClassifier()\nmodel.fit(X_train, Y_train)\nresult = model.score(X_test, Y_test)\nprint(\"Accuracy: \", (result*100.0))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I get accuracy of 92,4 if i choose 5 features"},{"metadata":{"trusted":true},"cell_type":"code","source":"#submission with dropped\ntrain.columns\nnewtrain2=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\nnewtest2=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\narray2 = newtrain2.values\nX2 = array2[:,0:5]\nY2 = array2[:,-1]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X2, Y2, test_size=test_size,\nrandom_state=seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.columns\nnewtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\nnewtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\narray = newtrain.values\nX = array[:,0:5]\nY = array[:,-1]\ntest_size = 0.32\nseed = 3\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\nrandom_state=seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_new=newtrain.CLASS\nX_new=newtrain.drop(\"CLASS\",axis=1)\nOUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\nOUTPUT_new=pd.DataFrame(OUTPUT)\nOUTPUT_new.columns=[\"CLASS\"]\nOUTPUT_new.index.name=\"Index\"\nOUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\nOUTPUT_new.to_csv(\"RTC_DROP\")\nprint(OUTPUT_new[\"CLASS\"].unique())\nprint(OUTPUT_new[\"CLASS\"].nunique())\nprint(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\nprint(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### GBC gave me a score of 81%"},{"metadata":{},"cell_type":"markdown","source":"## REFERENCES\n\n1. https://stackabuse.com/gradient-boosting-classifiers-in-python-with-scikit-learn/\n- https://realpython.com/logistic-regression-python\n- https://machinelearningmastery.com/compare-machine-learning-algorithms-python-scikit-learn/\n- https://stackabuse.com/applying-filter-methods-in-python-for-feature-selection/\n- http://www.scipy-lectures.org/\n- http://pandas.pydata.org/pandas-docs/stable/cookbook.html"}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}
\ No newline at end of file
diff --git a/Assignment Colab/Fezile Dlamini -corrected.ipynb b/Assignment Colab/Fezile Dlamini -corrected.ipynb
new file mode 100644
index 0000000..66d5836
--- /dev/null
+++ b/Assignment Colab/Fezile Dlamini -corrected.ipynb
@@ -0,0 +1,1058 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Please use this link to learn Markdown\n",
+ "\n",
+ "[Link](https://www.earthdatascience.org/courses/intro-to-earth-data-science/file-formats/use-text-files/format-text-with-markdown-jupyter-notebook/)\n",
+ "\n",
+ "
\n",
+ " Please use it to write your report.\n",
+ " \n",
+ " So far its easy to follow your thought which is good.\n",
+ " \n",
+ " It would be better to explain more on the concepts, you have done it well in some parts ,others neglected.\n",
+ " \n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
+ "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
+ },
+ "outputs": [],
+ "source": [
+ "# This Python 3 environment comes with many helpful analytics libraries installed\n",
+ "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
+ "# For example, here's several helpful packages to load in \n",
+ "\n",
+ "#import seaborn as sb\n",
+ "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
+ "\n",
+ "# Input data files are available in the \"../input/\" directory.\n",
+ "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n",
+ "\n",
+ "import os\n",
+ "for dirname, _, filenames in os.walk('/kaggle/input'):\n",
+ " for filename in filenames:\n",
+ " print(os.path.join(dirname, filename))\n",
+ "\n",
+ "# Any results you write to the current directory are saved as output."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Importing Libraries"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
+ "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
+ },
+ "outputs": [],
+ "source": [
+ "###Importing libraries\n",
+ "import pandas\n",
+ "import scipy\n",
+ "import numpy\n",
+ "import matplotlib.pyplot as plt\n",
+ "import sklearn\n",
+ "import seaborn as sns\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading some libraries\n",
+ "### These are some of the libraries I think I will need"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pandas import read_csv #for reading in csv files\n",
+ "from pandas.plotting import scatter_matrix \n",
+ "from matplotlib import pyplot \n",
+ "from sklearn.model_selection import train_test_split \n",
+ "from sklearn.model_selection import cross_val_score \n",
+ "from sklearn.model_selection import StratifiedKFold\n",
+ "from sklearn.metrics import classification_report \n",
+ "from sklearn.metrics import confusion_matrix\n",
+ "from sklearn.metrics import accuracy_score \n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "from sklearn.neighbors import KNeighborsClassifier \n",
+ "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis \n",
+ "from sklearn.naive_bayes import GaussianNB \n",
+ "from sklearn.svm import SVC \n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.linear_model import SGDClassifier\n",
+ "from sklearn.neighbors import NearestCentroid\n",
+ "from sklearn.neural_network import MLPClassifier"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Brief description of the codes above:\n",
+ "#### 1.**read_csv**: for reading in csv files\n",
+ "#### 2.**scatter matrix**: for showing how one variable is affected by another\n",
+ "#### 3.**pyplot** : for plotting graphs\n",
+ "#### 4.**train_test_split**: for splitting my data into train and test\n",
+ "#### 5.**cross_val_score**: to estimate the skill of a machine learning model on unseen data\n",
+ "#### 6.**StratifiedKFold**: the folds are selected so that the mean response value is approximately equal in all the folds. In the case of a dichotomous classification, this means that each fold contains roughly the same proportions of the two types of class labels\n",
+ "#### 7.**classification_report**: Visual classification reports are used to compare classification models to select models that are “redder”, e.g. have stronger classification metrics or that are more balanced.\n",
+ "#### 8.**confusion_matrix**: A confusion matrix is a table that is often used to describe the performance of a classification model (or “classifier”) on a set of test data for which the true values are known. It allows the visualization of the performance of an algorithm.\n",
+ "#### 9.**accuracy_score**: It is the ratio of number of correct predictions to the total number of input samples\n",
+ "#### 10.**LogisticRegression**: an algorithm for classification\n",
+ "#### 11.**DecisionTreeClassifier**: create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n",
+ "#### 12.**KNeighborsClassifier**: for classification\n",
+ "#### 13.**LinearDiscriminantAnalysis**: used for modeling differences in groups i.e. separating two or more classes\n",
+ "#### 14.**GaussianNB**: an algorithm that estimates the mean and the standard deviation from your training data,\n",
+ "#### 15.**SVC**: an algorithm that creates a line or a hyperplane which separates the data into classes\n",
+ "#### 16.**RandomForestClassifier**: Random forests creates decision trees on randomly selected data samples, gets prediction from each tree and selects the best solution by means of voting\n",
+ "#### 17.**SGDClassifier**: Stochastic Gradient Descent Classifier (SGDC) is an incremental Gradient Descent method falling under the broad classification of Supervised Learning Model that helps converge faster and is thus very fast as compared to other iterative models capable of delivering similar performance\n",
+ "#### 18.**NearestCentroid**: assigns to observations the label of the class of training samples whose mean (centroid) is closest to the observation\n",
+ "#### 19.**MLPClassifier**: It can distinguish data that is not linearly separable\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this suprreses unnecesary warnings from my output\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Loading My Dataset\n",
+ "\n",
+ "##### I am going to first use my training dataset, then the test dataset last."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train = pandas.read_csv('/kaggle/input/ace-class-assignment/AMP_TrainSet.csv')#reading in my train dataset\n",
+ "train\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test= pandas.read_csv('/kaggle/input/ace-class-assignment/Test.csv') #reading in my test dataset\n",
+ "test"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Inspecting my train dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.shape #a tuple that gives you an indication of the number of dimensions in the array."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.isnull().sum() ###this will show the number of null values in my data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.count() #returns number of non-null values in my data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### It seems i have no missing values in my data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.describe() #returns summary of the whole data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.info() #It returns range, column, number of non-null objects of each column, datatype and memory usage"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### This shows that my dataset has 3038 rows (instances) and 12 columns (attributes)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### I will also take a look at how many instances i have for each class"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.groupby('CLASS').size()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.groupby('CLASS').size().plot(kind='bar') #i can also show this in a graph form\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I have two groups of classes, each with 1519 instances"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# DATA VISUALISATION"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will start with univariate plots to see each individual variable"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1. HISTOGRAMS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#visualizing using histograms\n",
+ "train.hist(figsize=(16,16))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### These histograms show that FullAcidicMolPerc is exponentially distributed while the rest are have a Gaussian distribution except for NT_EFC195 and CLASS. Histograms also help us identify outliers. From this output, I can say there are no outliers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.corr(method='pearson')['CLASS'] #Here I tried to see the correlation of all attributes with the class"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### According to literature,Pearson’s correlation coefficient is the test statistics that measures the statistical relationship, or association, between two continuous variables. It is known as the best method of measuring the association between variables of interest because it is based on the method of covariance. It gives information about the magnitude of the association, or correlation, as well as the direction of the relationship.\n",
+ "\n",
+ "### So from the above results, i can see that most attributes have a negative correlation with the class. Only two have a high degree of correlation as they are between +o.5 and +1.0. AS_FUKS010112 has moderate corrlation as the range is between 0.30-0.49"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Multivariate "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#plotting a heatmap to show correlation of data\n",
+ "pyplot.figure(figsize=(10,10))\n",
+ "sns.heatmap(train.corr(method='pearson'))\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### i did this plot in order to see which features are highly correlated as this can be a problem in soome models if some features are used together whereas they are highly correlated."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#scatter plot\n",
+ "\n",
+ "import seaborn as sns\n",
+ "sns.pairplot(train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### A scatter plot shows the relationship between two variables as dots in two dimensions. So from this output, i can be able to see the relationship between variables. If they show a good correlation, then they ccan be removed in feature selection."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EVALUATING ALGORITHMS\n",
+ "#### I will now evaluate some algorithms and estimate their accuracy on unseen data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Building models"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will first split my train data into test and train, so that I test the effectiveness of my model using the test data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values #first create a variable for extracting the values from the train dataset to be used\n",
+ "X = array[:,0:11] #selecting which columns to use, in this case all of them\n",
+ "Y = array[:,11] #selecting the label for our data, which is the last column\n",
+ "test_size = 0.32 #this is the size of my test data, meaning my train data is 68%\n",
+ "seed = 3 #this is to initialize the random generator, to ensure i get the same numbers each time.\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## IMPORTING MODELS\n",
+ "\n",
+ "#### I will now use the models I imported in the beginning from sklearn to use for my algorithm."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "from sklearn.ensemble import GradientBoostingClassifier\n",
+ "models = []\n",
+ "models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))\n",
+ "models.append(('LDA', LinearDiscriminantAnalysis()))\n",
+ "models.append(('KNN', KNeighborsClassifier()))\n",
+ "models.append(('CART', DecisionTreeClassifier()))\n",
+ "models.append(('NB', GaussianNB()))\n",
+ "models.append(('SVM', SVC(gamma='auto')))\n",
+ "models.append(('RTC', RandomForestClassifier()))\n",
+ "models.append(('SGD',SGDClassifier()))\n",
+ "models.append(('NC', NearestCentroid()))\n",
+ "models.append(('MLPC',MLPClassifier()))\n",
+ "models.append(('GBC', GradientBoostingClassifier()))\n",
+ "# evaluate each model in turn\n",
+ "results = []\n",
+ "names = []\n",
+ "for name, model in models:\n",
+ " kfold = StratifiedKFold(n_splits=10)\n",
+ " cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')\n",
+ " results.append(cv_results)\n",
+ " names.append(name)\n",
+ " print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Compare Algorithms\n",
+ "pyplot.boxplot(results, labels=names)\n",
+ "pyplot.title('Algorithm Comparison')\n",
+ "pyplot.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### from here, RTC is the best performing, followed by gradient boosting then NB.\n",
+ "\n",
+ "### Irecently added Gradient boosting. It relies on the intuition that the best possible next model, when combined with previous models, minimizes the overall prediction error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(NB)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(RTC)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### The MCC gives a score close to 100."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make predictions on validation dataset, using my selected model from above(GBC)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "from sklearn.metrics import matthews_corrcoef\n",
+ "print('MCC', matthews_corrcoef(model.predict(X_test), Y_test))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### I will now test the performance of my model first using all the features, then with some selected ones to see if my performance increases or decreases with either the addition of or dropping of some features.\n",
+ "#### I started with all features because my features are not that much for me to consider dropping."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gives me a good score of 93.6%. I will now try selecting some features based on feature importance."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This will be my first submission. It gave me a score of 99%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y=train.CLASS\n",
+ "X=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X, Y).predict(test.values)\n",
+ "OUTPUT_1=pandas.DataFrame(OUTPUT)\n",
+ "OUTPUT_1.columns=[\"CLASS\"]\n",
+ "OUTPUT_1.index.name=\"Index\"\n",
+ "OUTPUT_1[\"CLASS\"]=OUTPUT_1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_1.to_csv(\"output\") #converting my output file into a csv\n",
+ "print(OUTPUT_1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#feature selection using feature importance\n",
+ "X = train.iloc[:,0:11] #independent columns\n",
+ "y = train.iloc[:,-1] #target column\n",
+ "from sklearn.ensemble import ExtraTreesClassifier\n",
+ "import matplotlib.pyplot as plt\n",
+ "model = ExtraTreesClassifier()\n",
+ "model.fit(X,y)\n",
+ "print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers\n",
+ "#plot graph of feature importances for better visualization\n",
+ "feat_importances = pd.Series(model.feature_importances_, index=X.columns)\n",
+ "feat_importances.nlargest(10).plot(kind='barh')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### I will select the features with the highest bars. The number of features selected will depend on the accuracy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"out1\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### This gave me a score of 85%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#this is how i checked the accuracy from the features selected\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#i will now select 6 features to see if my score improves\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,1,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### the accuracy deacreases. let me try 4 features instead"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "array = train.values\n",
+ "X = array[:,[1,2,3,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GaussianNB()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### accuracy deacreases even further. so if i weere to feature select, I would use 5 features because they give me the best accuracy."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Let me try the RTC model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### this actually gives me a better score than the one from GaussianNB. Let me submit it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Evaluate predictions\n",
+ "print(accuracy_score(Y_test, predictions))\n",
+ "print(confusion_matrix(Y_test, predictions))\n",
+ "print(classification_report(Y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new2=train.CLASS\n",
+ "X_new2=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT2=model.fit(X_new2, Y_new2).predict(test.values)\n",
+ "OUTPUT_new1=pd.DataFrame(OUTPUT2)\n",
+ "OUTPUT_new1.columns=[\"CLASS\"]\n",
+ "OUTPUT_new1.index.name=\"Index\"\n",
+ "OUTPUT_new1[\"CLASS\"]=OUTPUT_new1[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new1.to_csv(\"outputRTC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new1[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new1[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new1.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 83%. let me feature select the 5 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = RandomForestClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### this gives me a lower score than when all features are selected. So i will stop here."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### GBC "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#with all features\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "\n",
+ "array = train.values\n",
+ "X = array[:,0:11]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#submission with all features\n",
+ "Y_new4=train.CLASS\n",
+ "X_new4=train.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT4=model.fit(X_new4, Y_new4).predict(test.values)\n",
+ "OUTPUT_new4=pd.DataFrame(OUTPUT4)\n",
+ "OUTPUT_new4.columns=[\"CLASS\"]\n",
+ "OUTPUT_new4.index.name=\"Index\"\n",
+ "OUTPUT_new4[\"CLASS\"]=OUTPUT_new4[\"CLASS\"].map({0.0:False,1.0:True}) #changing 0 values to False, 1 to True\n",
+ "OUTPUT_new4.to_csv(\"outputGBC\") #converting my output file into a csv\n",
+ "print(OUTPUT_new4[\"CLASS\"].unique()) #printing out the unique values, i expect to get 2\n",
+ "print(OUTPUT_new4[\"CLASS\"].nunique()) #the sum of unique values\n",
+ "print(OUTPUT_new4.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new4.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### This gave me a score of 82%"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ " \n",
+ "array = train.values\n",
+ "X = array[:,[0,2,3,5,7]]\n",
+ "Y = array[:,11]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)\n",
+ "model = GradientBoostingClassifier()\n",
+ "model.fit(X_train, Y_train)\n",
+ "result = model.score(X_test, Y_test)\n",
+ "print(\"Accuracy: \", (result*100.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### i get accuracy of 92,4 if i choose 5 features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#submission with dropped\n",
+ "train.columns\n",
+ "newtrain2=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest2=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array2 = newtrain2.values\n",
+ "X2 = array2[:,0:5]\n",
+ "Y2 = array2[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X2, Y2, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train.columns\n",
+ "newtrain=train.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "newtest=test.drop([ 'FULL_AURR980107', 'FULL_OOBM850104', 'NT_EFC195', 'AS_DAYM780201', 'AS_FUKS010112', 'CT_RACS820104'], axis=1)\n",
+ "array = newtrain.values\n",
+ "X = array[:,0:5]\n",
+ "Y = array[:,-1]\n",
+ "test_size = 0.32\n",
+ "seed = 3\n",
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,\n",
+ "random_state=seed)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_new=newtrain.CLASS\n",
+ "X_new=newtrain.drop(\"CLASS\",axis=1)\n",
+ "OUTPUT=model.fit(X_new, Y_new).predict(newtest.values)\n",
+ "OUTPUT_new=pd.DataFrame(OUTPUT)\n",
+ "OUTPUT_new.columns=[\"CLASS\"]\n",
+ "OUTPUT_new.index.name=\"Index\"\n",
+ "OUTPUT_new[\"CLASS\"]=OUTPUT_new[\"CLASS\"].map({0.0:False,1.0:True})\n",
+ "OUTPUT_new.to_csv(\"RTC_DROP\")\n",
+ "print(OUTPUT_new[\"CLASS\"].unique())\n",
+ "print(OUTPUT_new[\"CLASS\"].nunique())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[0].sum())\n",
+ "print(OUTPUT_new.groupby(\"CLASS\").size()[1].sum())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### GBC gave me a score of 81%"
+ ]
+ }
+ ],
+ "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.7.4"
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Reading Material/Pandas Cookbook/Pandas-Cookbook b/Reading Material/Pandas Cookbook/Pandas-Cookbook
new file mode 160000
index 0000000..b45d95c
--- /dev/null
+++ b/Reading Material/Pandas Cookbook/Pandas-Cookbook
@@ -0,0 +1 @@
+Subproject commit b45d95ccef24b020fdf28ecb5a07e3348bee62f1