{"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":"gpu","dataSources":[{"sourceId":67356,"databundleVersionId":8006601,"sourceType":"competition"},{"sourceId":162314401,"sourceType":"kernelVersion"},{"sourceId":162317063,"sourceType":"kernelVersion"}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!python -m pip install --no-index --find-links=/kaggle/input/autogluon-pkgs autogluon > /dev/null\n!python -m pip install --no-index --find-links=/kaggle/input/ray-pkgs --upgrade --force-reinstall -q ray==2.6.3\n# tips: https://github.com/autogluon/autogluon/issues/3365\n\nfrom autogluon.tabular import TabularDataset, TabularPredictor\nimport gc","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-04-06T14:29:25.928414Z","iopub.execute_input":"2024-04-06T14:29:25.929035Z","iopub.status.idle":"2024-04-06T14:34:09.424042Z","shell.execute_reply.started":"2024-04-06T14:29:25.929003Z","shell.execute_reply":"2024-04-06T14:34:09.422871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install rdkit","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:34:09.426108Z","iopub.execute_input":"2024-04-06T14:34:09.426613Z","iopub.status.idle":"2024-04-06T14:34:24.765506Z","shell.execute_reply.started":"2024-04-06T14:34:09.426584Z","shell.execute_reply":"2024-04-06T14:34:24.764253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install duckdb","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:34:24.76756Z","iopub.execute_input":"2024-04-06T14:34:24.768058Z","iopub.status.idle":"2024-04-06T14:34:38.653793Z","shell.execute_reply.started":"2024-04-06T14:34:24.768015Z","shell.execute_reply":"2024-04-06T14:34:38.652525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport rdkit\nfrom rdkit import Chem\nimport duckdb","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:34:38.657977Z","iopub.execute_input":"2024-04-06T14:34:38.658384Z","iopub.status.idle":"2024-04-06T14:34:38.878562Z","shell.execute_reply.started":"2024-04-06T14:34:38.658348Z","shell.execute_reply":"2024-04-06T14:34:38.877628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = '/kaggle/input/leash-predict-chemical-bindings/train.parquet'\ntest_path = '/kaggle/input/leash-predict-chemical-bindings/test.parquet'\n\ncon = duckdb.connect()\n\ndf = con.query(f\"\"\"(SELECT *\n                        FROM parquet_scan('{train_path}')\n                        WHERE binds = 0 AND protein_name = 'sEH'\n                        ORDER BY random()\n                        LIMIT 150000)\n                        UNION ALL\n                        (SELECT *\n                        FROM parquet_scan('{train_path}')\n                        WHERE binds = 1 AND protein_name = 'sEH'\n                        ORDER BY random()\n                        LIMIT 150000)\"\"\").df()\n\ncon.close()","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:34:38.879897Z","iopub.execute_input":"2024-04-06T14:34:38.880301Z","iopub.status.idle":"2024-04-06T14:35:32.101253Z","shell.execute_reply.started":"2024-04-06T14:34:38.880266Z","shell.execute_reply":"2024-04-06T14:35:32.100102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:35:32.102528Z","iopub.execute_input":"2024-04-06T14:35:32.102874Z","iopub.status.idle":"2024-04-06T14:35:32.120451Z","shell.execute_reply.started":"2024-04-06T14:35:32.102845Z","shell.execute_reply":"2024-04-06T14:35:32.119428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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# Assuming your DataFrame is named 'df' with columns 'molecule_smiles', 'protein_name', and 'binds'\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=1024):\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)\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 for ecfp, protein in zip(df['ecfp'].tolist(), protein_onehot.tolist())]\n\ndata = pd.DataFrame(np.array(X), columns=[f\"col{i:04d}\" for i in range(len(X[0]))])\ndata['binds'] = df['binds']\ntrain, valid = train_test_split(data, test_size=0.2, random_state=42)\n\ntrain = TabularDataset(train)\nvalid = TabularDataset(valid)\n\ndel X, data\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:35:32.121923Z","iopub.execute_input":"2024-04-06T14:35:32.122238Z","iopub.status.idle":"2024-04-06T14:37:15.652433Z","shell.execute_reply.started":"2024-04-06T14:35:32.122212Z","shell.execute_reply":"2024-04-06T14:37:15.651376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictor = TabularPredictor(\n    label=\"binds\",\n    problem_type=\"binary\",\n    eval_metric=\"average_precision\",\n    path=\"predictor\",\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-06T14:37:15.654054Z","iopub.execute_input":"2024-04-06T14:37:15.654611Z","iopub.status.idle":"2024-04-06T14:37:15.66028Z","shell.execute_reply.started":"2024-04-06T14:37:15.654579Z","shell.execute_reply":"2024-04-06T14:37:15.659194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\npredictor.fit(\n    train,\n    tuning_data=valid,\n    save_space=True,\n    presets=\"medium_quality\",\n    use_bag_holdout=True,\n    ag_args_fit={'num_gpus':1},\n)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-04-06T14:38:36.638166Z","iopub.execute_input":"2024-04-06T14:38:36.639007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictor.leaderboard()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}