{"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":"# Introduction\n\nI am doing this for learning purposes. Pretty early on I realised that this would not be a winner, but maybe you can make this into useful model? This model achieved ~ 0.788 on the leaderboard.\n\nIf you have any suggestions on how this could be improved please leave a commment :)\n\n","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport os, gc\nimport matplotlib.pyplot as plt\n\nimport sklearn\nfrom sklearn.model_selection import StratifiedKFold\n\nfrom tensorflow.keras import layers\nfrom tensorflow import keras\nimport tensorflow as tf\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau,LearningRateScheduler\n\n# directories to save various things\nos.mkdir(\"./models\")\nos.mkdir(\"./predictions\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-26T18:22:26.288351Z","iopub.execute_input":"2022-07-26T18:22:26.288784Z","iopub.status.idle":"2022-07-26T18:22:31.725084Z","shell.execute_reply.started":"2022-07-26T18:22:26.288693Z","shell.execute_reply":"2022-07-26T18:22:31.724099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Install package to convert 1d features into 2d \n\nDeepInsight paper for this package - https://www.nature.com/articles/s41598-019-47765-6https://www.nature.com/articles/s41598-019-47765-6","metadata":{}},{"cell_type":"code","source":"# TO convert 1d data to 2d images - https://pypi.org/project/tab2img/\n!pip install tab2img","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:31.728083Z","iopub.execute_input":"2022-07-26T18:22:31.729002Z","iopub.status.idle":"2022-07-26T18:22:44.006625Z","shell.execute_reply.started":"2022-07-26T18:22:31.728962Z","shell.execute_reply":"2022-07-26T18:22:44.005378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tab2img.converter import Tab2Img","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:44.008807Z","iopub.execute_input":"2022-07-26T18:22:44.009570Z","iopub.status.idle":"2022-07-26T18:22:44.021028Z","shell.execute_reply.started":"2022-07-26T18:22:44.009526Z","shell.execute_reply":"2022-07-26T18:22:44.019913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import your favourite dataset\n\ntrain = pd.read_feather(\"../input/amex-processed/train_processed(1).ftr\")","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:44.024703Z","iopub.execute_input":"2022-07-26T18:22:44.024989Z","iopub.status.idle":"2022-07-26T18:22:50.258226Z","shell.execute_reply.started":"2022-07-26T18:22:44.024965Z","shell.execute_reply":"2022-07-26T18:22:50.257233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:50.259575Z","iopub.execute_input":"2022-07-26T18:22:50.259944Z","iopub.status.idle":"2022-07-26T18:22:50.271005Z","shell.execute_reply.started":"2022-07-26T18:22:50.259911Z","shell.execute_reply":"2022-07-26T18:22:50.270070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target = pd.read_csv(\"../input/amex-default-prediction/train_labels.csv\").target","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:50.272230Z","iopub.execute_input":"2022-07-26T18:22:50.272650Z","iopub.status.idle":"2022-07-26T18:22:51.068499Z","shell.execute_reply.started":"2022-07-26T18:22:50.272612Z","shell.execute_reply":"2022-07-26T18:22:51.067508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nss  = StandardScaler()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:51.069750Z","iopub.execute_input":"2022-07-26T18:22:51.070107Z","iopub.status.idle":"2022-07-26T18:22:51.076059Z","shell.execute_reply.started":"2022-07-26T18:22:51.070073Z","shell.execute_reply":"2022-07-26T18:22:51.074086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Scale the data\ntrain = ss.fit_transform(train)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:51.077527Z","iopub.execute_input":"2022-07-26T18:22:51.078154Z","iopub.status.idle":"2022-07-26T18:22:54.652499Z","shell.execute_reply.started":"2022-07-26T18:22:51.078079Z","shell.execute_reply":"2022-07-26T18:22:54.650796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# transform 1d tabular data to images\nconverter = Tab2Img()\nimages = converter.fit_transform(train, target.values)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:22:54.654338Z","iopub.execute_input":"2022-07-26T18:22:54.655027Z","iopub.status.idle":"2022-07-26T18:23:02.341417Z","shell.execute_reply.started":"2022-07-26T18:22:54.654989Z","shell.execute_reply":"2022-07-26T18:23:02.339566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Take note of this you will need it later\n\nimages[0].shape","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:02.352345Z","iopub.execute_input":"2022-07-26T18:23:02.353882Z","iopub.status.idle":"2022-07-26T18:23:02.373283Z","shell.execute_reply.started":"2022-07-26T18:23:02.353843Z","shell.execute_reply":"2022-07-26T18:23:02.372098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Let's have a look at our \"images\"","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots(3, 4, figsize=(15, 10))\nax = ax.flatten()\nfor i in range(12):\n    ax[i].title.set_text(f\"target = {target[i]}\")\n    ax[i].imshow(images[i], cmap = \"gray\")\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:02.374641Z","iopub.execute_input":"2022-07-26T18:23:02.377771Z","iopub.status.idle":"2022-07-26T18:23:03.858598Z","shell.execute_reply.started":"2022-07-26T18:23:02.377733Z","shell.execute_reply":"2022-07-26T18:23:03.857574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Wanna buy a credit default NFT?\n\nIf you stare for long enough you will see an ape staring back at you.\n\n![](https://lh3.googleusercontent.com/u2AhOwaxh5_bzM5QhW_TtWvgOQfxPVH3pqTVEfvilZTbO54xse23z8Yud519xsTCHdbbRNq3D2GCgtGoC1U6plRsc2trYiQ6PHrQZtY=w600)","metadata":{}},{"cell_type":"markdown","source":"#### Build a model using keras layers api","metadata":{}},{"cell_type":"code","source":"def build_model():\n\n    input_layer = keras.Input(shape=(21, 21, 1))\n\n    x = layers.Conv2D(64, 5, strides=2, activation = \"swish\", padding=\"same\")(input_layer)\n    x = layers.Conv2D(64, 3, strides=2, activation = \"swish\", padding=\"same\")(x)\n    x = layers.MaxPooling2D(3, strides=2, padding=\"same\")(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Dropout(0.4)(x)\n    \n    x = layers.Conv2D(32, 5, strides=2, activation = \"swish\", padding=\"same\")(x)\n    x = layers.Conv2D(32, 3, strides=2, activation = \"swish\", padding=\"same\")(x)\n    x = layers.MaxPooling2D(3, strides=2, padding=\"same\")(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Dropout(0.4)(x)\n    \n    # FC and predict\n    x = layers.Flatten()(x)\n    x = layers.Dense(100,activation = \"swish\")(x)\n    x = layers.Dropout(0.4)(x)\n    x = layers.Dense(10,activation = \"swish\")(x)\n    output = layers.Dense(1, activation=\"sigmoid\")(x)\n    model = keras.Model(inputs=input_layer, outputs=output)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:03.860283Z","iopub.execute_input":"2022-07-26T18:23:03.860967Z","iopub.status.idle":"2022-07-26T18:23:03.872164Z","shell.execute_reply.started":"2022-07-26T18:23:03.860929Z","shell.execute_reply":"2022-07-26T18:23:03.871175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"How about a UNET style architecture?","metadata":{}},{"cell_type":"code","source":"\ndef build_UNET():\n\n    input_layer = keras.Input(shape=(21, 21, 1))\n    x = layers.ZeroPadding2D(((11,0),(11,0)))(input_layer)\n    #print(x.shape)\n\n    conv1 = layers.Conv2D(8, (3,3), activation=\"swish\", padding=\"same\")(x)\n    conv1 = layers.Conv2D(8, (3,3), activation=\"swish\", padding=\"same\")(conv1)\n    #print(f\"conv1 shape {conv1.shape}\")\n    pool1 = layers.MaxPooling2D(pool_size=(2,2))(conv1)\n\n    conv2 = layers.Conv2D(16, (3,3), activation=\"swish\", padding=\"same\")(pool1)\n    conv2 = layers.Conv2D(16, (3,3), activation=\"swish\", padding=\"same\")(conv2)\n    #print(f\"conv2 shape {conv2.shape}\")\n    pool2 = layers.MaxPooling2D(pool_size=(2,2))(conv2)\n\n    conv3 = layers.Conv2D(32, (3,3), activation=\"swish\", padding=\"same\")(pool2)\n    conv3 = layers.Conv2D(32, (3,3), activation=\"swish\", padding=\"same\")(conv3)\n    #print(f\"conv3 shape {conv3.shape}\")\n    pool3 = layers.MaxPooling2D(pool_size=(2,2))(conv3)\n\n    conv4 = layers.Conv2D(64, (3,3), activation=\"swish\", padding=\"same\")(pool3)\n    conv4 = layers.Conv2D(64, (3,3), activation=\"swish\", padding=\"same\")(conv4)\n    #print(f\"conv4 shape {conv4.shape}\")\n    pool4 = layers.MaxPooling2D(pool_size=(2,2))(conv4)\n    \n    convm = layers.Conv2D(128, (3,3), activation=\"swish\", padding=\"same\")(pool4)\n    convm = layers.Conv2D(128, (3,3), activation=\"swish\", padding=\"same\")(convm)\n    #print(f\"convm shape {convm.shape}\")\n\n    ### UP\n\n    up5 = layers.UpSampling2D(size=(2,2))(convm)\n    #print(f\"up5 shape {up5.shape}\")\n    cat5 = layers.Concatenate()([up5, conv4])\n    conv5 = layers.Conv2D(64, (3,3), activation=\"swish\",padding=\"same\")(cat5)\n    conv5 = layers.Conv2D(64, (3,3), activation=\"swish\",padding=\"same\")(conv5)\n    #print(f\"conv5 shape {conv5.shape}\")\n    conv5 = layers.BatchNormalization()(conv5)\n\n    up6 = layers.UpSampling2D(size=(2,2))(conv5)\n    #print(f\"up6 shape {up6.shape}\")\n    cat6 = layers.Concatenate()([up6, conv3])\n    conv6 = layers.Conv2D(32, (3,3), activation=\"swish\", padding=\"same\")(cat6)\n    conv6 = layers.Conv2D(32, (3,3), activation=\"swish\", padding=\"same\")(conv6)\n    #print(f\"conv6 shape {conv6.shape}\")\n    conv6 = layers.BatchNormalization()(conv6)\n\n    up7 = layers.UpSampling2D(size=(2,2))(conv6)\n    #print(f\"up7 shape {up7.shape}\")\n    cat7 = layers.Concatenate()([up7, conv2])\n    conv7 = layers.Conv2D(16, (3,3), activation=\"swish\", padding=\"same\")(cat7)\n    conv7 = layers.Conv2D(16, (3,3), activation=\"swish\", padding=\"same\")(conv7)\n    #print(f\"conv7 shape {conv7.shape}\")\n    x = layers.BatchNormalization()(conv7)\n    \n    up8 = layers.UpSampling2D(size=(2,2))(conv7)\n    #print(f\"up8 shape {up8.shape}\")\n    cat8 = layers.Concatenate()([up8, conv1])\n    conv8 = layers.Conv2D(8, (3,3), activation=\"swish\", padding=\"same\")(cat8)\n    conv8 = layers.Conv2D(8, (3,3), activation=\"swish\", padding=\"same\")(conv8)\n    #print(f\"conv8 shape {conv8.shape}\")\n    x = layers.BatchNormalization()(conv8)\n\n    # predict\n    x = layers.Conv2D(32, kernel_size=(3,3), strides=1, padding=\"same\")(x)\n    x = layers.Flatten()(x)\n    x = layers.Dense(10)(x)\n    output = layers.Dense(1, activation=\"sigmoid\")(x)\n    model = keras.Model(inputs=input_layer, outputs=output)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:03.873742Z","iopub.execute_input":"2022-07-26T18:23:03.874477Z","iopub.status.idle":"2022-07-26T18:23:03.897154Z","shell.execute_reply.started":"2022-07-26T18:23:03.874438Z","shell.execute_reply":"2022-07-26T18:23:03.896192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"build_UNET().summary()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:03.898693Z","iopub.execute_input":"2022-07-26T18:23:03.899096Z","iopub.status.idle":"2022-07-26T18:23:06.686725Z","shell.execute_reply.started":"2022-07-26T18:23:03.899061Z","shell.execute_reply":"2022-07-26T18:23:06.685728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Amex metric","metadata":{}},{"cell_type":"code","source":"# COMPETITION METRIC FROM Konstantin Yakovlev\n# https://www.kaggle.com/kyakovlev\n# https://www.kaggle.com/competitions/amex-default-prediction/discussion/327534\n\ndef amex_metric_mod(y_true, y_pred):\n\n    labels = np.transpose(np.array([y_true, y_pred]))\n    labels = labels[labels[:, 1].argsort()[::-1]]\n    weights = np.where(labels[:, 0] == 0, 20, 1)\n    cut_vals = labels[np.cumsum(weights) <= int(0.04 * np.sum(weights))]\n    top_four = np.sum(cut_vals[:, 0]) / np.sum(labels[:, 0])\n\n    gini = [0, 0]\n    for i in [1, 0]:\n        labels = np.transpose(np.array([y_true, y_pred]))\n        labels = labels[labels[:, i].argsort()[::-1]]\n        weight = np.where(labels[:, 0] == 0, 20, 1)\n        weight_random = np.cumsum(weight / np.sum(weight))\n        total_pos = np.sum(labels[:, 0] * weight)\n        cum_pos_found = np.cumsum(labels[:, 0] * weight)\n        lorentz = cum_pos_found / total_pos\n        gini[i] = np.sum((lorentz - weight_random) * weight)\n\n    return 0.5 * (gini[1] / gini[0] + top_four)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:06.688539Z","iopub.execute_input":"2022-07-26T18:23:06.689498Z","iopub.status.idle":"2022-07-26T18:23:06.700290Z","shell.execute_reply.started":"2022-07-26T18:23:06.689460Z","shell.execute_reply":"2022-07-26T18:23:06.699036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### I briefly investigated using ImageDataGenerator to augment training, but seeing as these aren't really \"images\" I would be surprised if it helps","metadata":{}},{"cell_type":"markdown","source":"datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    zca_epsilon =  1e-7, # defualt 1e-6\n    zca_whitening = True\n)","metadata":{"execution":{"iopub.status.busy":"2022-07-24T13:16:41.796316Z","iopub.execute_input":"2022-07-24T13:16:41.797251Z","iopub.status.idle":"2022-07-24T13:16:41.807572Z","shell.execute_reply.started":"2022-07-24T13:16:41.797212Z","shell.execute_reply":"2022-07-24T13:16:41.806601Z"}}},{"cell_type":"code","source":"kfold = sklearn.model_selection.StratifiedKFold(n_splits=3)\n\nbatch_size = 1000\n\ndef run(images, target):\n    fold_scores = []\n\n    for fold, (trn_idx, val_idx) in enumerate(kfold.split(images, target)):\n        tf.keras.backend.clear_session()\n        \n        \n        # set random seed for fold\n        tf.random.set_seed(7453)\n        \n        \n        X_train, y_train = images[trn_idx], target[trn_idx]\n        X_val, y_val = images[val_idx], target[val_idx]\n        print(f\"#### fold: {fold +1} ####\")\n\n        initial_learning_rate = 0.01\n        epochs = 75\n        lr = ReduceLROnPlateau(monitor=\"val_loss\", \n                               factor=0.7, \n                               patience=3, \n                               verbose=0)\n\n        model = build_UNET()\n        \n        model.compile(\n            loss=tf.keras.losses.BinaryCrossentropy(),\n            optimizer=tf.keras.optimizers.Nadam(\n                learning_rate=initial_learning_rate, \n                clipvalue=0.5, \n                clipnorm=1.0\n            ),\n            metrics=[\"accuracy\"],\n        )\n\n        mcp_save = tf.keras.callbacks.ModelCheckpoint(\n            f\"./models/best_model_{fold}.hdf5\",\n            save_best_only=True,\n            monitor=\"val_loss\",\n            mode=\"auto\",\n        )\n\n        ES = EarlyStopping(\n            monitor=\"val_loss\",\n            min_delta=0,\n            patience=10,\n            verbose=0,\n            mode=\"auto\",\n            baseline=None,\n            restore_best_weights=True,\n        )\n\n        history = model.fit(\n            X_train,\n            y_train,\n            epochs=epochs,\n            verbose=1,\n            batch_size=batch_size,\n            validation_data=(\n                    X_val, \n                    y_val, \n                    ),\n            callbacks=[lr, mcp_save, ES],\n        )\n\n        y_pred = model.predict(X_val, \n                               batch_size=batch_size, \n                               verbose=0).ravel()\n\n        score = amex_metric_mod(y_val, y_pred)\n        print(f\"Fold {fold + 1}: {score}\")\n\n        fold_scores.append(score)\n        del (\n            model,\n            history,\n            mcp_save,\n        )\n\n        del y_pred, score, X_train, y_train, X_val, y_val\n        gc.collect()\n        \n        # for testing\n        # if fold == 0: break\n\n    gc.collect()\n    print(f\"Overall score: {np.mean(fold_scores, axis=0)}\")\n    del fold_scores","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:06.701915Z","iopub.execute_input":"2022-07-26T18:23:06.702343Z","iopub.status.idle":"2022-07-26T18:23:06.719183Z","shell.execute_reply.started":"2022-07-26T18:23:06.702306Z","shell.execute_reply":"2022-07-26T18:23:06.718177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# TRAINING\n\nimport warnings\n\nwarnings.filterwarnings(\"ignore\")\nmodels = run(images, target)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:23:06.720164Z","iopub.execute_input":"2022-07-26T18:23:06.720453Z","iopub.status.idle":"2022-07-26T18:42:54.136739Z","shell.execute_reply.started":"2022-07-26T18:23:06.720422Z","shell.execute_reply":"2022-07-26T18:42:54.135676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference","metadata":{}},{"cell_type":"code","source":"# Free memory for predictions\ndel images\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:42:54.140541Z","iopub.execute_input":"2022-07-26T18:42:54.140830Z","iopub.status.idle":"2022-07-26T18:42:54.523299Z","shell.execute_reply.started":"2022-07-26T18:42:54.140805Z","shell.execute_reply":"2022-07-26T18:42:54.522255Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Transform test set","metadata":{}},{"cell_type":"code","source":"test = pd.read_feather(\"../input/amex-processed/test_processed.ftr\")","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:42:54.524758Z","iopub.execute_input":"2022-07-26T18:42:54.525269Z","iopub.status.idle":"2022-07-26T18:43:05.876484Z","shell.execute_reply.started":"2022-07-26T18:42:54.525226Z","shell.execute_reply":"2022-07-26T18:43:05.875402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# scale data\ntest = ss.transform(test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:43:05.878075Z","iopub.execute_input":"2022-07-26T18:43:05.878899Z","iopub.status.idle":"2022-07-26T18:43:12.624198Z","shell.execute_reply.started":"2022-07-26T18:43:05.878857Z","shell.execute_reply":"2022-07-26T18:43:12.623202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# generate images of test set\ntest = converter.transform(test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:43:12.625555Z","iopub.execute_input":"2022-07-26T18:43:12.626644Z","iopub.status.idle":"2022-07-26T18:43:21.271227Z","shell.execute_reply.started":"2022-07-26T18:43:12.626607Z","shell.execute_reply":"2022-07-26T18:43:21.270224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Test \"images\"","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots(3, 4, figsize=(15, 10))\nax = ax.flatten()\nfor i in range(12):\n    ax[i].title.set_text(f\"test image {i}\")\n    ax[i].imshow(test[i], cmap = \"gray\")\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:43:21.272957Z","iopub.execute_input":"2022-07-26T18:43:21.273340Z","iopub.status.idle":"2022-07-26T18:43:22.294469Z","shell.execute_reply.started":"2022-07-26T18:43:21.273302Z","shell.execute_reply":"2022-07-26T18:43:22.293596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Make predictions","metadata":{}},{"cell_type":"code","source":"# predictions\n\nfor num, model in enumerate(os.listdir(\"./models/\")):\n    # loop to make predictions in chunks\n    preds = []\n    model = keras.models.load_model(\"./models/\" + model)\n    chunk_size = int(test.shape[0] / 10)\n    for start in range(0, test.shape[0], chunk_size):\n        test_subset = test[start : start + chunk_size]\n        preds.extend(model.predict(test_subset, batch_size=batch_size, verbose=0).flatten())\n\n    # loop to save predictions\n    sub = pd.read_csv(\"../input/amex-default-prediction/sample_submission.csv\")\n    del sub[\"prediction\"]\n    sub[\"prediction\"] = preds\n    sub.to_csv(f\"./predictions/{num}_preds.csv\")\n    del sub, model\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:43:22.295861Z","iopub.execute_input":"2022-07-26T18:43:22.296933Z","iopub.status.idle":"2022-07-26T18:45:00.508892Z","shell.execute_reply.started":"2022-07-26T18:43:22.296893Z","shell.execute_reply":"2022-07-26T18:45:00.507878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# get submission data\nsub = pd.read_csv(\"../input/amex-default-prediction/sample_submission.csv\")\ndel sub[\"prediction\"]\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:45:00.511085Z","iopub.execute_input":"2022-07-26T18:45:00.511468Z","iopub.status.idle":"2022-07-26T18:45:01.639583Z","shell.execute_reply.started":"2022-07-26T18:45:00.511431Z","shell.execute_reply":"2022-07-26T18:45:01.638587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# average predictions for final score\nfor num, data in enumerate(os.listdir(\"./predictions/\")):\n\n    p1 = pd.read_csv(f\"./predictions/{data}\")\n    del p1[\"Unnamed: 0\"]\n    sub[f\"{num}_prediction\"] = p1[\"prediction\"]\n\n    del p1\n    gc.collect()\n\nsub.to_csv(\"test_output.csv\")\nsub[\"prediction\"] = sub.iloc[:, 1:].mean(axis=1)\nsub = sub[[\"customer_ID\", \"prediction\"]]\nsub.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:45:01.641038Z","iopub.execute_input":"2022-07-26T18:45:01.641545Z","iopub.status.idle":"2022-07-26T18:45:18.360785Z","shell.execute_reply.started":"2022-07-26T18:45:01.641503Z","shell.execute_reply":"2022-07-26T18:45:18.359802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub","metadata":{"execution":{"iopub.status.busy":"2022-07-26T18:45:18.362333Z","iopub.execute_input":"2022-07-26T18:45:18.362698Z","iopub.status.idle":"2022-07-26T18:45:18.380004Z","shell.execute_reply.started":"2022-07-26T18:45:18.362648Z","shell.execute_reply":"2022-07-26T18:45:18.378936Z"},"trusted":true},"execution_count":null,"outputs":[]}]}