From c5dacdf2ca5335ca28be49cf79b3411ce4717892 Mon Sep 17 00:00:00 2001 From: Senamile Fezile Dlamini <60500625+senadee@users.noreply.github.com> Date: Tue, 10 Mar 2020 06:05:40 -0700 Subject: [PATCH 1/5] Add files via upload --- Assignment Colab/Fezile Dlamini (2).ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 Assignment Colab/Fezile Dlamini (2).ipynb diff --git a/Assignment Colab/Fezile Dlamini (2).ipynb b/Assignment Colab/Fezile Dlamini (2).ipynb new file mode 100644 index 0000000..621f6a8 --- /dev/null +++ b/Assignment Colab/Fezile Dlamini (2).ipynb @@ -0,0 +1 @@ +{"cells":[{"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\nimport numpy as np # linear algebra\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\nimport sklearn\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 #for showing how one variable is affected by another\nfrom matplotlib import pyplot #for plotting graphs\nfrom sklearn.model_selection import train_test_split # for splitting my data into train and test\nfrom sklearn.model_selection import cross_val_score #to estimate the skill of a machine learning model on unseen data\nfrom 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\nfrom 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.\nfrom 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.\nfrom sklearn.metrics import accuracy_score #It is the ratio of number of correct predictions to the total number of input samples\nfrom sklearn.linear_model import LogisticRegression #an algorithm for classification\nfrom 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.\nfrom sklearn.neighbors import KNeighborsClassifier #for classification\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis #used for modeling differences in groups i.e. separating two or more classes\nfrom sklearn.naive_bayes import GaussianNB #an algorithm that estimates the mean and the standard deviation from your training data,\nfrom sklearn.svm import SVC #an algorithm that creates a line or a hyperplane which separates the data into classes\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":{"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":{"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":"## 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\n#### I 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. So everytime i run this with a different seed number, i will get a different output\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\n#### I will now use the models I imported in the beginning from sklearn to use for my algorithm."},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\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()))\n# evaluate each model in turn\nresults = []\nnames = []\nfor 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 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Compare Algorithms\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 NB."},{"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":{},"cell_type":"markdown","source":"#### I will now test the performance of my model first using all the features, then with some selected ones"},{"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=pd.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":{"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 From 091a05de0eb4870b1d5d0867cb9684f94a5616c6 Mon Sep 17 00:00:00 2001 From: Atwine Date: Tue, 10 Mar 2020 17:51:28 +0300 Subject: [PATCH 2/5] Make corrections --- .../Fezile Dlamini (2)-checkpoint.ipynb | 3695 ++++++++++++++++ Assignment Colab/Fezile Dlamini (2).ipynb | 3696 ++++++++++++++++- .../Pandas Cookbook/Pandas-Cookbook | 1 + 3 files changed, 7391 insertions(+), 1 deletion(-) create mode 100644 Assignment Colab/.ipynb_checkpoints/Fezile Dlamini (2)-checkpoint.ipynb create mode 160000 Reading Material/Pandas Cookbook/Pandas-Cookbook diff --git a/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini (2)-checkpoint.ipynb b/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini (2)-checkpoint.ipynb new file mode 100644 index 0000000..8c8fc2d --- /dev/null +++ b/Assignment Colab/.ipynb_checkpoints/Fezile Dlamini (2)-checkpoint.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", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104CLASS
05.00.0000.95174.8420.975-3.66300.28273.4445.6611.0411
14.05.4050.93171.5950.957-4.01110.60068.2226.5371.4531
25.55.4050.87373.5950.961-2.51200.59369.4444.9341.7221
35.04.1670.89566.2500.999-1.36200.61467.2224.3161.3821
47.58.5370.93264.7200.979-2.09100.61672.9444.5401.5391
55.07.6921.03078.9490.976-3.09110.51178.7785.9921.0911
63.06.8970.93078.5860.957-3.54410.38578.2226.2841.4671
72.05.8820.86876.5880.949-5.83200.15476.5886.4791.0861
87.02.6320.85760.4471.012-0.29200.18864.3333.8491.9251
99.00.0000.91165.8081.049-3.88800.36163.2226.3271.2161
102.03.4480.99171.1720.990-3.71200.51076.3895.4021.2851
112.50.0000.96060.5790.998-1.36100.16361.6675.6271.0551
123.00.0000.84870.8750.967-3.60310.26371.6116.8041.0291
133.07.1430.88571.3570.955-4.33010.23272.7786.7261.4451
142.57.6920.95360.7691.021-3.64100.40260.7697.1121.0281
156.04.3480.84267.8700.980-1.43200.18765.1675.2381.4381
162.00.0000.83873.8420.990-4.92800.53675.6676.9961.0711
174.00.0000.89064.0830.993-4.97700.82665.9446.0381.4421
184.511.1111.03277.1851.020-0.69401.10078.4446.1411.3341
192.04.1670.92568.6670.997-3.12701.21066.9446.1491.1651
202.06.6670.95568.2330.961-3.32701.30473.5006.6041.3921
213.010.3451.07272.0000.974-4.70401.72661.0565.7220.8901
223.52.7030.98672.9190.967-3.62811.71770.8336.6691.4451
231.00.0000.84552.7691.037-4.65802.83452.7697.4261.0241
241.00.0000.83863.2311.048-4.06002.98063.2316.9421.1321
255.54.3480.96058.9130.994-4.75602.13863.4447.5460.9791
266.50.0000.94163.9171.030-3.42102.43562.0566.8011.2101
271.05.5560.88074.8330.977-3.87812.04474.8336.6441.1431
286.50.0000.97366.5000.995-4.23402.70469.4445.6731.1431
297.58.3330.93669.3750.989-1.76502.74365.8895.2421.5591
.......................................
3008-6.020.0001.07383.6861.000-1.426015.45281.7226.5661.0930
3009-1.022.5001.09977.7001.001-0.214015.62578.3335.7471.1130
30101.012.5000.96379.7080.980-1.255015.50275.5565.5581.0360
30110.05.2630.95773.0790.991-1.528015.67670.5565.7231.0790
3012-3.019.6081.14483.4121.015-1.029015.81375.1116.3781.1680
3013-1.012.2450.99176.1220.985-1.688015.77478.2786.3741.1530
3014-1.016.6671.13880.2500.993-0.350023.50280.2505.3251.2070
30152.010.8110.94667.5140.985-2.240015.97465.9445.1691.1740
3016-1.08.3330.94271.0001.017-1.488023.55071.0005.0171.3910
30170.010.2561.00980.0771.003-1.074015.78180.1676.1491.1070
30180.018.7501.18188.2500.998-1.314017.66688.2506.3831.1330
3019-0.516.6671.06177.7291.000-1.155015.83880.1116.1381.0380
30200.511.4291.05977.6571.008-0.905015.86774.1675.5231.0880
30211.011.5381.01578.0381.037-0.200016.20979.9445.2671.0440
30223.00.0000.95866.7691.036-0.173022.47766.7696.0681.3790
30232.012.0001.00475.8671.001-1.416016.44474.1115.6111.1620
30243.520.0001.01573.0500.991-2.797016.49574.9446.6061.1410
30252.510.7140.93378.0710.966-2.887016.51382.0565.7321.1140
30260.50.0000.86081.5450.995-0.618026.93181.5455.1201.2050
30279.07.5470.92677.2830.998-3.418016.51778.1115.4511.1810
3028-2.018.7501.28979.9381.0281.094018.11979.9386.2411.0600
30294.514.2861.05869.1430.995-1.085020.62569.1435.7691.2000
30302.012.9630.99972.8150.985-3.446016.25665.7226.3781.3400
30310.017.0211.04576.2340.993-2.268016.36577.2785.8211.1160
30320.016.6671.08182.9171.001-2.073024.49782.9175.6401.1850
30331.05.2630.94567.9471.006-2.151016.70668.6115.5981.1440
3034-6.521.6671.13375.4331.015-1.675016.89773.2786.1941.6390
3035-1.512.5001.09176.5420.991-0.918016.91882.1115.8891.1310
30362.05.0000.84973.7501.017-2.722017.13174.7226.0551.2700
3037-1.015.7891.06666.1580.998-2.080017.15167.1115.8531.1360
\n", + "

3038 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "0 5.0 0.000 0.951 74.842 \n", + "1 4.0 5.405 0.931 71.595 \n", + "2 5.5 5.405 0.873 73.595 \n", + "3 5.0 4.167 0.895 66.250 \n", + "4 7.5 8.537 0.932 64.720 \n", + "5 5.0 7.692 1.030 78.949 \n", + "6 3.0 6.897 0.930 78.586 \n", + "7 2.0 5.882 0.868 76.588 \n", + "8 7.0 2.632 0.857 60.447 \n", + "9 9.0 0.000 0.911 65.808 \n", + "10 2.0 3.448 0.991 71.172 \n", + "11 2.5 0.000 0.960 60.579 \n", + "12 3.0 0.000 0.848 70.875 \n", + "13 3.0 7.143 0.885 71.357 \n", + "14 2.5 7.692 0.953 60.769 \n", + "15 6.0 4.348 0.842 67.870 \n", + "16 2.0 0.000 0.838 73.842 \n", + "17 4.0 0.000 0.890 64.083 \n", + "18 4.5 11.111 1.032 77.185 \n", + "19 2.0 4.167 0.925 68.667 \n", + "20 2.0 6.667 0.955 68.233 \n", + "21 3.0 10.345 1.072 72.000 \n", + "22 3.5 2.703 0.986 72.919 \n", + "23 1.0 0.000 0.845 52.769 \n", + "24 1.0 0.000 0.838 63.231 \n", + "25 5.5 4.348 0.960 58.913 \n", + "26 6.5 0.000 0.941 63.917 \n", + "27 1.0 5.556 0.880 74.833 \n", + "28 6.5 0.000 0.973 66.500 \n", + "29 7.5 8.333 0.936 69.375 \n", + "... ... ... ... ... \n", + "3008 -6.0 20.000 1.073 83.686 \n", + "3009 -1.0 22.500 1.099 77.700 \n", + "3010 1.0 12.500 0.963 79.708 \n", + "3011 0.0 5.263 0.957 73.079 \n", + "3012 -3.0 19.608 1.144 83.412 \n", + "3013 -1.0 12.245 0.991 76.122 \n", + "3014 -1.0 16.667 1.138 80.250 \n", + "3015 2.0 10.811 0.946 67.514 \n", + "3016 -1.0 8.333 0.942 71.000 \n", + "3017 0.0 10.256 1.009 80.077 \n", + "3018 0.0 18.750 1.181 88.250 \n", + "3019 -0.5 16.667 1.061 77.729 \n", + "3020 0.5 11.429 1.059 77.657 \n", + "3021 1.0 11.538 1.015 78.038 \n", + "3022 3.0 0.000 0.958 66.769 \n", + "3023 2.0 12.000 1.004 75.867 \n", + "3024 3.5 20.000 1.015 73.050 \n", + "3025 2.5 10.714 0.933 78.071 \n", + "3026 0.5 0.000 0.860 81.545 \n", + "3027 9.0 7.547 0.926 77.283 \n", + "3028 -2.0 18.750 1.289 79.938 \n", + "3029 4.5 14.286 1.058 69.143 \n", + "3030 2.0 12.963 0.999 72.815 \n", + "3031 0.0 17.021 1.045 76.234 \n", + "3032 0.0 16.667 1.081 82.917 \n", + "3033 1.0 5.263 0.945 67.947 \n", + "3034 -6.5 21.667 1.133 75.433 \n", + "3035 -1.5 12.500 1.091 76.542 \n", + "3036 2.0 5.000 0.849 73.750 \n", + "3037 -1.0 15.789 1.066 66.158 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "0 0.975 -3.663 0 0.282 \n", + "1 0.957 -4.011 1 0.600 \n", + "2 0.961 -2.512 0 0.593 \n", + "3 0.999 -1.362 0 0.614 \n", + "4 0.979 -2.091 0 0.616 \n", + "5 0.976 -3.091 1 0.511 \n", + "6 0.957 -3.544 1 0.385 \n", + "7 0.949 -5.832 0 0.154 \n", + "8 1.012 -0.292 0 0.188 \n", + "9 1.049 -3.888 0 0.361 \n", + "10 0.990 -3.712 0 0.510 \n", + "11 0.998 -1.361 0 0.163 \n", + "12 0.967 -3.603 1 0.263 \n", + "13 0.955 -4.330 1 0.232 \n", + "14 1.021 -3.641 0 0.402 \n", + "15 0.980 -1.432 0 0.187 \n", + "16 0.990 -4.928 0 0.536 \n", + "17 0.993 -4.977 0 0.826 \n", + "18 1.020 -0.694 0 1.100 \n", + "19 0.997 -3.127 0 1.210 \n", + "20 0.961 -3.327 0 1.304 \n", + "21 0.974 -4.704 0 1.726 \n", + "22 0.967 -3.628 1 1.717 \n", + "23 1.037 -4.658 0 2.834 \n", + "24 1.048 -4.060 0 2.980 \n", + "25 0.994 -4.756 0 2.138 \n", + "26 1.030 -3.421 0 2.435 \n", + "27 0.977 -3.878 1 2.044 \n", + "28 0.995 -4.234 0 2.704 \n", + "29 0.989 -1.765 0 2.743 \n", + "... ... ... ... ... \n", + "3008 1.000 -1.426 0 15.452 \n", + "3009 1.001 -0.214 0 15.625 \n", + "3010 0.980 -1.255 0 15.502 \n", + "3011 0.991 -1.528 0 15.676 \n", + "3012 1.015 -1.029 0 15.813 \n", + "3013 0.985 -1.688 0 15.774 \n", + "3014 0.993 -0.350 0 23.502 \n", + "3015 0.985 -2.240 0 15.974 \n", + "3016 1.017 -1.488 0 23.550 \n", + "3017 1.003 -1.074 0 15.781 \n", + "3018 0.998 -1.314 0 17.666 \n", + "3019 1.000 -1.155 0 15.838 \n", + "3020 1.008 -0.905 0 15.867 \n", + "3021 1.037 -0.200 0 16.209 \n", + "3022 1.036 -0.173 0 22.477 \n", + "3023 1.001 -1.416 0 16.444 \n", + "3024 0.991 -2.797 0 16.495 \n", + "3025 0.966 -2.887 0 16.513 \n", + "3026 0.995 -0.618 0 26.931 \n", + "3027 0.998 -3.418 0 16.517 \n", + "3028 1.028 1.094 0 18.119 \n", + "3029 0.995 -1.085 0 20.625 \n", + "3030 0.985 -3.446 0 16.256 \n", + "3031 0.993 -2.268 0 16.365 \n", + "3032 1.001 -2.073 0 24.497 \n", + "3033 1.006 -2.151 0 16.706 \n", + "3034 1.015 -1.675 0 16.897 \n", + "3035 0.991 -0.918 0 16.918 \n", + "3036 1.017 -2.722 0 17.131 \n", + "3037 0.998 -2.080 0 17.151 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 CLASS \n", + "0 73.444 5.661 1.041 1 \n", + "1 68.222 6.537 1.453 1 \n", + "2 69.444 4.934 1.722 1 \n", + "3 67.222 4.316 1.382 1 \n", + "4 72.944 4.540 1.539 1 \n", + "5 78.778 5.992 1.091 1 \n", + "6 78.222 6.284 1.467 1 \n", + "7 76.588 6.479 1.086 1 \n", + "8 64.333 3.849 1.925 1 \n", + "9 63.222 6.327 1.216 1 \n", + "10 76.389 5.402 1.285 1 \n", + "11 61.667 5.627 1.055 1 \n", + "12 71.611 6.804 1.029 1 \n", + "13 72.778 6.726 1.445 1 \n", + "14 60.769 7.112 1.028 1 \n", + "15 65.167 5.238 1.438 1 \n", + "16 75.667 6.996 1.071 1 \n", + "17 65.944 6.038 1.442 1 \n", + "18 78.444 6.141 1.334 1 \n", + "19 66.944 6.149 1.165 1 \n", + "20 73.500 6.604 1.392 1 \n", + "21 61.056 5.722 0.890 1 \n", + "22 70.833 6.669 1.445 1 \n", + "23 52.769 7.426 1.024 1 \n", + "24 63.231 6.942 1.132 1 \n", + "25 63.444 7.546 0.979 1 \n", + "26 62.056 6.801 1.210 1 \n", + "27 74.833 6.644 1.143 1 \n", + "28 69.444 5.673 1.143 1 \n", + "29 65.889 5.242 1.559 1 \n", + "... ... ... ... ... \n", + "3008 81.722 6.566 1.093 0 \n", + "3009 78.333 5.747 1.113 0 \n", + "3010 75.556 5.558 1.036 0 \n", + "3011 70.556 5.723 1.079 0 \n", + "3012 75.111 6.378 1.168 0 \n", + "3013 78.278 6.374 1.153 0 \n", + "3014 80.250 5.325 1.207 0 \n", + "3015 65.944 5.169 1.174 0 \n", + "3016 71.000 5.017 1.391 0 \n", + "3017 80.167 6.149 1.107 0 \n", + "3018 88.250 6.383 1.133 0 \n", + "3019 80.111 6.138 1.038 0 \n", + "3020 74.167 5.523 1.088 0 \n", + "3021 79.944 5.267 1.044 0 \n", + "3022 66.769 6.068 1.379 0 \n", + "3023 74.111 5.611 1.162 0 \n", + "3024 74.944 6.606 1.141 0 \n", + "3025 82.056 5.732 1.114 0 \n", + "3026 81.545 5.120 1.205 0 \n", + "3027 78.111 5.451 1.181 0 \n", + "3028 79.938 6.241 1.060 0 \n", + "3029 69.143 5.769 1.200 0 \n", + "3030 65.722 6.378 1.340 0 \n", + "3031 77.278 5.821 1.116 0 \n", + "3032 82.917 5.640 1.185 0 \n", + "3033 68.611 5.598 1.144 0 \n", + "3034 73.278 6.194 1.639 0 \n", + "3035 82.111 5.889 1.131 0 \n", + "3036 74.722 6.055 1.270 0 \n", + "3037 67.111 5.853 1.136 0 \n", + "\n", + "[3038 rows x 12 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train = pandas.read_csv('../AMP Data Sets/AMP_TrainSet.csv')#reading in my train dataset\n", + "train\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104
04.03.7040.87373.5190.987-4.83300.38274.5567.2251.234
14.04.4440.89262.4440.931-0.58400.32056.0564.9421.853
22.00.0000.90147.0001.039-5.66400.16447.0005.9691.174
34.50.0000.86969.2220.982-5.42302.01069.2225.4621.138
4-4.021.5911.06171.6820.976-2.00202.75866.0005.5821.453
54.56.9770.89568.5120.950-1.87803.09072.0005.7791.844
612.03.1751.02274.4601.010-3.22503.17276.7225.6641.215
71.53.7040.93269.5190.977-2.50902.54372.0004.2511.560
83.03.3330.90359.5000.963-1.68202.99066.0005.1751.514
94.00.0000.87372.7920.998-4.94302.98577.4445.6261.621
1011.08.2190.92775.0680.989-3.11803.49376.3896.0471.126
114.52.7030.96669.7570.972-3.89613.71476.4445.4921.445
120.011.5381.02777.9230.981-3.95413.67978.0567.2221.054
136.03.3331.11479.1001.024-2.43703.98875.5566.6671.079
140.00.0001.00578.9711.1021.54404.14378.5564.4721.280
153.06.0610.89776.4550.955-4.03214.31081.2226.2071.506
163.02.1280.88964.0641.0000.58304.09774.6675.0971.302
179.50.0000.78655.6470.955-0.57703.81661.6674.8292.026
181.512.0000.94870.7200.956-3.55913.98266.5007.0241.050
194.00.0000.82854.8751.048-2.85304.29354.8755.2291.651
205.03.1250.90169.5940.995-1.67703.87658.5005.2781.486
211.50.0000.87267.2000.972-5.39204.47167.2006.5240.986
222.00.0000.78664.1500.969-4.70603.92963.7226.9411.040
238.00.0000.93362.8001.008-4.17004.10462.6674.8701.547
243.010.8111.08677.1081.010-2.11204.20878.0565.7481.249
254.02.9410.90071.2060.967-3.96304.12672.6116.8281.507
2610.00.0000.84569.5110.975-2.04903.97770.7224.8911.543
275.50.0000.94671.6671.023-4.98203.43971.6675.9531.108
289.00.0000.82254.5450.993-3.95503.56255.5006.0861.114
29-6.038.2351.23983.5591.0020.10813.31791.5005.7231.055
....................................
7281.04.1670.93167.8330.936-0.775014.99368.6676.0471.125
7291.07.4070.93081.2590.985-2.859014.99380.7786.0121.051
7300.025.0001.11979.6671.023-0.379014.98677.6676.0421.137
731-2.017.5001.06884.1000.995-1.328014.94390.0006.0811.484
7321.04.5450.83085.0910.996-3.729014.98285.8335.6121.165
7331.011.5381.05070.8851.015-2.530014.98175.7225.3371.327
7340.013.3330.92572.5330.993-2.093018.27972.5335.5251.147
7350.511.1111.13580.7781.034-1.448014.95180.7785.4111.079
736-0.513.3330.95775.2000.969-1.257017.79975.2005.9391.150
7375.010.2040.94778.1840.986-3.313015.30077.1116.2391.050
738-1.019.2311.06591.0771.0040.520015.21495.6115.3691.276
739-1.517.6471.11982.1471.005-1.477015.32181.3335.7711.016
7406.53.7040.90976.1111.009-2.840015.66679.2226.0231.242
7415.00.0000.83680.0970.973-2.795015.11082.6115.9231.245
742-3.513.3331.11575.2891.027-1.292015.05880.3895.8091.300
7434.08.3330.92879.0000.960-3.607015.09180.9445.4171.316
74410.517.0001.09182.1601.003-2.414015.27074.9445.6011.053
7455.512.8210.99667.5130.991-4.674014.98967.9446.9281.166
746-2.019.0481.03085.3330.969-1.162015.45886.5006.2841.156
747-2.520.5131.09982.7951.014-0.965015.71586.3335.5891.127
748-2.025.0001.17886.4171.0131.322022.98986.4175.5841.228
749-4.021.8751.02166.1880.994-0.523015.49971.2225.9391.080
7502.00.0001.05486.4621.051-0.815020.86686.4625.7121.298
751-2.014.8941.04283.2550.978-1.303015.26085.1675.7181.164
752-8.028.2611.22182.1091.014-0.153015.35581.1676.9040.933
753-1.516.0001.10082.8200.991-1.987015.18585.3337.0531.325
754-1.018.1821.08573.4551.027-0.745016.55074.6676.7291.132
755-1.019.0481.10882.1901.033-1.789016.11279.6676.0361.219
756-1.07.1430.95576.7861.0231.141020.63076.7865.6691.111
757-7.017.1431.07884.1861.009-0.066017.16876.6116.6881.305
\n", + "

758 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "0 4.0 3.704 0.873 73.519 \n", + "1 4.0 4.444 0.892 62.444 \n", + "2 2.0 0.000 0.901 47.000 \n", + "3 4.5 0.000 0.869 69.222 \n", + "4 -4.0 21.591 1.061 71.682 \n", + "5 4.5 6.977 0.895 68.512 \n", + "6 12.0 3.175 1.022 74.460 \n", + "7 1.5 3.704 0.932 69.519 \n", + "8 3.0 3.333 0.903 59.500 \n", + "9 4.0 0.000 0.873 72.792 \n", + "10 11.0 8.219 0.927 75.068 \n", + "11 4.5 2.703 0.966 69.757 \n", + "12 0.0 11.538 1.027 77.923 \n", + "13 6.0 3.333 1.114 79.100 \n", + "14 0.0 0.000 1.005 78.971 \n", + "15 3.0 6.061 0.897 76.455 \n", + "16 3.0 2.128 0.889 64.064 \n", + "17 9.5 0.000 0.786 55.647 \n", + "18 1.5 12.000 0.948 70.720 \n", + "19 4.0 0.000 0.828 54.875 \n", + "20 5.0 3.125 0.901 69.594 \n", + "21 1.5 0.000 0.872 67.200 \n", + "22 2.0 0.000 0.786 64.150 \n", + "23 8.0 0.000 0.933 62.800 \n", + "24 3.0 10.811 1.086 77.108 \n", + "25 4.0 2.941 0.900 71.206 \n", + "26 10.0 0.000 0.845 69.511 \n", + "27 5.5 0.000 0.946 71.667 \n", + "28 9.0 0.000 0.822 54.545 \n", + "29 -6.0 38.235 1.239 83.559 \n", + ".. ... ... ... ... \n", + "728 1.0 4.167 0.931 67.833 \n", + "729 1.0 7.407 0.930 81.259 \n", + "730 0.0 25.000 1.119 79.667 \n", + "731 -2.0 17.500 1.068 84.100 \n", + "732 1.0 4.545 0.830 85.091 \n", + "733 1.0 11.538 1.050 70.885 \n", + "734 0.0 13.333 0.925 72.533 \n", + "735 0.5 11.111 1.135 80.778 \n", + "736 -0.5 13.333 0.957 75.200 \n", + "737 5.0 10.204 0.947 78.184 \n", + "738 -1.0 19.231 1.065 91.077 \n", + "739 -1.5 17.647 1.119 82.147 \n", + "740 6.5 3.704 0.909 76.111 \n", + "741 5.0 0.000 0.836 80.097 \n", + "742 -3.5 13.333 1.115 75.289 \n", + "743 4.0 8.333 0.928 79.000 \n", + "744 10.5 17.000 1.091 82.160 \n", + "745 5.5 12.821 0.996 67.513 \n", + "746 -2.0 19.048 1.030 85.333 \n", + "747 -2.5 20.513 1.099 82.795 \n", + "748 -2.0 25.000 1.178 86.417 \n", + "749 -4.0 21.875 1.021 66.188 \n", + "750 2.0 0.000 1.054 86.462 \n", + "751 -2.0 14.894 1.042 83.255 \n", + "752 -8.0 28.261 1.221 82.109 \n", + "753 -1.5 16.000 1.100 82.820 \n", + "754 -1.0 18.182 1.085 73.455 \n", + "755 -1.0 19.048 1.108 82.190 \n", + "756 -1.0 7.143 0.955 76.786 \n", + "757 -7.0 17.143 1.078 84.186 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "0 0.987 -4.833 0 0.382 \n", + "1 0.931 -0.584 0 0.320 \n", + "2 1.039 -5.664 0 0.164 \n", + "3 0.982 -5.423 0 2.010 \n", + "4 0.976 -2.002 0 2.758 \n", + "5 0.950 -1.878 0 3.090 \n", + "6 1.010 -3.225 0 3.172 \n", + "7 0.977 -2.509 0 2.543 \n", + "8 0.963 -1.682 0 2.990 \n", + "9 0.998 -4.943 0 2.985 \n", + "10 0.989 -3.118 0 3.493 \n", + "11 0.972 -3.896 1 3.714 \n", + "12 0.981 -3.954 1 3.679 \n", + "13 1.024 -2.437 0 3.988 \n", + "14 1.102 1.544 0 4.143 \n", + "15 0.955 -4.032 1 4.310 \n", + "16 1.000 0.583 0 4.097 \n", + "17 0.955 -0.577 0 3.816 \n", + "18 0.956 -3.559 1 3.982 \n", + "19 1.048 -2.853 0 4.293 \n", + "20 0.995 -1.677 0 3.876 \n", + "21 0.972 -5.392 0 4.471 \n", + "22 0.969 -4.706 0 3.929 \n", + "23 1.008 -4.170 0 4.104 \n", + "24 1.010 -2.112 0 4.208 \n", + "25 0.967 -3.963 0 4.126 \n", + "26 0.975 -2.049 0 3.977 \n", + "27 1.023 -4.982 0 3.439 \n", + "28 0.993 -3.955 0 3.562 \n", + "29 1.002 0.108 1 3.317 \n", + ".. ... ... ... ... \n", + "728 0.936 -0.775 0 14.993 \n", + "729 0.985 -2.859 0 14.993 \n", + "730 1.023 -0.379 0 14.986 \n", + "731 0.995 -1.328 0 14.943 \n", + "732 0.996 -3.729 0 14.982 \n", + "733 1.015 -2.530 0 14.981 \n", + "734 0.993 -2.093 0 18.279 \n", + "735 1.034 -1.448 0 14.951 \n", + "736 0.969 -1.257 0 17.799 \n", + "737 0.986 -3.313 0 15.300 \n", + "738 1.004 0.520 0 15.214 \n", + "739 1.005 -1.477 0 15.321 \n", + "740 1.009 -2.840 0 15.666 \n", + "741 0.973 -2.795 0 15.110 \n", + "742 1.027 -1.292 0 15.058 \n", + "743 0.960 -3.607 0 15.091 \n", + "744 1.003 -2.414 0 15.270 \n", + "745 0.991 -4.674 0 14.989 \n", + "746 0.969 -1.162 0 15.458 \n", + "747 1.014 -0.965 0 15.715 \n", + "748 1.013 1.322 0 22.989 \n", + "749 0.994 -0.523 0 15.499 \n", + "750 1.051 -0.815 0 20.866 \n", + "751 0.978 -1.303 0 15.260 \n", + "752 1.014 -0.153 0 15.355 \n", + "753 0.991 -1.987 0 15.185 \n", + "754 1.027 -0.745 0 16.550 \n", + "755 1.033 -1.789 0 16.112 \n", + "756 1.023 1.141 0 20.630 \n", + "757 1.009 -0.066 0 17.168 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 \n", + "0 74.556 7.225 1.234 \n", + "1 56.056 4.942 1.853 \n", + "2 47.000 5.969 1.174 \n", + "3 69.222 5.462 1.138 \n", + "4 66.000 5.582 1.453 \n", + "5 72.000 5.779 1.844 \n", + "6 76.722 5.664 1.215 \n", + "7 72.000 4.251 1.560 \n", + "8 66.000 5.175 1.514 \n", + "9 77.444 5.626 1.621 \n", + "10 76.389 6.047 1.126 \n", + "11 76.444 5.492 1.445 \n", + "12 78.056 7.222 1.054 \n", + "13 75.556 6.667 1.079 \n", + "14 78.556 4.472 1.280 \n", + "15 81.222 6.207 1.506 \n", + "16 74.667 5.097 1.302 \n", + "17 61.667 4.829 2.026 \n", + "18 66.500 7.024 1.050 \n", + "19 54.875 5.229 1.651 \n", + "20 58.500 5.278 1.486 \n", + "21 67.200 6.524 0.986 \n", + "22 63.722 6.941 1.040 \n", + "23 62.667 4.870 1.547 \n", + "24 78.056 5.748 1.249 \n", + "25 72.611 6.828 1.507 \n", + "26 70.722 4.891 1.543 \n", + "27 71.667 5.953 1.108 \n", + "28 55.500 6.086 1.114 \n", + "29 91.500 5.723 1.055 \n", + ".. ... ... ... \n", + "728 68.667 6.047 1.125 \n", + "729 80.778 6.012 1.051 \n", + "730 77.667 6.042 1.137 \n", + "731 90.000 6.081 1.484 \n", + "732 85.833 5.612 1.165 \n", + "733 75.722 5.337 1.327 \n", + "734 72.533 5.525 1.147 \n", + "735 80.778 5.411 1.079 \n", + "736 75.200 5.939 1.150 \n", + "737 77.111 6.239 1.050 \n", + "738 95.611 5.369 1.276 \n", + "739 81.333 5.771 1.016 \n", + "740 79.222 6.023 1.242 \n", + "741 82.611 5.923 1.245 \n", + "742 80.389 5.809 1.300 \n", + "743 80.944 5.417 1.316 \n", + "744 74.944 5.601 1.053 \n", + "745 67.944 6.928 1.166 \n", + "746 86.500 6.284 1.156 \n", + "747 86.333 5.589 1.127 \n", + "748 86.417 5.584 1.228 \n", + "749 71.222 5.939 1.080 \n", + "750 86.462 5.712 1.298 \n", + "751 85.167 5.718 1.164 \n", + "752 81.167 6.904 0.933 \n", + "753 85.333 7.053 1.325 \n", + "754 74.667 6.729 1.132 \n", + "755 79.667 6.036 1.219 \n", + "756 76.786 5.669 1.111 \n", + "757 76.611 6.688 1.305 \n", + "\n", + "[758 rows x 11 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test= pandas.read_csv('../AMP Data Sets/Test.csv') #reading in my test dataset\n", + "test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspecting my train dataset\n", + "\n", + "
\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": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3038, 12)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.shape #a tuple that gives you an indication of the number of dimensions in the array." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 0\n", + "FULL_AcidicMolPerc 0\n", + "FULL_AURR980107 0\n", + "FULL_DAYM780201 0\n", + "FULL_GEOR030101 0\n", + "FULL_OOBM850104 0\n", + "NT_EFC195 0\n", + "AS_MeanAmphiMoment 0\n", + "AS_DAYM780201 0\n", + "AS_FUKS010112 0\n", + "CT_RACS820104 0\n", + "CLASS 0\n", + "dtype: int64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.isnull().sum() ###this will show the number of null values in my data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 3038\n", + "FULL_AcidicMolPerc 3038\n", + "FULL_AURR980107 3038\n", + "FULL_DAYM780201 3038\n", + "FULL_GEOR030101 3038\n", + "FULL_OOBM850104 3038\n", + "NT_EFC195 3038\n", + "AS_MeanAmphiMoment 3038\n", + "AS_DAYM780201 3038\n", + "AS_FUKS010112 3038\n", + "CT_RACS820104 3038\n", + "CLASS 3038\n", + "dtype: int64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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\n", + "\n", + "
\n", + "Good\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104CLASS
count3038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.000000
mean2.0602378.5215200.97141073.6687600.994007-2.4329270.08854515.68323373.6508285.9113611.2352550.500000
std3.8199297.5866520.1074138.5274890.0313331.7072230.28413311.5756659.1660920.6936890.2100120.500082
min-16.0000000.0000000.68400042.7500000.866000-10.4320000.0000000.04100042.7780003.5330000.7850000.000000
25%0.0000002.5160000.89500068.2940000.974000-3.6060000.0000005.58750067.5560005.4592501.0820000.000000
50%2.0000007.1430000.96300074.0595000.994000-2.2965000.00000014.98850073.6970005.9255001.1840000.500000
75%4.00000013.1580001.04100079.3437501.011000-1.2832500.00000026.80775079.7780006.3820001.3510001.000000
max30.00000046.6670001.451000101.6820001.1960003.5760001.00000051.280000103.1670008.6620002.1920001.000000
\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 2.060237 8.521520 0.971410 73.668760 \n", + "std 3.819929 7.586652 0.107413 8.527489 \n", + "min -16.000000 0.000000 0.684000 42.750000 \n", + "25% 0.000000 2.516000 0.895000 68.294000 \n", + "50% 2.000000 7.143000 0.963000 74.059500 \n", + "75% 4.000000 13.158000 1.041000 79.343750 \n", + "max 30.000000 46.667000 1.451000 101.682000 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 0.994007 -2.432927 0.088545 15.683233 \n", + "std 0.031333 1.707223 0.284133 11.575665 \n", + "min 0.866000 -10.432000 0.000000 0.041000 \n", + "25% 0.974000 -3.606000 0.000000 5.587500 \n", + "50% 0.994000 -2.296500 0.000000 14.988500 \n", + "75% 1.011000 -1.283250 0.000000 26.807750 \n", + "max 1.196000 3.576000 1.000000 51.280000 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 CLASS \n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 73.650828 5.911361 1.235255 0.500000 \n", + "std 9.166092 0.693689 0.210012 0.500082 \n", + "min 42.778000 3.533000 0.785000 0.000000 \n", + "25% 67.556000 5.459250 1.082000 0.000000 \n", + "50% 73.697000 5.925500 1.184000 0.500000 \n", + "75% 79.778000 6.382000 1.351000 1.000000 \n", + "max 103.167000 8.662000 2.192000 1.000000 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.describe() #returns summary of the whole data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 3038 entries, 0 to 3037\n", + "Data columns (total 12 columns):\n", + "FULL_Charge 3038 non-null float64\n", + "FULL_AcidicMolPerc 3038 non-null float64\n", + "FULL_AURR980107 3038 non-null float64\n", + "FULL_DAYM780201 3038 non-null float64\n", + "FULL_GEOR030101 3038 non-null float64\n", + "FULL_OOBM850104 3038 non-null float64\n", + "NT_EFC195 3038 non-null int64\n", + "AS_MeanAmphiMoment 3038 non-null float64\n", + "AS_DAYM780201 3038 non-null float64\n", + "AS_FUKS010112 3038 non-null float64\n", + "CT_RACS820104 3038 non-null float64\n", + "CLASS 3038 non-null int64\n", + "dtypes: float64(10), int64(2)\n", + "memory usage: 284.9 KB\n" + ] + } + ], + "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": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CLASS\n", + "0 1519\n", + "1 1519\n", + "dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.groupby('CLASS').size()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'pyplot' 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 1\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'CLASS'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\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'bar'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#i can also show this in a graph form\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mpyplot\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[0m", + "\u001b[0;31mNameError\u001b[0m: name 'pyplot' is not defined" + ] + } + ], + "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\n", + "\n", + "
\n", + "\n", + "## ??\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### I will start with univariate plots to see each individual variable\n", + "\n", + "
\n", + "\n", + "## ??\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'pyplot' 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 1\u001b[0m \u001b[0;31m#visualizing using histograms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m16\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----> 3\u001b[0;31m \u001b[0mpyplot\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[0m", + "\u001b[0;31mNameError\u001b[0m: name 'pyplot' is not defined" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "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", + "
\n", + "Good observations\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "## ??\n", + "\n", + "What did you find out from the cell below.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 0.534602\n", + "FULL_AcidicMolPerc -0.598816\n", + "FULL_AURR980107 -0.584111\n", + "FULL_DAYM780201 -0.554838\n", + "FULL_GEOR030101 -0.260470\n", + "FULL_OOBM850104 -0.453287\n", + "NT_EFC195 0.260702\n", + "AS_MeanAmphiMoment 0.693552\n", + "AS_DAYM780201 -0.437168\n", + "AS_FUKS010112 0.033432\n", + "CT_RACS820104 0.267652\n", + "CLASS 1.000000\n", + "Name: CLASS, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.corr(method='pearson')['CLASS'] #Here I tried to see the correlation of all attributes with the class" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multivariate \n", + "\n", + "
\n", + " \n", + " Please import: `import matplotlib.pyplot as plt`\n", + "\n", + "## ??\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": "iVBORw0KGgoAAAANSUhEUgAABsYAAAaRCAYAAAATdThrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdf9RmZ1kf+u+VGYI5isSQ0dpMkKBhHRIPSjqNKF1dKD9MoiVttZggS8XouFqCP6Ae49IGGo8/EMWKK6gRUwJFYrQtjjoaawU8VmLzIogkNHYalUzUkwFCtFIJkev88T5jX9/MvM+zn9k780yez2etvd69733v+7n2Wt/1/nOtvXd1dwAAAAAAAODR7rSTXQAAAAAAAAA8EjTGAAAAAAAAWAsaYwAAAAAAAKwFjTEAAAAAAADWgsYYAAAAAAAAa0FjDAAAAAAAgLUwaWOsqm6sqvuq6n3HOV9V9dqqOlRV762qi6asBwAAAAAAgPU19RNjb0hyyQ7nL01y/mzbn+THJ64HAAAAAACANTVpY6y7fzPJh3eYcnmSN/am25KcWVWfOWVNAAAAAAAArKeT/Y2xc5Lcs+X48GwMAAAAAAAARnWyG2MLq6r9VbVRVRsXXnhhJ7E9+rZRycxabKOTm7XYRiUza7GNTm7WYhuVzKzFNjq5WYttVDKzFtvo5GYttlHJzFpso5ObtdhGJTNrsS3tZDfG7k1y7pbjvbOxh+nuG7p7X3fvO+OMMx6R4ji1yQzLkBuGkhmWITcMJTMsQ24YSmZYhtwwlMywDLlhKJlhJye7MXYgydfUpmckeaC7//Qk1wQAAAAAAMCj0O4pF6+qtyR5VpKzq+pwklckeUySdPdPJDmY5LIkh5J8NMmLp6wHAAAAAACA9TVpY6y7r5xzvpO8ZMoaAAAAAAAAIDn5r1IEAAAAAACAR4TGGAAAAAAAAGtBYwwAAAAAAIC1oDEGAAAAAADAWtAYAwAAAAAAYC1ojAEAAAAAALAWNMYAAAAAAABYCxpjAAAAAAAArAWNMQAAAAAAANaCxhgAAAAAAABrQWMMAAAAAACAtaAxBgAAAAAAwFrQGAMAAAAAAGAtaIwBAAAAAACwFiZvjFXVJVV1V1UdqqprjnH+iVX1tqp6d1W9t6oum7omAAAAAAAA1s+kjbGq2pXk+iSXJrkgyZVVdcG2ad+d5JbufnqSK5K8bsqaAAAAAAAAWE9TPzF2cZJD3X13dz+Y5OYkl2+b00k+dbb/+CR/MnFNAAAAAAAArKHdE69/TpJ7thwfTvIF2+a8MsmvVdVLk3xykudMXBMAAAAAAABraPJvjC3gyiRv6O69SS5L8qaqelhdVbW/qjaqauPIkSOPeJGcemSGZcgNQ8kMy5AbhpIZliE3DCUzLENuGEpmWIbcMJTMsJOpG2P3Jjl3y/He2dhWVyW5JUm6+51JPinJ2dsX6u4buntfd+/bs2fPROXyaCIzLENuGEpmWIbcMJTMsAy5YSiZYRlyw1AywzLkhqFkhp1M3Ri7Pcn5VXVeVZ2e5IokB7bN+UCSZydJVT01m40xLVwAAAAAAABGNWljrLsfSnJ1kluTvD/JLd19R1VdV1XPn017eZJvrKrfS/KWJF/X3T1lXQAAAAAAAKyf3YtOrKpK8tVJntzd11XVE5P8ne7+rztd190HkxzcNnbtlv07kzxzUNUAAAAAAAAw0JAnxl6X5AuTXDk7/osk149eEQAAAAAAAExg4SfGknxBd19UVe9Oku6+f/bdMAAAAAAAAFh5Q54Y+3hV7UrSSVJVe5J8YpKqAAAAAAAAYGRDGmOvTfIfk3x6VX1vkt9K8n2TVAUAAAAAAAAjW/hVit395qp6V5JnJ6kk/7i73z9ZZQAAAAAAADCihRtjVXVWkvuSvGXL2GO6++NTFAYAAAAAAABjGvIqxd9NciTJHyT577P9P6qq362qvzdFcQAAAAAAADCWIY2x/5Tksu4+u7ufkOTSJL+U5F8ked0UxQEAAAAAAMBYhjTGntHdtx496O5fS/KF3X1bkseOXhkAAAAAAACMaOFvjCX506r6jiQ3z46/Ksn/V1W7knxi9MoAAAAAAABgREOeGHthkr1J3prkPyY5dza2K8kLxi8NAAAAAAAAxrPQE2Ozp8Ku6e6XHmfKofFKAgAAAAAAgPEt9MRYd/91kn8wcS0AAAAAAAAwmSHfGHt3VR1I8nNJ/vLoYHf/h9GrAgAAAAAAgJEN+cbYJyX5UJIvSfKPZtuXz7uoqi6pqruq6lBVXXOcOS+oqjur6o6q+pkBNQEAAAAAAMBCFn5irLtfPHTx2bfJrk/y3CSHk9xeVQe6+84tc85P8p1Jntnd91fVpw/9HQAAAAAAAJhn4cZYVX1SkquSXJjNp8eSJN399TtcdnGSQ91992yNm5NcnuTOLXO+Mcn13X3/bL37Fq4eAAAAAAAAFjTkVYpvSvJ3knxpknck2ZvkL+Zcc06Se7YcH56NbfWUJE+pqv9SVbdV1SUDagIAAAAAAICFDGmMfU53/6skf9ndNyX5siRfMEINu5Ocn+RZSa5M8lNVdeb2SVW1v6o2qmrjyJEjI/wsj3YywzLkhqFkhmXIDUPJDMuQG4aSGZYhNwwlMyxDbhhKZtjJkMbYx2d/P1JVn5vk8UnmfQ/s3iTnbjneOxvb6nCSA9398e7+wyR/kM1G2d/S3Td0977u3rdnz54BZbOuZIZlyA1DyQzLkBuGkhmWITcMJTMsQ24YSmZYhtwwlMywkyGNsRuq6tOS/KskB7L5nbAfnHPN7UnOr6rzqur0JFfMrt3qrdl8WixVdXY2X61494C6AAAAAAAAYK7di07s7tfPdt+R5MkLXvNQVV2d5NYku5Lc2N13VNV1STa6+8Ds3POq6s4kf53k27v7Q0NuAgAAAAAAAOZZuDFWVY9N8hVJnrT1uu6+bqfruvtgkoPbxq7dst9JXjbbAAAAAAAAYBILN8aS/EKSB5K8K8nHpikHAAAAAAAApjGkMba3uy+ZrBIAAAAAAACY0GkD5v52Vf1fk1UCAAAAAAAAE5r7xFhV/X6Sns19cVXdnc1XKVY2PxH2tGlLBAAAAAAAgBO3yKsUv3zyKgAAAAAAAGBiizTGPj3J2d39K1sHq+rSJPcl+eMpCgMAAAAAAIAxLfKNsVclufMY43cmefW45QAAAAAAAMA0FmmMPa67H/ZU2Gzs7PFLAgAAAAAAgPEt0hj7tB3O/R9jFQIAAAAAAABTWqQx9utV9b1VVUcHatN1SX5jutIAAAAAAABgPLsXmPPyJK9Pcqiq3jMb+7wkG0m+YarCAAAAAAAAYExzG2Pd/ZdJrqyqJye5cDZ8R3ffvXVeVV3Y3XdMUCMAAAAAAACcsEWeGEuSzBphd+8w5U1JLjrhigAAAAAAAGACi3xjbFE1fwoAAAAAAACcHGM2xvpYg1V1SVXdVVWHquqa411cVV9RVV1V+0asCQAAAAAAAJKM2xh7mKraleT6JJcmuSCb3yq74BjzHpfkW5L8zpT1AAAAAAAAsL5OqDFWVX93y+GDx5hycZJD3X13dz+Y5OYklx9j3vckeVWSvzqRegAAAAAAAOB4TvSJsduO7nT3M45x/pwk92w5Pjwb+xtVdVGSc7v7l0+wFgAAAAAAADiuE22M1QldXHVaktckefkCc/dX1UZVbRw5cuREfpY1ITMsQ24YSmZYhtwwlMywDLlhKJlhGXLDUDLDMuSGoWSGnZxoY6znnL83yblbjvfOxo56XJLPTfL2qvqjJM9IcqCq9j3sh7pv6O593b1vz549J1Y1a0FmWIbcMJTMsAy5YSiZYRlyw1AywzLkhqFkhmXIDUPJDDvZPW9CVf1Yjt0AqyRnzrn89iTnV9V52WyIXZHkhUdPdvcDSc7e8ltvT/Ivu3tjbuUAAAAAAAAwwNzGWJKdmlQ7NrC6+6GqujrJrUl2Jbmxu++oquuSbHT3gcVLBQAAAAAAgOXNbYx1903HO1dVP7TA9QeTHNw2du1x5j5r3noAAAAAAACwjBP9xtgLRqkCAAAAAAAAJnaijbEapQoAAAAAAACY2NxXKVbVWcc7FY0xAAAAAAAAThFzG2NJ3pWkc+wm2IPjlgMAAAAAAADTmNsY6+7zHolCAAAAAAAAYEqLvErxom1DneSD3X3PNCUBAAAAAADA+BZ5leIPH2PsrKo6PcmV3f2ekWsCAAAAAACA0S3yKsUvPtZ4Ve1L8tok/3DsogAAAAAAAGBspy17YXdvJPmUEWsBAAAAAACAySzdGKuqz8jm98YAAAAAAABg5c19lWJV/Vge3gA7K8kXJfmWKYoCAAAAAACAsc1tjCXZ2HbcST6U5GXdfd/4JQEAAAAAAMD4FmmMva27PzB5JQAAAAAAADChRb4x9tajO1X17yesBQAAAAAAACazSGOstuw/eegPVNUlVXVXVR2qqmuOcf5lVXVnVb23qv5zVX3W0N8AAAAAAACAeRZpjPVx9ueqql1Jrk9yaZILklxZVRdsm/buJPu6+2lJfj7JDw75DQAAAAAAAFjEIo2xz6uqP6+qv0jytNn+n1fVX1TVn8+59uIkh7r77u5+MMnNSS7fOqG739bdH50d3pZk79CbAAAAAAAAgHl2z5vQ3btOYP1zktyz5fhwki/YYf5VSX7lBH4PAAAAAAAAjmmRJ8YeEVX1oiT7krz6OOf3V9VGVW0cOXLkkS2OU5LMsAy5YSiZYRlyw1AywzLkhqFkhmXIDUPJDMuQG4aSGXYydWPs3iTnbjneOxv7W6rqOUm+K8nzu/tjx1qou2/o7n3dvW/Pnj2TFMuji8ywDLlhKJlhGXLDUDLDMuSGoWSGZcgNQ8kMy5AbhpIZdjJ1Y+z2JOdX1XlVdXqSK5Ic2Dqhqp6e5Cez2RS7b+J6AAAAAAAAWFOTNsa6+6EkVye5Ncn7k9zS3XdU1XVV9fzZtFcn+ZQkP1dV76mqA8dZDgAAAAAAAJa2e+of6O6DSQ5uG7t2y/5zpq4BAAAAAAAApn6VIgAAAAAAAKwEjTEAAAAAAADWgsYYAAAAAAAAa0FjDAAAAAAAgLWgMQYAAAAAAMBa0BgDAAAAAABgLWiMAQAAAAAAsBY0xgAAAAAAAFgLGmMAAAAAAACsBY0xAAAAAAAA1oLGGAAAAAAAAGtBYwwAAAAAAIC1oDEGAAAAAADAWtAYAwAAAAAAYC1M3hirqkuq6q6qOlRV1xzj/GOr6mdn53+nqp40dU0AAAAAAACsn0kbY1W1K8n1SS5NckGSK6vqgm3Trkpyf3d/TpIfSfKqKWsCAAAAAABgPU39xNjFSQ51993d/WCSm5Ncvm3O5Ulumu3/fJJnV1VNXBcAAAAAAABrZurG2DlJ7tlyfHg2dsw53f1QkgeSPGHiugAAAAAAAFgzu092AYuqqv1J9s8OP1ZV7zuZ9TyCzk7ywZNdxCPkfd39uWMtJjNrYdTMJHJzsot4hPhfMw6ZOQFysxb8rxmHzJwAuVkL/teMQ2ZOgNysBf9rxiEzJ0Bu1oL/NeOQmQVUd49dzP9evOoLk7yyu790dvydSdLd379lzq2zOe+sqt1J/izJnt6hsKra6O59kxW+Qtzr6q+9atzrqbP+KnGvq7/2qnGvp876q8S9rv7aq8a9njrrrxL3uvprrxr3euqsv0rc6+qvvWrc66mz/ipxr6u/9qpxr4uZ+lWKtyc5v6rOq6rTk1yR5MC2OQeSfO1s/yuT/MZOTTEAAAAAAABYxqSvUuzuh6rq6iS3JtmV5MbuvqOqrkuy0d0Hkvx0kjdV1aEkH85m8wwAAAAAAABGNfk3xrr7YJKD28au3bL/V0n+2cBlbxihtFOFe139tVeNez111l8l7nX111417vXUWX+VuNfVX3vVuNdTZ/1V4l5Xf+1V415PnfVXiXtd/bVXjXs9ddZfJe519ddeNe51AZN+YwwAAAAAAABWxdTfGAMAAAAAAICVoDEGAAAAAADAWtAYAwAAAAAAYC1ojAEAAAAAALAWNMYAAAAAAABYCxpjAAAAAAAArAWNMQAAAAAAANaCxhgAAAAAAABrQWMMAAAAAACAtaAxBgAAAAAAwFrQGAMAAAAAAGAtaIwBAAAAAACwFjTGAAAAAAAAWAuTNsaq6saquq+q3nec81VVr62qQ1X13qq6aMp6AAAAAAAAWF9TPzH2hiSX7HD+0iTnz7b9SX584noAAAAAAABYU5M2xrr7N5N8eIcplyd5Y2+6LcmZVfWZU9YEAAAAAADAejrZ3xg7J8k9W44Pz8YAAAAAAABgVCe7MbawqtpfVRtVtXHhhRd2EtujbxuVzKzFNjq5WYttVDKzFtvo5GYttlHJzFpso5ObtdhGJTNrsY1ObtZiG5XMrMU2OrlZi21UMrMW29JOdmPs3iTnbjneOxt7mO6+obv3dfe+M8444xEpjlObzLAMuWEomWEZcsNQMsMy5IahZIZlyA1DyQzLkBuGkhl2crIbYweSfE1tekaSB7r7T09yTQAAAAAAADwK7Z5y8ap6S5JnJTm7qg4neUWSxyRJd/9EkoNJLktyKMlHk7x4ynoAAAAAAABYX5M2xrr7yjnnO8lLpqwBAAAAAAAAkpP/KkUAAAAAAAB4RGiMAQAAAAAAsBY0xgAAAAAAAFgLGmMAAAAAAACsBY0xAAAAAAAA1oLGGAAAAAAAAGth4cZYVX1fVZ255fjTqur/maYsAAAAAAAAGNeQJ8Yu7e6PHD3o7vuTXDZ+SQAAAAAAADC+IY2xXVX12KMHVXVGksfuMB8AAAAAAABWxu4Bc9+c5D9X1b+dHb84yU3jlwQAAAAAAADjW7gx1t2vqqrfS/Kc2dD3dPet05QFAAAAAAAA41qoMVZVu5L8end/cZJfnbYkAAAAAAAAGN9C3xjr7r9O8omqevzE9QAAAAAAAMAkhnxj7H8m+f2q+k9J/vLoYHd/8+hVAQAAAAAAwMiGNMb+w2wbpKouSfKjSXYleX13/8C2809MclOSM2dzrunug0N/BwAAAAAAAHaycGOsu2+qqjOSPLG771rkmtm3ya5P8twkh5PcXlUHuvvOLdO+O8kt3f3jVXVBkoNJnrRoXQAAAAAAALCIhb4xliRV9Y+SvCfJr86OP7+qDsy57OIkh7r77u5+MMnNSS7fNqeTfOps//FJ/mTRmgAAAAAAAGBRCzfGkrwym42ujyRJd78nyZPnXHNOknu2HB+ejW1f90VVdTibT4u9dEBNAAAAAAAAsJAhjbGPd/cD28Y+MUINVyZ5Q3fvTXJZkjdV1cPqqqr9VbVRVRtHjhwZ4Wd5tJMZliE3DCUzLENuGEpmWIbcMJTMsAy5YSiZYRlyw1Ayw06GNMbuqKoXJtlVVedX1Y8l+e0519yb5Nwtx3tnY1tdleSWJOnudyb5pCRnb1+ou2/o7n3dvW/Pnj0DymZdyQzLkBuGkhmWITcMJTMsQ24YSmZYhtwwlMywDLlhKJlhJ0MaYy9NcmGSjyX5mSQPJPnWOdfcnuT8qjqvqk5PckWS7d8l+0CSZydJVT01m40xLVwAAAAAAABGtXuRSVW1J8lnJXl1d3/Xoot390NVdXWSW5PsSnJjd99RVdcl2ejuA0lenuSnqurbknSSr+vuHnojAAAAAAAAsJO5jbGq+oYk35fkfyQ5r6r2zxpaC+nug0kObhu7dsv+nUmeuXDFAAAAAAAAsIRFnhj71iQXdveRqnpykjfn4a9DBAAAAAAAgJW2yDfGHuzuI0nS3Xcneey0JQEAAAAAAMD4FnlibG9VvfZ4x939zeOXBQAAAAAAAONapDH27duO3zVFIQAAAAAAADCluY2x7r7pkSgEAAAAAAAApjS3MVZVv5ikj3e+u58/akUAAAAAAAAwgUVepfhDk1cBAAAAAAAAE1vkVYrvOLpfVacnecrs8K7u/vhUhQEAAAAAAMCYFnliLElSVc9KclOSP0pSSc6tqq/t7t+cpjQAAAAAAAAYz8KNsSQ/nOR53X1XklTVU5K8Jcnfm6IwAAAAAAAAGNNpA+Y+5mhTLEm6+w+SPGb8kgAAAAAAAGB8Q54Y26iq1yf5d7Pjr06yMX5JAAAAAAAAML4hjbF/nuQlSb55dvz/Jnnd6BUBAAAAAADABBZujHX3x5K8ZrYBAAAAAADAKWVuY6yq3rvT+e5+2pzrL0nyo0l2JXl9d//AMea8IMkrk3SS3+vuF86rCwAAAAAAAIZY5ImxT2SzYfUzSX4xyf9adPGq2pXk+iTPTXI4ye1VdaC779wy5/wk35nkmd19f1V9+oD6AQAAAAAAYCGnzZvQ3Z+f5Mokn5LN5tj3Jrkwyb3d/cdzLr84yaHuvru7H0xyc5LLt835xiTXd/f9s9+7b9gtAAAAAAAAwHxzG2NJ0t3/rbtf0d0XZfOpsTcm+bYFLj0nyT1bjg/PxrZ6SpKnVNV/qarbZq9eBAAAAAAAgFEt1BirqnOq6uVV9VtJXpTNptiPj1TD7iTnJ3lWNp9M+6mqOvMYNeyvqo2q2jhy5MhIP82jmcywDLlhKJlhGXLDUDLDMuSGoWSGZcgNQ8kMy5AbhpIZdjK3MVZV78jmU2KPSfLiJF+b5JeTnF5VZ825/N4k52453jsb2+pwkgPd/fHu/sMkf5DNRtnf0t03dPe+7t63Z8+eeWWDzLAUuWEomWEZcsNQMsMy5IahZIZlyA1DyQzLkBuGkhl2snuBOZ+VpJN8U5L9W8ZrNv7kHa69Pcn5VXVeNhtiVyR54bY5b83mk2L/tqrOzuarFe9eqHoAAAAAAABY0NzGWHc/adnFu/uhqro6ya1JdiW5sbvvqKrrkmx094HZuedV1Z1J/jrJt3f3h5b9TQAAAAAAADiWRZ4YS5JU1T9J8hvd/cDs+Mwkz+rut+50XXcfTHJw29i1W/Y7yctmGwAAAAAAAExi7jfGtnjF0aZYknT3R5K8YvySAAAAAAAAYHxDGmPHmrvwE2cAAAAAAABwMg1pjG1U1Wuq6rNn22uSvGuqwgAAAAAAAGBMQxpjL03yYJKfnW0fS/KSKYoCAAAAAACAsS38KsTu/ssk10xYCwAAAAAAAExmbmOsqv5Nd39rVf1ikt5+vrufP0llAAAAAAAAMKJFnhh70+zvD01ZCAAAAAAAAExpbmOsu981+/uO6csBAAAAAACAaSzyKsXfzzFeoXhUdz9t1IoAAAAAAABgAou8SvHLZ39fMvt79NWKL8oODTMAAAAAAABYJYu8SvGPk6SqntvdT99y6juq6neTXDNVcQAAAAAAADCW0wbMrap65paDLxp4PQAAAAAAAJw0i7xK8airktxYVY9PUknuT/L1k1QFAAAAAAAAI1u4Mdbd70ryebPGWLr7gcmqAgAAAAAAgJHNbYxV1Yu6+99V1cu2jSdJuvs1c66/JMmPJtmV5PXd/QPHmfcVSX4+yd/v7o3FygcAAAAAAIDFLPLE2CfP/j5u6OJVtSvJ9Umem+Rwktur6kB337lt3uOSfEuS3xn6GwAAAAAAALCIuY2x7v7J2d9/vcT6Fyc51N13J0lV3Zzk8iR3bpv3PUleleTbl/gNAAAAAAAAmOu0RSdW1U1VdeaW40+rqhvnXHZOknu2HB+ejW1d96Ik53b3Ly9aCwAAAAAAAAy1cGMsydO6+yNHD7r7/iRPP5Efr6rTkrwmycsXmLu/qjaqauPIkSMn8rOsCZlhGXLDUDLDMuSGoWSGZcgNQ8kMy5AbhpIZliE3DCUz7GRIY+y0qvq0owdVdVbmv4rx3iTnbjneOxs76nFJPjfJ26vqj5I8I8mBqtq3faHuvqG793X3vj179gwom3UlMyxDbhhKZliG3DCUzLAMuWEomWEZcsNQMsMy5IahZIadzP3G2BY/nOSdVfVzSSrJVyb5vjnX3J7k/Ko6L5sNsSuSvPDoye5+IMnZR4+r6u1J/mV3bwyoCwAAAAAAAOZauDHW3W+sqo0kXzIb+qfdfeecax6qqquT3JpkV5Ibu/uOqrouyUZ3H1i2cAAAAAAAABhiyBNjmTXC7qyqT07yT6vq1d39ZXOuOZjk4Laxa48z91lD6gEAAAAAAIBFLfyNsao6var+yexVin+azSfHfmKyygAAAAAAAGBEc58Yq6rnJbkyyfOSvC3JG5P8/e5+8cS1AQAAAAAAwGgWeWLsV5M8Ock/6O4XdfcvJvnEtGUBAAAAAADAuBb5xthFSa5I8utVdXeSm5PsmrQqAAAAAAAAGNncJ8a6+z3dfU13f3aSVyT5/CSPqapfqar9k1cIAAAAAAAAI1jkVYp/o7t/u7tfmmRvkh9J8oyj56rqwpFrAwAAAAAAgNEMaowd1d2f6O5f6+6v3zL8ppFqAgAAAAAAgNEt1Rg7jhpxLQAAAAAAABjVmI2xHnEtAAAAAAAAGNWYjTEAAAAAAABYWSfUGKuqv7vl8METrAUAAAAAAAAmc6JPjN12dKe7n3GCawEAAAAAAMBkTrQxVqNUAQAAAAAAABM70cZYj1IFAAAAAAAATGz3vAlV9WM5dgOskpy5wPWXJPnRJLuSvL67f2Db+Zcl+YYkDyU5kuTru/uP55cOAAAAAAAAi5vbGEuyseS5VNWuJNcneW6Sw0lur6oD3X3nlmnvTrKvuz9aVf88yQ8m+aoF6gIAAAAAAICFzW2MdfdNxztXVT805/KLkxzq7rtn829OcnmSv2mMdffbtsy/LcmL5tUEAAAAAAAAQ53oN8ZeMOf8OUnu2XJ8eDZ2PFcl+ZUTrAkAAAAAAAAe5kQbYzVKFUmq6kVJ9iV59XHO76+qjaraOHLkyFg/y6OYzLAMuWEomWEZcsNQMsMy5IahZIZlyA1DyQzLkBuGkhl2MrcxVlVnHWd7QuY3xu5Ncu6W472zse2/8Zwk35Xk+d39sWMt1N03dPe+7t63Z8+eeWWDzLAUuWEomWEZcsNQMsMy5IahZIZlyA1DyQzLkBuGkhl2MvcbY0nelaRz7CbYg3OuvT3J+VV1XjYbYlckeeHWCVX19CQ/meSS7r5vgXoAAAAAAABgsLmNse4+b9nFu/uhqro6ya1JdiW5sbvvqKrrkmx094FsvjrxU5L8XFUlyQe6+/nL/iYAAAAAAAAcy9zGWAP8MnwAACAASURBVFVdtG2ok3ywu+9Z5Ae6+2CSg9vGrt2y/5xF1gEAAAAAAIATscirFH/4GGNnVdXpSa7s7veMXBMAAAAAAACMbpFXKX7xscaral+S1yb5h2MXBQAAAAAAAGM7bdkLu3sjm98GAwAAAAAAgJW3dGOsqj4jm98bAwAAAAAAgJU391WKVfVjeXgD7KwkX5TkW6YoCgAAAAAAAMY2tzGWZGPbcSf5UJKXdfd945cEAAAAAAAA41ukMfa27v7A5JUAAAAAAADAhBb5xthbj+5U1b+fsBYAAAAAAACYzCKNsdqy/+SpCgEAAAAAAIApLdIY6+PsAwAAAAAAwCljkW+MfV5V/Xk2nxw7Y7af2XF396dOVh0AAAAAAACMZG5jrLt3PRKFAAAAAAAAwJQWeZUiAAAAAAAAnPI0xgAAAAAAAFgLkzfGquqSqrqrqg5V1TXHOP/YqvrZ2fnfqaonTV0TAAAAAAAA62fSxlhV7UpyfZJLk1yQ5MqqumDbtKuS3N/dn5PkR5K8asqaAAAAAAAAWE9TPzF2cZJD3X13dz+Y5OYkl2+bc3mSm2b7P5/k2VVVE9cFAAAAAADAmpm6MXZOknu2HB+ejR1zTnc/lOSBJE+YuC4AAAAAAADWzO6TXcCiqmp/kv2zw49V1ftOZj2PoLOTfPBkF/EIeV93f+5Yi8nMWhg1M4ncnOwiHiH+14xDZk6A3KwF/2vGITMnQG7Wgv8145CZEyA3a8H/mnHIzAmQm7Xgf804ZGYB1d1jF/O/F6/6wiSv7O4vnR1/Z5J09/dvmXPrbM47q2p3kj9Lsqd3KKyqNrp732SFrxD3uvprrxr3euqsv0rc6+qvvWrc66mz/ipxr6u/9qpxr6fO+qvEva7+2qvGvZ46668S97r6a68a93rqrL9K3Ovqr71q3Otipn6V4u1Jzq+q86rq9CRXJDmwbc6BJF872//KJL+xU1MMAAAAAAAAljHpqxS7+6GqujrJrUl2Jbmxu++oquuSbHT3gSQ/neRNVXUoyYez2TwDAAAAAACAUU3+jbHuPpjk4Laxa7fs/1WSfzZw2RtGKO1U4V5Xf+1V415PnfVXiXtd/bVXjXs9ddZfJe519ddeNe711Fl/lbjX1V971bjXU2f9VeJeV3/tVeNeT531V4l7Xf21V417XcCk3xgDAAAAAACAVTH1N8YAAAAAAABgJWiMAQAAAAAAsBY0xgAAAAAAAFgLGmMAAAAAAACsBY0xAAAAAAAA1oLGGAAAAAAAAGtBYwwAAAAAAIC1oDEGAAAAAADAWtAYAwAAAAAAYC1ojAEAAAAAALAWNMYAAAAAAABYCxpjAAAAAAAArAWNMQAAAAAAANbCpI2xqrqxqu6rqvcd53xV1Wur6lBVvbeqLpqyHgAAAAAAANbX1E+MvSHJJTucvzTJ+bNtf5Ifn7geAAAAAAAA1tSkjbHu/s0kH95hyuVJ3tibbktyZlV95pQ1AQAAAAAAsJ5O9jfGzklyz5bjw7MxAAAAAAAAGNXJbowtrKr2V9VGVW1ceOGFncT26NtGJTNrsY1ObtZiG5XMrMU2OrlZi21UMrMW2+jkZi22UcnMWmyjk5u12EYlM2uxjU5u1mIblcysxba0k90YuzfJuVuO987GHqa7b+jufd2974wzznhEiuPUJjMsQ24YSmZYhtwwlMywDLlhKJlhGXLDUDLDMuSGoWSGnZzsxtiBJF9Tm56R5IHu/tOTXBMAAAAAAACPQrunXLyq3pLkWUnOrqrDSV6R5DFJ0t0/keRgksuSHEry0SQvnrIeAAAAAAAA1tekjbHuvnLO+U7ykilrAAAAAAAAgOTkv0oRAAAAAAAAHhEaYwAAAAAAAKwFjTEAAAAAAADWgsYYAAAAAAAAa0FjDAAAAAAAgLWgMQYAAAAAAMBa0BgDAAAAAABgLcxtjFXVmY9EIQAAAAAAADClRZ4Y+2BV/XpVXaVJBgAAAAAAwKlqkcbY+5P8myRfkuR/VNUvVNUVVXXGtKUBAAAAAADAeBZpjH28u3+pu786yd4kb07ygiSHq+pnJq0OAAAAAAAARrJ7gTl1dKe7/1eSW5LcUlWPT/KPpyoMAAAAAAAAxrRIY+zNxxrs7geS3DRuOQAAAAAAADCNua9S7O4feiQKAQAAAAAAgCnNbYxV1eOr6geq6r9V1Yer6kNV9f7Z2JkLXH9JVd1VVYeq6ppjnH9iVb2tqt5dVe+tqsuWvRkAAAAAAAA4nrmNsWx+U+z+JM/q7rO6+wlJvng2dstOF1bVriTXJ7k0yQVJrqyqC7ZN++4kt3T305NckeR1w24BAAAAAAAA5lukMfak7n5Vd//Z0YHu/rPuflWSz5pz7cVJDnX33d39YJKbk1y+bU4n+dTZ/uOT/MlipQMAAAAAAMDiFmmM/XFV/d9V9RlHB6rqM6rqO5LcM+fac7bNOTwb2+qVSV5UVYeTHEzy0gVqAgAAAAAAgEEWaYx9VZInJHnH7BtjH07y9iRnJXnBCDVcmeQN3b03yWVJ3lRVD6urqvZX1UZVbRw5cmSEn+XRTmZYhtwwlMywDLlhKJlhGXLDUDLDMuSGoWSGZcgNQ8kMO5nbGOvu+7v7O7r7/5x9Y+ys7n7qbOzDcy6/N8m5W473zsa2uiqzb5V19zuTfFKSs49Rxw3dva+79+3Zs2de2SAzLEVuGEpmWIbcMJTMsAy5YSiZYRlyw1AywzLkhqFkhp0s8sTYcVXVi+dMuT3J+VV1XlWdnuSKJAe2zflAkmfP1ntqNhtjWrgAAAAAAACM6oQaY0n+9U4nu/uhJFcnuTXJ+5Pc0t13VNV1VfX82bSXJ/nGqvq9JG9J8nXd3SdYFwAAAAAAAPwtu+dNqKr3Hu9Uks+Yd313H0xycNvYtVv270zyzHnrAAAAAAAAwImY2xjLZvPrS5Pcv228kvz26BUBAAAAAADABBZpjP1Skk/p7vdsP1FVbx+9IgAAAAAAAJjA3MZYd1+1w7kXjlsOAAAAAAAATGORJ8ZSVZXk4iTnzIbuTfJfu7unKgwAAAAAAADGNLcxVlXPS/K6JP89mw2xJNmb5HOq6l90969NWB8AAAAAAACMYpEnxn40yXO6+4+2DlbVeUkOJnnqBHUBAAAAAADAqE5bYM7uJIePMX5vkseMWw4AAAAAAABMY5Enxm5McntV3ZzkntnYE5N8VZKfnqowAAAAAAAAGNPcxlh3f39V/UKS5yf5wtnwvUm+urvvnLI4AAAAAAAAGMsiT4xl1gD7myZYVZ3d3R+crCoAAAAAAAAY2dxvjFXVpVX1h1X1W1X19Kq6I8nvVNXhqnr2I1AjAAAAAAAAnLBFnhj7/iSXJTkzya8n+bLuvq2qnprkzUkumrA+AAAAAAAAGMUijbFPdPf7k6SqPtrdtyVJd7+/quY+cQYAAAAAAACrYJHG2Eeq6puSfGqS+6vq25LckuQ5Sf7nlMUBAAAAAADAWBZ54utrs/m6xM9O8rzZ2K1JXpDkG+ddXFWXVNVdVXWoqq45zpwXVNWdVXVHVf3MgrUDAAAAAADAwuY+Mdbd9yT5pi1DPzLb5qqqXUmuT/LcJIeT3F5VB/5/9u4+2rK7rBP890mFl4hAhJSOVCVNgKIlIA14LUF6lHcTG8mIQicZRuStxmXHwYk4BrUjHUaFbsAGjGB4EcSRiOgw1cuCYCv4SjAFApJiwCICqfIlBQTQQQghz/xxT8Hxpuqefc49JznF+XzW2uvu/du//TvPXuu77j/P2nt394GxObuSPDfJw7v7hqr6xinqBwAAAAAAgEGGvEoxVfXIJD+Q5PQkX07ykSSv6u6PTrh0d5KD3X3taJ0rkpyb5MDYnGcluay7b0iS7r5+qjsAAAAAAACAASa+SrGqfjHJDyW5KsmXknx0tL25qp404fIdSa4bOz40Ght33yT3rao/q6qrqursocUDAAAAAADAUEO+Mfb47n5ad/9GkvOSfGd3vyrJo5L83BxqODnJriSPSHJ+kldV1akbJ1XVnqraX1X7jxw5Moef5WudzDALuWFaMsMs5IZpyQyzkBumJTPMQm6YlswwC7lhWjLDZoY0xm6uqruN9u+RZFuSjF59WBOuPZz11y8etXM0Nu5Qkr3d/aXu/pusv6Zx18aFuvvy7l7r7rXt27cPKJtVJzPMQm6YlswwC7lhWjLDLOSGackMs5AbpiUzzEJumJbMsJkhjbFfSPKXVfX7Sf40yfOTpKq2J3n/hGuvTrKrqs6sqttn/YmzvRvmvCXrT4ulqk7L+qsVrx16AwAAAAAAADDEyZMmdPdvjZpi90pysLs/Mxo/kuSCCdfeVFUXJrky60+avba7r6mqS5Ps7+69o3OPq6oDSb6c5Ce7+1NbuisAAAAAAADYYGJjLEm6+9NJPj0+VlX3zXoT61kTrt2XZN+GsUvG9jvJRaMNAAAAAAAAFmLiqxSr6oFV9faq+mBV/Z9V9c1V9TtJ/jDJgcWXCAAAAAAAAFs35Btjr0rym0l+IMmRJO9L8tEk9+nuX1pgbQAAAAAAADA3Q16leIfuft1o/8NV9ezu/j8WWBMAAAAAAADM3ZDG2B2r6sFJanT8xfHj7n7voooDAAAAAACAeRnSGPu7JC8ZO/77seNO8qh5FwUAAAAAAADzNrEx1t2PvDUKAQAAAAAAgEU6adYLq+qxVfX78ywGAAAAAAAAFmViY6yqHlVVH6mqf6qq36iqb62q/UlekOQViy8RAAAAAAAAtm7IE2MvTrInyd2TvDnJu5K8rru/rbt/d5HFAQAAAAAAwLxM/MZYku7ud47231JVh7v7lxdYEwAAAAAAAMzdkMbYqVX1xPFrxo89NQYAAAAAAMCJYEhj7I+SfN/Y8R+PHXcSjTEAAAAAAACW3sTGWHc/7dYoBAAAAAAAABZpYmOsqi7aMNRJPpnkT7v7bxZSFQAAAAAAAMzZSQPm3HnDdpcka0neWlXnTbq4qs6uqg9X1cGquniTeT9QVV1VawNrBwAAAAAAgMGGvErxPx1rvKruluS/J7nieNdW1bYklyV5bJJDSa6uqr3dfWDDvDsneXaSdw8vHQAAAAAAAIYb8sTYMXX3p5PUhGm7kxzs7mu7+8asN9HOPca85yd5YZIvzFoPAAAAAAAAbGbmxlhVPTLJDROm7Uhy3djxodHY+DoPSXJ6d//erLUAAAAAAADAJBNfpVhVf5WkNwzfLcnfJnnqVn68qk5K8pIkPzxg7p4ke5LkjDPO2MrPsiJkhlnIDdOSGWYhN0xLZpiF3DAtmWEWcsO0ZIZZyA3Tkhk2M+SJsccn+b6x7fFJ/nV37+7uD0249nCS08eOd47GjrpzkgckeWdVfSzJQ5Psraq1jQt19+Xdvdbda9u3bx9QNqtOZpiF3DAtmWEWcsO0ZIZZyA3TkhlmITdMS2aYhdwwLZlhMxOfGOvuj28cq6o7VdVTkpzf3f9uk8uvTrKrqs7MekPsvCQXjK392SSnja37ziTP6e79g+8AAAAAAAAABhj8jbGqun1VfX9V/XaSv0vy6CSv3Oya7r4pyYVJrkzyoSRv6u5rqurSqnrCFuoGAAAAAACAqQz5xtjjkpyf5HFJ3pHk15N8e3c/bcgPdPe+JPs2jF1ynLmPGLImAAAAAAAATGvIE2NvS3KvJP+2u5/S3f8tyc2LLQsAAAAAAADma+ITY0kekvVvg/33qro2yRVJti20KgAAAAAAAJiziU+Mdff7uvvi7r53kp9L8qAkt6uqt1bVnoVXCAAAAAAAAHMw5FWKX9Hdf97dP5ZkZ5JfSvLQo+eq6v5zrg0AAAAAAADmZqrG2FHdfXN3v727nz42/IY51QQAAAAAAABzN1Nj7DhqjmsBAAAAAADAXM2zMdZzXAsAAAAAAADmap6NMQAAAAAAAFhaW2qMVdU9xg5v3GItAAAAAAAAsDBbfWLsqqM73f3QLa4FAAAAAAAAC7PVxljNpQoAAAAAAABYsK02xnouVQAAAAAAAMCCnTxpQlW9PMdugFWSU+deEQAAAAAAACzAxMZYkv0zngMAAAAAAIClMbEx1t2vP965qnrRpOur6uwkL02yLcmru/sFG85flOSZSW5KciTJ07v745PWBQAAAAAAgGls9RtjT97sZFVtS3JZknOSnJXk/Ko6a8O0v0yy1t0PTPLmJP95izUBAAAAAADALWy1MVYTzu9OcrC7r+3uG5NckeTc8Qnd/Y7u/vzo8KokO7dYEwAAAAAAANzCxFcpVtXdjncqkxtjO5JcN3Z8KMl3bDL/GUneOqkmAAAAAAAAmNbExliS9yTpHLsJduO8CqmqpyRZS/Ldxzm/J8meJDnjjDPm9bN8DZMZZiE3TEtmmIXcMC2ZYRZyw7RkhlnIDdOSGWYhN0xLZtjMxFcpdveZ3X2v0d+N270mXH44yeljxztHY/9CVT0myc8keUJ3f/E4dVze3WvdvbZ9+/ZJZYPMMBO5YVoywyzkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsNmhrxK8SEbhjrJJ7v7umPN3+DqJLuq6sysN8TOS3LBhvUfnORXk5zd3dcPqhoAAAAAAACmNORVii8+xtjdqur2Sc7v7vcd78LuvqmqLkxyZZJtSV7b3ddU1aVJ9nf33iT/JcnXJ/ntqkqST3T3E6a9EQAAAAAAANjMxMZYdz/yWONVtZbkZUm+a8L1+5Ls2zB2ydj+YwZVCgAAAAAAAFsw8Rtjx9Pd+7P+pBcAAAAAAAAsvZkbY1X1TVn/3hgAAAAAAAAsvYmvUqyql+eWDbC7JfnOJM9eRFEAAAAAAAAwbxMbY0n2bzjuJJ9KclF3Xz//kgAAAAAAAGD+hjTG3tHdn1h4JQAAAAAAALBAQ74x9pajO1X1OwusBQAAAAAAABZmSGOsxvbvtahCAAAAAAAAYJGGNMb6OPsAAAAAAABwwhjyjbF/U1Wfy/qTY6eM9jM67u6+y8KqAwAAAAAAgDmZ2Bjr7m23RiEAAAAAAACwSENepQgAAAAAAAAnPI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVsPDGWFWdXVUfrqqDVXXxMc7foap+a3T+3VV1z0XXBAAAAAAAwOpZaGOsqrYluSzJOUnOSnJ+VZ21YdozktzQ3fdJ8ktJXrjImgAAAAAAAFhNi35ibHeSg919bXffmOSKJOdumHNukteP9t+c5NFVVQuuCwAAAAAAgBWz6MbYjiTXjR0fGo0dc05335Tks0nuvuC6AAAAAAAAWDEn39YFDFVVe5LsGR1+sao+eFvWcys6Lcknb+sibiUf7O4HzGsxmVkJc81MIje3dRG3Ev9r5kNmtkBuVoL/NfMhM1sgNyvB/5r5kJktkJuV4H/NfMjMFsjNSvC/Zj5kZoDq7nkX89XFqx6W5Hnd/T2j4+cmSXf/4ticK0dz3lVVJyf5+yTbe5PCqmp/d68trPAl4l6Xf+1l415PnPWXiXtd/rWXjXs9cdZfJu51+ddeNu71xFl/mbjX5V972bjXE2f9ZeJel3/tZeNeT5z1l4l7Xf61l417HWbRr1K8Osmuqjqzqm6f5LwkezfM2ZvkqaP9H0zyh5s1xQAAAAAAAGAWC32VYnffVFUXJrkyybYkr+3ua6rq0iT7u3tvktckeUNVHUzy6aw3zwAAAAAAAGCuFv6Nse7el2TfhrFLxva/kORJUy57+RxKO1G41+Vfe9m41xNn/WXiXpd/7WXjXk+c9ZeJe13+tZeNez1x1l8m7nX511427vXEWX+ZuNflX3vZuNcTZ/1l4l6Xf+1l414HWOg3xgAAAAAAAGBZLPobYwAAAAAAALAUNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK2GhjbGqem1VXV9VHzzO+aqql1XVwar6QFU9ZJH1AAAAAAAAsLoW/cTY65Kcvcn5c5LsGm17krxiwfUAAAAAAACwohbaGOvuP07y6U2mnJvk13vdVUlOrapvXmRNAAAAAAAArKbb+htjO5JcN3Z8aDQGAAAAAAAAc3VbN8YGq6o9VbW/qvbf//737yS2r71trmRmJba5k5uV2OZKZlZimzu5WYltrmRmJba5k5uV2OZKZlZimzu5WYltrmRmJba5k5uV2OZKZlZim9lt3Rg7nOT0seOdo7Fb6O7Lu3utu9dOOeWUW6U4TmwywyzkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQybua0bY3uT/FCte2iSz3b3393GNQEAAAAAAPA16ORFLl5Vb0zyiCSnVdWhJD+X5HZJ0t2vTLIvyfcmOZjk80metsh6AAAAAAAAWF0LbYx19/kTzneS/7DIGgAAAAAAACC57V+lCAAAAAAAALcKjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBK0BgDAAAAAABgJWypMVZVj51XIQAAAAAAALBIW31i7DVzqQIAAAAAAAAW7ORJE6pq7/FOJbn7fMsBAAAAAACAxZjYGEvyPyZ5SpJ/2jBeSXbPvSIAAAAAAABYgCGNsauSfL67/2jjiar68PxLAgAAAAAAgPmb2Bjr7nM2Ofdd8y0HAAAAAAAAFmPIE2NJkqr6piQ7RoeHu/sfFlMSAAAAAAAAzN/ExlhVPTjJK5LcNcnh0fDOqvpMkh/t7vcusD4AAAAAAACYi5MGzPm1JM/u7vt192NG27ck+fHRuU1V1dlV9eGqOlhVFx/j/BlV9Y6q+suq+kBVfe/0twEAAAAAAACbG9IYu1N3v3vjYHdfleROm11YVduSXJbknCRnJTm/qs7aMO1nk7ypux+c5LwkvzKkcAAAAAAAAJjGkG+MvbWqfi/Jrye5bjR2epIfSvK2CdfuTnKwu69Nkqq6Ism5SQ6Mzekkdxnt3zXJ3w4rHQAAAAAAAIab2Bjr7v+tqs7JekNrx2j4cJLLunvfhMt35KvNtCQ5lOQ7Nsx5XpK3V9WPZf0JtMcMqBsAAAAAAACmMuSJsXT3W5O8dUE1nJ/kdd394qp6WJI3VNUDuvvm8UlVtSfJniQ544wzFlQKX0tkhlnIDdOSGWYhN0xLZpiF3DAtmWEWcsO0ZIZZyA3Tkhk2M/EbY1W1rar+16p6flV954ZzPzvh8sNZf+3iUTtHY+OekeRNSdLd70pyxySnbVyouy/v7rXuXtu+ffukskFmmIncMC2ZYRZyw7RkhlnIDdOSGWYhN0xLZpiF3DAtmWEzExtjSX41yXcn+VSSl1fVS8bOPXHCtVcn2VVVZ1bV7ZOcl2TvhjmfSPLoJKmq+2W9MXZkQF0AAAAAAAAw2JDG2O7uvqC7/2vWvw/29VX1u1V1hyS12YXdfVOSC5NcmeRDSd7U3ddU1aVV9YTRtJ9I8qyqen+SNyb54e7uWW8IAAAAAAAAjmXIN8Zuf3Rn1OjaU1WXJPnDJF8/6eLu3pdk34axS8b2DyR5+NCCAQAAAAAAYBZDnhjbX1Vnjw9096VJfi3JPRdRFAAAAAAAAMzbxMZYdz+lu992jPFXd/ftFlMWAAAAAAAAzNeQVymmqr4lyblJdoyGDifZ290fWlRhAAAAAAAAME8Tnxirqp9KckWSSvIXo62SvLGqLl5seQAAAAAAADAfQ54Ye0aS+3f3l8YHq+olSa5J8oJFFAYAAAAAAADzNPGJsSQ3J7nHMca/eXQOAAAAAAAAlt6QJ8Z+PMkfVNVfJ7luNHZGkvskuXBRhQEAAAAAAMA8TWyMdffbquq+SXYn2TEaPpzk6u7+8iKLAwAAAAAAgHkZ8sRYkuxM8v9291VVdc8ka0n+MevfGAMAAAAAAIClN/EbY1V1cZI/SnJVVT0zyduSnJPkTVV10YLrAwAAAAAAgLkY8sTY/5LkrCRfl+RjSe7V3Ueq6k5J3p3kJYsrDwAAAAAAAOZjSGPsy939z1V1Y5J/TvKpJOnu/6+qFlocAAAAAAAAzMuQxth7q+o3k9wpyR8keX1VvS3Jo5IcWGRxAAAAAAAAMC9DGmPPTPKkJJ3kzUl2J7kgyYeTXLa40gAAAAAAAGB+JjbGuvumJG8cG/rz0TZIVZ2d5KVJtiV5dXe/4BhznpzkeVlvvr2/uy8Yuj4AAAAAAAAMMbExVlXvTfK7Sd7Y3R+dZvGq2pb1p8oem+RQkquram93HxibsyvJc5M8vLtvqKpvnOY3AAAAAAAAYIiTBsz5hiSnJnlHVf1FVf3vVXWPgevvTnKwu6/t7huTXJHk3A1znpXksu6+IUm6+/qBawMAAAAAAMBgQxpjN3T3c7r7jCQ/kWRXkvdW1Tuqas+Ea3ckuW7s+NBobNx9k9y3qv6sqq4avXrxFqpqT1Xtr6r9R44cGVA2q05mmIXcMC2ZYRZyw7RkhlnIDdOSGWYhN0xLZpiF3DAtmWEzQxpjX9Hdf9LdP5r15tYLkzxsDjWcnPVm2yOSnJ/kVVV16jF++/LuXuvute3bt8/hZ/laJzPMQm6YlswwC7lhWjLDLOSGackMs5AbpiUzzEJumJbMsJmJ3xhL8pGNA9395SRvG22bOZzk9LHjnaOxcYeSvLu7v5Tkb6rqI1lvlF09oDYAAAAAAAAYZOITY9193hbWvzrJrqo6s6pun+S8JHs3zHlL1p8WS1WdlvVXK167hd8EAAAAAACAW5j4xFhVXbTZ+e5+ySbnbqqqC5NcmWRbktd29zVVdWmS/d29d3TucVV1IMmXk/xkd39qmpsAAAAAAACASYa8SvFFSd6X5K1JvpikpvmB7t6XZN+GsUvG9jvJRaMNAAAAAAAAFmJIY+zBSc5P8u+SvCfJG5P8waihBQAAAAAAACeEId8Ye393X9zdL4gSMgAAIABJREFUD0rymiTnJjlQVU9YeHUAAAAAAAAwJxMbY0dV1fasPz32rUkOJbl+UUUBAAAAAADAvE18lWJVPT3Jk5PcMcmbkzy5uzXFAAAAAAAAOKEM+cbYq5N8MMnHk3xPksdV1VdOdrdXKgIAAAAAALD0hjTGHrnwKgAAAAAAAGDBhjTGHprkRd395UUXAwAAAAAAAIty0oA5pyd5T1U9fNHFAAAAAAAAwKJMfGKsuy+sqock+eWq+lCSVyS5eez8exdYHwAAAAAAAMzFkFcpprvfW1U/neR3ktw7SR89leRRC6oNAAAAAAAA5mZiY6yqvjHJi5PcK8mjuvv9C68KAAAAAAAA5mzIN8beneRPkvxbTTEAAAAAAABOVEMaY7u7+/Lu7vHBqjq9qn5yQXUBAAAAAADAXE1sjHX3kaP7VbW9qn60qv4kyTuTfNMCawMAAAAAAIC5mdgYq6o7V9VTq+rKJH+R5N5Jzuzue3f3cwZcf3ZVfbiqDlbVxZvM+4Gq6qpam+oOAAAAAAAAYICTB8y5PusNsZ9N8qfd3VX1/UMWr6ptSS5L8tgkh5JcXVV7u/vAhnl3TvLsrH/PDAAAAAAAAOZuyDfGnpvkDkl+Jclzq+reU6y/O8nB7r62u29MckWSc48x7/lJXpjkC1OsDQAAAAAAAIMN+cbYf+3uh+arDa23JLlHVf1UVd13wuU7klw3dnxoNPYVVfWQJKd39+9ttlBV7amq/VW1/8iRI5tNhSQyw2zkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQybGfLEWJJk9NTXL3T3tyZZS3LXJPu28uNVdVKSlyT5iQG/f3l3r3X32vbt27fys6wImWEWcsO0ZIZZyA3TkhlmITdMS2aYhdwwLZlhFnLDtGSGzQxujFXVqVX17VX17Umu6+6f7u77TLjscJLTx453jsaOunOSByR5Z1V9LMlDk+ytqrWhdQEAAAAAAMAQJ0+aUFV3SPKrSf6nJH+TpJL8q6r6v5P8yOjbYcdzdZJdVXVm1hti5yW54OjJ7v5sktPGfuudSZ7T3funvxUAAAAAAAA4viFPjP1Mkttl/TtgD+7uByU5I+tNtf+42YXdfVOSC5NcmeRDSd7U3ddU1aVV9YStlQ4AAAAAAADDTXxiLMkTk+zu7s8fHejuf6yqH01yVSY3x/Zlw7fIuvuS48x9xIB6AAAAAAAAYGpDnhi7ebwpdlR3/1OSnn9JAAAAAAAAMH9DnhjrqvqGrH9bbKOb51wPAAAAAAAALMSQxthdk7wnx26MeWIMAAAAAACAE8LExlh333PIQlV1/+6+ZssVAQAAAAAAwAIM+cbYUG+Y41oAAAAAAAAwV/NsjB3rVYsAAAAAAACwFObZGPO9MQAAAAAAAJbWPBtjAAAAAAAAsLS21BirqnuMHd64xVoAAAAAAABgYbb6xNhVR3e6+6FbXAsAAAAAAAAWZquNsZpLFQAAAAAAALBgW22M9VyqAAAAAAAAgAU7edKEqnp5jt0AqySnzr0iAAAAAAAAWICJjbEk+2c8BwAAAAAAAEtjYmOsu19/vHNV9aJJ11fV2UlemmRbkld39ws2nL8oyTOT3JTkSJKnd/fHJ60LAAAAAAAA09jqN8aevNnJqtqW5LIk5yQ5K8n5VXXWhml/mWStux+Y5M1J/vMWawIAAAAAAIBb2GpjrCac353kYHdf2903JrkiybnjE7r7Hd39+dHhVUl2brEmAAAAAAAAuIWJjbGquttxtrtncmNsR5Lrxo4PjcaO5xlJ3nqcOvZU1f6q2n/kyJFJZYPMMBO5YVoywyzkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsNmhjwx9p4k+0d/x7f9SW6cVyFV9ZQka0n+y7HOd/fl3b3W3Wvbt2+f18/yNUxmmIXcMC2ZYRZyw7RkhlnIDdOSGWYhN0xLZpiF3DAtmWEzJ0+a0N1nbmH9w0lOHzveORr7F6rqMUl+Jsl3d/cXt/B7AAAAAAAAcEwTG2NV9ZANQ53kk9193bHmb3B1kl1VdWbWG2LnJblgw/oPTvKrSc7u7usHVQ0AAAAAAABTmtgYS/LiY4zdrapun+T87n7f8S7s7puq6sIkVybZluS13X1NVV2aZH937836qxO/PslvV1WSfKK7nzDtjQAAAAAAAMBmhrxK8ZHHGq+qtSQvS/JdE67fl2TfhrFLxvYfM6hSAAAAAAAA2IKTZr2wu/dn/UkvAAAAAAAAWHozN8aq6puy/r0xAAAAAAAAWHoTX6VYVS/PLRtgd0vynUmevYiiAAAAAAAAYN4mNsaS7N9w3Ek+leSi7r5+/iUBAAAAAADA/A1pjL2juz+x8EoAAAAAAABggYZ8Y+wtR3eq6ncWWAsAAAAAAAAszJDGWI3t32tRhQAAAAAAAMAiDWmM9XH2AQAAAAAA4IQx5Btj/6aqPpf1J8dOGe1ndNzdfZeFVQcAAAAAAABzMrEx1t3bbo1CAAAAAAAAYJGGvEoRAAAAAAAATngaYwAAAAAAAKwEjTEAAAAAAABWwsIbY1V1dlV9uKoOVtXFxzh/h6r6rdH5d1fVPRddEwAAAAAAAKtnoY2xqtqW5LIk5yQ5K8n5VXXWhmnPSHJDd98nyS8leeEiawIAAAAAAGA1LfqJsd1JDnb3td19Y5Irkpy7Yc65SV4/2n9zkkdXVS24LgAAAAAAAFbMohtjO5JcN3Z8aDR2zDndfVOSzya5+4LrAgAAAAAAYMWcfFsXMFRV7UmyZ3T4xar64G1Zz63otCSfvK2LuJV8sLsfMK/FZGYlzDUzidzc1kXcSvyvmQ+Z2QK5WQn+18yHzGyB3KwE/2vmQ2a2QG5Wgv818yEzWyA3K8H/mvmQmQGqu+ddzFcXr3pYkud19/eMjp+bJN39i2NzrhzNeVdVnZzk75Ns700Kq6r93b22sMKXiHtd/rWXjXs9cdZfJu51+ddeNu71xFl/mbjX5V972bjXE2f9ZeJel3/tZeNeT5z1l4l7Xf61l417PXHWXybudfnXXjbudZhFv0rx6iS7qurMqrp9kvOS7N0wZ2+Sp472fzDJH27WFAMAAAAAAIBZLPRVit19U1VdmOTKJNuSvLa7r6mqS5Ps7+69SV6T5A1VdTDJp7PePAMAAAAAAIC5Wvg3xrp7X5J9G8YuGdv/QpInTbns5XMo7UThXpd/7WXjXk+c9ZeJe13+tZeNez1x1l8m7nX511427vXEWX+ZuNflX3vZuNcTZ/1l4l6Xf+1l415PnPWXiXtd/rWXjXsdYKHfGAMAAAAAAIBlsehvjAEAAAAAAMBS0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArISFNsaq6rVVdX1VffA456uqXlZVB6vqA1X1kEXWAwAAAAAAwOpa9BNjr0ty9ibnz0mya7TtSfKKBdcDAAAAAADAilpoY6y7/zjJpzeZcm6SX+91VyU5taq+eZE1AQAAAAAAsJpu62+M7Uhy3djxodEYAAAAAAAAzNVt3RgbrKr2VNX+qtp///vfv5PYvva2uZKZldjmTm5WYpsrmVmJbe7kZiW2uZKZldjmTm5WYpsrmVmJbe7kZiW2uZKZldjmTm5WYpsrmVmJbWa3dWPscJLTx453jsZuobsv7+617l475ZRTbpXiOLHJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQyzkBumJTNs5rZujO1N8kO17qFJPtvdf3cb1wQAAAAAAMDXoJMXuXhVvTHJI5KcVlWHkvxcktslSXe/Msm+JN+b5GCSzyd52iLrAQAAAAAAYHUttDHW3edPON9J/sMiawAAAAAAAIDktn+VIgAAAAAAANwqNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlbKkxVlWXzKsQAAAAAAAAWKStPjH2zLlUAQAAAAAAAAt28qQJVfW5451Kcsp8ywEAAAAAAIDFmNgYS/KZJN/e3f+w8URVXTf/kgAAAAAAAGD+hrxK8deT/KvjnPvNOdYCAAAAAAAACzPxibHu/tlNzv3UfMsBAAAAAACAxRjyKsVU1V2TnJ1kx2jocJIru/szA649O8lLk2xL8urufsGG82ckeX2SU0dzLu7ufYPvAAAAAAAAAAaY+CrFqvqhJO9N8ogkXzfaHpnkPaNzm127LcllSc5JclaS86vqrA3TfjbJm7r7wUnOS/IrU94DAAAAAAAATDTkibGfSfJtG58Oq6pvSPLurH+D7Hh2JznY3deOrrkiyblJDozN6SR3Ge3fNcnfDisdAAAAAAAAhhvSGKusN682unl0bjM7klw3dnwoyXdsmPO8JG+vqh9LcqckjxlQEwAAAAAAAExl4qsUk/x8kvdW1Suq6qdH2yuz/nrFn59DDecneV1370zyvUneUFW3qKuq9lTV/qraf+TIkTn8LF/rZIZZyA3TkhlmITdMS2aYhdwwLZlhFnLDtGSGWcgN05IZNjOxMdbdr0+yluSPknxxtL0zyVp3v27C5YeTnD52vHM0Nu4ZSd40+q13JbljktOOUcfl3b3W3Wvbt2+fVDbIDDORG6YlM8xCbpiWzDALuWFaMsMs5IZpyQyzkBumJTNsZsirFNPdNyS5Yob1r06yq6rOzHpD7LwkF2yY84kkj07yuqq6X9YbY1q4AAAAAAAAzNWQVykeV1X91Wbnu/umJBcmuTLJh5K8qbuvqapLq+oJo2k/keRZVfX+JG9M8sPdfaxvmgEAAAAAAMDMJj4xVlVPPN6pJP/DpOu7e1+SfRvGLhnbP5Dk4ZPWAQAAAAAAgK0Y8irF30ryfyU51lNcd5xvOQAAAAAAALAYQxpjH0jyou7+4MYTVfWY+ZcEAAAAAAAA8zfkG2M/nuRzxzn3/XOsBQAAAAAAABZm4hNj3f0nm5zbP99yAAAAAAAAYDEmNsaq6uQkz8j602H3GA0fTvL/JHlNd39pceUBAAAAAADAfAz5xtgbknwmyfOSHBqN7Uzy1CS/keTfL6QyAAAAAAAAmKMhjbFv6+77bhg7lOSqqvrIAmoCAAAAAACAuTtpwJxPV9WTquorc6vqpKr690luWFxpAAAAAAAAMD9DGmPnJfnBJP9QVR+pqr9O8g9Jnjg6BwAAAAAAAEtv4qsUu/tjGX1HrKruPhr71GLLAgAAAAAAgPka8sRYqmp3VX37qCH2TVV1UVWds+DaAAAAAAAAYG4mPjFWVT+X5JwkJ1fV7yf5jiTvSPLcqnpId//8gmsEAAAAAACALZvYGMv698UelOQOSf4+yc7u/lxVvSjJu5NojAEAAAAAALD0hrxK8abu/nJ3fz7JR7v7c0nS3f+c5OaFVgcAAAAAAABzMqQxdmNVfd1o/9uODlbVXTOgMVZVZ1fVh6vqYFVdfJw5T66qA1V1TVX95qDKAQAAAAAAYApDXqX4Xd39xSTp7vFG2O2SPHWzC6tqW5LLkjw2yaEkV1fV3u4+MDZnV5LnJnl4d99QVd845T0AAAAAAADARBMbY939xaqqJLuT7BgNH07yF939yQmX705ysLuvTZKquiLJuUkOjM15VpLLuvuG0e9dP90tAAAAAAAAwGQTG2NV9bgkv5Lkr7PeEEuSnUnuU1U/2t1v3+TyHUmuGzs+lOQ7Nsy57+h3/izJtiTP6+63DSsfAAAAAAAAhhnyKsWXJnlMd39sfLCqzkyyL8n95lDDriSPyHrD7Y+r6lu7+zMbfm9Pkj1JcsYZZ2zxJ1kFMsMs5IZpyQyzkBumJTPMQm6YlswwC7lhWjLDLOSGackMmzlpwJyTs/6k10aHs/6dsc0cTnL62PHOfPWps6MOJdnb3V/q7r9J8pGsN8r+he6+vLvXuntt+/btA8pm1ckMs5AbpiUzzEJumJbMMAu5YVoywyzkhmnJDLOQG6YlM2xmyBNjr01y9ej7YEdfi3h6kvOSvGbCtVcn2TV6uuzw6JoLNsx5S5Lzk/xaVZ2W9VcrXjusfAAAAAAAABhmYmOsu3+xqt6S5NwkDxsNH07yP3f3gQnX3lRVFya5MuvfD3ttd19TVZcm2d/de0fnHldVB5J8OclPdvenZr8lAAAAAAAAuKUhT4yluz+U5EMbx6vq4d39ZxOu3Zf1b5GNj10ytt9JLhptAAAAAAAAsBATG2NVtS3Jk5PsSPK27v5gVT0+yU8nOSXJgxdbIgAAAAAAAGzdkCfGXpP1b4r9RZKXVdXfJllLcnF3v2WRxQEAAAAAAMC8DGmMrSV5YHffXFV3TPL3Se7tO2AAAAAAAACcSE4aMOfG7r45Sbr7C0mu1RQDAAAAAADgRDPkibFvqaoPjPYryb1Hx5Wku/uBC6sOAAAAAAAA5mRIY+x+C68CAAAAAAAAFmxiY6y7P54kVXVmkvuPhg9097WLLAwAAAAAAADmaWJjrKrukuTVSdaSvG80/KCqek+SZ3T35xZYHwAAAAAAAMzFSQPmvCzJgST36e4ndvcTk9w7yV8l+eVFFgcAAAAAAADzMuQbYw/v7h8eH+juTnJpVf31QqoCAAAAAACAORvyxNhmai5VAAAAAAAAwIINaYz9eVVdUlX/oglWVf8xybsWUxYAAAAAAADM15BXKf5YktckOVhV7xuNPSjJXyZ55qIKAwAAAAAAgHma2Bjr7s8leVJV3TvJWaPhA9390YVWBgAAAAAAAHM08VWKVfWUJBk1wj7d3f/taFOsqi4ccP3ZVfXhqjpYVRdvMu8Hqqqram2K+gEAAAAAAGCQId8Yu2hs/+Ubzj19swuraluSy5Kck/Wnzc6vqrOOMe/OSZ6d5N0D6gEAAAAAAICpDWmM1XH2j3W80e4kB7v72u6+MckVSc49xrznJ3lhki8MqAcAAAAAAACmNqQx1sfZP9bxRjuSXDd2fGg09hVV9ZAkp3f37w2oBQAAAAAAAGYypDH2LVX1gar6q7H9o8f/eis/XlUnJXlJkp8YMHdPVe2vqv1HjhzZys+yImSGWcgN05IZZiE3TEtmmIXcMC2ZYRZyw7RkhlnIDdOSGTYzpDF2vyTfl+TxY/tHj2/xvbANDic5fex452jsqDsneUCSd1bVx5I8NMneqlrbuFB3X97da929tn379gFls+pkhlnIDdOSGWYhN0xLZpiF3DAtmWEWcsO0ZIZZyA3Tkhk2c/KkCd398S2sf3WSXVV1ZtYbYucluWBs7c8mOe3ocVW9M8lzunv/Fn4TAAAAAAAAbmHiE2NV9Yyq+smx48NV9bmq+seq+pHNru3um5JcmOTKJB9K8qbuvqaqLq2qJ2y1eAAAAAAAABhq4hNjSX4kydljx9d3946qumPWG16v3Ozi7t6XZN+GsUuOM/cRA+oBAAAAAACAqQ35xlh196fGjn87Sbr7C0lOWUhVAAAAAAAAMGdDGmOnjh909y/k/2fv/oNtO8s6wX+f3GuUFpBOcqUxP0xoY42BbiHeSoPMaGhAEqpMqlAwQRQlervsDsNMLLphZNIYZwQERLCjTYQ0P6Y0BnqGvqWXDj0ahimbMPfYIE2C6DUt5AaoXCANrfwI0Wf+OPvq4eTcs9feZ6/cfbI/n6pdd613ves9z1v1rfvPU2utJFV1SjZ8HwwAAAAAAACW2ZDG2Hur6n/bYvy6JO9dcD0AAAAAAAAwiiHfGHtJkjdX1ZEkfzQZ++4ka0l+aqzCAAAAAAAAYJGmNsa6+y+TXFlVj03yuMnwHd39ZxvnVdXjuvv2EWoEAAAAAACAHRvyxFiSpLvvTHLnNlPekeTCHVcEAAAAAAAAIxjyjbGhaoFrAQAAAAAAwEItsjHWC1wLAAAAAAAAFmqRjTEAAAAAAABYWjtqjFXVt204vW+HtQAAAAAAAMBodvrE2G3HD7r7STtcCwAAAAAAAEaz08ZYLaQKAAAAAAAAGNlOG2O9kCoAAAAAAABgZHunTaiqX83WDbBK8qiFVwQAAAAAAAAjmNoYS7I257UkSVVdkuQNSfYkeXN3v2rT9WuS/FSS+5McS/LC7v7EgLoAAAAAAABgsKmNse5+24muVdVrt7u3qvYkuT7JM5IcTXK4qg529x0bpn0oyf7u/lJV/UySX0ryI0OKBwAAAAAAgKF2+o2x5065flGSI919Z3ffl+SmJJdvnNDdt3b3lyantyU5a4c1AQAAAAAAwAPstDFWU66fmeSuDedHJ2MnclWS9+ywJgAAAAAAAHiAqY2xqjrtBL/TM70xNlhVPT/J/iSvOcH1A1W1VlVrx44dW9Sf5SFMZpiH3DArmWEecsOsZIZ5yA2zkhnmITfMSmaYh9wwK5lhO0OeGPvDJGuTfzf+1pLcN+Xeu5OcveH8rMnY16mqpyf5uSSXdfdXt1qou2/o7v3dvX/fvn0DymbVyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM85AbZiUzbGfvtAndfd4O1j+c5PyqOi/rDbErkjxv44SqemKSNyW5pLvv2cHfAgAAAAAAgBOa2hirqgs3DXWSz3b3XVvN/7qJ3fdX1dVJbkmyJ8mN3X17VV2XZK27D2b91YkPT/LOqkqST3b3ZTPuAwAAAAAAALY1tTGW5HVbjJ1WVacmubK7P7zdzd19KMmhTWPXbjh++pBCAQAAAAAAYCeGvErxqVuNV9X+JG9M8n2LLgoAAAAAAAAW7ZR5b+zutay/AhEAAAAAAACW3tyNsap6dNa/NwYAAAAAAABLb+qrFKvqV/PABthpSb43yYvHKAoAAAAAAAAWbWpjLMnapvNO8rkk13T3PYsvCQAAAAAAABZvSGPs1u7+5OiVAAAAAAAAwIiGfGPs3ccPqurfjlgLAAAAAAAAjGZIY6w2HD92rEIAAAAAAABgTEMaY32CYwAAAAAAANg1hnxj7Lur6otZf3LsYZPjTM67ux85WnUAAAAAAACwIFMbY92958EoBAAAAAAAAMY05FWKAAAAAAAAsOtpjAEAAAAAALASNMYAAAAAAABYCaM3xqrqkqr6eFUdqaqXbnH9G6vqtyfXP1hV545dEwAAAAAAAKtn1MZYVe1Jcn2SS5NckOTKqrpg07Srktzb3d+R5PVJXj1mTQAAAAAAAKymsZ8YuyjJke6+s7vvS3JTkss3zbk8ydsmx+9K8rSqqpHrAgAAAAAAYMWM3Rg7M8ldG86PTsa2nNPd9yf5QpLTR64LAAAAAACAFbP3ZBcwVFUdSHJgcvrVqvroyaznQXRGks+e7CIeJB/t7scvajGZWQkLzUwiNye7iAeJ/2sWQ2Z2QG5Wgv9rFkNmdkBuVoL/axZDZnZAblaC/2sWQ2Z2QG5Wgv9rFkNmBqjuXnQxf7t41ZOTvKK7nzk5f1mSdPcrN8y5ZTLnA1W1N8lnkuzrbQqrqrXu3j9a4UvEXpd/7WVjr7tn/WVir8u/9rKx192z/jKx1+Vfe9nY6+5Zf5nY6/KvvWzsdfesv0zsdfnXXjb2unvWXyb2uvxrLxt7HWbsVykeTnJ+VZ1XVacmuSLJwU1zDiZ5weT4h5P8/nZNMQAAAAAAAJjHqK9S7O77q+rqJLck2ZPkxu6+vaquS7LW3QeTvCXJO6rqSJLPZ715BgAAAAAAAAs1+jfGuvtQkkObxq7dcPyVJM+ZcdkbFlDabmGvy7/2srHX3bP+MrHX5V972djr7ll/mdjr8q+9bOx196y/TOx1+ddeNva6e9ZfJva6/GsvG3vdPesvE3td/rWXjb0OMOo3xgAAAAAAAGBZjP2NMQAAAAAAAFgKGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlTBqY6yqbqyqe6rqoye4XlX1xqo6UlUfqaoLx6wHAAAAAACA1TX2E2NvTXLJNtcvTXL+5Hcgya+PXA8AAAAAAAAratTGWHe/P8nnt5lyeZK397rbkjyqqh4zZk0AAAAAAACsppP9jbEzk9y14fzoZAwAAAAAAAAW6mQ3xgarqgNVtVZVa4973OM6id9D77dQMrMSv4WTm5X4LZTMrMRv4eRmJX4LJTMr8Vs4uVmJ30LJzEr8Fk5uVuK3UDKzEr+Fk5uV+C2UzKzEb24nuzF2d5KzN5yfNRl7gO6+obv3d/f+hz3sYQ9KcexuMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM2znZjbGDSX681j0pyRe6+9MnuSYAAAAAAAAegvaOuXhV/VaSi5OcUVVHk/zLJN+QJN39r5McSvKsJEeSfCnJT45ZDwAAAAAAAKtr1MZYd1855Xon+Wdj1gAAAAAAAADJyX+VIgAAAAAAADwoNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlTBXY6yqLlt0IQAAAAAAADCmvdMmVNWzNw8lub6q9iZJd/+fYxQGAAAAAAAAizS1MZbkt5PckuSerDfFkuSbk/xgkk6iMQYAAAAAAMDSG9IY+94kr0pyuLt/PUmq6uLu/slRKwMAAAAAAIAFmvqNse4+nOQZSU6tqlur6qKsPykGAAAAAAAAu8aQJ8bS3X+d5A1V9a4krx+3JAAAAAAAAFi8QY2x47r77iTPHakWAAAAAAAAGM3UVylW1bdU1auq6o+r6vNV9bmq+thk7FEPRpEAAAAAAACwU1MbY0luTnJvkou7+7TuPj3JUydjN0+7uaouqaps6PsZAAAgAElEQVSPV9WRqnrpFtfPmXy77ENV9ZGqetasmwAAAAAAAIBphjTGzu3uV3f3Z44PdPdnuvvVSb59uxurak+S65NcmuSCJFdW1QWbpr08yc3d/cQkVyT5tVk2AAAAAAAAAEMMaYx9oqr+eVU9+vhAVT26qv5Fkrum3HtRkiPdfWd335fkpiSXb5rTSR45Of6WJJ8aVjoAAAAAAAAMN6Qx9iNJTk/y/0y+Mfb5JO9LclqS506598x8ffPs6GRso1ckeX5VHU1yKMmLBtQEAAAAAAAAM5naGOvue7v7X3T3fzf5xthp3f1dk7HPL6CGK5O8tbvPSvKsJO+oqgfUVVUHqmqtqtaOHTu2gD/LQ53MMA+5YVYywzzkhlnJDPOQG2YlM8xDbpiVzDAPuWFWMsN2hjwxdkJV9ZNTptyd5OwN52dNxja6KsnNSdLdH0jyTUnO2LxQd9/Q3fu7e/++ffvmL5qVITPMQ26YlcwwD7lhVjLDPOSGWckM85AbZiUzzENumJXMsJ0dNcaS/PyU64eTnF9V51XVqUmuSHJw05xPJnlaklTVd2W9MaaFCwAAAAAAwELtnTahqj5yoktJHr3dvd19f1VdneSWJHuS3Njdt1fVdUnWuvtgkp9N8htV9T8n6SQ/0d09yyYAAAAAAABgmqmNsaw3v56Z5N5N45XkP067ubsPJTm0aezaDcd3JHnKgDoAAAAAAABgbkMaY7+T5OHd/eHNF6rqfQuvCAAAAAAAAEYwtTHW3Vdtc+15iy0HAAAAAAAAxjHkibFUVSW5KMmZk6G7k/x/vgUGAAAAAADAbjG1MVZVP5Dk15L8adYbYklyVpLvqKp/2t3vHbE+AAAAAAAAWIghT4y9IcnTu/vPNw5W1XlJDiX5rhHqAgAAAAAAgIU6ZcCcvUmObjF+d5JvWGw5AAAAAAAAMI4hT4zdmORwVd2U5K7J2NlJrkjylrEKAwAAAAAAgEWa2hjr7ldW1buTXJ7kyZPhu5P8aHffMWZxAAAAAAAAsChDnhhLd38sycdGrgUAAAAAAABGM/UbY1V1yYbjb6mqN1fVR6rqN6vq0eOWBwAAAAAAAIsxtTGW5Bc3HL8uyWeS/GCSw0neNEZRAAAAAAAAsGiDXqW4wf7ufsLk+PVV9YJFFwQAAAAAAABjGNIY+9aquiZJJXlkVVV39+TakCfOAAAAAAAA4KQb0tj6jSSPSPLwJG9LckaSVNXfS/Lh8UoDAAAAAACAxZn6xFh3//wJxj+T5Men3V9VlyR5Q5I9Sd7c3a/aYs5zk7wiSSf5o+5+3rR1AQAAAAAAYBZTG2NVdVqSq5N8KslbkvwvSZ6c5GNJfrG7793m3j1Jrk/yjCRHkxyuqoPdfceGOecneVmSp3T3vVX1rTvYDwAAAAAAAGxpyKsU/48k35zke5LcmuTvJXl1ki8neeuUey9KcqS77+zu+5LclOTyTXN+Osn1xxts3X3P4OoBAAAAAABgoKlPjCX5tu5+VlVVkqPdffFk/P+tqmnfGDszyV0bzo8m+Ueb5nxnklTVH2T9dYuv6O5/P6AuAAAAAAAAGGzIE2OnVNXfTXJ2kodX1blJUlWnJzl1ATXsTXJ+kouTXJnkN6rqUZsnVdWBqlqrqrVjx44t4M/yUCczzENumJXMMA+5YVYywzzkhlnJDPOQG2YlM8xDbpiVzLCdIY2xVyb54ySHk7wwyZur6j8k+UiSX5ly791Zb6gdd9ZkbKOjSQ5299e6+78k+ZOsN8q+Tnff0N37u3v/vn37BpTNqpMZ5iE3zEpmmIfcMCuZYR5yw6xkhnnIDbOSGeYhN8xKZtjO1FcpdvdvVdXNSaq776+qf5fkCUnu7u5PT7n9cJLzq+q8rDfErkjyvE1z3p31J8X+TVWdkfVXK9454z4AAAAAAABgW1MbY1V14Ybj44d/neQxVfWY7v5PJ7p30ki7OsktWf9+2I3dfXtVXZdkrbsPTq79QFXdkeSvkrykuz83944AAAAAAABgC1MbY0nWknw0yWcn57XhWif5x9vd3N2HkhzaNHbthuNOcs3kBwAAAAAAAKMY0hi7JskPJ/lykpuS/F/d/RejVgUAAAAAAAALdsq0Cd39K9393yd5UZKzk/xeVd1cVU8YvToAAAAAAABYkKmNseO6+84k/y7Je5NclOQ7xyoKAAAAAAAAFm3qqxSr6rFJrkhyeZK7sv46xV/s7i+PXBsAAAAAAAAszJBvjB1J8pGsPy32xSTnJPmZqkqSdPcvj1YdAAAAAAAALMiQxth1SXpy/PARawEAAAAAAIDRTG2MdfcrHoQ6AAAAAAAAYFSnTJtQVd9UVS+oqstq3T+vqt+pqjdU1RkPRpEAAAAAAACwU1MbY0nenuQHkrwwyfuSfHuSf5XkvyV561iFAQAAAAAAwCIN+cbYBd39+Kram+Rod3//ZPzfV9UfjVgbAAAAAAAALMyQJ8buS5Luvj/JpzZd+6uFVwQAAAAAAAAjGPLE2FlV9cYkteE4k/MzR6sMAAAAAAAAFmhIY+wlG47XNl3bfA4AAAAAAABLaWpjrLvfdvy4qh4+GfuLMYsCAAAAAACARRvyjbFU1c9U1SeTfCLJJ6rqE1X1Twfee0lVfbyqjlTVS7eZ90NV1VW1f1jpAAAAAAAAMNzUxlhVvTzJDya5uLtP7+7Tkzw1yaWTa9vduyfJ9UkuTXJBkiur6oIt5j0iyYuTfHD2LQAAAAAAAMB0Q54Y+7Ekz+7uO48PTI6fm+THp9x7UZIj3X1nd9+X5KYkl28x7xeSvDrJVwZVDQAAAAAAADMa0hjr7n5Aw6q7v5zkr6fce2aSuzacH52M/Y2qujDJ2d39uwNqAQAAAAAAgLkMaYzdXVVP2zxYVf84yad38ser6pQkv5zkZwfMPVBVa1W1duzYsZ38WVaEzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDdoY0xv7HJG+qqrdW1Ysmv7cluSHJ1VPuvTvJ2RvOz5qMHfeIJI9P8r6q+vMkT0pysKr2b16ou2/o7v3dvX/fvn0DymbVyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM85AbZiUzbGdqY6y7b8968+r9Sc6d/N6f5PGTa9s5nOT8qjqvqk5NckWSgxvW/kJ3n9Hd53b3uUluS3JZd6/NsRcAAAAAAAA4ob1DJnX3V6rq1iT3TIbu2Oq7Y1vcd39VXZ3kliR7ktzY3bdX1XVJ1rr74PYrAAAAAAAAwGJMbYxV1SOTvDnJ9yT5cJJK8oSq+sMkV3X3F7e7v7sPJTm0aezaE8y9eFjZAAAAAAAAMJsh3xh7Y5I7kpzf3T/U3c9O8veT/Ock/2rM4gAAAAAAAGBRhrxK8Snd/RMbB7q7k1xXVX86SlUAAAAAAACwYEOeGNtOLaQKAAAAAAAAGNmQxth/rKprq+rrmmBV9b8m+cA4ZQEAAAAAAMBiDXmV4ouSvCXJkar68GTsCUk+lOSqsQoDAAAAAACARZraGOvuLyZ5TlX9/SQXTIbv6O4/2zivqh7X3bePUCMAAAAAAADs2JAnxpIkk0bYn20z5R1JLtxxRQAAAAAAADCCId8YG6qmTwEAAAAAAICTY5GNsV7gWgAAAAAAALBQi2yMAQAAAAAAwNLaUWOsqr5tw+l9O6wFAAAAAAAARrPTJ8ZuO37Q3U/a4VoAAAAAAAAwmp02xmohVQAAAAAAAMDIdtoY64VUAQAAAAAAACPbO21CVf1qtm6AVZJHDbj/kiRvSLInyZu7+1Wbrl+T5KeS3J/kWJIXdvcnppcOAAAAAAAAw01tjCVZm/NaqmpPkuuTPCPJ0SSHq+pgd9+xYdqHkuzv7i9V1c8k+aUkPzKgLgAAAAAAABhsamOsu992omtV9dopt1+U5Eh33zmZf1OSy5P8TWOsu2/dMP+2JM+fVhMAAAAAAADMaqffGHvulOtnJrlrw/nRydiJXJXkPTusCQAAAAAAAB5gp42xWkgVSarq+Un2J3nNCa4fqKq1qlo7duzYov4sD2EywzzkhlnJDPOQG2YlM8xDbpiVzDAPuWFWMsM85IZZyQzbmdoYq6rTTvA7PdMbY3cnOXvD+VmTsc1/4+lJfi7JZd391a0W6u4bunt/d+/ft2/ftLJBZpiL3DArmWEecsOsZIZ5yA2zkhnmITfMSmaYh9wwK5lhO1O/MZbkD5N0tm6C3Tfl3sNJzq+q87LeELsiyfM2TqiqJyZ5U5JLuvueAfUAAAAAAADAzKY2xrr7vHkX7+77q+rqJLck2ZPkxu6+vaquS7LW3Qez/urEhyd5Z1UlySe7+7J5/yYAAAAAAABsZWpjrKou3DTUST7b3XcN+QPdfSjJoU1j1244fvqQdQAAAAAAAGAnhrxK8XVbjJ1WVacmubK7P7zgmgAAAAAAAGDhhrxK8albjVfV/iRvTPJ9iy4KAAAAAAAAFu2UeW/s7rWsfxsMAAAAAAAAlt7cjbGqenTWvzcGAAAAAAAAS2/qqxSr6lfzwAbYaUm+N8mLxygKAAAAAAAAFm1qYyzJ2qbzTvK5JNd09z2LLwkAAAAAAAAWb0hj7Nbu/uTolQAAAAAAAMCIhnxj7N3HD6rq345YCwAAAAAAAIxmSGOsNhw/dqxCAAAAAAAAYExDGmN9gmMAAAAAAADYNYZ8Y+y7q+qLWX9y7GGT40zOu7sfOVp1AAAAAAAAsCBTG2PdvefBKAQAAAAAAADGNORVigAAAAAAALDraYwBAAAAAACwEkZvjFXVJVX18ao6UlUv3eL6N1bVb0+uf7Cqzh27JgAAAAAAAFbPqI2xqtqT5Poklya5IMmVVXXBpmlXJbm3u78jyeuTvHrMmgAAAAAAAFhNYz8xdlGSI919Z3ffl+SmJJdvmnN5krdNjt+V5GlVVSPXBQAAAAAAwIoZuzF2ZpK7NpwfnYxtOae770/yhSSnj1wXAAAAAAAAK2bvyS5gqKo6kOTA5PSrVfXRk1nPg+iMJJ892UU8SD7a3Y9f1GIysxIWmplEbk52EQ8S/9cshszsgNysBP/XLIbM7IDcrAT/1yyGzOyA3KwE/9cshszsgNysBP/XLIbMDFDdvehi/nbxqicneUV3P3Ny/rIk6e5Xbphzy2TOB6pqb5LPJNnX2xRWVWvdvX+0wpeIvS7/2svGXnfP+svEXpd/7WVjr7tn/WVir8u/9rKx192z/jKx1+Vfe9nY6+5Zf5nY6/KvvWzsdfesv0zsdfnXXjb2OszYr1I8nOT8qjqvqk5NckWSg5vmHEzygsnxDyf5/e2aYgAAAAAAADCPUV+l2N33V9XVSW5JsifJjd19e1Vdl2Stuw8meUuSd1TVkSSfz3rzDAAAAAAAABZq9G+MdfehJIc2jV274fgrSZ4z47I3LKC03cJel3/tZWOvu2f9ZWKvy7/2srHX3bP+MrHX5V972djr7ll/mdjr8q+9bOx196y/TOx1+ddeNva6e9ZfJva6/GsvG3sdYNRvjAEAAAAAAMCyGPsbYwAAAAAAALAUNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK2HUxlhV3VhV91TVR09wvarqjVV1pKo+UlUXjlkPAAAAAAAAq2vsJ8bemuSSba5fmuT8ye9Akl8fuR4AAAAAAABW1KiNse5+f5LPbzPl8iRv73W3JXlUVT1mzJoAAAAAAABYTSf7G2NnJrlrw/nRyRgAAAAAAAAs1MlujA1WVQeqaq2q1h73uMd1Er+H3m+hZGYlfgsnNyvxWyiZWYnfwsnNSvwWSmZW4rdwcrMSv4WSmZX4LZzcrMRvoWRmJX4LJzcr8VsomVmJ39xOdmPs7iRnbzg/azL2AN19Q3fv7+79D3vYwx6U4tjdZIZ5yA2zkhnmITfMSmaYh9wwK5lhHnLDrGSGecgNs5IZtnOyG2MHk/x4rXtSki9096dPck0AAAAAAAA8BO0dc/Gq+q0kFyc5o6qOJvmXSb4hSbr7Xyc5lORZSY4k+VKSnxyzHgAAAAAAAFbXqI2x7r5yyvVO8s/GrAEAAAAAAACSk/8qRQAAAAAAAHhQaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBK0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACth9MZYVV1SVR+vqiNV9dItrp9TVbdW1Yeq6iNV9ayxawIAAAAAAGD1jNoYq6o9Sa5PcmmSC5JcWVUXbJr28iQ3d/cTk1yR5NfGrAkAAAAAAIDVNPYTYxclOdLdd3b3fUluSnL5pjmd5JGT429J8qmRawIAAAAAAGAF7R15/TOT3LXh/GiSf7RpziuSvLeqXpTkm5M8feSaAAAAAAAAWEGjf2NsgCuTvLW7z0ryrCTvqKoH1FVVB6pqrarWjh079qAXye4jM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcywnbEbY3cnOXvD+VmTsY2uSnJzknT3B5J8U5IzNi/U3Td09/7u3r9v376RyuWhRGaYh9wwK5lhHnLDrGSGecgNs5IZ5iE3zEpmmIfcMCuZYTtjN8YOJzm/qs6rqlOTXJHk4KY5n0zytCSpqu/KemNMCxcAAAAAAICFGrUx1t33J7k6yS1JPpbk5u6+vaquq6rLJtN+NslPV9UfJfmtJD/R3T1mXQAAAAAAAKyevWP/ge4+lOTQprFrNxzfkeQpY9cBAAAAAADAahv7VYoAAAAAAACwFDTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWwtTGWFWdsen8+VX1xqo6UFU1XmkAAAAAAACwOEOeGHvv8YOqenmSH0vyh0mekeSXR6oLAAAAAAAAFmrvgDkbnwp7dpL/obv/sqp+M8l/GqcsAAAAAAAAWKwhjbGHVdUTs/502Z7u/ssk6e6vVdVfjVodAAAAAAAALMiQxtin87evTPx8VT2muz9dVacnuX+80gAAAAAAAGBxpjbGuvupJ7j0X5N832LLAQAAAAAAgHEMeWIsSVJV+5OcneSvkvxJd/9xki+NVRgAAAAAAAAs0tTGWFV9f5LXZf0Jse9J8gdJ/m5VfS3Jj3X3XeOWCAAAAAAAADt3yoA5v5Lk0u5+epILk3ytu5+S5H9P8pYxiwMAAAAAAIBFGdIY29PdxybHn0zy7UnS3f8hyZljFQYAAAAAAACLNKQxtlZVb6mqH03ym0nelyRV9XeS7Jl2c1VdUlUfr6ojVfXSE8x5blXdUVW3V9VvzlA/AAAAAAAADDL1G2NJ/kmSn07y5CT/d5IbJ+Od5Jnb3VhVe5Jcn+QZSY4mOVxVB7v7jg1zzk/ysiRP6e57q+pbZ94FAAAAAAAATDG1MdbdX0vya1uMfznJJ6bcflGSI919Z5JU1U1JLk9yx4Y5P53k+u6+d7LuPcNKBwAAAAAAgOGGvErxhKrqPVOmnJnkrg3nR/PA75J9Z5LvrKo/qKrbquqSndQEAAAAAAAAW5n6xFhVXXiiS0mesKAazk9ycZKzkry/qv5Bd//XTXUcSHIgSc4555wF/Fke6mSGecgNs5IZ5iE3zEpmmIfcMCuZYR5yw6xkhnnIDbOSGbYz5Imxw0lem+R1m36vTfKoKffeneTsDednTcY2OprkYHd/rbv/S5I/yXqj7Ot09w3dvb+79+/bt29A2aw6mWEecsOsZIZ5yA2zkhnmITfMSmaYh9wwK5lhHnLDrGSG7Ux9YizJx5L8k+7+080XququLeZvdDjJ+VV1XtYbYlcked6mOe9OcmWSf1NVZ2T91Yp3DqgLAAAAAAAABhvyxNgrtpn3ou1u7O77k1yd5JasN9hu7u7bq+q6qrpsMu2WJJ+rqjuS3JrkJd39uSHFAwAAAAAAwFBTnxjr7ndtc+3dA+4/lOTQprFrNxx3kmsmPwAAAAAAABjF1CfGquqaqrpqi/Grqup/GqcsAAAAAAAAWKwhr1L80SRv32L8HUleuNhyAAAAAAAAYBxDGmN7u/trmwe7+74ktfiSAAAAAAAAYPGGNMZOqapHbx7cagwAAAAAAACW1ZDG2GuS/G5VfX9VPWLyuzjJ7yR57ajVAQAAAAAAwILsnTahu99eVceSXJfk8Uk6ye1Jru3u94xcHwAAAAAAACzE1MZYkkwaYJpgAAAAAAAA7FpTX6VYVe/dcPyyccsBAAAAAACAcQz5xti+DcfPGasQAAAAAAAAGNOQxliPXgUAAAAAAACMbMg3xh5bVQeT1Ibjv9Hdl41SGQAAAAAAACzQkMbY5RuOXztWIQAAAAAAADCmIY2xD3X3F7e6UFXnLLgeAAAAAAAAGMWQb4y97/hBVf3epmvvXmg1AAAAAAAAMJIhjbHacHzaNte2vrnqkqr6eFUdqaqXbjPvh6qqq2r/gJoAAAAAAABgJkMaY32C463Ov05V7UlyfZJLk1yQ5MqqumCLeY9I8uIkHxxQDwAAAAAAAMxsyDfGvrWqrsn602HHjzM53zfl3ouSHOnuO5Okqm5KcnmSOzbN+4Ukr07ykqGFAwAAAAAAwCyGPDH2G0kekeThG46Pn795yr1nJrlrw/nRydjfqKoLk5zd3b87sGYAAAAAAACY2dQnxrr754csVFUv6+5XzvLHq+qUJL+c5CcGzD2Q5ECSnHPOObP8GVaUzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDdoY8MTbUc7YYuzvJ2RvOz5qMHfeIJI9P8r6q+vMkT0pysKr2b16ou2/o7v3dvX/fvmlvcASZYT5yw6xkhnnIDbOSGeYhN8xKZpiH3DArmWEecsOsZIbtLLIxVluMHU5yflWdV1WnJrkiycHjF7v7C919Rnef293nJrktyWXdvbbAugAAAAAAAGChjbF+wED3/UmuTnJLko8lubm7b6+q66rqsgX+bQAAAAAAANjW1G+MzWCrJ8bS3YeSHNo0du0J5l68wHoAAAAAAADgb0x9Yqyqrh641jt3WAsAAAAAAACMZsirFF84ZKHu/sUd1gIAAAAAAACjWeQ3xgAAAAAAAGBpDfnG2D+sqi9uMV5JursfueCaAAAAAAAAYOGGNMb+c3c/cfRKAAAAAAAAYERepQgAAAAAAMBKGNIYe+foVQAAAAAAAMDIhrxK8Ruq6toTXOvu/oVFFgQAAAAAAABjGNIY+4stxv5Okp9KcnoSjTEAAAAAAACW3tTGWHe/7vhxVT0iyYuTvDDJTUled6L7AAAAAAAAYJkMeWIsVXVakmuS/GiStyW5sLvvHbMwAAAAAAAAWKSpjbGqek2SZye5Ick/6O6tXq0IAAAAAAAAS+2UAXN+Nsm3JXl5kk9V1Rcnv/9WVV8ctzwAAAAAAABYjCHfGBvSPAMAAAAAAIClNnrTq6ouqaqPV9WRqnrpFtevqao7quojVfV7VfXtY9cEAAAAAADA6hm1MVZVe5Jcn+TSJBckubKqLtg07UNJ9nf3P0zyriS/NGZNAAAAAAAArKaxnxi7KMmR7r6zu+9LclOSyzdO6O5bu/tLk9Pbkpw1ck0AAAAAAACsoLEbY2cmuWvD+dHJ2IlcleQ9o1YEAAAAAADAShr9G2NDVdXzk+xP8poTXD9QVWtVtXbs2LEHtzh2JZlhHnLDrGSGecgNs5IZ5iE3zEpmmIfcMCuZYR5yw6xkhu2M3Ri7O8nZG87Pmox9nap6epKfS3JZd391q4W6+4bu3t/d+/ft2zdKsTy0yAzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM85AbZiUzbGfsxtjhJOdX1XlVdWqSK5Ic3Dihqp6Y5E1Zb4rdM3I9AAAAAAAArKhRG2PdfX+Sq5PckuRjSW7u7tur6rqqumwy7TVJHp7knVX14ao6eILlAAAAAAAAYG57x/4D3X0oyaFNY9duOH762DUAAAAAAADA2K9SBAAAAAAAgKWgMQYAAAAAAMBK0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArITRG2NVdUlVfbyqjlTVS7e4/o1V9duT6x+sqnPHrgkAAAAAAIDVM2pjrKr2JLk+yaVJLkhyZVVdsGnaVUnu7e7vSPL6JK8esyYAAAAAAABW09hPjF2U5Eh339nd9yW5Kcnlm+ZcnuRtk+N3JXlaVdXIdQEAAAAAALBixm6MnZnkrg3nRydjW87p7vuTfCHJ6SPXBQAAAAAAwIrZe7ILGKqqDiQ5MDn9alV99GTW8yA6I8lnT3YRD5KPdvfjF7WYzKyEhWYmkZuTXcSDxP81iyEzOyA3K8H/NYshMzsgNyvB/zWLITM7IDcrwf81iyEzOyA3K8H/NYshMwNUdy+6mL9dvOrJSV7R3c+cnL8sSbr7lRvm3DKZ84Gq2pvkM0n29TaFVdVad+8frfAlYq/Lv/aysdfds/4ysdflX3vZ2OvuWX+Z2Ovyr71s7HX3rL9M7HX511429rp71l8m9rr8ay8be9096y8Te13+tZeNvQ4z9qsUDyc5v6rOq6pTk1yR5OCmOQeTvGBy/MNJfn+7phgAAAAAAADMY9RXKXb3/VV1dZJbkuxJcmN3315V1yVZ6+6DSd6S5B1VdSTJ57PePAMAAAAAAICFGv0bY919KMmhTWPXbjj+SpLnzLjsDSVPBIgAACAASURBVAsobbew1+Vfe9nY6+5Zf5nY6/KvvWzsdfesv0zsdfnXXjb2unvWXyb2uvxrLxt73T3rLxN7Xf61l4297p71l4m9Lv/ay8ZeBxj1G2MAAAAAAACwLMb+xhgAAAAAAAAsBY0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhjw/7N391G31mW96L8XC18IyZdYNtxrgWJiBmrqXiEdPScVbYMnWTtrG3isnZmrRlG5NU9YHnLT2bvsxV02kKQ0lb0F0cxWpyU0DuJLKcYyDQFDV/jCQvdhqWRt2aLAdf545rLHR5jznnPNCXMxP58x7rHm/bt/8zevG77j+ecav/sGAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCUstDFWVa+vqhur6qo7uV5V9eqq2lNVV1bVExZZDwAAAAAAAKtr0TvG3pDk5DHXT0ly7OjYkeTcBdcDAAAAAADAilpoY6y735vki2OmbE/ypl5zeZIHVNVDFlkTAAAAAAAAq+nufsfYliTXrzvfOxoDAAAAAACAuRrUGKuq84eMLVJV7aiq3VW1+/jjj+8kjnveMVcysxLH3MnNShxzJTMrccyd3KzEMVcysxLH3MnNShxzJTMrccyd3KzEMVcysxLH3MnNShxzJTMrccxs6I6x49efVNWmJP/6QH545IYkR6073zoa+ybdfV53b+vubYcddtgcfpp7OplhFnLDtGSGWcgN05IZZiE3TEtmmIXcMC2ZYRZyw7RkhnHGNsaq6mVV9c9JHltV/zQ6/jnJjUn+bA6/vzPJj9WaE5N8qbs/N4d1AQAAAAAA4BscOu5id/96kl+vql/v7pdNu3hVXZDkKUmOrKq9SX41yb1Ga/9Bkl1JnplkT5Kbkzx/2t8AAAAAAACAIcY2xvbr7pdV1ZYkD13/ne5+74TvnT7heif52SE1AAAAAAAAwIEY1Birqt9IclqSa5LcNhruJGMbYwAAAAAAALAsBjXGkvxgku/s7lsWWQwAAAAAAAAsyiED512X0bvBAAAAAAAA4GA0dMfYzUk+UlWXJvn6rrHu/vmFVAUAAAAAAABzNrQxtnN0AAAAAAAAwEFpUGOsu99YVYclObq7r11wTQAAAAAAADB3g94xVlXPSvKRJBePzh9XVXaQAQAAAAAAcNAY1BhL8ookJyT5xyTp7o8kefiCagIAAAAAAIC5G9oY+1p3f2nD2O3zLgYAAAAAAAAWZdA7xpJcXVXPTbKpqo5N8vNJ3r+4sgAAAAAAAGC+hu4Y+7kkxye5JckFSf4pyYsWVRQAAAAAAADM26AdY919c5JfGR0AAAAAAABw0BnUGKuqbUl+OcnD1n+nux+7mLIAAAAAAABgvoa+Y+y/JXlpko8muX1x5QAAAAAAAMBiDH3H2L7u3tndn+zuT+8/hnyxqk6uqmurak9VnXkH14+uqsuq6sNVdWVVPXOqOwAAAAAAAIABhu4Y+9Wq+qMklya5Zf9gd7993JeqalOSc5I8I8neJFdU1c7uvmbdtJcnuai7z62q45LsytojGwEAAAAAAGBuhjbGnp/kUUnulX95lGInGdsYS3JCkj3dfV2SVNWFSbYnWd8Y6yTfOvp8/ySfHVgTAAAAAAAADDa0MfY93f2dM6y/Jcn16873JnnihjmvSPKXVfVzSQ5P8vQZfgcAAAAAAADGGvqOsfePHnO4CKcneUN3b03yzCTnV9U31VVVO6pqd1Xt3rdv34JK4Z5EZpiF3DAtmWEWcsO0ZIZZyA3TkhlmITdMS2aYhdwwLZlhnKGNsROTfKSqrq2qK6vqo1V15YDv3ZDkqHXnW0dj670gyUVJ0t0fSHLfJEduXKi7z+vubd29bfPmzQPLZpXJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQyzkBumJTOMM/RRiifPuP4VSY6tqmOy1hA7LclzN8z5TJKTkryhqr4ra40xLVwAAAAAAADmatCOse7+dJIHJHnW6HjAaGzS925NckaSS5J8LMlF3X11VZ1dVaeOpr0kyQur6u+SXJDkx7u7p78VAAAAAAAAuHODdoxV1S8keWGSt4+G/mtVndfdvz/pu929K8muDWNnrft8TZInDa4YAAAAAAAAZjD0UYovSPLE7v5yklTVK5N8IMnExhgAAAAAAAAsg0GPUkxSSW5bd37baAwAAAAAAAAOCkN3jP1xkg9W1Z+Ozv9tktctpiQAAAAAAACYv0GNse5+VVW9O8mTR0PP7+4PL6wqAAAAAAAAmLOxjbGqetC600+Njq9f6+4vLqYsAAAAAAAAmK9JO8Y+n2RvkltH5+vfK9ZJHr6IogAAAAAAAGDeJjXGXp3kqUn+OskFSf6qu3vhVQEAAAAAAMCcHTLuYne/KMnjkrw1yY8m+XBV/WZVHXNXFAcAAAAAAADzMrYxliS95rIk/2eSP0jy/CRPX3RhAAAAAAAAME9jH6VYVYcn2Z7kR5JsTvL2JP+6uz9zF9QGAAAAAAAAczPpHWM3JvlEkgtH/3aSbVW1LUm6++2LLQ8AAAAAAADmY1Jj7K1Za4Z95+hYr7O2gwwAAAAAAACW3tjGWHf/+F1UBwAAAAAAACzUpHeMPa+7/2tVvfiOrnf3qxZTFgAAAAAAAMzXIROuHz7694g7OSaqqpOr6tqq2lNVZ97JnOdU1TVVdXVVvXlg7QAAAAAAADDYpEcpvnb073+cZfGq2pTknCTPSLI3yRVVtbO7r1k359gkL0vypO6+qaoePMtvAQAAAAAAwDhjG2P7VdXmJC9M8rD13+nun5jw1ROS7Onu60brXJhke5Jr1s15YZJzuvum0Zo3Di0eAAAAAAAAhhrUGEvyZ0nel+T/TXLbFOtvSXL9uvO9SZ64Yc4jk6Sq/jrJpiSv6O6Lp/gNAAAAAAAAmGhoY+xbuvuXFljDsUmekmRrkvdW1WO6+x/XT6qqHUl2JMnRRx+9oFK4J5EZZiE3TEtmmIXcMC2ZYRZyw7RkhlnIDdOSGWYhN0xLZhjnkIHz/p+qeuYM69+Q5Kh151tHY+vtTbKzu7/W3Z9M8vGsNcq+QXef193bunvb5s2bZyiFVSMzzEJumJbMMAu5YVoywyzkhmnJDLOQG6YlM8xCbpiWzDDO2MZYVf1zVf1Tkl/IWnPsK6Ox/eOTXJHk2Ko6pqruneS0JDs3zHlH1naLpaqOzNqjFa+b8j4AAAAAAABgrLGPUuzuIw5k8e6+tarOSHJJ1t4f9vruvrqqzk6yu7t3jq59f1Vdk7X3l720u79wIL8LAAAAAAAAGw19x1iq6tlJnpykk7yvu98x5HvdvSvJrg1jZ6373ElePDoAAAAAAABgIQa9Y6yqXpPkp5N8NMlVSX66qs5ZZGEAAAAAAAAwT0N3jD0tyXeNdnelqt6Y5OqFVQUAAAAAAABzNmjHWJI9SY5ed37UaAwAAAAAAAAOCkN3jB2R5GNV9Tej8+9JsruqdiZJd5+6iOIAAAAAAABgXoY2xs5aaBUAAAAAAACwYIMaY939niSpqm9d/53u/uKC6gIAAAAAAIC5GtQYq6odSc5O8pUktyepJJ3k4YsrDQAAAAAAAOZn6KMUX5rk0d39+UUWAwAAAAAAAItyyMB5/5Dk5kUWAgAAAAAAAIs0dMfYy5K8v6o+mOSW/YPd/fMLqQoAAAAAAADmbGhj7LVJ3pXko1l7xxgAAAAAAAAcVIY2xu7V3S9eaCUAAAAAAACwQEPfMfbOqtpRVQ+pqgftPxZaGQAAAAAAAMzR0B1jp4/+fdm6sU7y8PmWAwAAAAAAAIsxaMdYdx+z8UjyqCHfraqTq+raqtpTVWeOmfdDVdVVtW1g7QAAAAAAADDY0EcpJklqzUlV9bok1w+YvynJOUlOSXJcktOr6rg7mHdEkl9I8sFp6gEAAAAAAIChBjXGqurEqnp1kk8n+bMk782wHWMnJNnT3dd191eTXJhk+x3M+7Ukr0zylUFVAwAAAAAAwJTGNsaq6j9X1SeS/KckVyZ5fJJ93f3G7r5pwPpb8o07y/aOxtb/xhOSHNXdfzFV5QAAAAAAADCFSTvGfjLJ/5fk3CTnd/cXkvS8fryqDknyqiQvGTB3R1Xtrqrd+/btm1cJ3IPJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQyzkBumJTOMM6kx9pAk/3eSZyX5h6o6P8lhVXXowPVvSHLUuvOto7H9jkjy6CTvrqpPJTkxyc6q2rZxoe4+r7u3dfe2zZs3D/x5VpnMMAu5YVoywyzkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsM4Yxtc3X1bkouTXFxV90nyA0kOS3JDVV3a3c+dsP4VSY6tqmOy1hA7LcnXv9PdX0py5P7zqnp3kl/s7t0z3AsAAAAAAADcqUk7xr6uu2/p7j/p7h9O8oisNcwmfefWJGckuSTJx5Jc1N1XV9XZVXXqrEUDAAAAAADAtAY9EnG0W+yHkjxs6Hf26+5dSXZtGDvrTuY+ZZq1AQAAAAAAYKihTa4/S/KlJB9KcsviygEAAAAAAIDFGNoY29rdJy+0EgAAAAAAAFigoe8Ye39VPWahlQAAAAAAAMACDd0x9uQkP15Vn8zaoxQrSXf3YxdWGQAAAAAAAMzR0MbYKQutAgAAAAAAABZsUGOsuz+dJFX14CT3XWhFAAAAAAAAsACD3jFWVadW1SeSfDLJe5J8Ksk7F1gXAAAAAAAAzNWgxliSX0tyYpKPd/cxSU5KcvnCqgIAAAAAAIA5G9oY+1p3fyHJIVV1SHdflmTbAusCAAAAAACAuRr0jrEk/1hV90vyviT/rapuTPLlxZUFAAAAAAAA8zV0x9j2JDcneVGSi5P8Q5JnLaooAAAAAAAAmLdBO8a6+8tV9dAkx3b3G6vqW5JsWmxpAAAAAAAAMD+DdoxV1QuTvC3Ja0dDW5K8Y1FFAQAAAAAAwLwNfZTizyZ5UpJ/SpLu/kSSBy+qKAAAAAAAAJi3oY2xW7r7q/tPqurQJD3ki1V1clVdW1V7qurMO7j+4qq6pqqurKpLR49sBAAAAAAAgLka2hh7T1X9cpLDquoZSd6a5M8nfamqNiU5J8kpSY5LcnpVHbdh2oeTbOvux2btcY2/ObR4AAAAAAAAGGpoY+zMJPuSfDTJTyXZleTlA753QpI93X3daMfZhUm2r5/Q3Zd1982j08uTbB1YEwAAAAAAAAx26JBJ3X17kj8cHdPYkuT6ded7kzxxzPwXJHnnlL8BAAAAAAAAE41tjFXVleOujx5/OBdV9bwk25J8351c35FkR5IcffTR8/pZ7sFkhlnIDdOSGWYhN0xLZpiF3DAtmWEWcsO0ZIZZyA3TkhnGmfQoxduT3Jbk/CTPSfKsDcckNyQ5at351tHYN6iqpyf5lSSndvctd7RQd5/X3du6e9vmzZsH/DSrTmaYhdwwLZlhFnLDtGSGWcgN05IZZiE3TEtmmIXcMC2ZYZyxjbHuflyS05PcL8mbk/ynJMcnuaG7Pz1g/SuSHFtVx1TVvZOclmTn+glV9fgkr81aU+zG6W8BAAAAAAAAJpu0Yyzd/ffd/avd/YQkf57kTUn+w5DFu/vWJGckuSTJx5Jc1N1XV9XZVXXqaNpvZa3x9taq+khV7byT5QAAAAAAAGBmY98xliRVtSVrO71+MMlNWWuK/enQH+juXUl2bRg7a93npw9dCwAAAAAAAGY1tjFWVe9JckSSi5I8P8kXRpfuXVUP6u4vLrg+AAAAAAAAmItJO8YemqST/FSSHevGazT+8AXVBQAAAAAAAHM1tjHW3Q8bskhVHd/dV8+lIgAAAAAAAFiAQ+a0zvlzWgcAAAAAAAAWYl6NsZrTOgAAAAAAALAQ82qM9ZzWAQAAAAAAgIWYV2MMAAAAAAAAltq8GmNfndM6AAAAAAAAsBBjG2NV9dCquv+686dW1e9V1Yur6t77x7v7xEUWCQAAAAAAAAdq0o6xi5IcniRV9bgkb03ymSTfneQ1iy0NAAAAAAAA5ufQCdcP6+7Pjj4/L8nru/t3quqQJB9ZbGkAAAAAAAAwP5N2jNW6z09LcmmSdPftG64BAAAAAADAUpu0Y+xdVXVRks8leWCSdyVJVT0kyVcWXBsAAAAAAADMzaTG2IuS/EiShyR5cnd/bTT+iCQPWmRhAAAAAAAAME9jH6XYay7s7v+S5MFV9VtV9akkZyf53SE/UFUnV9W1VbWnqs68g+v3qaq3jK5/sKoeNv1tAAAAAAAAwHhjd4xV1SOTnD46Pp/kLUmqu586ZPGq2pTknCTPSLI3yRVVtbO7r1k37QVJburuR1TVaUlembVdagAAAAAAADA3Y3eMJfn7JE9L8gPd/eTu/v0kt02x/glJ9nT3dd391SQXJtm+Yc72JG8cfX5bkpOqqqb4DQAAAAAAAJhoUmPs2Uk+l+SyqvrDqjopyTRNqy1Jrl93vnc0dodzuvvWJF9K8m1T/AYAAAAAAABMNPZRit39jiTvqKrDs7az60VZe9fYuUn+tLv/8i6oMUlSVTuS7Bid3lJVV91Vv303OzJrj7FcBVd196PntZjMrIS5ZiaRm7u7iLuIvzXzITMHQG5Wgr818yEzB0BuVoK/NfMhMwdAblaCvzXzITMHQG5Wgr818yEzA1R3T/eFqgcm+XdJfqS7T5ow93uTvKK7/83o/GVJ0t2/vm7OJaM5H6iqQ5P89ySbe0xhVbW7u7dNVfhByr0u/9rLxr0ePOsvE/e6/GsvG/d68Ky/TNzr8q+9bNzrwbP+MnGvy7/2snGvB8/6y8S9Lv/ay8a9HjzrLxP3uvxrLxv3OsykRyl+k+6+qbvPm9QUG7kiybFVdUxV3TvJaUl2bpizM8m/H33+4STvGtcUAwAAAAAAgFmMfZTigeruW6vqjCSXJNmU5PXdfXVVnZ1kd3fvTPK6JOdX1Z4kX8xa8wwAAAAAAADmaqGNsSTp7l1Jdm0YO2vd569k7dGM0zhvDqUdLNzr8q+9bNzrwbP+MnGvy7/2snGvB8/6y8S9Lv/ay8a9HjzrLxP3uvxrLxv3evCsv0zc6/KvvWzc68Gz/jJxr8u/9rJxrwNM/Y4xAAAAAAAAOBhN/Y4xAAAAAAAAOBhpjAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWwkIbY1X1+qq6saquupPrVVWvrqo9VXVlVT1hkfUAAAAAAACwuha9Y+wNSU4ec/2UJMeOjh1Jzl1wPQAAAAAAAKyohTbGuvu9Sb44Zsr2JG/qNZcneUBVPWSRNQEAAAAAALCa7u53jG1Jcv26872jMQAAAAAAAJiru7sxNlhV7aiq3VW1+/jjj+8kjnveMVcysxLH3MnNShxzJTMrccyd3KzEMVcysxLH3MnNShxzJTMrccyd3KzEMVcysxLH3MnNShxzJTMrcczs7m6M3ZDkqHXnW0dj36S7z+vubd297bDDDrtLiuPgJjPMQm6YlswwC7lhWjLDLOSGackMs5AbpiUzzEJumJbMMM7d3RjbmeTHas2JSb7U3Z+7m2sCAAAAAADgHujQRS5eVRckeUqSI6tqb5JfTXKvJOnuP0iyK8kzk+xJcnOS5y+yHgAAAAAAAFbXQhtj3X36hOud5GcXWQMAAAAAAAAkd/+jFAEAAAAAAOAuoTEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEmZujFXVM+ZZCAAAAAAAACzSgewYe93cqgAAAAAAAIAFO3TcxaraeWeXknzbkB+oqpOT/F6STUn+qLt/Y8P1o5O8MckDRnPO7O5dQ9YGAAAAAACAocY2xpL8r0mel+R/bBivJCdMWryqNiU5J8kzkuxNckVV7ezua9ZNe3mSi7r73Ko6LsmuJA8bVj4AAAAAAAAMM6kxdnmSm7v7PRsvVNW1A9Y/Icme7r5u9J0Lk2xPsr4x1km+dfT5/kk+O2BdAAAAAAAAmMrYxlh3nzLm2v82YP0tSa5fd743yRM3zHlFkr+sqp9LcniSpw9YFwAAAAAAAKZyyJBJVfXtVfWE0fHtc67h9CRv6O6tSZ6Z5Pyq+qa6qmpHVe2uqt379u2bcwncE8kMs5AbpiUzzEJumJbMMAu5YVoywyzkhmnJDLOQG6YlM4wztjFWVY+vqsuTvDvJb46O91TV5VX1hAHr35DkqHXnW0dj670gyUVJ0t0fSHLfJEduXKi7z+vubd29bfPmzQN+mlUnM8xCbpiWzDALuWFaMsMs5IZpyQyzkBumJTPMQm6YlswwzqR3jP1xkp/q7g+uH6yqE0fXvnvC969IcmxVHZO1hthpSZ67Yc5nkpyU5A1V9V1Za4xp4QIAAAAAADBXkx6lePjGpliSdPflWXsf2FjdfWuSM5JckuRjSS7q7qur6uyqOnU07SVJXlhVf5fkgiQ/3t09zU0AAAAAAADAJJN2jL2zqv4iyZuSXD8aOyrJjyW5eMgPdPeuJLs2jJ217vM1SZ40tGAAAAAAAACYxdjGWHf/fFWdkmR7ki2j4RuSnDNqeAEAAAAAAMBBYdKOsXT3O5O88y6oBQAAAAAAABZm7DvGqmpTVf1UVf1aVf0vG669fLGlAQAAAAAAwPyMbYwleW2S70vyhSS/X1WvWnft2QurCgAAAAAAAOZsUmPshO5+bnf/bpInJrlfVb29qu6TpBZfHgAAAAAAAMzHpMbYvfd/6O5bu3tHko8keVeS+y2yMAAAAAAAAJinSY2x3VV18vqB7j47yR8nediiigIAAAAAAIB5G9sY6+7ndffFdzD+R919r8WVBQAAAAAAAPN16KQJVfWoJNuTbBkN3ZBkZ3d/bJGFAQAAAAAAwDyN3TFWVb+U5MIkleRvRkcluaCqzlx8eQAAAAAAADAfk3aMvSDJ8d39tfWDVfWqJFcn+Y1FFQYAAAAAAADzNHbHWJLbk/yrOxh/yOgaAAAAAAAAHBQm7Rh7UZJLq+oTSa4fjR2d5BFJzlhkYQAAAAAAADBPYxtj3X1xVT0yyQlJtoyGb0hyRXfftujiAAAAAAAAYF4mPUoxSbYm+fvu/pMkHxqdP2roD1TVyVV1bVXtqaoz72TOc6rqmqq6uqrePHRtAAAAAAAAGGpsY2zUyHpPksur6ieTXJzklCQXVdWLJy1eVZuSnDP6znFJTq+q4zbMOTbJy5I8qbuPz9rjGwEAAAAAAGCuJr1j7Eez1tD6liSfSvLw7t5XVYcn+WCSV034/glJ9nT3dUlSVRcm2Z7kmnVzXpjknO6+KUm6+8ZpbwIAAAAAAAAmmfQoxdu6+38m+cck/zPJF5Kku788cP0tSa5fd743//Kusv0emeSRVfXXVXV5VZ08cG0AAAAAAAAYbFJj7G9H7/x6e5JLk7yxqv6PqnpdvnHX14E4NMmxSZ6S5PQkf1hVD9g4qap2VNXuqtq9b9++Of0092QywyzkhmnJDLOQG6YlM8xCbpiWzDALuWFaMsMs5IZpyQzjTGqM/WSSP09yQdYeq3huku9Ncm2S5w9Y/4YkR6073zoaW29vkp3d/bXu/mSSj2etUfYNuvu87t7W3ds2b9484KdZdTLDLOSGackMs5AbpiUzzEJumJbMMAu5YVoywyzkhmnJDOOMfcdYd9+atabYfu8fHUNdkeTYqjomaw2x05I8d8Ocd2Rtp9gfV9WRWXu04nVT/AYAAAAAAABMNHbHWFX9bVW9vKq+Y5bFR421M5JckuRjSS7q7qur6uyqOnU07ZIkX6iqa5JcluSl3f2FWX4PAAAAAAAA7szYHWNJHpjkAUkuq6r/nrXdY2/p7s8O/YHu3pVk14axs9Z97iQvHh0AAAAAAACwEJPeMXZTd/9idx+d5CVZe/fX31bVZVW1Y/HlAQAAAAAAwHxMaox9XXe/r7t/JsmWJK9M8r0LqwoAAAAAAADmbNKjFD++caC7b0ty8egAAAAAAACAg8LYHWPdfdpdVQgAAAAAAAAs0tgdY1X14nHXu/tV8y0HAAAAAAAAFmPSoxR/O8lHkrwzyS1JauEVAQAAAAAAwAJMaow9PsnpSf73JB9KckGSS7u7F10YAAAAAAAAzNOkd4z9XXef2d2PS/K6JNuTXFNVp94l1QEAAAAAAMCcjG2M7VdVm7O2e+wxSfYmuXGRRQEAAAAAAMC8jX2UYlX9RJLnJLlvkrcleU53a4oBAAAAAABw0Jn0jrE/SnJVkk8n+TdJvr+qvn6xuz1SEQAAAAAAgIPCpMbYU++SKgAAAAAAAGDBJjXGTkzy2919211RDAAAAAAAACzKIROuH5XkQ1X1pLuiGAAAAAAAAFiUsY2x7j4jyU8k+a2qel1VbauqJ+w/hvxAVZ1cVddW1Z6qOnPMvB+qqq6qbdPdAgAAAAAAAEw26VGK6e6/rapfTvInSb4jSe+/lORp475bVZuSnJPkGUn2JrmiqnZ29zUb5h2R5BeSfHDqOwAAAAAAAIABxjbGqurBSX4nycOTPK27/27K9U9Isqe7rxutd2GS7Umu2TDv15K8MslLp1wfAAAAAAAABpn0jrEPJnlfkifP0BRLki1Jrl93vnc09nWjRzIe1d1/McP6AAAAAAAAMMikxtgJ3X1ed/f6wao6qqoOeHdXVR2S5FVJXjJg7o6q2l1Vu/ft23egP80KkBlmITdMS2aYhdwwUo/mhAAAIABJREFULZlhFnLDtGSGWcgN05IZZiE3TEtmGGdsY6y7v56YqtpcVT9TVe9L8u4k3z5g/RuSHLXufOtobL8jkjw6ybur6lNJTkyys6q23UEt53X3tu7etnnz5gE/zaqTGWYhN0xLZpiF3DAtmWEWcsO0ZIZZyA3TkhlmITdMS2YYZ9I7xo5I8uwkz03yyCRvT3JMd28duP4VSY6tqmOy1hA7bbRWkqS7v5TkyHW/9+4kv9jdu6e4BwAAAAAAAJhobGMsyY1J/ibJy5P8VXd3Vf3g0MW7+9aqOiPJJUk2JXl9d19dVWcn2d3dO2ctHAAAAAAAAKYxqTH2sqzt8npNkguq6i3T/kB370qya8PYWXcy9ynTrg8AAAAAAABDTHrH2O9294lJto+G3pHkX1XVL1XVIxdeHQAAAAAAAMzJ2MbYft19XXf/5+5+TJJtSe6fDbvAAAAAAAAAYJkNaoxV1QOq6nuq6nuSXN/dv9zdj1hwbQAAAAAAADA3Y98xVlX3SfLaJP82ySeTVJKHVtWfJvnp7v7q4ksEAAAAAACAAzdpx9ivJLlXkqO6+/Hd/bgkR2etofZ/Lbo4AAAAAAAAmJdJjbFnJ3lhd//z/oHR559J8oOLLAwAAAAAAADmaVJj7PbuvnnjYHf/jyS9mJIAAAAAAABg/sa+YyxJV9UDs/ZusY1uX0A9AAAAAAAAsBCTGmP3T/Kh3HFjzI4xAAAAAAAADhpjG2Pd/bAhi1TV8d199VwqAgAAAAAAgAWY9I6xoc6f0zoAAAAAAACwEPNqjN3RoxYBAAAAAABgacyrMeZ9YwAAAAAAACy1eTXGAAAAAAAAYKnNqzH21Tu7UFUnV9W1VbWnqs68g+svrqprqurKqrq0qh46p5oAAAAAAADg68Y2xqrqoVV1/3XnT62q3xs1s+69f7y7T7yT729Kck6SU5Icl+T0qjpuw7QPJ9nW3Y9N8rYkvznbrQAAAAAAAMCdm7Rj7KIkhydJVT0uyVuTfCbJdyd5zYD1T0iyp7uv6+6vJrkwyfb1E7r7su6+eXR6eZKtw8sHAAAAAACAYSY1xg7r7s+OPj8vyeu7+3eSPD9rTa9JtiS5ft353tHYnXlBknfe0YWq2lFVu6tq9759+wb8NKtOZpiF3DAtmWEWcsO0ZIZZyA3TkhlmITdMS2aYhdwwLZlhnEmNsVr3+WlJLk2S7r59w7UDVlXPS7ItyW/d0fXuPq+7t3X3ts2bN8/zp7mHkhlmITdMS2aYhdwwLZlhFnLDtGSGWcgN05IZZiE3TEtmGOfQCdffVVUXJflckgcmeVeSVNVDknxlwPo3JDlq3fnW0dg3qKqnJ/mVJN/X3bcMWBcAAAAAAACmMmnH2IuSvD3Jp5I8ubu/Nhp/RJIHDVj/iiTHVtUxVXXvJKcl2bl+QlU9Pslrk5za3TdOUTsAAAAAAAAMNnbHWHd3kguTtQZWVb0oyb9L8skkvztp8e6+tarOSHJJkk1Ze0fZ1VV1dpLd3b0za49OvF+St1ZVknymu089gHsCAAAAAACAbzK2MVZVj0xy+uj4fJK3JKnufurQH+juXUl2bRg7a93np09TMAAAAAAAAMxi0jvG/j7J+5L8QHfvSZKq+g8LrwoAAAAAAADmbNI7xp6d5HNJLquqP6yqk5LU4ssCAAAAAACA+RrbGOvud3T3aUkeleSyJC9K8uCqOreqvv+uKBAAAAAAAADmYdKOsSRJd3+5u9/c3c9KsjXJh5P80kIrAwAAAAAAgDka1Bhbr7tv6u7zuvukRRQEAAAAAAAAizB1YwwAAAAAAAAORhpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkLb4xV1clVdW1V7amqM+/g+n2q6i2j6x+sqoctuiYAAAAAAABWz0IbY1W1Kck5SU5JclyS06vquA3TXpDkpu5+RJL/kuSVi6wJAAAAAACA1bToHWMnJNnT3dd191eTXJhk+4Y525O8cfT5bUlOqqpacF0AAAAAAACsmEMXvP6WJNevO9+b5Il3Nqe7b62qLyX5tiSfXz+pqnYk2TE6vaWqrlpIxcvnyGz4b3EPdlV3P3pei8nMSphrZhK5ubuLuIv4WzMfMnMA5GYl+FszHzJzAORmJfhbMx8ycwDkZiX4WzMfMnMA5GYl+FszHzIzQHX3vIv5l8WrfjjJyd39k6PzH03yxO4+Y92cq0Zz9o7O/2E0507/51XV7u7etrDCl4h7Xf61l417PXjWXybudfnXXjbu9eBZf5m41+Vfe9m414Nn/WXiXpd/7WXjXg+e9ZeJe13+tZeNez141l8m7nX511427nWYRT9K8YYkR6073zoau8M5VXVokvsn+cKC6wIAAAAAAGDFLLoxdkWSY6vqmKq6d5LTkuzcMGdnkn8/+vzDSd7Vi9zGBgAAAAAAwEpa6DvGRu8MOyPJJUk2JXl9d19dVWcn2d3dO5O8Lsn5VbUnyRez1jyb5LyFFb183Ovyr71s3OvBs/4yca/Lv/ayca8Hz/rLxL0u/9rLxr0ePOsvE/e6/GsvG/d68Ky/TNzr8q+9bNzrwbP+MnGvy7/2snGvAyz0HWMAAAAAAACwLBb9KEUAAAAAAABYChpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBKWGhjrKpeX1U3VtVVd3K9qurVVbWnqq6sqicssh4AAAAAAABW16J3jL0hycljrp+S5NjRsSPJuQuuBwAAAAAAgBW10MZYd783yRfHTNme5E295vIkD6iqhyyyJgAAAAAAAFbT3f2OsS1Jrl93vnc09k2qakdV7a6q3ccff3wncdzzjrmSmZU45k5uVuKYK5lZiWPu5GYljrmSmZU45k5uVuKYK5lZiWPu5GYljrmSmZU45k5uVuKYK5lZiWNmd3djbLDuPq+7t3X3tsMOO+zuLoeDgMwwC7lhWjLDLOSGackMs5AbpiUzzEJumJbMMAu5YVoywzh3d2PshiRHrTvfOhoDAAAAAACAubq7G2M7k/xYrTkxyZe6+3N3c00AAAAAAADcAx26yMWr6oIkT0lyZFXtTfKrSe6VJN39B0l2JXlmkj1Jbk7y/EXWAwAAAAAAwOpaaGOsu0+fcL2T/OwiawAAAAAAAIDk7n+UIgAAAAAAANwlNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK2HhjbGqOrmqrq2qPVV15h1cP7qqLquqD1fVlVX1zEXXBAAAAAAAwOoZ2xirqsdU1eVVdX1VnVdVD1x37W8mLV5Vm5Kck+SUJMclOb2qjtsw7eVJLuruxyc5Lclrpr0JAAAAAAAAmGTSjrFzk7wiyWOSfDzJX1XVd4yu3WvA+ick2dPd13X3V5NcmGT7hjmd5FtHn++f5LMD1gUAAAAAAICpHDrh+hHdffHo829X1YeSXFxVP5q1htYkW5Jcv+58b5InbpjziiR/WVU/l+TwJE8fsC4AAAAAAABMZeI7xqrq/vs/d/dlSX4oyflJHjqnGk5P8obu3prkmUnOr6pvqquqdlTV7qravW/fvjn9NPdkMsMs5IZpyQyzkBumJTPMQm6YlswwC7lhWjLDLOSGackM40xqjL0yyXetH+juK5OclOTtA9a/IclR6863jsbWe0GSi0ZrfyDJfZMcuXGh7j6vu7d197bNmzcP+GlWncwwC7lhWjLDLOSGackMs5AbpiUzzEJumJbMMAu5YVoywzhjG2Pd/ebuvvz/Z+/ugza7yzrBfy+6jUSIvKVhmU4CURoxQRygK+Bk1GBAk2xMVAZMWIaXhTRVO1EYHCTszGasuCr4gg5uxAklIlRBjMxM7JEm7Q4E3XUJdCNDhu4Y6A0v6VagDRFXEULg2j+eO8PDQ/f9lvuk7879+VSdes75nd/53dep+tbzz1XnnCOMf7q7L5ti/T1JtlXV6VV1QpJLkuzcMOfTWWu0paq+O2uNMS1cAAAAAAAAFmriqxSPpqqumTSnu+9OcnmS3UluSXJdd++rqquq6qLRtJ9JcllVfSTJO5K8qLun+X4ZAAAAAAAATG3zuJNV9fCjncra98Am6u5dSXZtGLty3f7+JGdPsxYAAAAAAADMa2xjLGuvNPxU1hph9+jR8SOHKgoAAAAAAAAWbVJj7LYk53b3pzeeqKrbhykJAAAAAAAAFm/SN8Z+I8nDjnLulxdcCwAAAAAAAAxm7BNj3X31mHO/ufhyAAAAAAAAYBiTnhg7qqp61iILAQAAAAAAgCHN3RhL8jsLqwIAAAAAAAAGNvZVilW182inkjxi8eUAAAAAAADAMMY2xpJ8f5LnJ/m7DeOV5KxBKgIAAAAAAIABTGqM3ZTki939JxtPVNWtw5QEAAAAAAAAize2Mdbd54859wOLLwcAAAAAAACGMemJsSRJVT0qydbR4aHu/uxwJQEAAAAAAMDijW2MVdWTk7wxyUOSHBoNn1JVf5Pkf+nuPx+4PgAAAAAAAFiISU+M/W6Sl3X3B9YPVtXTR+e+d6jCAAAAAAAAYJEeMOH8gzY2xZKku29K8qBhSgIAAAAAAIDFm9QYe3dVvauqfrKq/slo+8mqeleSG6b5gao6r6puraoDVXXFUeY8t6r2V9W+qnr7rDcBAAAAAAAAk4x9lWJ3/3RVnZ/k4iRbR8OHklzd3bsmLV5Vm5JcneRZSQ4m2VNVO7t7/7o525K8JsnZ3X1nVT1yvlsBAAAAAACAo5v0jbF097uTvHvO9c9KcqC7b0uSqro2a022/evmXJa1Rtudo9/73Jy/BQAAAAAAAEc16VWKR1VV10wxbWuS29cdH8zXnzy7x+OTPL6q/qyqbqqq8+atCQAAAAAAAI5mbGOsqh5+lO0RSS5YUA2bk2xLck6SS5O8qaoeeoRadlTV3qrae/jw4QX9NPdnMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM40x6Yuxwkr1JPrRu2zvapvkW2KEkp647PmU0tt7BJDu7+yvd/YkkH8tao+wbdPc13b29u7dv2bJlip9m1ckM85AbZiUzzENumJXMMA+5YVYywzzkhlnJDPOQG2YlM4wzqTF2W5Jzuvv0ddt3dPfpST47xfp7kmyrqtOr6oQklyTZuWHO9Vl7WixVdXLWXq142yw3AQAAAAAAAJNMaoz9RpKHHeXcL09avLvvTnJ5kt1JbklyXXfvq6qrquqi0bTdSe6oqv1Jbkzyqu6+Y6rqAQAAAAAAYEqbx53s7qvHnPvNaX6gu3cl2bVh7Mp1+53klaMNAAAAAAAABjG2MZYkVfWEJBcn2ToaOpS1b4LdMmRhAAAAAAAAsEhjX6VYVa9Ocm2SSvLB0VZJ3lFVVwxfHgAAAAAAACzGpCfGXpLkzO7+yvrBqnp9kn1JXjtUYQAAAAAAALBIY58YS/K1JP/oCOOPHp0DAAAAAACA48KkJ8ZekeQ9VfXxJLePxk5L8rgklw9ZGAAAAAAAACzS2MZYd99QVY9PclaSraPhQ0n2dPdXhy4OAAAAAAAAFmVsY6yqvi3JV7r7ptHxdyW5IGuvUvxPw5cHAAAAAAAAizHpG2M3JHlsklTV45K8P8l3JLm8qn5p2NIAAAAAAABgcSY1xh7W3R8f7b8wyTu6+6eSnJ/kwkErAwAAAAAAgAWa1Bjrdfs/lOT/TJLuvivJ14YqCgAAAAAAABZt7DfGktxcVb+a5FCSxyX54ySpqocOXRgAAAAAAAAs0qQnxi5L8tdZ+87YD3f3F0fjZyT51QHrAgAAAAAAgIWa9MTYP+3u124c7O7/p6ouHqgmAAAAAAAAWLhJT4xdXVX/4/qBqnpAVb0lyfcOVhUAAAAAAAAs2KTG2I8k+bWq+vEkqaoHJtmZ5IQkPzrND1TVeVV1a1UdqKorxsx7dlV1VW2fsnYAAAAAAACY2thXKXb3J6rqmUl2V9Wjkjw/yZ7u/pfTLF5Vm5JcneRZSQ4m2VNVO7t7/4Z5JyV5eZIPzHEPAAAAAAAAMNHYJ8aq6ilJHpnk1Ul+IWvNrbdV1VNG5yY5K8mB7r6tu+9Kcm2SI32b7OeTvC7Jl2YpHgAAAAAAAKY19omxJL+2bv/mJI9aN9ZJfmjC9VuT3L7u+GCSp62fMGqwndrd76qqV02sGAAAAAAAAOYw6VWKzxjyx6vqAUlen+RFU8zdkWRHkpx22mlDlsX9hMwwD7lhVjLDPOSGWckM85AbZiUzzENumJXMMA+5YVYywziTXqX4Exu2H6+q7x99E2wah5Kcuu74lNHYPU5K8sQk76uqTyZ5epKdVbV940LdfU13b+/u7Vu2bJny51llMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM40x6leKPHmHs4UmeVFUv6e73Trh+T5JtVXV61hpilyR53j0nu/sLSU6+57iq3pfkX3X33ilqBwAAAAAAgKlNepXii480XlWPSXJdNnwv7AjX311VlyfZnWRTkjd3976quirJ3u7eOV/ZAAAAAAAAMJtJT4wdUXd/qqq+Zcq5u5Ls2jB25VHmnjNPPQAAAAAAADDJ2G+MHU1VfVeSLy+4FgAAAAAAABjM2CfGquo/J+kNww9P8ugkzx+qKAAAAAAAAFi0Sa9S/NUNx53kjiQf7+67hikJAAAAAAAAFm9SY+zL3X3TfVIJAAAAAAAADGjSN8Z+656dqnr/wLUAAAAAAADAYCY1xmrd/gOHLAQAAAAAAACGNOlVig+oqodlrYF2z/5/b5Z19+eHLA4AAAAAAAAWZVJj7CFJPpSvN8P+fN25TvIdQxQFAAAAAAAAiza2Mdbdj51mkao6s7v3LaQiAAAAAAAAGMCkb4xN620LWgcAAAAAAAAGsajGWE2eAgAAAAAAAMfOohpjvaB1AAAAAAAAYBCLaowBAAAAAADAUltUY+yuBa0DAAAAAAAAgxjbGKuqx1TVQ9YdP6Oq/l1VvbKqTrhnvLufPmaN86rq1qo6UFVXHOH8K6tqf1XdXFXvqarHzHszAAAAAAAAcDSTnhi7LsmDkqSq/nGSP0jy6STfm+S3Ji1eVZuSXJ3k/CRnJLm0qs7YMO3DSbZ395OSvDPJL89yAwAAAAAAADCNzRPOn9jdfznaf36SN3f3r1XVA5L81ynWPyvJge6+LUmq6tokFyfZf8+E7r5x3fybRr8DAAAAAAAACzXpibFat/9DSd6TJN39tQ3njmZrktvXHR8cjR3NS5K8e4p1AQAAAAAAYCaTGmPvrarrqurfJXlYkvcmSVU9OsmXFllIVT0/yfYkv3KU8zuqam9V7T18+PAif5r7KZlhHnLDrGSGecgNs5IZ5iE3zEpmmIfcMCuZYR5yw6xkhnEmNcZekeQ/Jvlkkn/a3V8ZjT8uycOnWP9QklPXHZ8yGvsGVfXMJP86yUXd/eUjLdTd13T39u7evmXLlil+mlUnM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwzthvjHV3J7k2SarqyVX1iiTPSfKJJL8xxfp7kmyrqtOz1hC7JMnz1k+oqicn+fdJzuvuz818BwAAAAAAADCFsY2xqnp8kktH218n+f0k1d3PmGbx7r67qi5PsjvJpiRv7u59VXVVkr3dvTNrr058cJI/qKok+XR3XzTvDQEAAAAAAMCRjG2MJfmLJP9Xkgu7+0CSVNW/nOUHuntXkl0bxq5ct//MWdYDAAAAAACAeUz6xthPJPmrJDdW1Zuq6twkNXxZAAAAAAAAsFhjG2PdfX13X5LkCUluTPKKJI+sqjdW1Q/fFwUCAAAAAADAIkx6YixJ0t1/391v7+4fTXJKkg8nefWglQEAAAAAAMACTdUYW6+77+zua7r73CEKAgAAAAAAgCHM3BgDAAAAAACA45HGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArYfDGWFWdV1W3VtWBqrriCOe/tap+f3T+A1X12KFrAgAAAAAAYPUM2hirqk1Jrk5yfpIzklxaVWdsmPaSJHd29+OS/HqS1w1ZEwAAAAAAAKtp6CfGzkpyoLtv6+67klyb5OINcy5O8nuj/XcmObeqauC6AAAAAAAAWDFDN8a2Jrl93fHB0dgR53T33Um+kOQRA9cFAAAAAADAitl8rAuYVlXtSLJjdPjlqvrosaznPnRykr8+1kXcRz7a3U9c1GIysxIWmplEbo51EfcR/2sWQ2buBblZCf7XLIbM3AtysxL8r1kMmbkX5GYl+F+zGDJzL8jNSvC/ZjFkZgrV3Ysu5uuLV31fkp/r7h8ZHb8mSbr7l9bN2T2a8/6q2pzkM0m29JjCqmpvd28frPAl4l6Xf+1l416Pn/WXiXtd/rWXjXs9ftZfJu51+ddeNu71+Fl/mbjX5V972bjX42f9ZeJel3/tZeNej5/1l4l7Xf61l417nc7Qr1Lck2RbVZ1eVSckuSTJzg1zdiZ54Wj/nyV577imGAAAAAAAAMxj0FcpdvfdVXV5kt1JNiV5c3fvq6qrkuzt7p1JfifJ26rqQJLPZ615BgAAAAAAAAs1+DfGuntXkl0bxq5ct/+lJM+ZcdlrFlDa8cK9Lv/ay8a9Hj/rLxP3uvxrLxv3evysv0zc6/KvvWzc6/Gz/jJxr8u/9rJxr8fP+svEvS7/2svGvR4/6y8T97r8ay8b9zqFQb8xBgAAAAAAAMti6G+MAQAAAAAAwFLQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBK0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACshEEbY1X15qr6XFV99Cjnq6reUFUHqurmqnrKkPUAAAAAAACwuoZ+YuwtSc4bc/78JNtG244kbxy4HgAAAAAAAFbUoI2x7v7TJJ8fM+XiJG/tNTcleWhVPXrImgAAAAAAAFhNx/obY1uT3L7u+OBoDAAAAAAAABbqWDfGplZVO6pqb1XtPfPMMzuJ7f63LZTMrMS2cHKzEttCycxKbAsnNyuxLZTMrMS2cHKzEttCycxKbAsnNyuxLZTMrMS2cHKzEttCycxKbHM71o2xQ0lOXXd8ymjsm3T3Nd29vbu3n3jiifdJcRzfZIZ5yA2zkhnmITfMSmaYh9wwK5lhHnLDrGSGecgNs5IZxjnWjbGdSV5Qa56e5Avd/VfHuCYAAAAAAADuhzYPuXhVvSPJOUlOrqqDSf5tkm9Jku7+7SS7klyQ5ECSLyZ58ZD1AAAAAAAAsLoGbYx196UTzneSfzFkDQAAAAAAAJAc+1cpAgAAAAAAwH1CYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlaIwBAAAAAACwEjTGAAAAAAAAWAlzNcaq6mMzzD2vqm6tqgNVdcURzp9WVTdW1Yer6uaqumCemgAAAAAAAGCczZMmVNX/l6TvORz9/bZ7xrv728dcuynJ1UmeleRgkj1VtbO796+b9m+SXNfdb6yqM5LsSvLYme8EAAAAAAAAxpjmibHfTXJ9km3dfVJ3n5Tk06P9ozbFRs5KcqC7b+vuu5Jcm+TiDXM6yT3rPCTJX05fPgAAAAAAAExn4hNj3f3TVfXUJO+oquuT/B/5+hNkk2xNcvu644NJnrZhzs8l+eOq+qkkD0ryzCnXBgAAAAAAgKlN9Y2x7v5Qvt6w+pMkD1xgDZcmeUt3n5LkgiRvq6pvqquqdlTV3qrae/jw4QX+PPdXMsM85IZZyQzzkBtmJTPMQ26YlcwwD7lhVjLDPOSGWckM40zVGEuS7v5ad78hyXOTvHTKyw4lOXXd8SmjsfVekuS60W+8P2tNt5OP8PvXdPf27t6+ZcuWactmhckM85AbZiUzzENumJXMMA+5YVYywzzkhlnJDPOQG2YlM4wz8VWKSVJVT8jat8G2joYOVdUnuvuWCZfuSbKtqk7PWkPskiTP2zDn00nOTfKWqvrurDXGtHABAAAAAABYqIlPjFXVq5Ncm6SSfHC0Vda+OXbFuGu7++4klyfZneSWJNd1976quqqqLhpN+5kkl1XVR5K8I8mLunvab5gBAAAAAADAVKZ5YuwlSc7s7q+sH6yq1yfZl+S14y7u7l1Jdm0Yu3Ld/v4kZ09bMAAAAAAAAMxjmm+MfS3JPzrC+KNH5wAAAAAAAGDpTfPE2CuSvKeqPp7k9tHYaUkel7XXJAIAAAAAAMDSm9gY6+4bqurxSc5KsnU0fCjJnu7+6pDFAQAAAAAAwKJM88RYuvtrSW7aOF5VD+7uv1t4VQAAAAAAALBg03xjbJz9C6kCAAAAAAAABjbxibGqeuXRTiV58GLLAQAAAAAAgGFM88TYLyZ5WJKTNmwPnvJ6AAAAAAAAOOam+cbYnye5vrs/tPFEVb108SUBAAAAAADA4k0+EDcAAAAgAElEQVTTGHtxks8f5dz2BdYCAAAAAAAAg5nYGOvuW8ec++xiywEAAAAAAIBhTPxGWFU9pKpeW1V/UVWfr6o7quqW0dhD74siAQAAAAAA4N6a2BhLcl2SO5Oc090P7+5HJHnGaOy6IYsDAAAAAACARZmmMfbY7n5dd3/mnoHu/kx3vy7JY4YrDQAAAAAAABZnmsbYp6rqZ6vqUfcMVNWjqurVSW4frjQAAAAAAABYnGkaYz+Z5BFJ/mT0jbHPJ3lfkocnee6ki6vqvKq6taoOVNUVR5nz3KraX1X7qurtM9QPAAAAAAAAU9k8aUJ335nk1aNtJlW1KcnVSZ6V5GCSPVW1s7v3r5uzLclrkpzd3XdW1SNn/R0AAAAAAACYZJonxlJVT6iqc6vqQRvGz5tw6VlJDnT3bd19V5Jrk1y8Yc5lSa4eNeDS3Z+brnQAAAAAAACY3sTGWFX9dJI/TPJTSfZV1frG1i9OuHxrvvE7ZAdHY+s9Psnjq+rPquqmKZptAAAAAAAAMLNpnhi7LMlTu/vHkpyT5H+rqpePztUCaticZNto7UuTvKmqHrpxUlXtqKq9VbX38OHDC/hZ7u9khnnIDbOSGeYhN8xKZpiH3DArmWEecsOsZIZ5yA2zkhnGmaYx9oDu/rsk6e5PZq2BdX5VvT6TG2OHkpy67viU0dh6B5Ps7O6vdPcnknwsa42yb9Dd13T39u7evmXLlinKZtXJDPOQG2YlM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTOMM01j7LNV9Y/vORg1yS5McnKS75lw7Z4k26rq9Ko6IcklSXZumHN91pptqaqTs/Zqxdumqh4AAAAAAACmNE1j7AVJPrN+oLvv7u4XJPmBcRd2991JLk+yO8ktSa7r7n1VdVVVXTSatjvJHVW1P8mNSV7V3XfMeB8AAAAAAAAw1uZJE7r7YFWdVlUP7e6/qarHJtme5C+6+8+muH5Xkl0bxq5ct99JXjnaAAAAAAAAYBATnxirqiuS/EmSm6rqpUluSHJ+kt+vKs0sAAAAAAAAjgsTnxhL8s+TnJHk25J8Msl3dPfhqnpQkg8kef1w5QEAAAAAAMBiTNMY+2p3/0NV3ZXkH5LckSTd/fdVNWhxAAAAAAAAsCjTNMb+vKrenuRBSd6T5Peq6oYk5ybZP2RxAAAAAAAAsCjTNMZemuQ5STrJO5M8LcmlSf4iydXDlQYAAAAAAACLM7Ex1t13J3nHPcdV9cEkX0xyqLv/fsDaAAAAAAAAYGEeMGlCVf12VZ052n9Iko8keWuSD1fVpQPXBwAAAAAAAAsxsTGW5Pu7e99o/8VJPtbd35PkqUl+drDKAAAAAAAAYIGmaYzdtW7/WUmuT5Lu/swgFQEAAAAAAMAApmmM/U1VXVhVT05ydpIbkqSqNic5ccjiAAAAAAAAYFE2TzHnZUnekOR/SPKKdU+KnZvkXUMVBgAAAAAAAIs0sTHW3R9Lct4Rxncn2T1EUQAAAAAAALBoE1+lWFW/UlUvO8L4y6rqtcOUBQAAAAAAAIs1zTfGfijJNUcYf1OSCxdbDgAAAAAAAAxjmsbYt3Z3bxzs7q8lqUkXV9V5VXVrVR2oqivGzHt2VXVVbZ+iJgAAAAAAAJjJNI2xf6iqbRsHR2P/MO7CqtqU5Ook5yc5I8mlVXXGEeadlOTlST4wTdEAAAAAAAAwq2kaY1cmeXdVvaiqvme0vTjJu0bnxjkryYHuvq2770pybZKLjzDv55O8LsmXZqgdAAAAAAAApjaxMdbd707yY0mekeQto+0ZSZ7d3bsmXL41ye3rjg+Oxv67qnpKklO7+11TVw0AAAAAAAAzmuaJsXT3R7v7hd391NH2giQfr6rn3Jsfr6oHJHl9kp+ZYu6OqtpbVXsPHz58b36WFSEzzENumJXMMA+5YVYywzzkhlnJDPOQG2YlM8xDbpiVzDDOVI2xe1TVpqq6oKreluRTSX5ywiWHkpy67viU0dg9TkryxCTvq6pPJnl6kp1VtX3jQt19TXdv7+7tW7ZsmaVsVpTMMA+5YVYywzzkhlnJDPOQG2YlM8xDbpiVzDAPuWFWMsM4m6eZVFU/mOR5SS5I8sEkZyc5vbu/OOHSPUm2VdXpWWuIXTJaJ0nS3V9IcvK633lfkn/V3XtnuAcAAAAAAACYaOITY1V1MMkvJfm/k5zR3c9O8g9TNMXS3XcnuTzJ7iS3JLmuu/dV1VVVddG9Kx0AAAAAAACmN80TY+9M8mNZe23iV6vqD5P0tD/Q3buS7NowduVR5p4z7boAAAAAAAAwi4lPjHX3K5KcnuTXkpyT5NYkW6rquVX14GHLAwAAAAAAgMWY2BhLkl5zY3fvyFqT7NIkFyf55IC1AQAAAAAAwMJM8yrFb9DdX0nyR0n+qKp+YPElAQAAAAAAwOJNbIxV1aYkz02yNckN3f3Rqrowyf+a5MQkTx62RAAAAAAAALj3pnli7HeSnJrkg0neUFV/mWR7kiu6+/ohiwMAAAAAAIBFmaYxtj3Jk7r7a1X1wCSfSfKd3X3HsKUBAAAAAADA4jxgijl3dffXkqS7v5TkNk0xAAAAAAAAjjfTPDH2hKq6ebRfSb5zdFxJurufNFh1AAAAAAAAsCDTNMa+e/AqAAAAAAAAYGATG2Pd/alpFqqq93f39937kgAAAAAAAGDxpvnG2LQeuMC1AAAAAAAAYKEW2RjrBa4FAAAAAAAAC7XIxhgAAAAAAAAsrUU2xmqBawEAAAAAAMBCTWyMVdUfT7nWPz/K9edV1a1VdaCqrjjC+VdW1f6qurmq3lNVj5ny9wAAAAAAAGBq0zwxtmWahbr7oxvHqmpTkquTnJ/kjCSXVtUZG6Z9OMn27n5Skncm+eVpfg8AAAAAAABmsXmKOQ+pqp842snu/o9jrj0ryYHuvi1JquraJBcn2b/u+hvXzb8pyfOnqAkAAAAAAABmMlVjLMmFOfI3xDrJuMbY1iS3rzs+mORpY+a/JMm7p6gJAAAAAAAAZjJNY+xT3f0/D11IVT0/yfYkP3iU8zuS7EiS0047behyuB+QGeYhN8xKZpiH3DArmWEecsOsZIZ5yA2zkhnmITfMSmYYZ5pvjH1XVZ29cbCqzq6q75xw7aEkp647PmU0tnGtZyb510ku6u4vH2mh7r6mu7d39/YtW6b67BkrTmaYh9wwK5lhHnLDrGSGecgNs5IZ5iE3zEpmmIfcMCuZYZxpGmMfSPK3Rxj/2yS/MeHaPUm2VdXpVXVCkkuS7Fw/oaqenOTfZ60p9rkp6gEAAAAAAICZTdMYO6m7/9vGwdHYY8dd2N13J7k8ye4ktyS5rrv3VdVVVXXRaNqvJHlwkj+oqv9aVTuPshwAAAAAAADMbZpvjD1szLkTJ13c3buS7NowduW6/WdOUQMAAAAAAADcK9M8Mbanqi7bOFhVL03yocWXBAAAAAAAAIs3zRNjr0jyn6rqf8rXG2Hbk5yQ5MeHKgwAAAAAAAAWaWJjrLs/m+SfVNUzkjxxNPyu7n7voJUBAAAAAADAAk3zxFiSpLtvTHLjgLUAAAAAAADAYKb5xhgAAAAAAAAc9zTGAAAAAAAAWAkaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBK0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJgzfGquq8qrq1qg5U1RVHOP+tVfX7o/MfqKrHDl0TAAAAAAAAq2fQxlhVbUpydZLzk5yR5NKqOmPDtJckubO7H5fk15O8bsiaAAAAAAAAWE1DPzF2VpID3X1bd9+V5NokF2+Yc3GS3xvtvzPJuVVVA9cFAAAAAADAihm6MbY1ye3rjg+Oxo44p7vvTvKFJI8YuC4AAAAAAABWzOZjXcC0qmpHkh2jwy9X1UePZT33oZOT/PWxLuI+8tHufuKiFpOZlbDQzCRyc6yLuI/4X7MYMnMvyM1K8L9mMWTmXpCbleB/zWLIzL0gNyvB/5rFkJl7QW5Wgv81iyEzU6juXnQxX1+86vuS/Fx3/8jo+DVJ0t2/tG7O7tGc91fV5iSfSbKlxxRWVXu7e/tghS8R97r8ay8b93r8rL9M3Ovyr71s3Ovxs/4yca/Lv/ayca/Hz/rLxL0u/9rLxr0eP+svE/e6/GsvG/d6/Ky/TNzr8q+9bNzrdIZ+leKeJNuq6vSqOiHJJUl2bpizM8kLR/v/LMl7xzXFAAAAAAAAYB6Dvkqxu++uqsuT7E6yKcmbu3tfVV2VZG9370zyO0neVlUHknw+a80zAAAAAAAAWKjBvzHW3buS7NowduW6/S8lec6My16zgNKOF+51+ddeNu71+Fl/mbjX5V972bjX42f9ZeJel3/tZeNej5/1l4l7Xf61l417PX7WXybudfnXXjbu9fhZf5m41+Vfe9m41ykM+o0xAAAAAAAAWBZDf2MMAAAAAAAAloLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArQWMMAAAAAACAlaAxBgAAAAAAwErQGAMAAAAAAGAlDNoYq6o3V9XnquqjRzlfVfWGqjpQVTdX1VOGrAcAAAAAAIDVNfQTY29Jct6Y8+cn2TbadiR548D1AAAAAAAAsKIGbYx1958m+fyYKRcneWuvuSnJQ6vq0UPWBAAAAAAAwGo61t8Y25rk9nXHB0djAAAAAAAAsFDHujE2taraUVV7q2rvmWee2Uls979toWRmJbaFk5uV2BZKZlZiWzi5WYltoWRmJbaFk5uV2BZKZlZiWzi5WYltoWRmJbaFk5uV2BZKZlZim9uxbowdSnLquuNTRmPfpLuv6e7t3b39xBNPvE+K4/gmM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwzrFujO1M8oJa8/QkX+juvzrGNQEAAAAAAHA/tHnIxavqHUnOSXJyVR1M8m+TfEuSdPdvJ9mV5IIkB5J8McmLh6wHAAAAAACA1TVoY6y7L51wvpP8iyFrAAAAAAAAgOTYv0oRAAAAAAAA7hMaYwAAAAAAAKwEjTEAAAAAAABWgsYYAAAAAAAAK0FjDAAAAAAAgJWgMQYAAAAAAMBK0BgDAAAAAABgJWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAShi8MVZV51XVrVV1oKquOML506rqxqr6cFXdXFUXDF0TAAAAAAAAq2fQxlhVbUpydZLzk5yR5NKqOmPDtH+T5LrufnKSS5L81pA1AQAAAAAAsJqGfmLsrCQHuvu27r4rybVJLt4wp5N8+2j/IUn+cuCaAAAAAAAAWEGbB15/a5Lb1x0fTPK0DXN+LskfV9VPJXlQkmcOXBMAAAAAAAAraPBvjE3h0iRv6e5TklyQ5G1V9U11VdWOqtpbVXsPHz58nxfJ8UdmmIfcMCuZYR5yw6xkhnnIDbOSGeYhN8xKZpiH3DArmWGcoRtjh5Kcuu74lNHYei9Jcl2SdPf7kzwwyckbF+rua7p7e3dv37Jly0Dlcn8iM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwztCNsT1JtlXV6VV1QpJLkuzcMOfTSc5Nkqr67qw1xrRwAQAAAAAAWKhBG2PdfXeSy5PsTnJLkuu6e19VXVVVF42m/UySy6rqI0nekeRF3d1D1gUAAAAAAMDq2Tz0D3T3riS7NoxduW5/f5Kzh64DAAAAAACA1Tb0qxQBAAAAAABgKWiMAQAAAAAAsBI0xgAAAAAAAFgJGmMAAAAAAACsBI0xAAAAAAAAVoLGGAAAAAAAACtBYwwAAAAAAICVoDEGAAAAAADAStAYAwAAAAAAYCVojAEAAAAAALASNMYAAAAAAABYCRpjAAAAAAAArASNMQAAAAAAAFaCxhgAAAAAAAArYfDGWFWdV1W3VtWBqrriKHOeW1X7q2pfVb196JoAAAAAAABYPZtnvaCqviXJE5Mc6u7PTZi7KcnVSZ6V5GCSPVW1s7v3r5uzLclrkpzd3XdW1SNnrQkAAAAAAAAmmfjEWFX9dlWdOdp/SJKPJHlrkg9X1aUTLj8ryYHuvq2770pybZKLN8y5LMnV3X1nkkxqtgEAAAAAAMA8pnmV4vd3977R/ouTfKy7vyfJU5P87IRrtya5fd3xwdHYeo9P8viq+rOquqmqzpuiJgAAAAAAAJjJNI2xu9btPyvJ9UnS3Z9ZUA2bk2xLck6SS5O8qaoeunFSVe2oqr1Vtffw4cML+mnuz2SGecgNs5IZ5iE3zEpmmIfcMCuZYR5yw6xkhnnIDbOSGcaZpjH2N1V1YVU9OcnZSW5IkqranOTECdceSnLquuNTRmPrHUyys7u/0t2fSPKxrDXKvkF3X9Pd27t7+5YtW6Yom1UnM8xDbpiVzDAPuWFWMsM85IZZyQzzkBtmJTPMQ26YlcwwzjSNsZcluTzJ7yZ5xbonxc5N8q4J1+5Jsq2qTq+qE5JckmTnhjnXZ+1psVTVyVl7teJtU1UPAAAAAAAAU9o8aUJ3fyzJN333q7t3J9k94dq7q+ry0bxNSd7c3fuq6qoke7t75+jcD1fV/iRfTfKq7r5j9lsBAAAAAACAo5vYGKuqy5K8r7s/XlWV5M1Jnp3kk0le2N0fHnd9d+9KsmvD2JXr9jvJK0cbAAAAAAAADGKaVym+PGtNsCS5NMmTkpyetUbWG4YpCwAAAAAAABZrmsbY3d39ldH+hUne2t13dPd/SfKg4UoDAAAAAACAxZmmMfa1qnp0VT0wyblJ/su6cycOUxYAAAAAAAAs1sRvjCW5MsneJJuS7OzufUlSVT+Y5LYBawMAAAAAAICFmdgY6+4/qqrHJDmpu+9cd2pPkksGqwwAAAAAAAAWaJpXKaa7776nKVZrzk3ym0kODFkcAAAAAAAALMpUjbEkqaqnV9UbknwqyR8m+dMkTxiqMAAAAAAAAFikiY2xqvrFqvp4kl9IcnOSJyc53N2/t+HVigAAAAAAALC0Jn5jLMlLk3wsyRuT/Ofu/nJV9bBlAQAAAAAAwGJN8yrFRyf535P8aJL/t6reluTEqpqmqQYAAAAAAABLYWJzq7u/muSGJDdU1bcmuTDJiUkOVdV7uvt5A9cIAAAAAAAA99pMT31195eT/Ick/6Gqvj3JxYNUBQAAAAAAAAs2zasUj6i7/zbJLyywFgAAAAAAABjM3I2xkVpIFQAAAAAAADCwe9sY60kTquq8qrq1qg5U1RVj5j27qrqqtt/LmgAAAAAAAOCbTPzGWFX9txy5AVZJHjXh2k1Jrk7yrCQHk+ypqp3dvX/DvJOSvDzJB6asGwAAAAAAAGYysTGW5Cey1gC7fcP4qUk+M+Has5Ic6O7bkqSqrk1ycZL9G+b9fJLXJXnVFPUAAAAAAADAzKZ5leKvJ/lCd39q/ZbkC6Nz42zN/9/enYfJVdX5H/98SGQTR2RRVJAg4BIEI0ZABUVBiMxIYAQhg0p8WNxQcWFEcQHUUWEYHUdEUUH0x7DI4sQhGpFlQFkkQlYQCIICIkQQXFAg5Pv745zbdbtSVV1VXdVd3ff9ep48qbr7rfvtc8892x1eoXZPnjbE9o6StoiISzo4bgAAAAAAAAAAAKAj7VSMPSsiltZPzNOmjWbntteS9B+SPtzGskfaXmh74cqVK0ezW1QEMYNuEDfoFDGDbhA36BQxg24QN+gUMYNuEDfoFDGDbhA36BQxg1baqRjbsMW89UZY916lIRcLm+dphadJeomkK23fJWkXSfNsz6zfUEScHhEzI2Lmpptu2sZho+qIGXSDuEGniBl0g7hBp4gZdIO4QaeIGXSDuEGniBl0g7hBp4gZtNJOxdhC20fUT7R9uKRfjrDuDZK2tb2V7bUlHSxpXjEzIh6JiE0iYlpETJN0naR9I2Jh22cAAAAAAAAAAAAAtGFqG8scLeli24eoVhE2U9LakvZvtWJErLJ9lKQFkqZIOiMilts+UdLCiJjXan0AAAAAAAAAAACgV0asGIuI+yW9yvbrlIY9lKRLIuLydnYQEfMlza+b9qkmy+7ezjYBAAAAAAAAAACATrXTY0ySFBFXSLqij8cCAAAAAAAAAAAA9E077xgDAAAAAAAAAAAAJjwqxgAAAAAAAAAAAFAJVIwBAAAAAAAAAACgEqgYAwAAAAAAAAAAQCVQMQYAAAAAAAAAAIBKoGIMAAAAAAAAAAAAlUDFGAAAAAAAAAAAACqBijEAAAAAAAAAAABUAhVjAAAAAAAAAAAAqAQqxgAAAAAAAAAAAFAJVIwBAAAAAAAAAACgEqgYAwAAAAAAAAAAQCVQMQYAAAAAAAAAAIBK6HvFmO1Ztm+1vcL2sQ3mf8j2zbaX2L7M9pb9PiYAAAAAAAAAAABUT18rxmxPkXSqpDdKmi5pju3pdYvdJGlmROwg6QJJJ/XzmAAAAAAAAAAAAFBN/e4xtpOkFRHx64h4XNK5kmaXF4iIKyLi0fz1Okmb9/mYAAAAAAAAAAAAUEH9rhh7rqS7S9/vydOaOUzSj/p6RAAAAAAAAAAAAKikvr9jrF223ypppqSTm8w/0vZC2wtXrlw5tgeHCYmYQTeIG3SKmEE3iBt0iphBN4gbdIqYQTeIG3SKmEE3iBt0iphBK/2uGLtX0hal75vnacPY3lPScZL2jYjHGm0oIk6PiJkRMXPTTTfty8FiciFm0A3iBp0iZtAN4gadImbQDeIGnSJm0A3iBp0iZtAN4gadImbQSr8rxm6QtK3trWyvLelgSfPKC9h+maRvKFWKPdDn4wEAAAAAAAAAAEBF9bViLCJWSTpK0gJJt0g6PyKW2z7R9r55sZMlbSDp+7YX2Z7XZHMAAAAAAAAAAABA16b2ewcRMV/S/Lppnyp93rPfxwAAAAAAAAAAAAD0eyhFAAAAAAAAAAAAYCBQMQYAAAAAAAAAAIBKoGIMAAAAAAAAAAAAlUDFGAAAAAAAAAAAACqBijEAAAAAAAAAAABUAhVjAAAAAAAAAAAAqAQqxgAAAAAAAAAAAFAJVIwBAAAAAAAAAACgEqgYAwAAAAAAAAAAQCVQMQYAAAAAAAAAAIBKoGIMAAAAAAAAAAAAlUDFGAAAAAAAAAAAACqBijEAAAAAAAAAAABUAhVjAAAAAAAAAAAAqIS+V4zZnmX7VtsrbB/bYP46ts/L86+3Pa3fxwQAAAAAAAAAAIDq6WvFmO0pkk6V9EZJ0yXNsT29brHDJP0xIraR9CVJX+znMQEAAAAAAAAAAKCa+t1jbCdJKyLi1xHxuKRzJc2uW2a2pLPy5wsk7WHbfT4uAAAAAAAAAAAAVEy/K8aeK+nu0vd78rSGy0TEKkmPSNq4z8cFAAAAAAAAAACAipk63gfQLttHSjoyf33M9rLxPJ4xtImkP4z3QYyRZRHxkl5tjJiphJ7GjETcjPdBjBHSmt4gZkaBuKkE0preIGZGgbipBNKa3iBmRoG4qQTSmt4gZkaBuKkE0preIGba4Ijo9cHUNm6/UtLxEbF3/v4xSYqIz5eWWZCXudb2VEm/l7RptDgw2wsjYmbfDnyAcK6Dv+1Bw7lOnO0PEs518Lc9aDjXibP9QcK5Dv62Bw3nOnG2P0g418Hf9qDhXCfO9gcJ5zr42x40nOvE2f4g4VwHf9uDhnNtT7+HUrxB0ra2t7K9tqSDJc2rW2aepEPz5wMkXd6qUgwAAAAAAAAAAADoRl+HUoyIVbaPkrRA0hRJZ0TEctsnSloYEfMkfVvS92yvkPSQUuUZAAAAAAAAAAAA0FN9f8dYRMyXNL9u2qdKn/8u6cAON3t6Dw5touBcB3/bg4ZznTjbHySc6+Bve9BwrhNn+4OEcx38bQ8aznXibH+QcK6Dv+1Bw7lOnO0PEs518Lc9aDjXibP9QcK5Dv62Bw3n2oa+vmMMAAAAAAAAAAAAGBT9fscYAAAAAAAAAAAAMBAGumLM9izbt9peYfvYBvPXsX1enn+97Wljf5S90ca5zrW90vai/O/w8TjO0bJ9hu0HbC9rMt+2v5J/hyW2d+xw+8RMbf6kiBmJuOmlqsQNMdM7xMzQ/FHFTN5GJeKmKjEjkdb0UlXihrSmd6oSMxJpTS9VJW6Imd6pSsxIxE0vVSVuiJneqUrMSMRNL1UlbvoWMxExkP8kTZF0h6TnS1pb0mJJ0+uWeY+kr+fPB0s6b7yPu4/nOlfSV8f7WHtwrq+RtKOkZU3m7yPpR5IsaRdJ1xMz1Y4Z4oa4IWaImYkeM1WKmyrFTL/jpioxU7W4Ia0hZgYtbqoSM1WLG2KGmCFuiBtiZuL8q1LMEDfEzSDFzCD3GNtJ0oqI+HVEPC7pXEmz65aZLems/PkCSXvY9hgeY6+0c66TQkRcJemhFovMlvTdSK6TtKHtZ7e5eWJmkiJueqYycUPM9AwxUzOamJGqEzeViRmJtKaHKhM3pDU9U5mYkUhreqgycUPM9ExlYkYibnqoMnFDzPRMZWJGIm56qDJx06+YGeSKsedKurv0/Z48reEyEbFK0iOSNh6To+utds5Vkt6cuwNeYHuLsTm0Mdfub9HtusTM5ETctIe4qSFm2kPM1IwmZtpdfzLEDTEzHGlNe4ibGtKa9hAzw5HWtIe4qSFm2kPMDEfctIe4qSFm2kPMDEfctIe4qekqZga5YgzD/VDStIjYQdKlqtVsA80QM+gGcYNOETPoFDGDbhA36BQxg24QN+gUMYNuEDfoFDGDbhA3LQxyxdi9ksq1mJvnaQ2XsT1V0tMlPTgmR9dbI55rRDwYEY/lr9+S9PIxOrax1s51H826xMzkRNy0hzfjAMQAAB2GSURBVLipIWbaQ8zUjCZm2l1/MsQNMTMcaU17iJsa0pr2EDPDkda0h7ipIWbaQ8wMR9y0h7ipIWbaQ8wMR9y0h7ip6SpmBrli7AZJ29reyvbaSi/Dm1e3zDxJh+bPB0i6PCK9cW2CGfFc68bF3FfSLWN4fGNpnqS3O9lF0iMRcV+b6xIzJRWKGYm4aRdxU0PMtIeYqRlNzEjViRtiZjjSmvYQNzWkNe0hZoYjrWkPcVNDzLSHmBmOuGkPcVNDzLSHmBmOuGkPcVPTXcxExMD+k7SPpNsk3SHpuDztREn75s/rSvq+pBWSfiHp+eN9zH08189LWi5psaQrJL1ovI+5y/M8R9J9kp5QGu/zMEnvkvSuPN+STs2/w1JJM4mZascMcUPcEDPj/lsSMz2ImSrFTVViZizipioxU6W4Ia0hZgYxbqoSM1WKG2KGmCFuxv23rETcEDPEDHEz7r9lJeKmXzHjvDIAAAAAAAAAAAAwqQ3yUIoAAAAAAAAAAABAz1AxBgAAAAAAAAAAgEqgYgwAAAAAAAAAAACVQMUYAAAAAAAAAAAAKoGKMQAAAAAAAAAAAFQCFWMAAAAAAAAAAAADwvZmts+1fYftX9qeb/sFtpc1WX6q7ZW2v1A3/Z9s32R7se2bbb8zT3+h7SttL7J9i+3Tx+K8BgUVYyOw/WQOjuLfNNtzbX+1brkrbc/Mn++yvUnd/DXWabHPDWx/oxT0V9reOe+7YeCjd8bjmuflZ9gO27PaWPZdtt/eYPpQjNieafsrI2znLttX101bNFKc2d7d9v/mz3NzorsoJ65HjHT8k9UgxU6j9ML28bY/kj9/x/ad+TgX296j7vhuzdNvsD2jNO8g20tsL7f9xdL059m+It9ol9jepzTvY7ZX5G3uXZp+hu0HGhznRrYvtX17/v8Zefoxpd92Wf69N2r3dxpE43SPucv20vzvZtuftb1u3TJH2/677afn78/M621WWubUfG13z/F3eGleEZNFvJ1XOse7bC/K059i+6x8LLfY/lhpG7NyzKywfWxp+tl5+rIcQ0/J0237K3n5JbZ3LK3zY9sPF+nWRDdOcbOB7dOc8iY3OuVPjsjzptn+W90xvT3Pe7rt7+brckf+/PQG692c5z2ltM810g7b69r+hVP6tNz2CaXlt7J9fV7nPNtr5+mvyce8yvYBded1qFNac7vtQ0vTP2f7btt/aef3GWTjFC9Nr3uev53ty/O1vd32J227tJ8iX7Hc9gW218/zjndKW7YpbevoPK049jk5TVmS//Y3Ka17b+l36Pl9qjT/FY3ircryNTql9P0j+ZocV7om5Vh9f5Pt1F/HRbY3dLoXPVKa9tPSOm93umcsdcqnFPemA3OMrS7iJ09f2/aZefnFtncvzSvySMV+ntmXH2zA2N4vX8MX5e9rOd1zi9/1BttbtVi/q2eOURxvw0KhHmy34T3BpWczpzz2o7afVpr/5fz7bdJo/X6z/fHx2O9o9SjuyPNWUA9jp7iWr3KpDKS03Hec7/Ueno/ayimPsLft9fO1XJr3/zPbG+Tlml37o/K0YelGN9e+xbYOydtYavsa2y/t9veeDLxm5cMVTmn5ItsPuVZ28tMm67d8rsnLfNkpD7NW3fQ32l6Y17vJOb/kJhUWzdIT21vk477ZKX/zgdI+mpWxvMj2tbYfc07HSus0jM/S/K94EjwrDTLblnSxpCsjYuuIeLmkj0l6VovV3iDpNkkH5vWVY/F0SW+KiJdKepmkK/PyX5H0pYiYEREvlvRffTmZAUXF2Mj+loOj+HfXGOzzW5IekrRtDvp3SBp1Jtr21NFuoyLG45pL0hxJP8v/txQRX4+I746wzMKIaFioUOdptreQJNsvbutI13ReRMyQtLukf7PdKpEeMgljcuBjp84x+bodLenrdfMOyTfMr0k6WZJsb5w/7xER20nazLUKtU9IOj8iXibp4LyebE/P37eTNEvS12xPyet8J0+rd6ykyyJiW0mX5e+KiJOL31YpM/B/EfFQh+c8aMYrZl4XEdtL2knS8yV9o27+HEk3SPpnSYqIByR9QdK/S1J+CNut+C5pmaS31K2/uPgSEQeVrt2Fki7Ksw6UtE4+lpdLemd+qJgi6VRJb5Q0XdKcHEuSdLakF0naXtJ6korCiTdK2jb/O1LSaaXjOVnS29r9cSaA8cqb/FEpb7Kj0t9uuWL6jrpjKu5R35b064jYJiK2lnRn3taw9ZSu5+bKcdQi7XhM0utz+jRD0izbu+RtfVEpU79NPtbD8vTfSpor6b/LJ+RUsf5pSTsr/S182rUKjh/maZPBeMRL0+tuez1J8yR9ISJeKOmlkl4l6T2l9c/Lx7qdpMclHVSat1QpNgoHSlqetz1V0n8qpXE7SFoi6ajSsl8q/Q7z8zo9u0/l7U1RisWfjPgrVctjkv7ZdRUDEfG50v2hHKutGnd9qS6mH87Try5N21NKhU1K+Zy98r1mF0mP5OWXKd3nrqrb/hH52LZXKlw4pa4Q65DSfh7o+JeYmOrzmgdJeo6kHfLvtL+kh5usW+jFM0e71igU6qcGz2YrJM2WUoG8pNdLurffx9HChKwYU2/ijjxvNfUqdoq0/pp2d2x7c0k/lvThiFgg6QOS7o+I7SPiJUr50ydGuPY/l7SnpN/Ubb6ba99sW3dKem3+PT6jVGheSU0qH46WtHf+W56nXHZS5C+aaPhck/exllLc3S3ptaXpL5H0VUlvjYjpkmYq3UOk5hUWDdMTSauU4m66Un7nvaWYapZ3fUjS+1VL44rjahWfcqoEHtYwDH3xOklPRMRQeV1ELFaKo2bmKD0P/VbSK/O0p0maKunBvI3HIuLWPO/Zku4pbX9pz45+AqBibMDY3lqpgOYTEbFakiLizoi4JC8yxfY3c+3/T3Lhgmwf4dTqZbHtC11rWfsd21+3fb2kk2xvmlsHLLf9Ldu/ca0l7VudWmEvcuqxNmXNI0Q/5BvxgUoFd29wqSWbUyvXJfnafi9PO961Vmkvz/MWS3pvab2hFk1OLf2Llq9LbL+5tPvzVStwmiPpnNI21i2td5Pt17U6j/wgcYekLW0/1all2y/yusXD4Vzb82xfrnRDlu2PutYqt6ctOye7VrHTgWslPbeNec+XdHtErMzffyqpiKWQ9A/589Ml/S5/ni3p3HzjvVMpk7eTJEXEVUoZsXqzJZ2VP58lab8GywyLVXQnIv4i6V2S9suVBMV9aAOlys5yZevpkrbO6cCpko6KiCfyvN9IWtf2s3JMzpL0o/r95XlvUe3ahaSn5sLs9ZQKwP+kFCMrIuLXEfG4pHOVC5giYn5kkn6h9NChPP+7edZ1kja0/ey8zmWS/jya36rKckzspOF5k5UR8cUR1ttG6WHtM6XJJ0qambc5JCKeVLqeRXrTMO3I17domfiU/C9ybL1e0gV53lDaERF3RcQSSavrDnFvSZdGxEMR8UdJlypXgkTEdRFx30i/DdbUxnX/F0k/j4ifSFJEPKpUedWoJepUSU9Vqugs/EC1AuetlSo5/lCskv89NcfEP6h2P2qm1/ep9ykVhlalwqRdq5TuIx8c4/1+TNJHIuJ30lBBwDfz51tKhQJl0yVdnpd5QKnwdGaD5SrBqWfDrkqFuUWl9LMl3Ve6J9yT09FWWj1zTLF9cn6eXeLa8D4b2L7Mqdfv0tLzxDSnVvJrPBeXtl9fKFT0Avl8ft5daHtH2wucegi8Ky+zu+2rbF/i1FL+6y5VjDr1KF5s+zrnxoDlZ7Ps3NK57q5UML2qtI0POfUcWWb76NI5/So/v9/m1MNkT9s/d2rhv1NertUz1kVOvUZut31Snv4FSevlcz57hGs0MHoYd8rLkuetiF7HToeerdQw5riImFeaNlQxHhG3RsRjan3tb4rGDZk6vvbNthUR15R+g+tUi68qalj5EBFXt1inqQbPNVK6FyxXqswspzf/KulzEfGrYt2IKCo8m1VYNExPIuK+iLgxL/tnSbdo+LPVGnnXiHggIm6QVKRxhabx6VRWfHI+dvTXSyT9st2Fc3ngnkqNPM9RjrVIDcrnSfqN7XOceowWeZsvSbrc9o9sf9D2hj09gwFHxdjIikzkItsXj8H+tpO0KCekjWwr6dRILWgfVq1Q+qKIeEWkFtS3qNZKWko3uFdFxIeUWkZfnte/QNLzpKFWewdJenWkFg5PSjqkt6c2YYz1NZdSS+k7I+IOpe6s/yhJtrdTyqgXreM/0GDdMyW9L89v5pOSHonUSmkH5Yf97ELlFnKS3qSUgBbeKykitUSZI+msVhUvtp+vVHmyQtJxSrG2k1JG42TbT82L7ijpgIh4rVNL3tmSds7ncFKL8xh0AxM7HZqlVNA40rwVkl6YH9ynKmWmtsjzjpf0Vtv3SJqvVDAopYxYuTXLPWpeCVd4VqlA+veq6ybuVPE/Syl2J7rxiJlhIuJPSi0Gt82TDlbK+F6tdL2flZdbLendSr/7rbnAuOwCpUraV0m6Ual3QL3dlFpM3l5a56+S7lMqvPr3nGkbMW6chgN4m1KLTLWzziQyHnmTxUVhQhNbe/jQZrspFS4Py9Pkz4vyNofke8vOauN65gLURUoVD5dGxPWSNpb0cESsql++harEzFjHy0jXfTvVPeDle9gGtosGFgfla3yvUs/Ect7kT5Ludmphe7Ck80rbeUIpnVqqVCE2Xan3WuGoXOh+hmu9A3t2n7L9XKXWwKc1W7HiTpV0iEvDanbpg6WYvqI0fbfS9OPytI4KFLLFkvZ1Go5vK6WK3i1K88/M+xgaAnSSmy3pxxFxm6QHbb9cqZLrTfl3OMX2y9rYTqtnjsOUnlVeIekVko7Iv/3fJe0fqafy65R67xW/ecPn4maFQiW/zc+7Vyv1Cj1AqWX9CaVldlLKy06XtHXpuJ8q6br8zHKVcu/CBm6TtGlOZ+Yo5auUj68YEWbnvN8jSr/fNpJOUeol9CKlhgS7SvqIar2+Wj1jzVB6pt9eKR3dIiKOVa035kR6vu9V3A0hz1sZvYqdK/Ly13ew77MkfTUiLihNO0PSR52Gq/us7SL+urmO/br2h6lBBW+FdJNXaKrBc41UaxBysaR/dG2YxVb7blZh0Sw9KR/DNKXh8or4bVnG0kCrWDtK0jwaEQ6kf5J0RUT8Teketl+uyFREHC5pD6VK248opU2KiDMlvVjS95UqcK+zvc7YH/r4oGJsZOUhPfbP06LJss2m99KdEbEof/6lpGn580tsX217qVKFVrnA6fulwoldlTPmEfFj1Vrg7qH00HdDLojYQ6mCo4rG45qXH5jOVe0B7vVK1+8P0lAt/5B8Y9ywlFn/XpPt76lUGKG8nXLrqAcl/dH2wUqVqo+W5u0q6f/ldX6l1ELuBQ22XxRgnSPpnfk495J0bJ5+paR1lStilVvol47tzEgtxtc4xwlmkGKnnf2ebPs2peHF6nt+nG37TqWH71Olobh5t1Ih5NWS7lKqRC+O4zsRsbmkfSR9z3VjZ3cjIqLBubxJqbfBRI6VwqDcY8oFe3OUek+sVspMHTh0AOn+s0x5qMw65+dlW/Xmq5+3k1IMPUfSVpI+nCvY2/E1SVd125JvghvXuHHtnUDlnjj1Qym2e122zveJ+5Va8i4ZaYXcknKGUsOfnXIFCZoblHSmE8UQzZspVXIdUzf/XKUCzf2UChgkDRUevlupIOA5SkMpFu9xOU2pgHuGUkHCKeqBuvvUlyV9dIRK5MrKhdLfVRqyZzTKQymWRzMoD6X4uVFs/wylAqCFStf0GtXyO4fkBmO75X9VGLJsjbxmRNwj6YVKf1+rJV3m0vtqm2j1zLGXpLfn+0HR2GFbpfzJv9leojRSwXNVK8xr9lzctFAoK3pxLJV0fUT8OdJoCI+VCh1/EamV/JNK+ZZd8/THJRXv7ynvs5GLlNKpnZXyzYVdJV0cEX+N1IvpIqVYKs5paU5DlisNexX5WIt9tXrGuiwiHomIv0u6WdKWLY5v0PUq7uqR5538ehU7xVCKO+fv7eSdfqrUWHT9oZkplp6v1MNmI6Uyt34PJ9s2p56Rh0n66HgfyyTQ8LnG6b3H+0j6Qc4LXa80ckVLLSosWqYnTr0mL5R0dN5f/XYblbG0xfZzlNK/Sr2HahwtVyqrb9ccSXvavkspn7KxUrmypNTrMCK+pDTk9JtL038XEWdExGylHu6Veb6ebO/3GSsPas2xVDdSbRiX0Vgu6aW2p0TjXmPl1khPKnWblVJrt/0iYrHtuUqJZuGvbezXks6KiI+NuGQ19e2a5we1N0uanVu3WtLGLr2weQycp1T5Mbfb9SPiqLpplvTmqBuixvbOai8mJ4vxip1m+72z9P2YiLjA9vuUCoHKN9xDlG6kJytleopx93+o3MLX9pGqFRQdptoQZNfmVlKbKLX2L7ey3lwjv2PhftvPjoj7nIaGqB+O6mBN7mEU+3mPWUOOl2mSbrO9vVJB1KW5QfbaSjHz1dIqq7XmkHSKiN/bfkIpk/UBpVa05f1MVYqjcpz9i1KLzickPWD750rDVd2tFnFj+9OSNpX0ztIy3cTaZNLPuLlZKW+yVkSszgXOn/PIL1u+WdKMYj1paHz9GXmelCvUnIZ1/rntfSMNPTPi9YyIh3NvkVlKlRwb2p4aqddYO9f/Xg3PL22u2kuIJ7t+x0ur6/5MSa8pr5Af5v8SEX8qd8CJiLD9Q6WeG+Whlv9X6f60sG6dGXm9O/J2z1ftPZX3l/b3TdUKt3t5n5op6dx8PJtI2sf2qoho1iu7ir6s1MPizDHaX1GgcPlICxZyGjI05KPta5R6ACki7s3//9n2fysVTrV87+9E5jTk3OslbW87JE1RGr72mEhDgf1I0o9s369UUX3ZCJts9sxhpREwFtTtf67S/f7lEfFELugpRq9o9lw8R9KueVmpVih0ad16q+u2sVq18pH6AsPi+xO5QLHYZ6vylPOU8tJnRcTqNjsX1h9P+ViLfbV6xqr/TSZkeU8f4q7YLnneSa5fsZO1k3c6SanBxPdtz873k2Ioz4skXWR7tVIlyTXq/Dr29Nrb3kHpHbBvjIgHu93OJLBcqffwaDV7rtlb0oaSlub0Zn1Jf1PKixb5lMWNNhhpKOgzJJ1he5lShUWz9OTXuZHYhZLOjoiLSpsaqYylXrNYe5lS7+YVxbnYXhHpHc/ovcuVGggdGRGnS0N/t2uMvuA08sZukrbI6Z1sv0Pp/XDXSpoZEVfmxWcov3fQ9iylhjVP2N5MKd9UmXsKPca6c4OkV+eAKV46uI5av/yuLflBfqGkE5xTGadhy0YaHu1pku7LiWCrIRJ+rtqL7fdS7cZ+maQDbD8zz9vI9kRuYdZrfbvmSr3zlkTEFhExLSK2VLqR7a+UCB5oe+O8343KK0Z62fjDtotWjM2u/aUa/v6x+gzdxUqZuAV1068utmn7BUqtERu9i6GRBZLeV4rjZsMVXCrpHa69F2+jJstNVOMSOznzfZ/t1+f9bqRUePyzBtv5qqS1bA9rtZQf/D8paRfbL8rbKdKIZ0h6j1JGWkpd+PfI816sVGixUqlV7sG213EaEmdbpa7brcyTdGj+fKik/ylmOA2/9NrytEmonzEzjFNrsq8ptV77o1Jh0vE5nqZFxHMkPaeD+8GnlHpLNGrYsaekX+UWm4XfKrdgchoGaBdJv1L6Dba1vZVTC7uDlVt42z5c6eFiTl2vjHlKrc1texelIZmqNLxDP/MmK5TyJp91bnXvVPndspQvr3eT0pDAhU9IujHPKy/7B6UKjKKBTsO0w+ldqRvmY1hPqVDqVzm9ukK1h9phaUcTCyTtZfsZOU3bS2veByerfsdLq+t+tlKh9Z553+spvVy82VDKuyq9v7S8j0eVWjbX9wq6V9J025vm729Q6pmiXAhQ2F+pJ4DUw/tURGxVpJ9Kw9y8h0qx4SL19j5fw4d976fPK/WQL2J97Xwfacr2+vmeJNtvkLQqIm52GlqxeDfzU5R6Ji1rsanJ4ABJ34uILXNsb6FUebCbU6vxouJ7B+UClhE0e+ZYIOnd+XeV7Rfka/B0SQ/kwprXaYQeUKVCoeeV/hbfqzWHUxzJTjkPspbS0ISN8s8tRcRvlEZeqO9xdLVSL7YizvbX8B5lI2n3GavsCdeG7ZoIeh135Hmro+exU3K7Uoy8OG9nS0kvVRoquuxopWGfv52v0auL8pd8jafnfTe99i307Nrbfp5SZd3bIg07WWWXS1rHqeGvpFT54DQ0fMcaPNfMkXR46b60ldL74ddXauj18VzeJttrufbOy1ml+2K5wqJhepLvC9+WdEtE/EfdYTUtY2miYXxGxCURsVnpXB6lUqx/8jPu/kq9wO6wvVwpb/t7pSGA7yn+5eUuLyrFsv9RGnFpiqR/dXp36iKl4aPn5mX2krTM9mKlPMYxEfH7sTi/QTAhWxCNt4i43/YHJM3PN9W/aM3MyhKnliBSevhbImmu7fLLuXepyywVDldq+bzC9t+UWqDUDyFT75NK3XFX5v+b9TY6QdI5tt8m6VqlP6Y/R8QfbH9C0k/yOT2h9BDRaWZhUurzNZ+j0jBA2YWS3h0R37X9OUn/Z/tJpYKmuXXLvkOp9Ugovei1kc9KOtWphcmTSnEw1Hok0os5vyhJHt6a8WuSTnMaonOVpLkR8Zjba/H4GaVWwUvyb3anUgHCMBHxY9szJC20/bjS+6k+Xr/cRDVesaPUevntSte9yBSdULSirzvGsP1ZpZenLqib9zfbpyilQYdJ+k/bxfvsTixloj8s6Zu2P6jUqnZuvokvd2qxf7NSDL23eIC0fY5Sb41N8o380xHxbaVeAefbPkwpDXpL6ZD2l/STiJi0vQ7H4B4jpTHzrdRA5mKlv1cpZXj3qVv24jy9frjNRsd+TYvZjXr6nar0rpblSpUsZ0ZtyImjlOJxiqQzImJ5XufrSnFxbU6LLoqIE5XSjn2U3oX3qFLaqLytq5Xe1bFBjrXDoq5V+kQ3RnmTk5XyJg8qtXIsv3C5GDqkcEZEfEUp3fgv20Xac62aF4j/QNLxtneLiKsbpR1OlRtnOVXQrSXp/Igoev58VKm3zmeV7pffliTbr1CK42covV/ihIjYLiIesv0ZpQc/KaVpD+V1TlJqjbl+jplvRcTxTY57whmDeGl63fN9ZXaef6rS3/j3NLyV/kFOjX7WUhrSbm6Dczi3wbTf2T5B0lVOrfl/U1r3pJzfCKWhgN+Z1+n1fQojO0Xp/RTd+qDtt5a+79dswYiY7/TeoJ/m+14ov1PB9v5KveI3lXSJ7UURsbdSr8YFOf7vVW24xHXy9Kcoxe1PJX1zFOcxEczRmvf/C5Xeo/OQa++g+IWG/w031OKZ41tKPXluzNdppdJ1PVvSD/OzyEKlioRWmhUKneTO3pdxg9L5bKPU6KKr9zNGxDcaTLvR9ndUq4D/VkTc5PQ+mHa09YxV5/S8/I0xMd4z1su4I887yfK8I+hpmlWWy0HeqnQd11UqMzs8Ih6pWy5sH6rUG+gkpaFQTyvF4SWSLszLNbz2tt+vlM/eTOlvd36k9wN1fO1bbOtTShUtX8vxtSoiZnbym0wW+VrsL+nLtj+q9H7Lu5QqObtVPNe8VqmB8rtK+/ur7Z9JelNEnGf7aKVy2vWV8inFs81eSuUvf8/fj4nUY7VhepLzzm9T6plWPJd9PCLmq0ne1anCbaGkf5C0Oh/L9EgjMjRLmzCGIvUabPSs0ajBy1l16z6klM+V1rznFct8SNKHRnOME5ljaCQAVEHOCDwZEatsv1LSaZHe4QAAAAAAQGXZ3l3SRyJipMomAAAATGD0GKue5ym1ElhL6eXBR4zz8QAAAAAAAAAAAIwJeoyNI9vXKw3JUfa2iFg6HseD/uOao1vEDjpFzKAbxA06QbygX2wfJ+nAusnfj4j698phgJAmYDwQd+gWsYNO2d5eaQjwssciYufxOB4Ao0PFGAAAAAAAAAAAACphrfE+AAAAAAAAAAAAAGAsUDEGAAAAAAAAAACASqBiDAAAAAAAAAAAAJVAxRgAAAAAAAAAAAAqgYoxAAAAAAAAAAAAVML/B4vKg4497evTAAAAAElFTkSuQmCC\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", + "## Add more algorithms please: Gradient Boosting\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LR: 0.912356 (0.013890)\n", + "LDA: 0.913808 (0.018930)\n", + "KNN: 0.907040 (0.017335)\n", + "CART: 0.896858 (0.014657)\n", + "NB: 0.913334 (0.016768)\n", + "SVM: 0.890594 (0.022649)\n", + "RTC: 0.933671 (0.015717)\n", + "SGD: 0.877977 (0.024229)\n", + "NC: 0.893481 (0.019393)\n", + "MLPC: 0.918158 (0.017259)\n" + ] + } + ], + "source": [ + "\n", + "\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", + "# 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": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "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 NB." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MCC 0.860278994009734\n" + ] + } + ], + "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": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MCC 0.8788612940586917\n" + ] + } + ], + "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": "markdown", + "metadata": {}, + "source": [ + "#### I will now test the performance of my model first using all the features, then with some selected ones\n", + "\n", + "
\n", + "\n", + "## Why do you decide to do the feature selection this way, any reason?\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 93.01130524152107\n" + ] + } + ], + "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": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9393627954779034\n", + "[[464 25]\n", + " [ 34 450]]\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.93 0.95 0.94 489\n", + " 1.0 0.95 0.93 0.94 484\n", + "\n", + " accuracy 0.94 973\n", + " macro avg 0.94 0.94 0.94 973\n", + "weighted avg 0.94 0.94 0.94 973\n", + "\n" + ] + } + ], + "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.\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 (2).ipynb b/Assignment Colab/Fezile Dlamini (2).ipynb index 621f6a8..8c8fc2d 100644 --- a/Assignment Colab/Fezile Dlamini (2).ipynb +++ b/Assignment Colab/Fezile Dlamini (2).ipynb @@ -1 +1,3695 @@ -{"cells":[{"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\nimport numpy as np # linear algebra\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\nimport sklearn\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 #for showing how one variable is affected by another\nfrom matplotlib import pyplot #for plotting graphs\nfrom sklearn.model_selection import train_test_split # for splitting my data into train and test\nfrom sklearn.model_selection import cross_val_score #to estimate the skill of a machine learning model on unseen data\nfrom 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\nfrom 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.\nfrom 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.\nfrom sklearn.metrics import accuracy_score #It is the ratio of number of correct predictions to the total number of input samples\nfrom sklearn.linear_model import LogisticRegression #an algorithm for classification\nfrom 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.\nfrom sklearn.neighbors import KNeighborsClassifier #for classification\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis #used for modeling differences in groups i.e. separating two or more classes\nfrom sklearn.naive_bayes import GaussianNB #an algorithm that estimates the mean and the standard deviation from your training data,\nfrom sklearn.svm import SVC #an algorithm that creates a line or a hyperplane which separates the data into classes\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":{"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":{"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":"## 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\n#### I 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. So everytime i run this with a different seed number, i will get a different output\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\n#### I will now use the models I imported in the beginning from sklearn to use for my algorithm."},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\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()))\n# evaluate each model in turn\nresults = []\nnames = []\nfor 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 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Compare Algorithms\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 NB."},{"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":{},"cell_type":"markdown","source":"#### I will now test the performance of my model first using all the features, then with some selected ones"},{"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=pd.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":{"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 +{ + "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", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104CLASS
05.00.0000.95174.8420.975-3.66300.28273.4445.6611.0411
14.05.4050.93171.5950.957-4.01110.60068.2226.5371.4531
25.55.4050.87373.5950.961-2.51200.59369.4444.9341.7221
35.04.1670.89566.2500.999-1.36200.61467.2224.3161.3821
47.58.5370.93264.7200.979-2.09100.61672.9444.5401.5391
55.07.6921.03078.9490.976-3.09110.51178.7785.9921.0911
63.06.8970.93078.5860.957-3.54410.38578.2226.2841.4671
72.05.8820.86876.5880.949-5.83200.15476.5886.4791.0861
87.02.6320.85760.4471.012-0.29200.18864.3333.8491.9251
99.00.0000.91165.8081.049-3.88800.36163.2226.3271.2161
102.03.4480.99171.1720.990-3.71200.51076.3895.4021.2851
112.50.0000.96060.5790.998-1.36100.16361.6675.6271.0551
123.00.0000.84870.8750.967-3.60310.26371.6116.8041.0291
133.07.1430.88571.3570.955-4.33010.23272.7786.7261.4451
142.57.6920.95360.7691.021-3.64100.40260.7697.1121.0281
156.04.3480.84267.8700.980-1.43200.18765.1675.2381.4381
162.00.0000.83873.8420.990-4.92800.53675.6676.9961.0711
174.00.0000.89064.0830.993-4.97700.82665.9446.0381.4421
184.511.1111.03277.1851.020-0.69401.10078.4446.1411.3341
192.04.1670.92568.6670.997-3.12701.21066.9446.1491.1651
202.06.6670.95568.2330.961-3.32701.30473.5006.6041.3921
213.010.3451.07272.0000.974-4.70401.72661.0565.7220.8901
223.52.7030.98672.9190.967-3.62811.71770.8336.6691.4451
231.00.0000.84552.7691.037-4.65802.83452.7697.4261.0241
241.00.0000.83863.2311.048-4.06002.98063.2316.9421.1321
255.54.3480.96058.9130.994-4.75602.13863.4447.5460.9791
266.50.0000.94163.9171.030-3.42102.43562.0566.8011.2101
271.05.5560.88074.8330.977-3.87812.04474.8336.6441.1431
286.50.0000.97366.5000.995-4.23402.70469.4445.6731.1431
297.58.3330.93669.3750.989-1.76502.74365.8895.2421.5591
.......................................
3008-6.020.0001.07383.6861.000-1.426015.45281.7226.5661.0930
3009-1.022.5001.09977.7001.001-0.214015.62578.3335.7471.1130
30101.012.5000.96379.7080.980-1.255015.50275.5565.5581.0360
30110.05.2630.95773.0790.991-1.528015.67670.5565.7231.0790
3012-3.019.6081.14483.4121.015-1.029015.81375.1116.3781.1680
3013-1.012.2450.99176.1220.985-1.688015.77478.2786.3741.1530
3014-1.016.6671.13880.2500.993-0.350023.50280.2505.3251.2070
30152.010.8110.94667.5140.985-2.240015.97465.9445.1691.1740
3016-1.08.3330.94271.0001.017-1.488023.55071.0005.0171.3910
30170.010.2561.00980.0771.003-1.074015.78180.1676.1491.1070
30180.018.7501.18188.2500.998-1.314017.66688.2506.3831.1330
3019-0.516.6671.06177.7291.000-1.155015.83880.1116.1381.0380
30200.511.4291.05977.6571.008-0.905015.86774.1675.5231.0880
30211.011.5381.01578.0381.037-0.200016.20979.9445.2671.0440
30223.00.0000.95866.7691.036-0.173022.47766.7696.0681.3790
30232.012.0001.00475.8671.001-1.416016.44474.1115.6111.1620
30243.520.0001.01573.0500.991-2.797016.49574.9446.6061.1410
30252.510.7140.93378.0710.966-2.887016.51382.0565.7321.1140
30260.50.0000.86081.5450.995-0.618026.93181.5455.1201.2050
30279.07.5470.92677.2830.998-3.418016.51778.1115.4511.1810
3028-2.018.7501.28979.9381.0281.094018.11979.9386.2411.0600
30294.514.2861.05869.1430.995-1.085020.62569.1435.7691.2000
30302.012.9630.99972.8150.985-3.446016.25665.7226.3781.3400
30310.017.0211.04576.2340.993-2.268016.36577.2785.8211.1160
30320.016.6671.08182.9171.001-2.073024.49782.9175.6401.1850
30331.05.2630.94567.9471.006-2.151016.70668.6115.5981.1440
3034-6.521.6671.13375.4331.015-1.675016.89773.2786.1941.6390
3035-1.512.5001.09176.5420.991-0.918016.91882.1115.8891.1310
30362.05.0000.84973.7501.017-2.722017.13174.7226.0551.2700
3037-1.015.7891.06666.1580.998-2.080017.15167.1115.8531.1360
\n", + "

3038 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "0 5.0 0.000 0.951 74.842 \n", + "1 4.0 5.405 0.931 71.595 \n", + "2 5.5 5.405 0.873 73.595 \n", + "3 5.0 4.167 0.895 66.250 \n", + "4 7.5 8.537 0.932 64.720 \n", + "5 5.0 7.692 1.030 78.949 \n", + "6 3.0 6.897 0.930 78.586 \n", + "7 2.0 5.882 0.868 76.588 \n", + "8 7.0 2.632 0.857 60.447 \n", + "9 9.0 0.000 0.911 65.808 \n", + "10 2.0 3.448 0.991 71.172 \n", + "11 2.5 0.000 0.960 60.579 \n", + "12 3.0 0.000 0.848 70.875 \n", + "13 3.0 7.143 0.885 71.357 \n", + "14 2.5 7.692 0.953 60.769 \n", + "15 6.0 4.348 0.842 67.870 \n", + "16 2.0 0.000 0.838 73.842 \n", + "17 4.0 0.000 0.890 64.083 \n", + "18 4.5 11.111 1.032 77.185 \n", + "19 2.0 4.167 0.925 68.667 \n", + "20 2.0 6.667 0.955 68.233 \n", + "21 3.0 10.345 1.072 72.000 \n", + "22 3.5 2.703 0.986 72.919 \n", + "23 1.0 0.000 0.845 52.769 \n", + "24 1.0 0.000 0.838 63.231 \n", + "25 5.5 4.348 0.960 58.913 \n", + "26 6.5 0.000 0.941 63.917 \n", + "27 1.0 5.556 0.880 74.833 \n", + "28 6.5 0.000 0.973 66.500 \n", + "29 7.5 8.333 0.936 69.375 \n", + "... ... ... ... ... \n", + "3008 -6.0 20.000 1.073 83.686 \n", + "3009 -1.0 22.500 1.099 77.700 \n", + "3010 1.0 12.500 0.963 79.708 \n", + "3011 0.0 5.263 0.957 73.079 \n", + "3012 -3.0 19.608 1.144 83.412 \n", + "3013 -1.0 12.245 0.991 76.122 \n", + "3014 -1.0 16.667 1.138 80.250 \n", + "3015 2.0 10.811 0.946 67.514 \n", + "3016 -1.0 8.333 0.942 71.000 \n", + "3017 0.0 10.256 1.009 80.077 \n", + "3018 0.0 18.750 1.181 88.250 \n", + "3019 -0.5 16.667 1.061 77.729 \n", + "3020 0.5 11.429 1.059 77.657 \n", + "3021 1.0 11.538 1.015 78.038 \n", + "3022 3.0 0.000 0.958 66.769 \n", + "3023 2.0 12.000 1.004 75.867 \n", + "3024 3.5 20.000 1.015 73.050 \n", + "3025 2.5 10.714 0.933 78.071 \n", + "3026 0.5 0.000 0.860 81.545 \n", + "3027 9.0 7.547 0.926 77.283 \n", + "3028 -2.0 18.750 1.289 79.938 \n", + "3029 4.5 14.286 1.058 69.143 \n", + "3030 2.0 12.963 0.999 72.815 \n", + "3031 0.0 17.021 1.045 76.234 \n", + "3032 0.0 16.667 1.081 82.917 \n", + "3033 1.0 5.263 0.945 67.947 \n", + "3034 -6.5 21.667 1.133 75.433 \n", + "3035 -1.5 12.500 1.091 76.542 \n", + "3036 2.0 5.000 0.849 73.750 \n", + "3037 -1.0 15.789 1.066 66.158 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "0 0.975 -3.663 0 0.282 \n", + "1 0.957 -4.011 1 0.600 \n", + "2 0.961 -2.512 0 0.593 \n", + "3 0.999 -1.362 0 0.614 \n", + "4 0.979 -2.091 0 0.616 \n", + "5 0.976 -3.091 1 0.511 \n", + "6 0.957 -3.544 1 0.385 \n", + "7 0.949 -5.832 0 0.154 \n", + "8 1.012 -0.292 0 0.188 \n", + "9 1.049 -3.888 0 0.361 \n", + "10 0.990 -3.712 0 0.510 \n", + "11 0.998 -1.361 0 0.163 \n", + "12 0.967 -3.603 1 0.263 \n", + "13 0.955 -4.330 1 0.232 \n", + "14 1.021 -3.641 0 0.402 \n", + "15 0.980 -1.432 0 0.187 \n", + "16 0.990 -4.928 0 0.536 \n", + "17 0.993 -4.977 0 0.826 \n", + "18 1.020 -0.694 0 1.100 \n", + "19 0.997 -3.127 0 1.210 \n", + "20 0.961 -3.327 0 1.304 \n", + "21 0.974 -4.704 0 1.726 \n", + "22 0.967 -3.628 1 1.717 \n", + "23 1.037 -4.658 0 2.834 \n", + "24 1.048 -4.060 0 2.980 \n", + "25 0.994 -4.756 0 2.138 \n", + "26 1.030 -3.421 0 2.435 \n", + "27 0.977 -3.878 1 2.044 \n", + "28 0.995 -4.234 0 2.704 \n", + "29 0.989 -1.765 0 2.743 \n", + "... ... ... ... ... \n", + "3008 1.000 -1.426 0 15.452 \n", + "3009 1.001 -0.214 0 15.625 \n", + "3010 0.980 -1.255 0 15.502 \n", + "3011 0.991 -1.528 0 15.676 \n", + "3012 1.015 -1.029 0 15.813 \n", + "3013 0.985 -1.688 0 15.774 \n", + "3014 0.993 -0.350 0 23.502 \n", + "3015 0.985 -2.240 0 15.974 \n", + "3016 1.017 -1.488 0 23.550 \n", + "3017 1.003 -1.074 0 15.781 \n", + "3018 0.998 -1.314 0 17.666 \n", + "3019 1.000 -1.155 0 15.838 \n", + "3020 1.008 -0.905 0 15.867 \n", + "3021 1.037 -0.200 0 16.209 \n", + "3022 1.036 -0.173 0 22.477 \n", + "3023 1.001 -1.416 0 16.444 \n", + "3024 0.991 -2.797 0 16.495 \n", + "3025 0.966 -2.887 0 16.513 \n", + "3026 0.995 -0.618 0 26.931 \n", + "3027 0.998 -3.418 0 16.517 \n", + "3028 1.028 1.094 0 18.119 \n", + "3029 0.995 -1.085 0 20.625 \n", + "3030 0.985 -3.446 0 16.256 \n", + "3031 0.993 -2.268 0 16.365 \n", + "3032 1.001 -2.073 0 24.497 \n", + "3033 1.006 -2.151 0 16.706 \n", + "3034 1.015 -1.675 0 16.897 \n", + "3035 0.991 -0.918 0 16.918 \n", + "3036 1.017 -2.722 0 17.131 \n", + "3037 0.998 -2.080 0 17.151 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 CLASS \n", + "0 73.444 5.661 1.041 1 \n", + "1 68.222 6.537 1.453 1 \n", + "2 69.444 4.934 1.722 1 \n", + "3 67.222 4.316 1.382 1 \n", + "4 72.944 4.540 1.539 1 \n", + "5 78.778 5.992 1.091 1 \n", + "6 78.222 6.284 1.467 1 \n", + "7 76.588 6.479 1.086 1 \n", + "8 64.333 3.849 1.925 1 \n", + "9 63.222 6.327 1.216 1 \n", + "10 76.389 5.402 1.285 1 \n", + "11 61.667 5.627 1.055 1 \n", + "12 71.611 6.804 1.029 1 \n", + "13 72.778 6.726 1.445 1 \n", + "14 60.769 7.112 1.028 1 \n", + "15 65.167 5.238 1.438 1 \n", + "16 75.667 6.996 1.071 1 \n", + "17 65.944 6.038 1.442 1 \n", + "18 78.444 6.141 1.334 1 \n", + "19 66.944 6.149 1.165 1 \n", + "20 73.500 6.604 1.392 1 \n", + "21 61.056 5.722 0.890 1 \n", + "22 70.833 6.669 1.445 1 \n", + "23 52.769 7.426 1.024 1 \n", + "24 63.231 6.942 1.132 1 \n", + "25 63.444 7.546 0.979 1 \n", + "26 62.056 6.801 1.210 1 \n", + "27 74.833 6.644 1.143 1 \n", + "28 69.444 5.673 1.143 1 \n", + "29 65.889 5.242 1.559 1 \n", + "... ... ... ... ... \n", + "3008 81.722 6.566 1.093 0 \n", + "3009 78.333 5.747 1.113 0 \n", + "3010 75.556 5.558 1.036 0 \n", + "3011 70.556 5.723 1.079 0 \n", + "3012 75.111 6.378 1.168 0 \n", + "3013 78.278 6.374 1.153 0 \n", + "3014 80.250 5.325 1.207 0 \n", + "3015 65.944 5.169 1.174 0 \n", + "3016 71.000 5.017 1.391 0 \n", + "3017 80.167 6.149 1.107 0 \n", + "3018 88.250 6.383 1.133 0 \n", + "3019 80.111 6.138 1.038 0 \n", + "3020 74.167 5.523 1.088 0 \n", + "3021 79.944 5.267 1.044 0 \n", + "3022 66.769 6.068 1.379 0 \n", + "3023 74.111 5.611 1.162 0 \n", + "3024 74.944 6.606 1.141 0 \n", + "3025 82.056 5.732 1.114 0 \n", + "3026 81.545 5.120 1.205 0 \n", + "3027 78.111 5.451 1.181 0 \n", + "3028 79.938 6.241 1.060 0 \n", + "3029 69.143 5.769 1.200 0 \n", + "3030 65.722 6.378 1.340 0 \n", + "3031 77.278 5.821 1.116 0 \n", + "3032 82.917 5.640 1.185 0 \n", + "3033 68.611 5.598 1.144 0 \n", + "3034 73.278 6.194 1.639 0 \n", + "3035 82.111 5.889 1.131 0 \n", + "3036 74.722 6.055 1.270 0 \n", + "3037 67.111 5.853 1.136 0 \n", + "\n", + "[3038 rows x 12 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train = pandas.read_csv('../AMP Data Sets/AMP_TrainSet.csv')#reading in my train dataset\n", + "train\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104
04.03.7040.87373.5190.987-4.83300.38274.5567.2251.234
14.04.4440.89262.4440.931-0.58400.32056.0564.9421.853
22.00.0000.90147.0001.039-5.66400.16447.0005.9691.174
34.50.0000.86969.2220.982-5.42302.01069.2225.4621.138
4-4.021.5911.06171.6820.976-2.00202.75866.0005.5821.453
54.56.9770.89568.5120.950-1.87803.09072.0005.7791.844
612.03.1751.02274.4601.010-3.22503.17276.7225.6641.215
71.53.7040.93269.5190.977-2.50902.54372.0004.2511.560
83.03.3330.90359.5000.963-1.68202.99066.0005.1751.514
94.00.0000.87372.7920.998-4.94302.98577.4445.6261.621
1011.08.2190.92775.0680.989-3.11803.49376.3896.0471.126
114.52.7030.96669.7570.972-3.89613.71476.4445.4921.445
120.011.5381.02777.9230.981-3.95413.67978.0567.2221.054
136.03.3331.11479.1001.024-2.43703.98875.5566.6671.079
140.00.0001.00578.9711.1021.54404.14378.5564.4721.280
153.06.0610.89776.4550.955-4.03214.31081.2226.2071.506
163.02.1280.88964.0641.0000.58304.09774.6675.0971.302
179.50.0000.78655.6470.955-0.57703.81661.6674.8292.026
181.512.0000.94870.7200.956-3.55913.98266.5007.0241.050
194.00.0000.82854.8751.048-2.85304.29354.8755.2291.651
205.03.1250.90169.5940.995-1.67703.87658.5005.2781.486
211.50.0000.87267.2000.972-5.39204.47167.2006.5240.986
222.00.0000.78664.1500.969-4.70603.92963.7226.9411.040
238.00.0000.93362.8001.008-4.17004.10462.6674.8701.547
243.010.8111.08677.1081.010-2.11204.20878.0565.7481.249
254.02.9410.90071.2060.967-3.96304.12672.6116.8281.507
2610.00.0000.84569.5110.975-2.04903.97770.7224.8911.543
275.50.0000.94671.6671.023-4.98203.43971.6675.9531.108
289.00.0000.82254.5450.993-3.95503.56255.5006.0861.114
29-6.038.2351.23983.5591.0020.10813.31791.5005.7231.055
....................................
7281.04.1670.93167.8330.936-0.775014.99368.6676.0471.125
7291.07.4070.93081.2590.985-2.859014.99380.7786.0121.051
7300.025.0001.11979.6671.023-0.379014.98677.6676.0421.137
731-2.017.5001.06884.1000.995-1.328014.94390.0006.0811.484
7321.04.5450.83085.0910.996-3.729014.98285.8335.6121.165
7331.011.5381.05070.8851.015-2.530014.98175.7225.3371.327
7340.013.3330.92572.5330.993-2.093018.27972.5335.5251.147
7350.511.1111.13580.7781.034-1.448014.95180.7785.4111.079
736-0.513.3330.95775.2000.969-1.257017.79975.2005.9391.150
7375.010.2040.94778.1840.986-3.313015.30077.1116.2391.050
738-1.019.2311.06591.0771.0040.520015.21495.6115.3691.276
739-1.517.6471.11982.1471.005-1.477015.32181.3335.7711.016
7406.53.7040.90976.1111.009-2.840015.66679.2226.0231.242
7415.00.0000.83680.0970.973-2.795015.11082.6115.9231.245
742-3.513.3331.11575.2891.027-1.292015.05880.3895.8091.300
7434.08.3330.92879.0000.960-3.607015.09180.9445.4171.316
74410.517.0001.09182.1601.003-2.414015.27074.9445.6011.053
7455.512.8210.99667.5130.991-4.674014.98967.9446.9281.166
746-2.019.0481.03085.3330.969-1.162015.45886.5006.2841.156
747-2.520.5131.09982.7951.014-0.965015.71586.3335.5891.127
748-2.025.0001.17886.4171.0131.322022.98986.4175.5841.228
749-4.021.8751.02166.1880.994-0.523015.49971.2225.9391.080
7502.00.0001.05486.4621.051-0.815020.86686.4625.7121.298
751-2.014.8941.04283.2550.978-1.303015.26085.1675.7181.164
752-8.028.2611.22182.1091.014-0.153015.35581.1676.9040.933
753-1.516.0001.10082.8200.991-1.987015.18585.3337.0531.325
754-1.018.1821.08573.4551.027-0.745016.55074.6676.7291.132
755-1.019.0481.10882.1901.033-1.789016.11279.6676.0361.219
756-1.07.1430.95576.7861.0231.141020.63076.7865.6691.111
757-7.017.1431.07884.1861.009-0.066017.16876.6116.6881.305
\n", + "

758 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "0 4.0 3.704 0.873 73.519 \n", + "1 4.0 4.444 0.892 62.444 \n", + "2 2.0 0.000 0.901 47.000 \n", + "3 4.5 0.000 0.869 69.222 \n", + "4 -4.0 21.591 1.061 71.682 \n", + "5 4.5 6.977 0.895 68.512 \n", + "6 12.0 3.175 1.022 74.460 \n", + "7 1.5 3.704 0.932 69.519 \n", + "8 3.0 3.333 0.903 59.500 \n", + "9 4.0 0.000 0.873 72.792 \n", + "10 11.0 8.219 0.927 75.068 \n", + "11 4.5 2.703 0.966 69.757 \n", + "12 0.0 11.538 1.027 77.923 \n", + "13 6.0 3.333 1.114 79.100 \n", + "14 0.0 0.000 1.005 78.971 \n", + "15 3.0 6.061 0.897 76.455 \n", + "16 3.0 2.128 0.889 64.064 \n", + "17 9.5 0.000 0.786 55.647 \n", + "18 1.5 12.000 0.948 70.720 \n", + "19 4.0 0.000 0.828 54.875 \n", + "20 5.0 3.125 0.901 69.594 \n", + "21 1.5 0.000 0.872 67.200 \n", + "22 2.0 0.000 0.786 64.150 \n", + "23 8.0 0.000 0.933 62.800 \n", + "24 3.0 10.811 1.086 77.108 \n", + "25 4.0 2.941 0.900 71.206 \n", + "26 10.0 0.000 0.845 69.511 \n", + "27 5.5 0.000 0.946 71.667 \n", + "28 9.0 0.000 0.822 54.545 \n", + "29 -6.0 38.235 1.239 83.559 \n", + ".. ... ... ... ... \n", + "728 1.0 4.167 0.931 67.833 \n", + "729 1.0 7.407 0.930 81.259 \n", + "730 0.0 25.000 1.119 79.667 \n", + "731 -2.0 17.500 1.068 84.100 \n", + "732 1.0 4.545 0.830 85.091 \n", + "733 1.0 11.538 1.050 70.885 \n", + "734 0.0 13.333 0.925 72.533 \n", + "735 0.5 11.111 1.135 80.778 \n", + "736 -0.5 13.333 0.957 75.200 \n", + "737 5.0 10.204 0.947 78.184 \n", + "738 -1.0 19.231 1.065 91.077 \n", + "739 -1.5 17.647 1.119 82.147 \n", + "740 6.5 3.704 0.909 76.111 \n", + "741 5.0 0.000 0.836 80.097 \n", + "742 -3.5 13.333 1.115 75.289 \n", + "743 4.0 8.333 0.928 79.000 \n", + "744 10.5 17.000 1.091 82.160 \n", + "745 5.5 12.821 0.996 67.513 \n", + "746 -2.0 19.048 1.030 85.333 \n", + "747 -2.5 20.513 1.099 82.795 \n", + "748 -2.0 25.000 1.178 86.417 \n", + "749 -4.0 21.875 1.021 66.188 \n", + "750 2.0 0.000 1.054 86.462 \n", + "751 -2.0 14.894 1.042 83.255 \n", + "752 -8.0 28.261 1.221 82.109 \n", + "753 -1.5 16.000 1.100 82.820 \n", + "754 -1.0 18.182 1.085 73.455 \n", + "755 -1.0 19.048 1.108 82.190 \n", + "756 -1.0 7.143 0.955 76.786 \n", + "757 -7.0 17.143 1.078 84.186 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "0 0.987 -4.833 0 0.382 \n", + "1 0.931 -0.584 0 0.320 \n", + "2 1.039 -5.664 0 0.164 \n", + "3 0.982 -5.423 0 2.010 \n", + "4 0.976 -2.002 0 2.758 \n", + "5 0.950 -1.878 0 3.090 \n", + "6 1.010 -3.225 0 3.172 \n", + "7 0.977 -2.509 0 2.543 \n", + "8 0.963 -1.682 0 2.990 \n", + "9 0.998 -4.943 0 2.985 \n", + "10 0.989 -3.118 0 3.493 \n", + "11 0.972 -3.896 1 3.714 \n", + "12 0.981 -3.954 1 3.679 \n", + "13 1.024 -2.437 0 3.988 \n", + "14 1.102 1.544 0 4.143 \n", + "15 0.955 -4.032 1 4.310 \n", + "16 1.000 0.583 0 4.097 \n", + "17 0.955 -0.577 0 3.816 \n", + "18 0.956 -3.559 1 3.982 \n", + "19 1.048 -2.853 0 4.293 \n", + "20 0.995 -1.677 0 3.876 \n", + "21 0.972 -5.392 0 4.471 \n", + "22 0.969 -4.706 0 3.929 \n", + "23 1.008 -4.170 0 4.104 \n", + "24 1.010 -2.112 0 4.208 \n", + "25 0.967 -3.963 0 4.126 \n", + "26 0.975 -2.049 0 3.977 \n", + "27 1.023 -4.982 0 3.439 \n", + "28 0.993 -3.955 0 3.562 \n", + "29 1.002 0.108 1 3.317 \n", + ".. ... ... ... ... \n", + "728 0.936 -0.775 0 14.993 \n", + "729 0.985 -2.859 0 14.993 \n", + "730 1.023 -0.379 0 14.986 \n", + "731 0.995 -1.328 0 14.943 \n", + "732 0.996 -3.729 0 14.982 \n", + "733 1.015 -2.530 0 14.981 \n", + "734 0.993 -2.093 0 18.279 \n", + "735 1.034 -1.448 0 14.951 \n", + "736 0.969 -1.257 0 17.799 \n", + "737 0.986 -3.313 0 15.300 \n", + "738 1.004 0.520 0 15.214 \n", + "739 1.005 -1.477 0 15.321 \n", + "740 1.009 -2.840 0 15.666 \n", + "741 0.973 -2.795 0 15.110 \n", + "742 1.027 -1.292 0 15.058 \n", + "743 0.960 -3.607 0 15.091 \n", + "744 1.003 -2.414 0 15.270 \n", + "745 0.991 -4.674 0 14.989 \n", + "746 0.969 -1.162 0 15.458 \n", + "747 1.014 -0.965 0 15.715 \n", + "748 1.013 1.322 0 22.989 \n", + "749 0.994 -0.523 0 15.499 \n", + "750 1.051 -0.815 0 20.866 \n", + "751 0.978 -1.303 0 15.260 \n", + "752 1.014 -0.153 0 15.355 \n", + "753 0.991 -1.987 0 15.185 \n", + "754 1.027 -0.745 0 16.550 \n", + "755 1.033 -1.789 0 16.112 \n", + "756 1.023 1.141 0 20.630 \n", + "757 1.009 -0.066 0 17.168 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 \n", + "0 74.556 7.225 1.234 \n", + "1 56.056 4.942 1.853 \n", + "2 47.000 5.969 1.174 \n", + "3 69.222 5.462 1.138 \n", + "4 66.000 5.582 1.453 \n", + "5 72.000 5.779 1.844 \n", + "6 76.722 5.664 1.215 \n", + "7 72.000 4.251 1.560 \n", + "8 66.000 5.175 1.514 \n", + "9 77.444 5.626 1.621 \n", + "10 76.389 6.047 1.126 \n", + "11 76.444 5.492 1.445 \n", + "12 78.056 7.222 1.054 \n", + "13 75.556 6.667 1.079 \n", + "14 78.556 4.472 1.280 \n", + "15 81.222 6.207 1.506 \n", + "16 74.667 5.097 1.302 \n", + "17 61.667 4.829 2.026 \n", + "18 66.500 7.024 1.050 \n", + "19 54.875 5.229 1.651 \n", + "20 58.500 5.278 1.486 \n", + "21 67.200 6.524 0.986 \n", + "22 63.722 6.941 1.040 \n", + "23 62.667 4.870 1.547 \n", + "24 78.056 5.748 1.249 \n", + "25 72.611 6.828 1.507 \n", + "26 70.722 4.891 1.543 \n", + "27 71.667 5.953 1.108 \n", + "28 55.500 6.086 1.114 \n", + "29 91.500 5.723 1.055 \n", + ".. ... ... ... \n", + "728 68.667 6.047 1.125 \n", + "729 80.778 6.012 1.051 \n", + "730 77.667 6.042 1.137 \n", + "731 90.000 6.081 1.484 \n", + "732 85.833 5.612 1.165 \n", + "733 75.722 5.337 1.327 \n", + "734 72.533 5.525 1.147 \n", + "735 80.778 5.411 1.079 \n", + "736 75.200 5.939 1.150 \n", + "737 77.111 6.239 1.050 \n", + "738 95.611 5.369 1.276 \n", + "739 81.333 5.771 1.016 \n", + "740 79.222 6.023 1.242 \n", + "741 82.611 5.923 1.245 \n", + "742 80.389 5.809 1.300 \n", + "743 80.944 5.417 1.316 \n", + "744 74.944 5.601 1.053 \n", + "745 67.944 6.928 1.166 \n", + "746 86.500 6.284 1.156 \n", + "747 86.333 5.589 1.127 \n", + "748 86.417 5.584 1.228 \n", + "749 71.222 5.939 1.080 \n", + "750 86.462 5.712 1.298 \n", + "751 85.167 5.718 1.164 \n", + "752 81.167 6.904 0.933 \n", + "753 85.333 7.053 1.325 \n", + "754 74.667 6.729 1.132 \n", + "755 79.667 6.036 1.219 \n", + "756 76.786 5.669 1.111 \n", + "757 76.611 6.688 1.305 \n", + "\n", + "[758 rows x 11 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test= pandas.read_csv('../AMP Data Sets/Test.csv') #reading in my test dataset\n", + "test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspecting my train dataset\n", + "\n", + "
\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": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3038, 12)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.shape #a tuple that gives you an indication of the number of dimensions in the array." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 0\n", + "FULL_AcidicMolPerc 0\n", + "FULL_AURR980107 0\n", + "FULL_DAYM780201 0\n", + "FULL_GEOR030101 0\n", + "FULL_OOBM850104 0\n", + "NT_EFC195 0\n", + "AS_MeanAmphiMoment 0\n", + "AS_DAYM780201 0\n", + "AS_FUKS010112 0\n", + "CT_RACS820104 0\n", + "CLASS 0\n", + "dtype: int64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.isnull().sum() ###this will show the number of null values in my data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 3038\n", + "FULL_AcidicMolPerc 3038\n", + "FULL_AURR980107 3038\n", + "FULL_DAYM780201 3038\n", + "FULL_GEOR030101 3038\n", + "FULL_OOBM850104 3038\n", + "NT_EFC195 3038\n", + "AS_MeanAmphiMoment 3038\n", + "AS_DAYM780201 3038\n", + "AS_FUKS010112 3038\n", + "CT_RACS820104 3038\n", + "CLASS 3038\n", + "dtype: int64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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\n", + "\n", + "
\n", + "Good\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FULL_ChargeFULL_AcidicMolPercFULL_AURR980107FULL_DAYM780201FULL_GEOR030101FULL_OOBM850104NT_EFC195AS_MeanAmphiMomentAS_DAYM780201AS_FUKS010112CT_RACS820104CLASS
count3038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.0000003038.000000
mean2.0602378.5215200.97141073.6687600.994007-2.4329270.08854515.68323373.6508285.9113611.2352550.500000
std3.8199297.5866520.1074138.5274890.0313331.7072230.28413311.5756659.1660920.6936890.2100120.500082
min-16.0000000.0000000.68400042.7500000.866000-10.4320000.0000000.04100042.7780003.5330000.7850000.000000
25%0.0000002.5160000.89500068.2940000.974000-3.6060000.0000005.58750067.5560005.4592501.0820000.000000
50%2.0000007.1430000.96300074.0595000.994000-2.2965000.00000014.98850073.6970005.9255001.1840000.500000
75%4.00000013.1580001.04100079.3437501.011000-1.2832500.00000026.80775079.7780006.3820001.3510001.000000
max30.00000046.6670001.451000101.6820001.1960003.5760001.00000051.280000103.1670008.6620002.1920001.000000
\n", + "
" + ], + "text/plain": [ + " FULL_Charge FULL_AcidicMolPerc FULL_AURR980107 FULL_DAYM780201 \\\n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 2.060237 8.521520 0.971410 73.668760 \n", + "std 3.819929 7.586652 0.107413 8.527489 \n", + "min -16.000000 0.000000 0.684000 42.750000 \n", + "25% 0.000000 2.516000 0.895000 68.294000 \n", + "50% 2.000000 7.143000 0.963000 74.059500 \n", + "75% 4.000000 13.158000 1.041000 79.343750 \n", + "max 30.000000 46.667000 1.451000 101.682000 \n", + "\n", + " FULL_GEOR030101 FULL_OOBM850104 NT_EFC195 AS_MeanAmphiMoment \\\n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 0.994007 -2.432927 0.088545 15.683233 \n", + "std 0.031333 1.707223 0.284133 11.575665 \n", + "min 0.866000 -10.432000 0.000000 0.041000 \n", + "25% 0.974000 -3.606000 0.000000 5.587500 \n", + "50% 0.994000 -2.296500 0.000000 14.988500 \n", + "75% 1.011000 -1.283250 0.000000 26.807750 \n", + "max 1.196000 3.576000 1.000000 51.280000 \n", + "\n", + " AS_DAYM780201 AS_FUKS010112 CT_RACS820104 CLASS \n", + "count 3038.000000 3038.000000 3038.000000 3038.000000 \n", + "mean 73.650828 5.911361 1.235255 0.500000 \n", + "std 9.166092 0.693689 0.210012 0.500082 \n", + "min 42.778000 3.533000 0.785000 0.000000 \n", + "25% 67.556000 5.459250 1.082000 0.000000 \n", + "50% 73.697000 5.925500 1.184000 0.500000 \n", + "75% 79.778000 6.382000 1.351000 1.000000 \n", + "max 103.167000 8.662000 2.192000 1.000000 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.describe() #returns summary of the whole data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 3038 entries, 0 to 3037\n", + "Data columns (total 12 columns):\n", + "FULL_Charge 3038 non-null float64\n", + "FULL_AcidicMolPerc 3038 non-null float64\n", + "FULL_AURR980107 3038 non-null float64\n", + "FULL_DAYM780201 3038 non-null float64\n", + "FULL_GEOR030101 3038 non-null float64\n", + "FULL_OOBM850104 3038 non-null float64\n", + "NT_EFC195 3038 non-null int64\n", + "AS_MeanAmphiMoment 3038 non-null float64\n", + "AS_DAYM780201 3038 non-null float64\n", + "AS_FUKS010112 3038 non-null float64\n", + "CT_RACS820104 3038 non-null float64\n", + "CLASS 3038 non-null int64\n", + "dtypes: float64(10), int64(2)\n", + "memory usage: 284.9 KB\n" + ] + } + ], + "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": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CLASS\n", + "0 1519\n", + "1 1519\n", + "dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.groupby('CLASS').size()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'pyplot' 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 1\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'CLASS'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\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'bar'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#i can also show this in a graph form\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mpyplot\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[0m", + "\u001b[0;31mNameError\u001b[0m: name 'pyplot' is not defined" + ] + } + ], + "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\n", + "\n", + "
\n", + "\n", + "## ??\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### I will start with univariate plots to see each individual variable\n", + "\n", + "
\n", + "\n", + "## ??\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'pyplot' 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 1\u001b[0m \u001b[0;31m#visualizing using histograms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m16\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----> 3\u001b[0;31m \u001b[0mpyplot\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[0m", + "\u001b[0;31mNameError\u001b[0m: name 'pyplot' is not defined" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "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", + "
\n", + "Good observations\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "## ??\n", + "\n", + "What did you find out from the cell below.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FULL_Charge 0.534602\n", + "FULL_AcidicMolPerc -0.598816\n", + "FULL_AURR980107 -0.584111\n", + "FULL_DAYM780201 -0.554838\n", + "FULL_GEOR030101 -0.260470\n", + "FULL_OOBM850104 -0.453287\n", + "NT_EFC195 0.260702\n", + "AS_MeanAmphiMoment 0.693552\n", + "AS_DAYM780201 -0.437168\n", + "AS_FUKS010112 0.033432\n", + "CT_RACS820104 0.267652\n", + "CLASS 1.000000\n", + "Name: CLASS, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train.corr(method='pearson')['CLASS'] #Here I tried to see the correlation of all attributes with the class" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multivariate \n", + "\n", + "
\n", + " \n", + " Please import: `import matplotlib.pyplot as plt`\n", + "\n", + "## ??\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", + "## Add more algorithms please: Gradient Boosting\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LR: 0.912356 (0.013890)\n", + "LDA: 0.913808 (0.018930)\n", + "KNN: 0.907040 (0.017335)\n", + "CART: 0.896858 (0.014657)\n", + "NB: 0.913334 (0.016768)\n", + "SVM: 0.890594 (0.022649)\n", + "RTC: 0.933671 (0.015717)\n", + "SGD: 0.877977 (0.024229)\n", + "NC: 0.893481 (0.019393)\n", + "MLPC: 0.918158 (0.017259)\n" + ] + } + ], + "source": [ + "\n", + "\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", + "# 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": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "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 NB." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MCC 0.860278994009734\n" + ] + } + ], + "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": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MCC 0.8788612940586917\n" + ] + } + ], + "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": "markdown", + "metadata": {}, + "source": [ + "#### I will now test the performance of my model first using all the features, then with some selected ones\n", + "\n", + "
\n", + "\n", + "## Why do you decide to do the feature selection this way, any reason?\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 93.01130524152107\n" + ] + } + ], + "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": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9393627954779034\n", + "[[464 25]\n", + " [ 34 450]]\n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.93 0.95 0.94 489\n", + " 1.0 0.95 0.93 0.94 484\n", + "\n", + " accuracy 0.94 973\n", + " macro avg 0.94 0.94 0.94 973\n", + "weighted avg 0.94 0.94 0.94 973\n", + "\n" + ] + } + ], + "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.\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/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 From 90337b61bb5bd53f08946320cf94b39e4ac3544f Mon Sep 17 00:00:00 2001 From: Senamile Fezile Dlamini <60500625+senadee@users.noreply.github.com> Date: Thu, 12 Mar 2020 22:21:42 -0700 Subject: [PATCH 3/5] Add files via upload --- Assignment Colab/Fezile Dlamini -corrected.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 Assignment Colab/Fezile Dlamini -corrected.ipynb diff --git a/Assignment Colab/Fezile Dlamini -corrected.ipynb b/Assignment Colab/Fezile Dlamini -corrected.ipynb new file mode 100644 index 0000000..ef777ac --- /dev/null +++ b/Assignment Colab/Fezile Dlamini -corrected.ipynb @@ -0,0 +1 @@ +{"cells":[{"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:\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"},{"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\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"},{"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\n#### I 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\n#### I 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)\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\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\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."},{"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.\n#### I 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":{"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 From 38700c4fc281a45ee9ce470c5d6625278185a684 Mon Sep 17 00:00:00 2001 From: Atwine Date: Sat, 14 Mar 2020 13:53:07 +0300 Subject: [PATCH 4/5] write report --- ...Fezile Dlamini -corrected-checkpoint.ipynb | 1058 ++++++++++++++++ .../Fezile Dlamini -corrected.ipynb | 1059 ++++++++++++++++- 2 files changed, 2116 insertions(+), 1 deletion(-) create mode 100644 Assignment Colab/.ipynb_checkpoints/Fezile Dlamini -corrected-checkpoint.ipynb 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 -corrected.ipynb b/Assignment Colab/Fezile Dlamini -corrected.ipynb index ef777ac..66d5836 100644 --- a/Assignment Colab/Fezile Dlamini -corrected.ipynb +++ b/Assignment Colab/Fezile Dlamini -corrected.ipynb @@ -1 +1,1058 @@ -{"cells":[{"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:\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"},{"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\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"},{"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\n#### I 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\n#### I 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)\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\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\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."},{"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.\n#### I 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":{"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 +{ + "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 +} From c8bbd3cd926e590421e55b6f63d348d28a9948e7 Mon Sep 17 00:00:00 2001 From: Senamile Fezile Dlamini <60500625+senadee@users.noreply.github.com> Date: Mon, 16 Mar 2020 06:07:19 -0700 Subject: [PATCH 5/5] Add files via upload --- Assignment Colab/Fezile Dlamini -Final Submission.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 Assignment Colab/Fezile Dlamini -Final Submission.ipynb 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