{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# The links to external data is listed bellow\n\n#### This is a link the AmEx provided DataSet\nhttps://www.kaggle.com/competitions/amex-default-prediction/data\n\n#### I had to proccess the test data as slices, details are in the section Kaggle Results\nhttps://www.kaggle.com/datasets/aboud9090/amex-data-slices\n\n#### This set is the RAW CSV predictions submitted to Kaggle\nhttps://www.kaggle.com/datasets/aboud9090/amex-prediction-results","metadata":{}},{"cell_type":"markdown","source":"# Training Data Pre-proccesing\nThe preprocessing data is named new_aa.csb\nThe labels for this data is train-labels.csv\nBoth of these files are on the Data tab to the right","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.datasets import make_multilabel_classification\nfrom sklearn.decomposition import PCA\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import explained_variance_score\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.neighbors import KNeighborsClassifier\n\n# Imports a bit of the total amount of data, the name of file is new_aa\naaDatasetOrginal = pd.read_csv('/kaggle/input/amex-data-slices/new_aa.csv')\naaDataset = aaDatasetOrginal\n\n# this part filters the strings out of the data\naaDataset = aaDataset.drop(columns=['S_2'])\naaDataset = aaDataset.drop(columns=['D_63'])\naaDataset = aaDataset.drop(columns=['D_64'])\n\n# this bollow function takes duplaicate columns and averages them\n# it remove duplicates through aggregation\nagg_function = {'P_2': 'mean', 'D_39': 'mean', 'B_1': 'mean',  'B_2': 'mean','R_1': 'mean','S_3': 'mean','D_41': 'mean',  'B_3': 'mean','D_42': 'mean',  'D_43': 'mean',  'D_44': 'mean',  'B_4': 'mean','D_45': 'mean',  'B_5': 'mean','R_2': 'mean','D_46': 'mean',  'D_47': 'mean',  'D_48': 'mean',  'D_49': 'mean',  'B_6': 'mean','B_7': 'mean','B_8': 'mean','D_50': 'mean',  'D_51': 'mean',  'B_9': 'mean','R_3': 'mean','D_52': 'mean',  'P_3': 'mean','B_10': 'mean',  'D_53': 'mean',  'S_5': 'mean','B_11': 'mean',  'S_6': 'mean','D_54': 'mean',  'R_4': 'mean','S_7': 'mean','B_12': 'mean',  'S_8': 'mean','D_55': 'mean',  'D_56': 'mean',  'B_13': 'mean',  'R_5': 'mean','D_58': 'mean',  'S_9': 'mean', 'B_14': 'mean', 'D_59': 'mean',  'D_60': 'mean',  'D_61': 'mean',  'B_15': 'mean',  'S_11': 'mean',  'D_62': 'mean', 'D_65': 'mean',  'B_16': 'mean', 'B_17': 'mean', 'B_18': 'mean', 'B_19': 'mean', 'D_66': 'mean', 'B_20': 'mean', 'D_68': 'mean', 'S_12': 'mean', 'R_6': 'mean',  'S_13': 'mean', 'B_21': 'mean', 'D_69': 'mean', 'B_22': 'mean', 'D_70': 'mean', 'D_71': 'mean', 'D_72': 'mean', 'S_15': 'mean', 'B_23': 'mean', 'D_73': 'mean', 'P_4': 'mean',  'D_74': 'mean', 'D_75': 'mean', 'D_76': 'mean', 'B_24': 'mean', 'R_7': 'mean',  'D_77': 'mean', 'B_25': 'mean', 'B_26': 'mean', 'D_78': 'mean', 'D_79': 'mean', 'R_8': 'mean',  'R_9': 'mean',  'S_16': 'mean', 'D_80': 'mean', 'R_10': 'mean', 'R_11': 'mean', 'B_27': 'mean', 'D_81': 'mean', 'D_82': 'mean', 'S_17': 'mean', 'R_12': 'mean', 'B_28': 'mean', 'R_13': 'mean', 'D_83': 'mean', 'R_14': 'mean', 'R_15': 'mean', 'D_84': 'mean', 'R_16': 'mean', 'B_29': 'mean', 'B_30': 'mean', 'S_18': 'mean', 'D_86': 'mean', 'D_87': 'mean', 'R_17': 'mean', 'R_18': 'mean', 'D_88': 'mean', 'B_31': 'mean', 'S_19': 'mean', 'R_19': 'mean', 'B_32': 'mean', 'S_20': 'mean', 'R_20': 'mean', 'R_21': 'mean', 'B_33': 'mean', 'D_89': 'mean', 'R_22': 'mean', 'R_23': 'mean', 'D_91': 'mean', 'D_92': 'mean', 'D_93': 'mean', 'D_94': 'mean', 'R_24': 'mean', 'R_25': 'mean', 'D_96': 'mean', 'S_22': 'mean', 'S_23': 'mean', 'S_24': 'mean', 'S_25': 'mean', 'S_26': 'mean', 'D_102': 'mean',    'D_103': 'mean',    'D_104': 'mean',    'D_105': 'mean',    'D_106': 'mean',    'D_107': 'mean',    'B_36': 'mean', 'B_37': 'mean', 'R_26': 'mean', 'R_27': 'mean', 'B_38': 'mean', 'D_108': 'mean',    'D_109': 'mean',    'D_110': 'mean',    'D_111': 'mean',    'B_39': 'mean', 'D_112': 'mean',    'B_40': 'mean', 'S_27': 'mean', 'D_113': 'mean',    'D_114': 'mean',    'D_115': 'mean',    'D_116': 'mean',    'D_117': 'mean',    'D_118': 'mean',    'D_119': 'mean',    'D_120': 'mean',    'D_121': 'mean',    'D_122': 'mean',    'D_123': 'mean',    'D_124': 'mean',    'D_125': 'mean',    'D_126': 'mean',    'D_127': 'mean',    'D_128': 'mean',    'D_129': 'mean',    'B_41': 'mean', 'B_42': 'mean', 'D_130': 'mean',    'D_131': 'mean',    'D_132': 'mean',    'D_133': 'mean',    'R_28': 'mean', 'D_134': 'mean',    'D_135': 'mean',    'D_136': 'mean',    'D_137': 'mean',    'D_138': 'mean',    'D_139': 'mean',    'D_140': 'mean',    'D_141': 'mean',    'D_142': 'mean',    'D_143': 'mean',    'D_144': 'mean', 'D_145': 'mean'}\naaDataset = aaDataset.groupby('customer_ID').aggregate(agg_function).reset_index()\n\n# apply normalization techniques, I get this code from -> https://www.geeksforgeeks.org/data-normalization-with-pandas/\nnormalized_aaDataset = aaDataset.copy()\nfor column in normalized_aaDataset.columns:\n    if (not isinstance(column, str)):\n        normalized_aaDataset[column] = normalized_aaDataset[column]  / normalized_aaDataset[column].abs().max()\n\n# converts NaNs to 0s\naaDataset = aaDataset.fillna(0)\n\n# prints the dataset\nprint(aaDataset)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:50:49.585681Z","iopub.execute_input":"2022-12-13T04:50:49.586076Z","iopub.status.idle":"2022-12-13T04:51:18.270505Z","shell.execute_reply.started":"2022-12-13T04:50:49.586046Z","shell.execute_reply":"2022-12-13T04:51:18.269222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dimension Reduction","metadata":{}},{"cell_type":"code","source":"# calculating Pricnipale Compotent Analysys (PCA)\n# Caclucating with 1st, 2nd, 5th, and 10th compoentn PCAs to get the most accuracy with least features\n#First PCA\n\npca0 = PCA(n_components = 1)\npca1 = PCA(n_components = 2)\npca2 = PCA(n_components = 5)\npca3 = PCA(n_components = 10)\npca4 = PCA(n_components = 25)\npca_chosen = PCA(n_components = 35)\npca5 = PCA(n_components = 50)\n\npca0.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca1.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca2.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca3.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca4.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca_chosen.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca5.fit(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\n\n# Creating newer the models\npca0DataSet = pca0.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca1DataSet = pca1.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca2DataSet = pca2.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca3DataSet = pca3.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca4DataSet = pca4.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca_chosenDataSet = pca_chosen.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\npca5DataSet = pca5.fit_transform(aaDataset.loc[:, aaDataset.columns != 'customer_ID'])\n\n# Recreating the models using PCA\npca0DataSetRev = pca0.inverse_transform(pca0DataSet)\npca1DataSetRev = pca1.inverse_transform(pca1DataSet)\npca2DataSetRev = pca2.inverse_transform(pca2DataSet)\npca3DataSetRev = pca3.inverse_transform(pca3DataSet)\npca4DataSetRev = pca4.inverse_transform(pca4DataSet)\npca_chosenDataSetRev = pca_chosen.inverse_transform(pca_chosenDataSet)\npca5DataSetRev = pca5.inverse_transform(pca5DataSet)\n\n# converting PCA dataset to dataframe\npac0DataFrame = pd.DataFrame(pca0DataSet)\npac1DataFrame = pd.DataFrame(pca1DataSet)\npac2DataFrame = pd.DataFrame(pca2DataSet)\npac3DataFrame = pd.DataFrame(pca3DataSet)\npac4DataFrame = pd.DataFrame(pca4DataSet)\npacChosenDataFrame = pd.DataFrame(pca_chosenDataSet)\npac5DataFrame = pd.DataFrame(pca5DataSet)\n\nidColumns = aaDataset.loc[:, aaDataset.columns == 'customer_ID']\nidColumns = np.asarray(idColumns)\n\n# adding the ID column to PCA'd matrixes\npac0DataFrame.insert(0, column='customer_ID', value=idColumns)\npac1DataFrame.insert(0, column='customer_ID', value=idColumns)\npac2DataFrame.insert(0, column='customer_ID', value=idColumns)\npac3DataFrame.insert(0, column='customer_ID', value=idColumns)\npac4DataFrame.insert(0, column='customer_ID', value=idColumns)\npacChosenDataFrame.insert(0, column='customer_ID', value=idColumns)\npac5DataFrame.insert(0, column='customer_ID', value=idColumns)","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-12-13T04:51:18.273320Z","iopub.execute_input":"2022-12-13T04:51:18.273809Z","iopub.status.idle":"2022-12-13T04:51:30.542248Z","shell.execute_reply.started":"2022-12-13T04:51:18.273764Z","shell.execute_reply":"2022-12-13T04:51:30.540621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Testing accuracy\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'], pca0DataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'], pca1DataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'],pca2DataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'],pca3DataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'],pca4DataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'],pca_chosenDataSetRev))\nprint(explained_variance_score(aaDataset.loc[:, aaDataset.columns != 'customer_ID'],pca5DataSetRev))","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:30.544395Z","iopub.execute_input":"2022-12-13T04:51:30.545214Z","iopub.status.idle":"2022-12-13T04:51:31.564925Z","shell.execute_reply.started":"2022-12-13T04:51:30.545166Z","shell.execute_reply":"2022-12-13T04:51:31.563639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## PCA Data Visulisations","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ntempDataSet = aaDataset.drop(columns=['customer_ID'])\n\nplt.scatter(pca0DataSetRev[:, 1], pca0DataSetRev[:, 0], alpha=.3, label=\"1_Component Recreation\", color=\"green\")\nplt.scatter(pca1DataSetRev[:, 1], pca1DataSetRev[:, 0], alpha=.3, label=\"2_Components Recreation\", color=\"brown\")\nplt.scatter(pca2DataSetRev[:, 1], pca2DataSetRev[:, 0], alpha=.3, label=\"5_Components Recreation\", color=\"pink\")\nplt.scatter(pca3DataSetRev[:, 1], pca3DataSetRev[:, 0], alpha=.3, label=\"10_Components Recreation\", color=\"black\")\nplt.scatter(pca4DataSetRev[:, 1], pca4DataSetRev[:, 0], alpha=.3, label=\"25_Components Recreation\", color=\"yellow\")\nplt.scatter(pca_chosenDataSetRev[:, 1], pca_chosenDataSetRev[:, 0], alpha=.3, label=\"35_Components Recreation\", color=\"green\")\nplt.scatter(pca5DataSetRev[:, 1], pca5DataSetRev[:, 0], alpha=.3, label=\"50_Component PCA Recreation\", color=\"red\")\nplt.scatter(tempDataSet.iloc[:, 1].values, tempDataSet.iloc[:, 0].values, alpha=.3, label=\"Orginal DataSet\", color=\"blue\")\nplt.legend(loc=\"upper right\", fontsize = 7)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:31.568264Z","iopub.execute_input":"2022-12-13T04:51:31.569076Z","iopub.status.idle":"2022-12-13T04:51:32.961135Z","shell.execute_reply.started":"2022-12-13T04:51:31.569027Z","shell.execute_reply":"2022-12-13T04:51:32.959830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### PCA Findings:\n1. The AmExData CSV data was transferred into Pandas DataFrame.\n  aaDataset = pandas.read_csv('new_aa.csv')\n\n2. Columns of the data containing strings are removed, \n   and NA values are replaced with 0s. The values are then normalized.\n  aaDataset = aaDataset.drop(bad_columns)\n\n3. Multiple PCAs, with different components are then created and fitted.\n  pca_0,1,2,3,4,5 = PCA(n_components= 1,2,5,10,25,50)\n  pca_0,1,2,3,4,5.fit(aaDataset)\n  pcaDataSet_0,1,2,3,4,5 = pca_0,1,2,3,4,5.fit_transform(orginalDatatset)\n \n4. The PCAs are the used to recreate original dataset.\n  pcaDataSetRev_0,1,2,3,4,5 = pca_0,1,2,3,4,5\n  .inverse_transform(pcaDataSet_0,1,2,3,4,5)\n  \n5. The accuracy is then tested by using variance\n  variance_score(aaDataset, pcaDataSetRev_0,1,2,3,4,5)\n\n\nA component of 35 for PCA seems to be the best quanity, so it will be used for the later classificaitons\nThe specific variable is pacChosenDataFrame\n ","metadata":{}},{"cell_type":"markdown","source":"# Training the Models","metadata":{}},{"cell_type":"markdown","source":"### Matrix prep","metadata":{}},{"cell_type":"code","source":"# A bit of extra pre-processing, just reading in the labels as 1D array\n# loading in the labels\nlabels = pd.read_csv('/kaggle/input/amex-data-slices/train_labels.csv')\nlabels = labels.iloc[0:].values.T\nlabels = labels.flatten()\n\n# this gets the DF ready for classificaiton\nfilterDS = pacChosenDataFrame.drop(columns=['customer_ID']).copy()\nfilterDS = filterDS.iloc[0: , :]","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:32.962759Z","iopub.execute_input":"2022-12-13T04:51:32.963142Z","iopub.status.idle":"2022-12-13T04:51:32.992174Z","shell.execute_reply.started":"2022-12-13T04:51:32.963111Z","shell.execute_reply":"2022-12-13T04:51:32.990905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Naive Bayes, (CategoricalNB)\nLink to ScitKit Page: https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.CategoricalNB.html#sklearn.naive_bayes.CategoricalNB","metadata":{}},{"cell_type":"code","source":"gausNB = GaussianNB()\ngausNB.fit(filterDS, labels)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:32.993692Z","iopub.execute_input":"2022-12-13T04:51:32.994898Z","iopub.status.idle":"2022-12-13T04:51:33.026147Z","shell.execute_reply.started":"2022-12-13T04:51:32.994827Z","shell.execute_reply":"2022-12-13T04:51:33.025129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# K-Nearest Neighbor\nhttps://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html","metadata":{}},{"cell_type":"code","source":"# k = 64\nnk64 = KNeighborsClassifier(n_neighbors=64)\nnk64.fit(filterDS, labels)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:33.027497Z","iopub.execute_input":"2022-12-13T04:51:33.027888Z","iopub.status.idle":"2022-12-13T04:51:33.040069Z","shell.execute_reply.started":"2022-12-13T04:51:33.027855Z","shell.execute_reply":"2022-12-13T04:51:33.038633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Kaggle Testing\nSo all the preprocessing was to create the intial model, however, know this model needs to be tested, I will know run all the models with the training set. Before I do that, I'll do the previous preprocessing steps on the testing dataset, I'll then run the model, submit the coefficents to Kaggle, and get an accuracy raiting. Because the testing file is 30GB, I had to split the 30GB file to 30 1GB files. I then ran each of the 1GB files. I would then stich together the CSV files. All the files match the names x<a-b><a-z>.csv, and can be seen at the data tab to the right","metadata":{}},{"cell_type":"markdown","source":"##  Preprocessing the Test Data","metadata":{}},{"cell_type":"code","source":"# Imports a bit of the total amount of test data\n# I change the file name to each slice of the test-data\n# Here is a link to the slices\n#https://www.kaggle.com/datasets/aboud9090/amex-data-slices\n\nbbDataset = pd.read_csv('/kaggle/input/amex-data-slices/xaa.csv')\n\n# REMEMBER THIS IS JUST REPREATED PREPROCESSING AND PCA FROM THE TRAINING DATA\n\n# this part filters the strings out of the data, it also converts NaNs to 0s\nbbDataset = bbDataset.drop(columns=['S_2'])\nbbDataset = bbDataset.drop(columns=['D_63'])\nbbDataset = bbDataset.drop(columns=['D_64'])\n\n# this bollow function takes duplaicate columns and averages them\nagg_function = {'P_2': 'mean', 'D_39': 'mean', 'B_1': 'mean',  'B_2': 'mean','R_1': 'mean','S_3': 'mean','D_41': 'mean',  'B_3': 'mean','D_42': 'mean',  'D_43': 'mean',  'D_44': 'mean',  'B_4': 'mean','D_45': 'mean',  'B_5': 'mean','R_2': 'mean','D_46': 'mean',  'D_47': 'mean',  'D_48': 'mean',  'D_49': 'mean',  'B_6': 'mean','B_7': 'mean','B_8': 'mean','D_50': 'mean',  'D_51': 'mean',  'B_9': 'mean','R_3': 'mean','D_52': 'mean',  'P_3': 'mean','B_10': 'mean',  'D_53': 'mean',  'S_5': 'mean','B_11': 'mean',  'S_6': 'mean','D_54': 'mean',  'R_4': 'mean','S_7': 'mean','B_12': 'mean',  'S_8': 'mean','D_55': 'mean',  'D_56': 'mean',  'B_13': 'mean',  'R_5': 'mean','D_58': 'mean',  'S_9': 'mean', 'B_14': 'mean', 'D_59': 'mean',  'D_60': 'mean',  'D_61': 'mean',  'B_15': 'mean',  'S_11': 'mean',  'D_62': 'mean', 'D_65': 'mean',  'B_16': 'mean', 'B_17': 'mean', 'B_18': 'mean', 'B_19': 'mean', 'D_66': 'mean', 'B_20': 'mean', 'D_68': 'mean', 'S_12': 'mean', 'R_6': 'mean',  'S_13': 'mean', 'B_21': 'mean', 'D_69': 'mean', 'B_22': 'mean', 'D_70': 'mean', 'D_71': 'mean', 'D_72': 'mean', 'S_15': 'mean', 'B_23': 'mean', 'D_73': 'mean', 'P_4': 'mean',  'D_74': 'mean', 'D_75': 'mean', 'D_76': 'mean', 'B_24': 'mean', 'R_7': 'mean',  'D_77': 'mean', 'B_25': 'mean', 'B_26': 'mean', 'D_78': 'mean', 'D_79': 'mean', 'R_8': 'mean',  'R_9': 'mean',  'S_16': 'mean', 'D_80': 'mean', 'R_10': 'mean', 'R_11': 'mean', 'B_27': 'mean', 'D_81': 'mean', 'D_82': 'mean', 'S_17': 'mean', 'R_12': 'mean', 'B_28': 'mean', 'R_13': 'mean', 'D_83': 'mean', 'R_14': 'mean', 'R_15': 'mean', 'D_84': 'mean', 'R_16': 'mean', 'B_29': 'mean', 'B_30': 'mean', 'S_18': 'mean', 'D_86': 'mean', 'D_87': 'mean', 'R_17': 'mean', 'R_18': 'mean', 'D_88': 'mean', 'B_31': 'mean', 'S_19': 'mean', 'R_19': 'mean', 'B_32': 'mean', 'S_20': 'mean', 'R_20': 'mean', 'R_21': 'mean', 'B_33': 'mean', 'D_89': 'mean', 'R_22': 'mean', 'R_23': 'mean', 'D_91': 'mean', 'D_92': 'mean', 'D_93': 'mean', 'D_94': 'mean', 'R_24': 'mean', 'R_25': 'mean', 'D_96': 'mean', 'S_22': 'mean', 'S_23': 'mean', 'S_24': 'mean', 'S_25': 'mean', 'S_26': 'mean', 'D_102': 'mean',    'D_103': 'mean',    'D_104': 'mean',    'D_105': 'mean',    'D_106': 'mean',    'D_107': 'mean',    'B_36': 'mean', 'B_37': 'mean', 'R_26': 'mean', 'R_27': 'mean', 'B_38': 'mean', 'D_108': 'mean',    'D_109': 'mean',    'D_110': 'mean',    'D_111': 'mean',    'B_39': 'mean', 'D_112': 'mean',    'B_40': 'mean', 'S_27': 'mean', 'D_113': 'mean',    'D_114': 'mean',    'D_115': 'mean',    'D_116': 'mean',    'D_117': 'mean',    'D_118': 'mean',    'D_119': 'mean',    'D_120': 'mean',    'D_121': 'mean',    'D_122': 'mean',    'D_123': 'mean',    'D_124': 'mean',    'D_125': 'mean',    'D_126': 'mean',    'D_127': 'mean',    'D_128': 'mean',    'D_129': 'mean',    'B_41': 'mean', 'B_42': 'mean', 'D_130': 'mean',    'D_131': 'mean',    'D_132': 'mean',    'D_133': 'mean',    'R_28': 'mean', 'D_134': 'mean',    'D_135': 'mean',    'D_136': 'mean',    'D_137': 'mean',    'D_138': 'mean',    'D_139': 'mean',    'D_140': 'mean',    'D_141': 'mean',    'D_142': 'mean',    'D_143': 'mean',    'D_144': 'mean', 'D_145': 'mean'}\nbbDataset = bbDataset.groupby('customer_ID').aggregate(agg_function).reset_index()\n\n# apply normalization techniques, I get this code from -> https://www.geeksforgeeks.org/data-normalization-with-pandas/\nnormalized_bbDataset = bbDataset.copy()\nfor column in normalized_bbDataset.columns:\n    if (not isinstance(column, str)):\n        normalized_bbDataset[column] = normalized_bbDataset[column]  / normalized_bbDataset[column].abs().max()\nbbDataset = normalized_bbDataset\n\n#fills an empty columns w/ 0\nbbDataset = bbDataset.fillna(0)\n\n# calculating Pricnipale Compotent Analysys (PCA)\npca_chosen = PCA(n_components = 35)\npca_chosen.fit(bbDataset.loc[:, bbDataset.columns != 'customer_ID'])\npca_chosenDataSet = pca_chosen.fit_transform(bbDataset.loc[:, bbDataset.columns != 'customer_ID'])\npca_chosenDataSetRev = pca_chosen.inverse_transform(pca_chosenDataSet)\npacChosenDataFrame = pd.DataFrame(pca_chosenDataSet)\n\n# get all the IDs\nidColumns = bbDataset.loc[:, bbDataset.columns == 'customer_ID']\nidColumns = np.asarray(idColumns)\n\n# insert the IDs back into the data frame\npacChosenDataFrame.insert(0, column='customer_ID', value=idColumns)\n    \n# this gets the DF ready for classificaiton\nbbDataset = pacChosenDataFrame.drop(columns=['customer_ID']).copy()\nbbDataset = filterDS.iloc[0: , :]\n\n# this gets the DF ready for classificaiton\nfilterDS2 = pacChosenDataFrame.drop(columns=['customer_ID']).copy()\nfilterDS2 = filterDS2.iloc[0: , :]","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:51:33.042592Z","iopub.execute_input":"2022-12-13T04:51:33.042967Z","iopub.status.idle":"2022-12-13T04:52:02.768572Z","shell.execute_reply.started":"2022-12-13T04:51:33.042932Z","shell.execute_reply":"2022-12-13T04:52:02.766883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Using Each Model for Prediction\nBecause the testing file is 30GB, I had to split the 30GB file to 30 1GB files. I then ran each of the 1GB files. I would then stich together the CSV files.","metadata":{}},{"cell_type":"markdown","source":"### Naive Bayes","metadata":{}},{"cell_type":"code","source":"# perform the prediction\nnaivePredictVals = gausNB.predict(filterDS2)\n\n# convert the array to a matrix, w/ ID to submit coefficents to kaggle\nnaivedf = pd.DataFrame()\nnaivedf['prediction']=pd.Series(naivePredictVals)\nnaivedf.insert(0, column='customer_ID', value=idColumns)\n\n# converting all predicted labels to csv files\nnaivedf.to_csv('naive-9.csv')\n","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:52:02.771583Z","iopub.execute_input":"2022-12-13T04:52:02.772820Z","iopub.status.idle":"2022-12-13T04:52:02.909753Z","shell.execute_reply.started":"2022-12-13T04:52:02.772755Z","shell.execute_reply":"2022-12-13T04:52:02.908664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### K=64 Neighbor","metadata":{}},{"cell_type":"code","source":"# perform the prediction on each slice\nnk64PredictVals = nk64.predict(filterDS2)\n\n# convert the array to a matrix, w/ ID to submit coefficents to kaggle\nnaivedf = pd.DataFrame()\nnaivedf['target']=pd.Series(nk64PredictVals)\nnaivedf.insert(0, column='customer_ID', value=idColumns)\n\n# converting all predicted labels to csv files\nnaivedf.to_csv('neighbork64-9.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:52:02.913616Z","iopub.execute_input":"2022-12-13T04:52:02.913971Z","iopub.status.idle":"2022-12-13T04:52:22.899928Z","shell.execute_reply.started":"2022-12-13T04:52:02.913939Z","shell.execute_reply":"2022-12-13T04:52:22.898827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Kaggle Results","metadata":{}},{"cell_type":"markdown","source":"Before I list the results, I'm going to list some of the reasons why the model underperformed:\n1. I couldn't utilize the entire dataset due to computing limitations\n2. In order to run the model for the 30GB dataset, I had to split the file to 30-1GB filles, run them indedpendtly, then stich  together the CSV prediction files; this open all of doors for human error. This proccess also took me 3hrs per Model, so I could only try it on 2-models\n\nModels Score:\nUsing NaiveBayes -> 0.09654\nK64-Neighbor -> 0.05754\n\nTop Score:\nUsing an Ensemble of a LGB(Light Gradient-Boosting Machine) & NN -> 0.80977\n\n","metadata":{}},{"cell_type":"markdown","source":"# Local Testing\nI want to test more k-neighbors, so I'll use a portion of the training-set I couldn't use to as the training set for some new models. These tests will not be as expansive as the Kaggle ones, but they're less prone to human error, as I won't need to stich CSV fillies. I also want to retest the naive bayes.","metadata":{}},{"cell_type":"code","source":"# New Models, they are trained on the orginal new_aa.csv training set\nnk512 = KNeighborsClassifier(n_neighbors=512)\nnk512.fit(filterDS, labels)\n\nnk1024 = KNeighborsClassifier(n_neighbors=1024)\nnk1024.fit(filterDS, labels)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:52:22.901487Z","iopub.execute_input":"2022-12-13T04:52:22.901815Z","iopub.status.idle":"2022-12-13T04:52:22.920195Z","shell.execute_reply.started":"2022-12-13T04:52:22.901786Z","shell.execute_reply":"2022-12-13T04:52:22.919330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This part just pre-procces the testing set, same as the training set\n\nccDataset = pd.read_csv('/kaggle/input/amex-data-slices/ccDataset.csv')\n\n# REMEMBER THIS IS JUST REPREATED PREPROCESSING AND PCA FROM THE TRAINING DATA\n\n# this part filters the strings out of the data, it also converts NaNs to 0s\nccDataset = ccDataset.drop(columns=['S_2'])\nccDataset = ccDataset.drop(columns=['D_63'])\nccDataset = ccDataset.drop(columns=['D_64'])\n\n# this bollow function takes duplaicate columns and averages them\nagg_function = {'P_2': 'mean', 'D_39': 'mean', 'B_1': 'mean',  'B_2': 'mean','R_1': 'mean','S_3': 'mean','D_41': 'mean',  'B_3': 'mean','D_42': 'mean',  'D_43': 'mean',  'D_44': 'mean',  'B_4': 'mean','D_45': 'mean',  'B_5': 'mean','R_2': 'mean','D_46': 'mean',  'D_47': 'mean',  'D_48': 'mean',  'D_49': 'mean',  'B_6': 'mean','B_7': 'mean','B_8': 'mean','D_50': 'mean',  'D_51': 'mean',  'B_9': 'mean','R_3': 'mean','D_52': 'mean',  'P_3': 'mean','B_10': 'mean',  'D_53': 'mean',  'S_5': 'mean','B_11': 'mean',  'S_6': 'mean','D_54': 'mean',  'R_4': 'mean','S_7': 'mean','B_12': 'mean',  'S_8': 'mean','D_55': 'mean',  'D_56': 'mean',  'B_13': 'mean',  'R_5': 'mean','D_58': 'mean',  'S_9': 'mean', 'B_14': 'mean', 'D_59': 'mean',  'D_60': 'mean',  'D_61': 'mean',  'B_15': 'mean',  'S_11': 'mean',  'D_62': 'mean', 'D_65': 'mean',  'B_16': 'mean', 'B_17': 'mean', 'B_18': 'mean', 'B_19': 'mean', 'D_66': 'mean', 'B_20': 'mean', 'D_68': 'mean', 'S_12': 'mean', 'R_6': 'mean',  'S_13': 'mean', 'B_21': 'mean', 'D_69': 'mean', 'B_22': 'mean', 'D_70': 'mean', 'D_71': 'mean', 'D_72': 'mean', 'S_15': 'mean', 'B_23': 'mean', 'D_73': 'mean', 'P_4': 'mean',  'D_74': 'mean', 'D_75': 'mean', 'D_76': 'mean', 'B_24': 'mean', 'R_7': 'mean',  'D_77': 'mean', 'B_25': 'mean', 'B_26': 'mean', 'D_78': 'mean', 'D_79': 'mean', 'R_8': 'mean',  'R_9': 'mean',  'S_16': 'mean', 'D_80': 'mean', 'R_10': 'mean', 'R_11': 'mean', 'B_27': 'mean', 'D_81': 'mean', 'D_82': 'mean', 'S_17': 'mean', 'R_12': 'mean', 'B_28': 'mean', 'R_13': 'mean', 'D_83': 'mean', 'R_14': 'mean', 'R_15': 'mean', 'D_84': 'mean', 'R_16': 'mean', 'B_29': 'mean', 'B_30': 'mean', 'S_18': 'mean', 'D_86': 'mean', 'D_87': 'mean', 'R_17': 'mean', 'R_18': 'mean', 'D_88': 'mean', 'B_31': 'mean', 'S_19': 'mean', 'R_19': 'mean', 'B_32': 'mean', 'S_20': 'mean', 'R_20': 'mean', 'R_21': 'mean', 'B_33': 'mean', 'D_89': 'mean', 'R_22': 'mean', 'R_23': 'mean', 'D_91': 'mean', 'D_92': 'mean', 'D_93': 'mean', 'D_94': 'mean', 'R_24': 'mean', 'R_25': 'mean', 'D_96': 'mean', 'S_22': 'mean', 'S_23': 'mean', 'S_24': 'mean', 'S_25': 'mean', 'S_26': 'mean', 'D_102': 'mean',    'D_103': 'mean',    'D_104': 'mean',    'D_105': 'mean',    'D_106': 'mean',    'D_107': 'mean',    'B_36': 'mean', 'B_37': 'mean', 'R_26': 'mean', 'R_27': 'mean', 'B_38': 'mean', 'D_108': 'mean',    'D_109': 'mean',    'D_110': 'mean',    'D_111': 'mean',    'B_39': 'mean', 'D_112': 'mean',    'B_40': 'mean', 'S_27': 'mean', 'D_113': 'mean',    'D_114': 'mean',    'D_115': 'mean',    'D_116': 'mean',    'D_117': 'mean',    'D_118': 'mean',    'D_119': 'mean',    'D_120': 'mean',    'D_121': 'mean',    'D_122': 'mean',    'D_123': 'mean',    'D_124': 'mean',    'D_125': 'mean',    'D_126': 'mean',    'D_127': 'mean',    'D_128': 'mean',    'D_129': 'mean',    'B_41': 'mean', 'B_42': 'mean', 'D_130': 'mean',    'D_131': 'mean',    'D_132': 'mean',    'D_133': 'mean',    'R_28': 'mean', 'D_134': 'mean',    'D_135': 'mean',    'D_136': 'mean',    'D_137': 'mean',    'D_138': 'mean',    'D_139': 'mean',    'D_140': 'mean',    'D_141': 'mean',    'D_142': 'mean',    'D_143': 'mean',    'D_144': 'mean', 'D_145': 'mean'}\nccDataset = ccDataset.groupby('customer_ID').aggregate(agg_function).reset_index()\n\n# apply normalization techniques, I get this code from -> https://www.geeksforgeeks.org/data-normalization-with-pandas/\nnormalized_ccDataset = ccDataset.copy()\nfor column in normalized_ccDataset.columns:\n    if (not isinstance(column, str)):\n        normalized_ccDataset[column] = normalized_ccDataset[column]  / normalized_bbDataset[column].abs().max()\nccDataset = normalized_ccDataset\n\n#fills an empty columns w/ 0\nccDataset = ccDataset.fillna(0)\n\n# calculating Pricnipale Compotent Analysys (PCA)\npca_chosen = PCA(n_components = 35)\npca_chosen.fit(ccDataset.loc[:, ccDataset.columns != 'customer_ID'])\npca_chosenDataSet = pca_chosen.fit_transform(ccDataset.loc[:, ccDataset.columns != 'customer_ID'])\npca_chosenDataSetRev = pca_chosen.inverse_transform(pca_chosenDataSet)\npacChosenDataFrame = pd.DataFrame(pca_chosenDataSet)\n\n# get all the IDs\nidColumns = ccDataset.loc[:, ccDataset.columns == 'customer_ID']\nidColumns = np.asarray(idColumns)\n\n# insert the IDs back into the data frame\npacChosenDataFrame.insert(0, column='customer_ID', value=idColumns)\n    \n# this gets the DF ready for classificaiton\nccDataset = pacChosenDataFrame.drop(columns=['customer_ID']).copy()\nccDataset = filterDS.iloc[0: , :]\n\n# this gets the DF ready for classificaiton\nfilterDS3 = pacChosenDataFrame.drop(columns=['customer_ID']).copy()\nfilterDS3 = filterDS3.iloc[0: , :]\n\n# A bit of extra pre-processing, just reading in the labels as 1D array\n# loading in the labels\nlabels2 = pd.read_csv('/kaggle/input/amex-data-slices/train_labels.csv')\nlabels2 = labels2.iloc[0:].values.T\nlabels2 = labels2.flatten()","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:52:22.921818Z","iopub.execute_input":"2022-12-13T04:52:22.922458Z","iopub.status.idle":"2022-12-13T04:52:51.035831Z","shell.execute_reply.started":"2022-12-13T04:52:22.922382Z","shell.execute_reply":"2022-12-13T04:52:51.033789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# New predictions\nnaivePredictVals = gausNB.predict(filterDS3)\nnk64PredictVals = nk64.predict(filterDS3)\nnk512PredictVals = nk512.predict(filterDS3)\nnk1024PredictVals = nk1024.predict(filterDS3)\n\nprint(naivePredictVals)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:52:51.038920Z","iopub.execute_input":"2022-12-13T04:52:51.040766Z","iopub.status.idle":"2022-12-13T04:53:56.689993Z","shell.execute_reply.started":"2022-12-13T04:52:51.040709Z","shell.execute_reply":"2022-12-13T04:53:56.688653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Local Testing Results","metadata":{}},{"cell_type":"code","source":"# this gets the new labels\nlabels3 = pd.read_csv('/kaggle/input/amex-data-slices/ccLabels.csv')\nlabels3 = labels3.iloc[0:].values.T\nlabels3 = labels3.flatten()\nprint(labels3)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:53:56.691984Z","iopub.execute_input":"2022-12-13T04:53:56.693178Z","iopub.status.idle":"2022-12-13T04:53:56.716106Z","shell.execute_reply.started":"2022-12-13T04:53:56.693131Z","shell.execute_reply":"2022-12-13T04:53:56.714769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(accuracy_score(labels3, naivePredictVals))\nprint(accuracy_score(labels3, nk64PredictVals))\nprint(accuracy_score(labels3, nk512PredictVals))\nprint(accuracy_score(labels3, nk1024PredictVals))","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:56:26.459493Z","iopub.execute_input":"2022-12-13T04:56:26.459965Z","iopub.status.idle":"2022-12-13T04:56:26.481025Z","shell.execute_reply.started":"2022-12-13T04:56:26.459930Z","shell.execute_reply":"2022-12-13T04:56:26.479794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## RUN THE BELOW CODE TO DELETE WORKING DIRECTORY\nUncomment First!","metadata":{}},{"cell_type":"code","source":"#import shutil\n#shutil.rmtree(\"/kaggle/working/\")","metadata":{"execution":{"iopub.status.busy":"2022-12-13T04:53:56.743406Z","iopub.execute_input":"2022-12-13T04:53:56.744600Z","iopub.status.idle":"2022-12-13T04:53:56.749546Z","shell.execute_reply.started":"2022-12-13T04:53:56.744554Z","shell.execute_reply":"2022-12-13T04:53:56.748313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}