{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":67356,"databundleVersionId":8006601,"sourceType":"competition"},{"sourceId":8196925,"sourceType":"datasetVersion","datasetId":4855347},{"sourceId":8752384,"sourceType":"datasetVersion","datasetId":5205859}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Three binary targets (protein binding affinity):\n- sEH\n- BRD4\n- HSA (ALB)\n\nA number of features that need to be extracted from a molecule (given in SMILES format) through some calculations.\n","metadata":{}},{"cell_type":"markdown","source":"## Environment setup, package installs, library imports\n---","metadata":{}},{"cell_type":"code","source":"#!pip install rdkit","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.018032Z","iopub.execute_input":"2024-06-25T18:56:57.018994Z","iopub.status.idle":"2024-06-25T18:56:57.023376Z","shell.execute_reply.started":"2024-06-25T18:56:57.018958Z","shell.execute_reply":"2024-06-25T18:56:57.022121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#!nvidia-smi  # this should display information about available GPUs","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.026900Z","iopub.execute_input":"2024-06-25T18:56:57.027270Z","iopub.status.idle":"2024-06-25T18:56:57.036700Z","shell.execute_reply.started":"2024-06-25T18:56:57.027244Z","shell.execute_reply":"2024-06-25T18:56:57.035359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport gc\nimport numpy as np \nimport pandas as pd\nimport joblib\n\n# import rdkit\n# from rdkit.Chem import (AllChem, MolFromSmiles, rdMolDescriptors, \n#                         Descriptors, rdmolfiles, MolFromPDBFile)\n \nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport keras\n\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.preprocessing import StandardScaler\n\nimport tensorflow as tf\nfrom tensorflow.keras.callbacks import (EarlyStopping, ModelCheckpoint, \n                                        ReduceLROnPlateau,LearningRateScheduler)\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.optimizers.schedules import ExponentialDecay\nfrom tensorflow.keras.regularizers import l2\nfrom tensorflow.keras.layers import (Input, Dense, Dropout, Multiply, \n                                     Lambda, Conv1D, GlobalAveragePooling1D, \n                                     BatchNormalization, Reshape, Layer, concatenate)\n#import shap\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-25T18:56:57.038499Z","iopub.execute_input":"2024-06-25T18:56:57.038885Z","iopub.status.idle":"2024-06-25T18:56:57.058386Z","shell.execute_reply.started":"2024-06-25T18:56:57.038853Z","shell.execute_reply":"2024-06-25T18:56:57.057476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Model parameters\nclass CFG:\n    nfolds = 3             # K-Fold Cross validaiton folds\n    batch_size = 1024      # Training Batch Size\n    num_epochs = 15        # Number of Training Epochs\n    batch_reg = 0.01       # Batch Regularization\n    init_lr = 0.5e-4        # Initial Learning Rate\n    minimum_lr = 0.3e-4    # Minimum Learning Rate\n    maximum_lr = minimum_lr * batch_size","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.059404Z","iopub.execute_input":"2024-06-25T18:56:57.059707Z","iopub.status.idle":"2024-06-25T18:56:57.069262Z","shell.execute_reply.started":"2024-06-25T18:56:57.059683Z","shell.execute_reply":"2024-06-25T18:56:57.068164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_path = \"/kaggle/input/belka-training-data\"\noutput_path = \"/kaggle/working\"\nsub_file = \"/kaggle/input/leash-BELKA/sample_submission.csv\"\nproteins = ['sEH', 'BRD4', 'HSA']","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.071411Z","iopub.execute_input":"2024-06-25T18:56:57.071709Z","iopub.status.idle":"2024-06-25T18:56:57.081060Z","shell.execute_reply.started":"2024-06-25T18:56:57.071685Z","shell.execute_reply":"2024-06-25T18:56:57.080014Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Reduce features data sizes\n---","metadata":{}},{"cell_type":"code","source":"def reduce_dtypes(df, train=False):\n    \n    if train :\n        df['binds'] = df['binds'].astype(np.int8)\n        \n    df['molecule_NumRotatableBonds']   = df['molecule_NumRotatableBonds'].astype(np.int8)\n    df['molecule_NumHDonors']          = df['molecule_NumHDonors'].astype(np.int8)\n    df['molecule_NumHAcceptors']       = df['molecule_NumHAcceptors'].astype(np.int8)\n    df['molecule_NumAromaticRings']    = df['molecule_NumAromaticRings'].astype(np.int8)\n    df['molecule_NumSaturatedRings']   = df['molecule_NumSaturatedRings'].astype(np.int8)\n    df['molecule_NumAliphaticRings']   = df['molecule_NumAliphaticRings'].astype(np.int8)\n    df['molecule_NumValenceElectrons'] = df['molecule_NumValenceElectrons'].astype(np.int8)\n    df['molecule_NumRadicalElectrons'] = df['molecule_NumRadicalElectrons'].astype(np.int8)\n\n    df['molecule_ExactMolWt']     = df['molecule_ExactMolWt'].astype(np.float32)\n    df['molecule_TPSA']           = df['molecule_TPSA'].astype(np.float32)\n    df['molecule_NumHeteroatoms'] = df['molecule_NumHeteroatoms'].astype(np.float32)\n    #df['molecule_mfp']            = df['molecule_mfp'].astype(np.float32)\n    \n    df['protein_NumRotatableBonds']   = df['protein_NumRotatableBonds'].astype(np.int8)\n    df['protein_NumHDonors']          = df['protein_NumHDonors'].astype(np.int8)\n    df['protein_NumHAcceptors']       = df['protein_NumHAcceptors'].astype(np.int8)\n    df['protein_NumAromaticRings']    = df['protein_NumAromaticRings'].astype(np.int8)\n    df['protein_NumSaturatedRings']   = df['protein_NumSaturatedRings'].astype(np.int8)\n    df['protein_NumAliphaticRings']   = df['protein_NumAliphaticRings'].astype(np.int8)\n    df['protein_NumValenceElectrons'] = df['protein_NumValenceElectrons'].astype(np.int8)\n    df['protein_NumRadicalElectrons'] = df['protein_NumRadicalElectrons'].astype(np.int8)\n\n    df['protein_ExactMolWt']     = df['protein_ExactMolWt'].astype(np.float32)\n    df['protein_TPSA']           = df['protein_TPSA'].astype(np.float32)\n    df['protein_NumHeteroatoms'] = df['protein_NumHeteroatoms'].astype(np.float32)\n    #df['protein_mfp']            = df['protein_mfp'].astype(np.float32)\n    \n    df['cosine_sim']              = df['cosine_sim'].astype(np.float32)\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.082318Z","iopub.execute_input":"2024-06-25T18:56:57.082670Z","iopub.status.idle":"2024-06-25T18:56:57.097400Z","shell.execute_reply.started":"2024-06-25T18:56:57.082631Z","shell.execute_reply":"2024-06-25T18:56:57.096391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create dictionary of train datasets and separate data\ntrain_df = {}\n\nfor p in proteins:\n    print(f\"reading train data for {p}\")\n    train_df[p] = pd.read_csv(os.path.join(base_path, f\"train_{p}.csv\"))\n    train_df[p] = reduce_dtypes(train_df[p], train=True)\n    print(train_df[p].info())","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:56:57.098789Z","iopub.execute_input":"2024-06-25T18:56:57.099571Z","iopub.status.idle":"2024-06-25T18:57:13.264350Z","shell.execute_reply.started":"2024-06-25T18:56:57.099541Z","shell.execute_reply":"2024-06-25T18:57:13.263226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Setup a CNN with Attentin and use K-Fold cross validation.\n---","metadata":{}},{"cell_type":"code","source":"features = ['molecule_NumRotatableBonds', 'molecule_NumHDonors', 'molecule_NumHAcceptors', 'molecule_NumAromaticRings',\n            'molecule_NumSaturatedRings', 'molecule_NumAliphaticRings', 'molecule_NumHeteroatoms', 'molecule_NumValenceElectrons',\n            'molecule_NumRadicalElectrons', 'molecule_ExactMolWt', 'molecule_TPSA', \n            \n            'protein_NumRotatableBonds', 'protein_NumHDonors', 'protein_NumHAcceptors', 'protein_NumAromaticRings',\n            'protein_NumSaturatedRings', 'protein_NumAliphaticRings', 'protein_NumHeteroatoms', 'protein_NumValenceElectrons',\n            'protein_NumRadicalElectrons', 'protein_ExactMolWt', 'protein_TPSA',\n            \n            'cosine_sim']\n\ntarget = 'binds'","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:57:13.265675Z","iopub.execute_input":"2024-06-25T18:57:13.265989Z","iopub.status.idle":"2024-06-25T18:57:13.271794Z","shell.execute_reply.started":"2024-06-25T18:57:13.265963Z","shell.execute_reply":"2024-06-25T18:57:13.270748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define dictionaries (keys are the proteins)\nX = {}\ny = {}\n","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:57:13.272922Z","iopub.execute_input":"2024-06-25T18:57:13.273236Z","iopub.status.idle":"2024-06-25T18:57:13.284962Z","shell.execute_reply.started":"2024-06-25T18:57:13.273209Z","shell.execute_reply":"2024-06-25T18:57:13.284195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for p in proteins:\n    X[p] = train_df[p][features].values\n    y[p] = train_df[p][target].values\n    \n    scaler = StandardScaler()\n    X[p] = scaler.fit_transform(X[p])\n    \n    del train_df[p]\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-06-25T18:57:13.288345Z","iopub.execute_input":"2024-06-25T18:57:13.288622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\n\ndef get_lr_callback(batch_size=8, mode='exp', epochs=10, plot=False):\n    lr_start, lr_max, lr_min = CFG.init_lr, CFG.maximum_lr, CFG.minimum_lr\n    lr_ramp_ep, lr_sus_ep, lr_decay = 2, 0, 0.75\n\n    def lrfn(epoch):  # Learning rate update function\n        if epoch < lr_ramp_ep: lr = (lr_max - lr_start) / lr_ramp_ep * epoch + lr_start\n        elif epoch < lr_ramp_ep + lr_sus_ep: lr = lr_max\n        elif mode == 'exp': lr = (lr_max - lr_min) * lr_decay**(epoch - lr_ramp_ep - lr_sus_ep) + lr_min\n        elif mode == 'step': lr = lr_max * lr_decay**((epoch - lr_ramp_ep - lr_sus_ep) // 2)\n        elif mode == 'cos':\n            decay_total_epochs, decay_epoch_index = epochs - lr_ramp_ep - lr_sus_ep + 3, epoch - lr_ramp_ep - lr_sus_ep\n            phase = math.pi * decay_epoch_index / decay_total_epochs\n            lr = (lr_max - lr_min) * 0.5 * (1 + math.cos(phase)) + lr_min\n        return lr\n\n    if plot:  # Plot lr curve if plot is True\n        plt.figure(figsize=(10, 5))\n        plt.plot(np.arange(epochs), [lrfn(epoch) for epoch in np.arange(epochs)], marker='o')\n        plt.xlabel('epoch'); plt.ylabel('lr')\n        plt.title('LR Scheduler')\n        plt.show()\n\n    return keras.callbacks.LearningRateScheduler(lrfn, verbose=False)  # Create lr callback","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_cb = get_lr_callback(CFG.batch_size, epochs=CFG.num_epochs, plot=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Clear all previously registered custom objects (e.g. Attention Layer)\nkeras.saving.get_custom_objects().clear()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the Attention Layer\n@keras.saving.register_keras_serializable()\nclass Attention(Layer):\n    def __init__(self, units, Layer_num):\n        att_layer_name = f\"Attention_Layer_{Layer_num}\"\n        super(Attention, self).__init__(name=att_layer_name)\n        self.units = units\n        self.Layer_num = Layer_num\n        self.Wq = Dense(units, name='query')\n        self.Wk = Dense(units, name='key')\n        self.Wv = Dense(units, name='value')\n        self.softmax = tf.keras.layers.Softmax(axis=-1)\n\n    def build(self, input_shape):\n        super(Attention, self).build(input_shape) \n        \n    def call(self, inputs):\n        q = self.Wq(inputs)\n        k = self.Wk(inputs)\n        v = self.Wv(inputs)\n        \n        # Scaled Dot-Product Attention\n        attention_scores = tf.matmul(q, k, transpose_b=True)\n        attention_scores /= tf.math.sqrt(tf.cast(tf.shape(k)[-1], tf.float32))\n        attention_weights = self.softmax(attention_scores)\n        \n        attention_output = tf.matmul(attention_weights, v)\n        return attention_output\n    \n    def get_config(self):\n        return {\n            \"units\": self.units,\n            \"Layer_num\" : self.Layer_num\n        }","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Increasing the complexity of the model to increase the learned parameter\n\ndef create_model(input_shape):\n    inputs = Input(shape=input_shape)\n    x = Reshape((input_shape[0], 1))(inputs)  # Reshape for Conv1D\n    \n    # Adding more convolutional layers with increased filters\n    x = Conv1D(256, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_1')(x)\n    x = Dropout(0.2, name='dropout_1')(x)\n    \n    x = Conv1D(128, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_2')(x)\n    x = Dropout(0.3, name='dropout_2')(x)\n    \n    x = Conv1D(128, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_3')(x)\n    x = Dropout(0.3, name='dropout_3')(x)\n    \n    x = Conv1D(64, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_4')(x)\n    x = Dropout(0.4, name='dropout_4')(x)\n    \n    # First Attention layer\n    attention1 = Attention(units=128, Layer_num=1)\n    x1 = attention1(x)\n    \n    # Additional Dense layer to process attention output\n    x1 = Dense(128, activation='relu', kernel_regularizer=l2(0.001), name='dense_attention_1')(x1)\n    x1 = BatchNormalization(name='batchnorm_attention_1')(x1)\n    x1 = Dropout(0.5, name='dropout_attention_1')(x1)\n    \n    # Second Attention layer\n    attention2 = Attention(units=128, Layer_num=2)\n    x2 = attention2(x)\n    \n    # Additional Dense layer to process attention output\n    x2 = Dense(128, activation='relu', kernel_regularizer=l2(0.001), name='dense_attention_2')(x2)\n    x2 = BatchNormalization(name='batchnorm_attention_2')(x2)\n    x2 = Dropout(0.5, name='dropout_attention_2')(x2)\n    \n    # Concatenate attention outputs\n    x = concatenate([x1, x2], axis=-1)\n    \n    x = GlobalAveragePooling1D()(x)\n    \n    # Adding more dense layers with increased neurons\n    x = Dense(256, activation='relu', kernel_regularizer=l2(0.001), name='dense_1')(x)\n    x = BatchNormalization(name='batchnorm_5')(x)\n    x = Dropout(0.5, name='dropout_5')(x)\n    \n    x = Dense(128, activation='relu', kernel_regularizer=l2(0.001), name='dense_2')(x)\n    x = BatchNormalization(name='batchnorm_6')(x)\n    x = Dropout(0.5, name='dropout_6')(x)\n    \n    outputs = Dense(1, activation='sigmoid', name='output_layer')(x)  # binary classification for 'binds'\n    \n    model = Model(inputs=inputs, outputs=outputs)    \n    model.compile(optimizer=Adam(learning_rate=0.001), \n                  loss='binary_crossentropy', \n                  metrics=['accuracy'])\n    \n    return model\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"# Define the CNN model with attention\n# Thsi was the first attempt at the model, but it seems this mode\n# is not providing sufficient number of parameters to learn and the \n# score us quite low. As a result the model in the cell above is introduced.\n\ndef create_model(input_shape):\n    inputs = Input(shape=input_shape)\n    x = Reshape((input_shape[0], 1))(inputs)  # Reshape for Conv1D\n    \n    x = Conv1D(128, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_1')(x)\n    x = Dropout(0.2, name='dropout_1')(x)\n    \n    x = Conv1D(64, kernel_size=3, activation='relu')(x)\n    x = BatchNormalization(name='batchnorm_2')(x)\n    x = Dropout(0.3, name='dropout_2')(x)\n    \n    attention = Attention(units=64)\n    x = attention(x)\n    \n    x = GlobalAveragePooling1D()(x)\n    \n    x = Dense(128, activation='relu', kernel_regularizer=l2(CFG.batch_reg), name='dense_1')(x)\n    x = BatchNormalization(name='batchnorm_3')(x)\n    x = Dropout(0.5, name='dropout_3')(x)\n    \n    outputs = Dense(1, activation='sigmoid', name='output_layer')(x)  # binary classification for 'binds'\n    \n    model = Model(inputs=inputs, outputs=outputs)    \n    model.compile(optimizer=Adam(CFG.init_lr), \n                  loss='binary_crossentropy', \n                  metrics=['accuracy']\n                 )\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2024-06-25T17:59:27.463424Z","iopub.execute_input":"2024-06-25T17:59:27.463829Z","iopub.status.idle":"2024-06-25T17:59:27.478311Z","shell.execute_reply.started":"2024-06-25T17:59:27.463793Z","shell.execute_reply":"2024-06-25T17:59:27.477476Z"}}},{"cell_type":"code","source":"%%time\n\n# Apply K-Fold cross validation\nk = CFG.nfolds\nskf = StratifiedKFold(n_splits=k, shuffle=True, random_state=42)\ntypical_model = None\n\n# reduce_lr = ReduceLROnPlateau(monitor='val_loss', \n#                               factor=0.2, \n#                               patience=3, \n#                               min_lr=minimum_lr)\n\naccuracy_per_fold = {}\nloss_per_fold = {}\nbest_model = {}\n\nfor p in proteins:\n    print(f\" ================= Fitting a model for protein {p}\")\n    best_model_path = f\"{output_path}/best_model_{p}.keras\"\n    check_model_path = f\"{output_path}/check_model_{p}.keras\"\n    \n    model_checkpoint = ModelCheckpoint(check_model_path, \n                                       monitor='val_loss',\n                                       save_best_only=True\n                                      )\n    # Define early stopping\n    early_stopping = EarlyStopping(monitor='val_loss', \n                                   patience=5, \n                                   restore_best_weights=True\n                                  )\n    \n    accuracy_per_fold[p] = []\n    loss_per_fold[p] = []\n    best_accuracy = -np.inf\n    best_model[p] = None\n    k_fold=0\n    \n    for train_index, val_index in skf.split(X[p], y[p]):\n        k_fold += 1\n        print(f\" ----- k-fold : {k_fold}\")\n        X_train, X_val = X[p][train_index], X[p][val_index]\n        y_train, y_val = y[p][train_index], y[p][val_index]\n        \n        # Create a new model instance\n        model = create_model(input_shape=(X[p].shape[1],))\n    \n        model.fit(X_train, y_train, \n                  epochs=CFG.num_epochs, \n                  batch_size=CFG.batch_size,\n                  validation_data=(X_val, y_val), \n                  callbacks=[early_stopping, model_checkpoint, lr_cb], \n                  verbose=1\n                 )\n        \n        # Evaluate the model with the checkpoint version\n        model = load_model(check_model_path)\n        scores = model.evaluate(X_val, y_val, verbose=0)\n        fold_accuracy = scores[1] * 100\n        accuracy_per_fold[p].append(fold_accuracy)\n        loss_per_fold[p].append(scores[0])\n        typical_model = model # for pringing model summary later\n        \n        if(fold_accuracy > best_accuracy ):\n            best_accuracy = fold_accuracy\n            best_model[p] = model\n            model.save(best_model_path)\n        \n    print(\"=\"*50)\n    print(f\"Metrics for protein {p}\")\n    print(f\"Mean accuracy over {k} folds: {np.mean(accuracy_per_fold[p]):.2f}%\")\n    print(f\"Standard deviation of accuracy over {k} folds: {np.std(accuracy_per_fold[p]):.2f}%\")\n    print(f\"Mean loss over {k} folds: {np.mean(loss_per_fold[p])}\")\n    print(f\"Standard deviation of loss over {k} folds: {np.std(loss_per_fold[p])}\")\n    print(\"Typical model : \\n\\n\")\n    print(typical_model.summary())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the best models for each protein\nif not best_model:\n    best_model = {}\n    for p in proteins:\n        print(f\"Reading {output_path}/best_model_{p}.keras\")\n        best_model[p] = load_model(f\"{output_path}/best_model_{p}.keras\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"%%time\n# Calculate and show Shap Values for the full sample\nshap.initjs()\nfor p in proteins:\n    explainer = shap.TreeExplainer(best_model[p])\n    shap_values = explainer.shap_values(X[p])\n    plt.suptitle('Model ' + p, fontsize=15) \n    shap.summary_plot(shap_values, X[p], plot_size=[8,8], plot_type='dot', show=False)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-18T15:19:56.073735Z","iopub.execute_input":"2024-06-18T15:19:56.074248Z"}}},{"cell_type":"markdown","source":"## Processing of test dataset and preparation for  (TO BE CONTINUED...)\n---","metadata":{}},{"cell_type":"code","source":"test_df = {}\nfor p in proteins:\n    print(f\"reading test data for {p}\")\n    test_df[p] = pd.read_csv(os.path.join(base_path, f\"test_{p}.csv\"))\n    test_df[p] = reduce_dtypes(test_df[p], train=False)\n    print(test_df[p].info())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Prepare test data\npredictions = {}\nscaler = StandardScaler()\nfor p in proteins:\n    X_test = test_df[p][features]\n    X_test = scaler.fit_transform(X_test)\n    predictions[p] = best_model[p].predict(X_test)  # Probabilities since last layer has \"sigmoid\"  ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create submission DataFrame\nsubmission_df = pd.DataFrame()\nfor p in proteins:\n    sub_df = {\n        'id': test_df[p]['id'],\n        'binds': predictions[p][:, 0] # We had added an extra dimension for CNN\n    }\n    sub_df = pd.DataFrame(sub_df)\n    submission_df = pd.concat([submission_df, sub_df], ignore_index=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.head(), submission_df.tail()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Restore the original order in test file","metadata":{}},{"cell_type":"code","source":"orig_ids = pd.read_csv('/kaggle/input/leash-BELKA/test.csv', usecols=['id'])\nsubmission_df = pd.merge(orig_ids, submission_df, on='id')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"length of submisison fiule : \", submission_df.shape)\nprint(submission_df.head())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"bind = sub['binds'].value_counts()\nprint(\"distribution\\n\")\nprint(bind)\nprint(f\"percent binding :  {int((bind[1]/bind[0])*100)}%\")","metadata":{"execution":{"iopub.status.busy":"2024-06-21T22:56:10.408023Z","iopub.execute_input":"2024-06-21T22:56:10.408836Z","iopub.status.idle":"2024-06-21T22:56:10.433116Z","shell.execute_reply.started":"2024-06-21T22:56:10.408797Z","shell.execute_reply":"2024-06-21T22:56:10.432023Z"}}},{"cell_type":"markdown","source":"The line below takes ages as the test dataset is huge too - I aborted after 40 minutes without sign of finishing!","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}