{"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":"# Acknowledegment\n\n* XGBoost Starter - [0.793] [link](https://www.kaggle.com/code/cdeotte/xgboost-starter-0-793)","metadata":{}},{"cell_type":"markdown","source":"# Load Libraries","metadata":{}},{"cell_type":"code","source":"# LOAD LIBRARIES\nimport cupy, cudf # GPU libraries\nimport matplotlib.pyplot as plt, gc, os\n\nimport sys\nimport os\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nfrom sklearn import preprocessing\nfrom sklearn.impute import KNNImputer\nfrom sklearn.metrics import roc_auc_score, roc_curve, f1_score, accuracy_score\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold, KFold\n\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.optim import Adam, SGD\nfrom torch.optim.optimizer import Optimizer\nimport torchvision.models as models\nfrom torch.nn.parameter import Parameter\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.optim.lr_scheduler import CosineAnnealingWarmRestarts, CosineAnnealingLR, ReduceLROnPlateau\n\n\nfrom torch.cuda.amp import autocast, GradScaler\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nprint('RAPIDS version',cudf.__version__)\n\n# FILL NAN VALUE\nNAN_VALUE = -127 # will fit in int8","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:28.998819Z","iopub.execute_input":"2022-06-06T17:49:28.999498Z","iopub.status.idle":"2022-06-06T17:49:34.963044Z","shell.execute_reply.started":"2022-06-06T17:49:28.999409Z","shell.execute_reply":"2022-06-06T17:49:34.962241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Process and Feature Engineer Train Data","metadata":{}},{"cell_type":"code","source":"%%time\ndef read_file(path = '', usecols = None):\n    # LOAD DATAFRAME\n    if usecols is not None: df = cudf.read_parquet(path, columns=usecols)\n    else: df = cudf.read_parquet(path)\n    # REDUCE DTYPE FOR CUSTOMER AND DATE\n    df['customer_ID'] = df['customer_ID'].str[-16:].str.hex_to_int().astype('int64')\n    df.S_2 = cudf.to_datetime( df.S_2 )\n    # SORT BY CUSTOMER AND DATE (so agg('last') works correctly)\n    #df = df.sort_values(['customer_ID','S_2'])\n    #df = df.reset_index(drop=True)\n    # FILL NAN\n    df = df.fillna(NAN_VALUE) \n    print('shape of data:', df.shape)\n    \n    return df\n\nprint('Reading train data...')\nTRAIN_PATH = '../input/amex-data-integer-dtypes-parquet-format/train.parquet'\ntrain = read_file(path = TRAIN_PATH)","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:34.964716Z","iopub.execute_input":"2022-06-06T17:49:34.965286Z","iopub.status.idle":"2022-06-06T17:49:59.42572Z","shell.execute_reply.started":"2022-06-06T17:49:34.965248Z","shell.execute_reply":"2022-06-06T17:49:59.424834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:59.427238Z","iopub.execute_input":"2022-06-06T17:49:59.427799Z","iopub.status.idle":"2022-06-06T17:49:59.665901Z","shell.execute_reply.started":"2022-06-06T17:49:59.427743Z","shell.execute_reply":"2022-06-06T17:49:59.665059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:59.668112Z","iopub.execute_input":"2022-06-06T17:49:59.668516Z","iopub.status.idle":"2022-06-06T17:49:59.673952Z","shell.execute_reply.started":"2022-06-06T17:49:59.66846Z","shell.execute_reply":"2022-06-06T17:49:59.67319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.columns","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:59.675277Z","iopub.execute_input":"2022-06-06T17:49:59.675766Z","iopub.status.idle":"2022-06-06T17:49:59.687786Z","shell.execute_reply.started":"2022-06-06T17:49:59.675727Z","shell.execute_reply":"2022-06-06T17:49:59.686871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndef process_and_feature_engineer(df):\n    # FEATURE ENGINEERING FROM \n    # https://www.kaggle.com/code/huseyincot/amex-agg-data-how-it-created\n    all_cols = [c for c in list(df.columns) if c not in ['customer_ID','S_2']]\n    cat_features = [\"B_30\",\"B_38\",\"D_114\",\"D_116\",\"D_117\",\"D_120\",\"D_126\",\"D_63\",\"D_64\",\"D_66\",\"D_68\"]\n    num_features = [col for col in all_cols if col not in cat_features]\n\n    test_num_agg = df.groupby(\"customer_ID\")[num_features].agg(['mean', 'std', 'min', 'max', 'last'])\n    test_num_agg.columns = ['_'.join(x) for x in test_num_agg.columns]\n\n    test_cat_agg = df.groupby(\"customer_ID\")[cat_features].agg(['count', 'last', 'nunique'])\n    test_cat_agg.columns = ['_'.join(x) for x in test_cat_agg.columns]\n\n    df = cudf.concat([test_num_agg, test_cat_agg], axis=1)\n    del test_num_agg, test_cat_agg\n    print('shape after engineering', df.shape )\n    \n    return df\n\ntrain = process_and_feature_engineer(train)\n\n# Clean Ram\ndel TRAIN_PATH, NAN_VALUE\n_ = gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:49:59.689069Z","iopub.execute_input":"2022-06-06T17:49:59.68932Z","iopub.status.idle":"2022-06-06T17:50:01.004884Z","shell.execute_reply.started":"2022-06-06T17:49:59.689298Z","shell.execute_reply":"2022-06-06T17:50:01.004063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:50:01.006459Z","iopub.execute_input":"2022-06-06T17:50:01.006818Z","iopub.status.idle":"2022-06-06T17:50:01.012313Z","shell.execute_reply.started":"2022-06-06T17:50:01.006782Z","shell.execute_reply":"2022-06-06T17:50:01.011395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets = cudf.read_csv('../input/amex-default-prediction/train_labels.csv')\ntargets['customer_ID'] = targets['customer_ID'].str[-16:].str.hex_to_int().astype('int64')","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:50:01.013749Z","iopub.execute_input":"2022-06-06T17:50:01.014436Z","iopub.status.idle":"2022-06-06T17:50:01.456603Z","shell.execute_reply.started":"2022-06-06T17:50:01.014398Z","shell.execute_reply":"2022-06-06T17:50:01.45581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets.head()","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:50:01.457745Z","iopub.execute_input":"2022-06-06T17:50:01.458109Z","iopub.status.idle":"2022-06-06T17:50:01.4769Z","shell.execute_reply.started":"2022-06-06T17:50:01.458074Z","shell.execute_reply":"2022-06-06T17:50:01.476103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ADD TARGETS\ntargets = cudf.read_csv('../input/amex-default-prediction/train_labels.csv')\ntargets['customer_ID'] = targets['customer_ID'].str[-16:].str.hex_to_int().astype('int64')\ntargets = targets.set_index('customer_ID')\ntrain = train.merge(targets, left_index=True, right_index=True, how='left')\ndel targets\ntrain = train.reset_index()\n# Convert train to CPU DataFrame\ntrain = train.to_pandas()","metadata":{"execution":{"iopub.status.busy":"2022-06-06T17:50:01.478997Z","iopub.execute_input":"2022-06-06T17:50:01.479939Z","iopub.status.idle":"2022-06-06T17:50:24.909551Z","shell.execute_reply.started":"2022-06-06T17:50:01.479899Z","shell.execute_reply":"2022-06-06T17:50:24.908552Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Impute missing values","metadata":{}},{"cell_type":"code","source":"CAT_FEATURES = [col for col in train.columns if (col.split(\"_\")[-1] in ['count', 'nunique']) | (col in [\"B_30_last\",\"B_38_last\",\"D_114_last\",\"D_116_last\",\"D_117_last\",\"D_120_last\",\"D_126_last\",\"D_63_last\",\"D_64_last\",\"D_66_last\",\"D_68_last\"])]\nNUM_FEATURES = [col for col in train.columns if (col.split(\"_\")[-1] in ['mean', 'std', 'min', 'max', 'last']) & (col not in [\"B_30_last\",\"B_38_last\",\"D_114_last\",\"D_116_last\",\"D_117_last\",\"D_120_last\",\"D_126_last\",\"D_63_last\",\"D_64_last\",\"D_66_last\",\"D_68_last\"])]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_na_columns = train[NUM_FEATURES].loc[:, train.isnull().any()].columns\ncat_na_columns = train[CAT_FEATURES].loc[:, train.isnull().any()].columns\nprint(len(num_na_columns))\nprint(len(cat_na_columns))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n# Fill num_na_cols using KNNImputer\nknn_imputer = KNNImputer(n_neighbors=5, weights='uniform')\nknn_imputer.fit(train[num_na_columns])\ntrain_num_na_cols = knn_imputer.transform(train[num_na_columns])\ntrain[num_na_columns] = train_num_na_cols","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.isna().sum().max()","metadata":{"execution":{"iopub.status.busy":"2022-06-09T22:54:03.441205Z","iopub.execute_input":"2022-06-09T22:54:03.441741Z","iopub.status.idle":"2022-06-09T22:54:03.532957Z","shell.execute_reply.started":"2022-06-09T22:54:03.441613Z","shell.execute_reply":"2022-06-09T22:54:03.531741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.to_parquet(\"./train.parquet\", index=False)\nFEATURES = train.columns[1:-1]\nprint(f'There are {len(FEATURES)} features!')","metadata":{},"execution_count":null,"outputs":[]}]}