{"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":"none","dataSources":[{"sourceId":67356,"databundleVersionId":8006601,"sourceType":"competition"},{"sourceId":8450028,"sourceType":"datasetVersion","datasetId":5035620}],"dockerImageVersionId":30673,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install rdkit\n!pip install duckdb","metadata":{"_uuid":"7cbe54e2-9655-443e-bb2f-2d0132033012","_cell_guid":"24b7ae79-0947-45a6-ae57-beb1ddef2ac3","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-05-18T11:49:54.590002Z","iopub.execute_input":"2024-05-18T11:49:54.590729Z","iopub.status.idle":"2024-05-18T11:50:20.118367Z","shell.execute_reply.started":"2024-05-18T11:49:54.59069Z","shell.execute_reply":"2024-05-18T11:50:20.117519Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"Collecting rdkit\n  Downloading rdkit-2023.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from rdkit) (1.26.4)\nRequirement already satisfied: Pillow in /opt/conda/lib/python3.10/site-packages (from rdkit) (9.5.0)\nDownloading rdkit-2023.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.9 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m34.9/34.9 MB\u001b[0m \u001b[31m46.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: rdkit\nSuccessfully installed rdkit-2023.9.6\nCollecting duckdb\n  Downloading duckdb-0.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (763 bytes)\nDownloading duckdb-0.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.2/18.2 MB\u001b[0m \u001b[31m73.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: duckdb\nSuccessfully installed duckdb-0.10.2\n","output_type":"stream"}]},{"cell_type":"code","source":"import duckdb\nimport pandas as pd\n\ntrain_path = '/kaggle/input/leash-predict-chemical-bindings/train.parquet'\ntest_path = '/kaggle/input/dddddd/newtest.csv'\n\ncon = duckdb.connect()\n\ndf = con.query(f\"\"\"(SELECT *\n                        FROM parquet_scan('{train_path}')\n                        WHERE binds = 0\n                        ORDER BY random()\n                        LIMIT 30000)\n                        UNION ALL\n                        (SELECT *\n                        FROM parquet_scan('{train_path}')\n                        WHERE binds = 1\n                        ORDER BY random()\n                        LIMIT 30000)\"\"\").df()\n\ncon.close()","metadata":{"_uuid":"afcb1325-2e05-4c62-974c-c0d49f12760f","_cell_guid":"3561cf9e-3957-4370-9658-8818058b8345","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-05-18T12:35:27.392824Z","iopub.execute_input":"2024-05-18T12:35:27.393229Z","iopub.status.idle":"2024-05-18T12:36:16.336853Z","shell.execute_reply.started":"2024-05-18T12:35:27.393199Z","shell.execute_reply":"2024-05-18T12:36:16.33558Z"},"trusted":true},"execution_count":10,"outputs":[{"output_type":"display_data","data":{"text/plain":"FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f50b7fe8a69a4434bd401682dc3d6036"}},"metadata":{}}]},{"cell_type":"code","source":"df.head(15)","metadata":{"_uuid":"9458b0cc-e19a-479a-af2f-6cc82bf248b6","_cell_guid":"71cd2efa-bb95-46a2-93a9-4dc12e3263f0","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-05-18T12:36:33.894427Z","iopub.execute_input":"2024-05-18T12:36:33.895844Z","iopub.status.idle":"2024-05-18T12:36:33.911802Z","shell.execute_reply.started":"2024-05-18T12:36:33.89581Z","shell.execute_reply":"2024-05-18T12:36:33.910006Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"           id                              buildingblock1_smiles  \\\n0   221553693         O=C(Nc1cnccc1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n1   186557772  O=C(Nc1ccc(C(=O)O)c([N+](=O)[O-])c1)OCC1c2cccc...   \n2   282491894      O=C(O)[C@@H]1CSCN1C(=O)OCC1c2ccccc2-c2ccccc21   \n3   115874632  O=C(N[C@H](CC1CCCC1)C(=O)O)OCC1c2ccccc2-c2ccccc21   \n4   200078266     O=C(Nc1ccc(Cl)nc1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n5    88566469   O=C(N[C@@H](CC1CC1)C(=O)O)OCC1c2ccccc2-c2ccccc21   \n6    33646156  COc1cc(NC(=O)OCC2c3ccccc3-c3ccccc32)c(C(=O)O)c...   \n7   115958810  O=C(N[C@H](CC1CCCC1)C(=O)O)OCC1c2ccccc2-c2ccccc21   \n8   190106257     O=C(Nc1ccc(C(=O)O)cc1Cl)OCC1c2ccccc2-c2ccccc21   \n9   156576669  O=C(Nc1cc(-n2cccn2)ccc1C(=O)O)OCC1c2ccccc2-c2c...   \n10  148977141  O=C(Nc1c(F)cc(Br)cc1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n11    3582901     C#CC[C@H](CC(=O)O)NC(=O)OCC1c2ccccc2-c2ccccc21   \n12  256603918  O=C(O)C[C@@H](NC(=O)OCC1c2ccccc2-c2ccccc21)c1c...   \n13  208841946     O=C(Nc1cccc(Br)c1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n14   38447898     COc1cccc(C(=O)O)c1NC(=O)OCC1c2ccccc2-c2ccccc21   \n\n                   buildingblock2_smiles    buildingblock3_smiles  \\\n0   Cc1ccc(-c2cc(C(F)(F)F)nc(OCCN)n2)cc1              Nc1nnn[nH]1   \n1                  COc1ccc(C)nc1CN.Cl.Cl     Cl.NCc1ccsc1C(F)(F)F   \n2                      CSC1(CN)CCOCC1.Cl          COC(=O)c1occc1N   \n3                 Cc1ccc(O)c(CN)n1.Cl.Cl             Nc1ccc(F)cn1   \n4                       N#Cc1cc(N)ccc1Cl      CCOC(=O)c1c(C)csc1N   \n5              C[Si](C)(C)C#Cc1ccc(N)cn1          CC1CC(CN)C(C)O1   \n6                     Nc1ccc2c(c1)OCCCO2      N#Cc1ccc2nc(N)sc2c1   \n7                Cl.Cl.NCCn1cc(C2CC2)nn1        Cl.NCC(F)(F)C1CC1   \n8                  Cl.N#CC1(NC(=O)CN)CC1    Cn1c(N)cc(=O)n(C)c1=O   \n9                   NCC[C@@H]1COC[C@H]1O   Nc1ccc(F)c(C(F)(F)F)c1   \n10                  NCc1cccc(C(F)(F)F)n1         NCc1c(Br)cncc1Br   \n11                CS(=O)(=O)c1ccc(N)cc1F         Nc1ccc2c(c1)OCO2   \n12                    Cl.NCC1Cc2ccccc2C1             Cc1cc(N)ncn1   \n13                      NCC12CCCC(CO1)C2         Nc1ncnc(=O)[nH]1   \n14                           CS(=O)CCCCN  Cl.Cl.NCc1cc(=O)nc[nH]1   \n\n                                      molecule_smiles protein_name  binds  \n0   Cc1ccc(-c2cc(C(F)(F)F)nc(OCCNc3nc(Nc4nnn[nH]4)...         BRD4      0  \n1   COc1ccc(C)nc1CNc1nc(NCc2ccsc2C(F)(F)F)nc(Nc2cc...         BRD4      0  \n2   COC(=O)c1occc1Nc1nc(NCC2(SC)CCOCC2)nc(N2CSC[C@...          sEH      0  \n3   Cc1ccc(O)c(CNc2nc(Nc3ccc(F)cn3)nc(N[C@H](CC3CC...          HSA      0  \n4   CCOC(=O)c1c(C)csc1Nc1nc(Nc2ccc(Cl)c(C#N)c2)nc(...          HSA      0  \n5   CC1CC(CNc2nc(Nc3ccc(C#C[Si](C)(C)C)nc3)nc(N[C@...          HSA      0  \n6   COc1cc(Nc2nc(Nc3ccc4c(c3)OCCCO4)nc(Nc3nc4ccc(C...          HSA      0  \n7   O=C(N[Dy])[C@@H](CC1CCCC1)Nc1nc(NCCn2cc(C3CC3)...          sEH      0  \n8   Cn1c(Nc2nc(NCC(=O)NC3(C#N)CC3)nc(Nc3ccc(C(=O)N...          HSA      0  \n9   O=C(N[Dy])c1ccc(-n2cccn2)cc1Nc1nc(NCC[C@@H]2CO...         BRD4      0  \n10  O=C(N[Dy])c1cc(Br)cc(F)c1Nc1nc(NCc2cccc(C(F)(F...         BRD4      0  \n11  C#CC[C@H](CC(=O)N[Dy])Nc1nc(Nc2ccc(S(C)(=O)=O)...          HSA      0  \n12  Cc1cc(Nc2nc(NCC3Cc4ccccc4C3)nc(N[C@H](CC(=O)N[...          HSA      0  \n13  O=C(N[Dy])c1c(Br)cccc1Nc1nc(NCC23CCCC(CO2)C3)n...         BRD4      0  \n14  COc1cccc(C(=O)N[Dy])c1Nc1nc(NCCCCS(C)=O)nc(NCc...         BRD4      0  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>buildingblock1_smiles</th>\n      <th>buildingblock2_smiles</th>\n      <th>buildingblock3_smiles</th>\n      <th>molecule_smiles</th>\n      <th>protein_name</th>\n      <th>binds</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>221553693</td>\n      <td>O=C(Nc1cnccc1C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>Cc1ccc(-c2cc(C(F)(F)F)nc(OCCN)n2)cc1</td>\n      <td>Nc1nnn[nH]1</td>\n      <td>Cc1ccc(-c2cc(C(F)(F)F)nc(OCCNc3nc(Nc4nnn[nH]4)...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>186557772</td>\n      <td>O=C(Nc1ccc(C(=O)O)c([N+](=O)[O-])c1)OCC1c2cccc...</td>\n      <td>COc1ccc(C)nc1CN.Cl.Cl</td>\n      <td>Cl.NCc1ccsc1C(F)(F)F</td>\n      <td>COc1ccc(C)nc1CNc1nc(NCc2ccsc2C(F)(F)F)nc(Nc2cc...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>282491894</td>\n      <td>O=C(O)[C@@H]1CSCN1C(=O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>CSC1(CN)CCOCC1.Cl</td>\n      <td>COC(=O)c1occc1N</td>\n      <td>COC(=O)c1occc1Nc1nc(NCC2(SC)CCOCC2)nc(N2CSC[C@...</td>\n      <td>sEH</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>115874632</td>\n      <td>O=C(N[C@H](CC1CCCC1)C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>Cc1ccc(O)c(CN)n1.Cl.Cl</td>\n      <td>Nc1ccc(F)cn1</td>\n      <td>Cc1ccc(O)c(CNc2nc(Nc3ccc(F)cn3)nc(N[C@H](CC3CC...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>200078266</td>\n      <td>O=C(Nc1ccc(Cl)nc1C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>N#Cc1cc(N)ccc1Cl</td>\n      <td>CCOC(=O)c1c(C)csc1N</td>\n      <td>CCOC(=O)c1c(C)csc1Nc1nc(Nc2ccc(Cl)c(C#N)c2)nc(...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>88566469</td>\n      <td>O=C(N[C@@H](CC1CC1)C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>C[Si](C)(C)C#Cc1ccc(N)cn1</td>\n      <td>CC1CC(CN)C(C)O1</td>\n      <td>CC1CC(CNc2nc(Nc3ccc(C#C[Si](C)(C)C)nc3)nc(N[C@...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>33646156</td>\n      <td>COc1cc(NC(=O)OCC2c3ccccc3-c3ccccc32)c(C(=O)O)c...</td>\n      <td>Nc1ccc2c(c1)OCCCO2</td>\n      <td>N#Cc1ccc2nc(N)sc2c1</td>\n      <td>COc1cc(Nc2nc(Nc3ccc4c(c3)OCCCO4)nc(Nc3nc4ccc(C...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>115958810</td>\n      <td>O=C(N[C@H](CC1CCCC1)C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>Cl.Cl.NCCn1cc(C2CC2)nn1</td>\n      <td>Cl.NCC(F)(F)C1CC1</td>\n      <td>O=C(N[Dy])[C@@H](CC1CCCC1)Nc1nc(NCCn2cc(C3CC3)...</td>\n      <td>sEH</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>190106257</td>\n      <td>O=C(Nc1ccc(C(=O)O)cc1Cl)OCC1c2ccccc2-c2ccccc21</td>\n      <td>Cl.N#CC1(NC(=O)CN)CC1</td>\n      <td>Cn1c(N)cc(=O)n(C)c1=O</td>\n      <td>Cn1c(Nc2nc(NCC(=O)NC3(C#N)CC3)nc(Nc3ccc(C(=O)N...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>156576669</td>\n      <td>O=C(Nc1cc(-n2cccn2)ccc1C(=O)O)OCC1c2ccccc2-c2c...</td>\n      <td>NCC[C@@H]1COC[C@H]1O</td>\n      <td>Nc1ccc(F)c(C(F)(F)F)c1</td>\n      <td>O=C(N[Dy])c1ccc(-n2cccn2)cc1Nc1nc(NCC[C@@H]2CO...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>148977141</td>\n      <td>O=C(Nc1c(F)cc(Br)cc1C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>NCc1cccc(C(F)(F)F)n1</td>\n      <td>NCc1c(Br)cncc1Br</td>\n      <td>O=C(N[Dy])c1cc(Br)cc(F)c1Nc1nc(NCc2cccc(C(F)(F...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>3582901</td>\n      <td>C#CC[C@H](CC(=O)O)NC(=O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>CS(=O)(=O)c1ccc(N)cc1F</td>\n      <td>Nc1ccc2c(c1)OCO2</td>\n      <td>C#CC[C@H](CC(=O)N[Dy])Nc1nc(Nc2ccc(S(C)(=O)=O)...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>12</th>\n      <td>256603918</td>\n      <td>O=C(O)C[C@@H](NC(=O)OCC1c2ccccc2-c2ccccc21)c1c...</td>\n      <td>Cl.NCC1Cc2ccccc2C1</td>\n      <td>Cc1cc(N)ncn1</td>\n      <td>Cc1cc(Nc2nc(NCC3Cc4ccccc4C3)nc(N[C@H](CC(=O)N[...</td>\n      <td>HSA</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>13</th>\n      <td>208841946</td>\n      <td>O=C(Nc1cccc(Br)c1C(=O)O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>NCC12CCCC(CO1)C2</td>\n      <td>Nc1ncnc(=O)[nH]1</td>\n      <td>O=C(N[Dy])c1c(Br)cccc1Nc1nc(NCC23CCCC(CO2)C3)n...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>14</th>\n      <td>38447898</td>\n      <td>COc1cccc(C(=O)O)c1NC(=O)OCC1c2ccccc2-c2ccccc21</td>\n      <td>CS(=O)CCCCN</td>\n      <td>Cl.Cl.NCc1cc(=O)nc[nH]1</td>\n      <td>COc1cccc(C(=O)N[Dy])c1Nc1nc(NCCCCS(C)=O)nc(NCc...</td>\n      <td>BRD4</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-18T12:36:38.9932Z","iopub.execute_input":"2024-05-18T12:36:38.993649Z","iopub.status.idle":"2024-05-18T12:36:39.002125Z","shell.execute_reply.started":"2024-05-18T12:36:38.993616Z","shell.execute_reply":"2024-05-18T12:36:39.000639Z"},"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"(60000, 7)"},"metadata":{}}]},{"cell_type":"markdown","source":"## Feature Preprocessing\n\nLets grab the smiles for the fully assembled molecule `molecule_smiles` and generate ecfps for it. We could choose different radiuses or bits, but 2 and 1024 is pretty standard.","metadata":{"_uuid":"815cd2d3-317b-4962-8dc2-379d35ff2605","_cell_guid":"7af88eb4-517f-4fe1-94c6-1ec67f737565","trusted":true}},{"cell_type":"code","source":"from rdkit import Chem\nfrom rdkit.Chem import AllChem\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import average_precision_score\nfrom sklearn.preprocessing import OneHotEncoder\n\n# Convert SMILES to RDKit molecules\ndf['molecule'] = df['molecule_smiles'].apply(Chem.MolFromSmiles)\n\n# Generate ECFPs\ndef generate_ecfp(molecule, radius=2, bits=2048):\n    if molecule is None:\n        return None\n    return list(AllChem.GetMorganFingerprintAsBitVect(molecule, radius, nBits=bits))\n\ndf['ecfp'] = df['molecule'].apply(generate_ecfp)","metadata":{"_uuid":"167d1164-f066-44e2-8a2e-6e1a07f8f0d7","_cell_guid":"9b72a690-6f02-4055-ad71-9071b2c577a3","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-05-18T12:38:18.655641Z","iopub.execute_input":"2024-05-18T12:38:18.655935Z","iopub.status.idle":"2024-05-18T12:39:49.184855Z","shell.execute_reply.started":"2024-05-18T12:38:18.655911Z","shell.execute_reply":"2024-05-18T12:39:49.183289Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"markdown","source":"## Train Model","metadata":{"_uuid":"7ddf0349-0f6f-4671-9ad6-fe63c4c1bcab","_cell_guid":"ad95e54b-7964-4bb1-8acd-5a4eb0d5d8c5","trusted":true}},{"cell_type":"code","source":"import pickle\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.metrics import average_precision_score\nfrom xgboost import XGBClassifier\n\n# Assuming 'df' is your DataFrame with columns 'protein_name', 'ecfp', and 'binds'\n\n# One-hot encode the protein_name\nonehot_encoder = OneHotEncoder(sparse_output=False)\nprotein_onehot = onehot_encoder.fit_transform(df['protein_name'].values.reshape(-1, 1))\n\n# Combine ECFPs and one-hot encoded protein_name\nX = [ecfp + protein.tolist() for ecfp, protein in zip(df['ecfp'].tolist(), protein_onehot)]\ny = df['binds'].tolist()\n\n# Split the data into train and test sets\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n# Create and train the XGBoost model\nxgb_model = XGBClassifier(use_label_encoder=False, n_estimators=100, random_state=42)\nxgb_model.fit(X_train, y_train)\n\n# Make predictions on the test set\ny_pred_proba = xgb_model.predict_proba(X_test)[:, 1]  # Probability of the positive class\n\n# Calculate the mean average precision\nmap_score = average_precision_score(y_test, y_pred_proba)\nprint(f\"Mean Average Precision (mAP): {map_score:.2f}\")\n\n# Save the model as a pickle file\nwith open('xgb_model.pkl', 'wb') as model_file:\n    pickle.dump(xgb_model, model_file)\n\nprint(\"Model saved as xgb_model.pkl\")\n","metadata":{"_uuid":"085d9c3b-b8cc-4f89-b6db-8b14d0625cbf","_cell_guid":"e80deeaf-ef13-4f59-bd66-100a014782b1","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-05-18T12:43:54.071922Z","iopub.execute_input":"2024-05-18T12:43:54.072796Z","iopub.status.idle":"2024-05-18T12:44:44.884517Z","shell.execute_reply.started":"2024-05-18T12:43:54.072755Z","shell.execute_reply":"2024-05-18T12:44:44.88353Z"},"trusted":true},"execution_count":23,"outputs":[{"name":"stdout","text":"Mean Average Precision (mAP): 0.97\nModel saved as xgb_model.pkl\n","output_type":"stream"}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df.head())","metadata":{"execution":{"iopub.status.busy":"2024-05-18T12:45:19.047688Z","iopub.execute_input":"2024-05-18T12:45:19.048098Z","iopub.status.idle":"2024-05-18T12:45:19.065225Z","shell.execute_reply.started":"2024-05-18T12:45:19.048072Z","shell.execute_reply":"2024-05-18T12:45:19.063292Z"},"trusted":true},"execution_count":24,"outputs":[{"name":"stdout","text":"          id                              buildingblock1_smiles  \\\n0  221553693         O=C(Nc1cnccc1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n1  186557772  O=C(Nc1ccc(C(=O)O)c([N+](=O)[O-])c1)OCC1c2cccc...   \n2  282491894      O=C(O)[C@@H]1CSCN1C(=O)OCC1c2ccccc2-c2ccccc21   \n3  115874632  O=C(N[C@H](CC1CCCC1)C(=O)O)OCC1c2ccccc2-c2ccccc21   \n4  200078266     O=C(Nc1ccc(Cl)nc1C(=O)O)OCC1c2ccccc2-c2ccccc21   \n\n                  buildingblock2_smiles buildingblock3_smiles  \\\n0  Cc1ccc(-c2cc(C(F)(F)F)nc(OCCN)n2)cc1           Nc1nnn[nH]1   \n1                 COc1ccc(C)nc1CN.Cl.Cl  Cl.NCc1ccsc1C(F)(F)F   \n2                     CSC1(CN)CCOCC1.Cl       COC(=O)c1occc1N   \n3                Cc1ccc(O)c(CN)n1.Cl.Cl          Nc1ccc(F)cn1   \n4                      N#Cc1cc(N)ccc1Cl   CCOC(=O)c1c(C)csc1N   \n\n                                     molecule_smiles protein_name  binds  \\\n0  Cc1ccc(-c2cc(C(F)(F)F)nc(OCCNc3nc(Nc4nnn[nH]4)...         BRD4      0   \n1  COc1ccc(C)nc1CNc1nc(NCc2ccsc2C(F)(F)F)nc(Nc2cc...         BRD4      0   \n2  COC(=O)c1occc1Nc1nc(NCC2(SC)CCOCC2)nc(N2CSC[C@...          sEH      0   \n3  Cc1ccc(O)c(CNc2nc(Nc3ccc(F)cn3)nc(N[C@H](CC3CC...          HSA      0   \n4  CCOC(=O)c1c(C)csc1Nc1nc(Nc2ccc(Cl)c(C#N)c2)nc(...          HSA      0   \n\n                                           molecule  \\\n0  <rdkit.Chem.rdchem.Mol object at 0x7e5e9cfaa420>   \n1  <rdkit.Chem.rdchem.Mol object at 0x7e5e9cfab760>   \n2  <rdkit.Chem.rdchem.Mol object at 0x7e5e9cfaaea0>   \n3  <rdkit.Chem.rdchem.Mol object at 0x7e5e9cfaae30>   \n4  <rdkit.Chem.rdchem.Mol object at 0x7e5e9d4b7bc0>   \n\n                                                ecfp  \n0  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, ...  \n1  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ...  \n2  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...  \n3  [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...  \n4  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...  \n","output_type":"stream"}]},{"cell_type":"markdown","source":"Look at that Average Precision score. We did amazing! \n\nActually no, we just overfit. This is likely recurring theme for this competition. It is easy to predict molecules that come from the same corner of chemical space, but generalizing to new molecules is extremely difficult.","metadata":{"_uuid":"952c2936-8867-4c5a-8539-3e18928a4631","_cell_guid":"268ae9d9-530d-4c81-8011-0fd21735457c","trusted":true}},{"cell_type":"markdown","source":"## Test Prediction\n\n The trained Random Forest model is then used to predict the binding probabilities. These predictions are saved to a CSV file, which serves as the submission file for the Kaggle competition.","metadata":{"_uuid":"005a0b72-efc6-4b93-860c-412dccd4e6e2","_cell_guid":"b069a642-573f-4b7f-8ebd-61fccfce852d","trusted":true}},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom rdkit import Chem\nimport joblib\nfrom sklearn.preprocessing import OneHotEncoder\n\n# Function to generate ECFP (Extended Connectivity Fingerprints) for a molecule\ndef generate_ecfp(mol):\n    from rdkit.Chem import AllChem\n    return list(AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048))\n\n# Path to the input test file and output submission file\ntest_file = '/kaggle/input/dddddd/newtest.csv'\noutput_file = 'submission.csv'\n\n# Process the test CSV file in chunks\nfor df_test in pd.read_csv(test_file, chunksize=100000):\n    try:\n        # Generate ECFPs for the molecule_smiles\n        df_test['molecule'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles)\n\n        # Fit OneHotEncoder to protein_name column\n        onehot_encoder = OneHotEncoder(sparse=False)\n        protein_onehot = onehot_encoder.fit_transform(df_test['protein_name'].values.reshape(-1, 1))\n\n        # Combine ECFPs and one-hot encoded protein_name\n        X_test = [generate_ecfp(mol) + list(protein) for mol, protein in zip(df_test['molecule'], protein_onehot)]\n\n        # Load the XGBoost model\n        xgb_model = joblib.load('/kaggle/working/xgb_model.pkl')  # Update with the actual path\n\n        # Predict the probabilities\n        probabilities = xgb_model.predict_proba(X_test)[:, 1]\n\n        # Create a DataFrame with 'id' and 'probability' columns\n        output_df = pd.DataFrame({'id': df_test['id'], 'binds': probabilities})\n\n        # Save the output DataFrame to a CSV file\n        output_df.to_csv(output_file, index=False, mode='a', header=not os.path.exists(output_file))\n\n    except KeyError as e:\n        print(f\"Column '{e.args[0]}' not found. Please check the column names in the CSV file.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-05-18T12:45:56.898154Z","iopub.execute_input":"2024-05-18T12:45:56.898513Z","iopub.status.idle":"2024-05-18T12:45:58.479141Z","shell.execute_reply.started":"2024-05-18T12:45:56.898487Z","shell.execute_reply":"2024-05-18T12:45:58.4781Z"},"trusted":true},"execution_count":26,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sklearn/preprocessing/_encoders.py:868: FutureWarning: `sparse` was renamed to `sparse_output` in version 1.2 and will be removed in 1.4. `sparse_output` is ignored unless you leave `sparse` to its default value.\n  warnings.warn(\n","output_type":"stream"}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**HYBRIDD MODELL**","metadata":{}},{"cell_type":"code","source":"pip install deepchem rdkit xgboost","metadata":{"execution":{"iopub.status.busy":"2024-05-18T13:11:19.057555Z","iopub.execute_input":"2024-05-18T13:11:19.058001Z","iopub.status.idle":"2024-05-18T13:11:31.134814Z","shell.execute_reply.started":"2024-05-18T13:11:19.057969Z","shell.execute_reply":"2024-05-18T13:11:31.132881Z"},"trusted":true},"execution_count":36,"outputs":[{"name":"stdout","text":"Collecting deepchem\n  Downloading deepchem-2.8.0-py3-none-any.whl.metadata (2.0 kB)\nRequirement already satisfied: rdkit in /opt/conda/lib/python3.10/site-packages (2023.9.6)\nRequirement already satisfied: xgboost in /opt/conda/lib/python3.10/site-packages (2.0.3)\nRequirement already satisfied: joblib in /opt/conda/lib/python3.10/site-packages (from deepchem) (1.3.2)\nRequirement already satisfied: numpy>=1.21 in /opt/conda/lib/python3.10/site-packages (from deepchem) (1.26.4)\nRequirement already satisfied: pandas in /opt/conda/lib/python3.10/site-packages (from deepchem) (2.2.1)\nRequirement already satisfied: scikit-learn in /opt/conda/lib/python3.10/site-packages (from deepchem) (1.2.2)\nRequirement already satisfied: sympy in /opt/conda/lib/python3.10/site-packages (from deepchem) (1.12)\nRequirement already satisfied: scipy>=1.10.1 in /opt/conda/lib/python3.10/site-packages (from deepchem) (1.11.4)\nRequirement already satisfied: Pillow in /opt/conda/lib/python3.10/site-packages (from rdkit) (9.5.0)\nRequirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.10/site-packages (from pandas->deepchem) (2.9.0.post0)\nRequirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.10/site-packages (from pandas->deepchem) (2023.3.post1)\nRequirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.10/site-packages (from pandas->deepchem) (2023.4)\nRequirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn->deepchem) (3.2.0)\nRequirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.10/site-packages (from sympy->deepchem) (1.3.0)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->deepchem) (1.16.0)\nDownloading deepchem-2.8.0-py3-none-any.whl (1.0 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m23.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: deepchem\nSuccessfully installed deepchem-2.8.0\nNote: you may need to restart the kernel to use updated packages.\n","output_type":"stream"}]}]}