{"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"}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Introduction \n****In the above problem, in addition to methods using Neural Network models or LLMs models, the problem of A binary class label of whether the molecule binds to the protein is a problem that can use machine learning models. to solve part of the above problem. In this problem, I would like to use 5 models: Random Forest, Decision Tree, Catboost, XGboost and KNN to compare on a data set including 180,000 rows data on the train set. Because the training set is very heavy (about more than 50 gb), we will extract the parquest file using duckdb to put it into machine learning models and use the model with the highest performance to compare the results.****","metadata":{}},{"cell_type":"markdown","source":"# Processing Data & Training Model  \n![image.png](attachment:96cfa8ce-0583-4248-a767-e3f092203189.png)","metadata":{},"attachments":{"96cfa8ce-0583-4248-a767-e3f092203189.png":{"image/png":"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Qnh0ENKejceZxhRUy/3SReIV6ZrTDW8kPrsCZ4oWIy3RT6wvkbdr9ULsLVo1shYwwb7S86JQVLIKrUXDC+5GZW4g8t9ahcpn5yPZtv/eiJaPpbzNDsHdzWF4fJn0GdgTyfkvCETGzgQUrrrDTRbPaUj8cRzybcnwpgJy/YN/EAqLY5ChSyq3dusKVGzwQ+IjS5ERp+5/SKTX8D8nuqFYg3czsAaPPAVr8IiIbp5h1eARjXOswbtuWINHREREREQ0wTHAIyIiIiIimiAY4BEREREREU0QDPCIiIiIiIgmCAZ4REREREREEwSzaN4MPa+IAo1GcckxXLBeUsqpxljlXxoln9XMoklEdLMwiybdCphF87pxl0WTAR6NO8XFxTAajcjJycHTTz8tlhIREY0zDPDoVsAA77rhMAlEREREREQTHAM8IiIiIiKiCYIBHhERERER0QTBAI+IiIiIiGiCYIBHREREREQ0QTDAIyIiIiIimiAY4BEREREREU0QHAePxh2Og0dERBPCZx+JAtEEN/VOUaCxxIHOacJggEdEREREtzoOdE5ERERERDTBMcAjIiIiIiKaIBjgERERERERTRAM8IiIiIiIiCYIBnhEREREREQTBAM8IiIiIiKiCYIBHhERERER0QTBAI+IiIiIiGiCYIBHREREREQ0QTDAIyIiIiIimiAY4BEREREREU0QDPCIiIiIiIgmCAZ4REREREREEwQDPCIiIiIiogmCAR4REREREdEEwQCPiIiIiIhogmCAR0RERERENEEwwCMiIiIiIpogGOARERERERFNEAzwiIiIiIiIJggGeERERERERBMEAzwiIiIiIqIJggEeERERERHRBMEAj4iIiIiIaIJggEdERERERDRBMMAjIiIiIiKaIBjgERERERERTRAM8IiIiIiIiCYIBnhEREREREQTBAM8IiIiIiKiCYIBHhERERER0QTBAI+IiIiIiGiCYIBHREREREQ0QTDAIyIiIiIimiAY4BEREREREU0QDPCIiIiIiIgmCAZ4REREREREEwQDPCIiIiIiogmCAR4REREREdEEwQCPiIiIiIhogmCAR0RERERENEEwwCMiIiIiIpogGODRuFFaWoqf/OQnKCkpUeYrKyuV+V/84hfKPBERERHRrW7S37p7rzS/Nw1Vu2YgNO4iop/8BJcvX8ZdgV8QqxDd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"}}},{"cell_type":"markdown","source":"# Import libraries","metadata":{}},{"cell_type":"markdown","source":"****We will use duckdb to loading file.parquet in this dataset. Because dataset consists of train and test that are very heavily loaded in pandas and it's hard to practice with that. So using Duckdb is very neccessary in this situation.****\n","metadata":{}},{"cell_type":"code","source":"!pip install rdkit\n!pip install duckdb","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:15:05.285808Z","iopub.execute_input":"2024-05-06T13:15:05.286128Z","iopub.status.idle":"2024-05-06T13:15:35.637829Z","shell.execute_reply.started":"2024-05-06T13:15:05.286071Z","shell.execute_reply":"2024-05-06T13:15:35.636734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import duckdb\nimport pandas as pd\n\ntrain_path = '/kaggle/input/leash-BELKA/train.parquet'\ntest_path = '/kaggle/input/leash-BELKA/test.parquet'\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 90000)\n                        UNION ALL\n                        (SELECT *\n                        FROM parquet_scan('{train_path}')\n                        WHERE binds = 1\n                        ORDER BY random()\n                        LIMIT 90000)\"\"\").df()\n\ncon.close()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:18:14.254428Z","iopub.execute_input":"2024-05-06T13:18:14.254823Z","iopub.status.idle":"2024-05-06T13:19:01.836957Z","shell.execute_reply.started":"2024-05-06T13:18:14.254791Z","shell.execute_reply":"2024-05-06T13:19:01.835905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Heading of the dataset","metadata":{}},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:20.267069Z","iopub.execute_input":"2024-05-06T13:19:20.267596Z","iopub.status.idle":"2024-05-06T13:19:20.292136Z","shell.execute_reply.started":"2024-05-06T13:19:20.267557Z","shell.execute_reply":"2024-05-06T13:19:20.291130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.info()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:22.455086Z","iopub.execute_input":"2024-05-06T13:19:22.455549Z","iopub.status.idle":"2024-05-06T13:19:22.570398Z","shell.execute_reply.started":"2024-05-06T13:19:22.455511Z","shell.execute_reply":"2024-05-06T13:19:22.569068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Basic EDA","metadata":{}},{"cell_type":"markdown","source":"****Some Basic information of Dataset ****","metadata":{}},{"cell_type":"code","source":"df['protein_name'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:25.381571Z","iopub.execute_input":"2024-05-06T13:19:25.381944Z","iopub.status.idle":"2024-05-06T13:19:25.402892Z","shell.execute_reply.started":"2024-05-06T13:19:25.381916Z","shell.execute_reply":"2024-05-06T13:19:25.401858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:29.446543Z","iopub.execute_input":"2024-05-06T13:19:29.447489Z","iopub.status.idle":"2024-05-06T13:19:29.991382Z","shell.execute_reply.started":"2024-05-06T13:19:29.447433Z","shell.execute_reply":"2024-05-06T13:19:29.990180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nsns.histplot(df['protein_name'])\nplt.xlabel(\"Protein name\")\nplt.ylabel(\"Frquency\")\nplt.title(\"Categories of Protein\")\n\n\nfor bar in plt.gca().patches:\n    plt.gca().text(bar.get_x() + bar.get_width()/2, bar.get_height(), \n                  f'{int(bar.get_height())}', \n                  ha='center', color='red', fontsize=9)\n    \nplt.show()\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:32.369915Z","iopub.execute_input":"2024-05-06T13:19:32.370401Z","iopub.status.idle":"2024-05-06T13:19:33.175180Z","shell.execute_reply.started":"2024-05-06T13:19:32.370366Z","shell.execute_reply":"2024-05-06T13:19:33.174286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\nsns.countplot(x='binds', data=df)\n\nplt.xlabel(\"Binds type \")\nplt.ylabel(\"Frequency\")\n\n\nplt.title(\"Frequency of 'binds'\")\n\n\nfor p in plt.gca().patches:\n    plt.gca().text(p.get_x() + p.get_width()/2, p.get_height(), \n                   f'{int(p.get_height())}', \n                   ha='center', color='green', fontsize=9)\n\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:19:37.319485Z","iopub.execute_input":"2024-05-06T13:19:37.320158Z","iopub.status.idle":"2024-05-06T13:19:37.591139Z","shell.execute_reply.started":"2024-05-06T13:19:37.320127Z","shell.execute_reply":"2024-05-06T13:19:37.590279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize the Chemical formula in Some Samples","metadata":{}},{"cell_type":"markdown","source":"****We will visualize the substances in the data in 2D and 3D formats to see the molecular formulas and the building blocks that make them up.****","metadata":{}},{"cell_type":"code","source":"import re\nfrom rdkit import Chem\nfrom rdkit.Chem import Draw\nfrom rdkit.Chem import AllChem","metadata":{"execution":{"iopub.status.busy":"2024-05-04T06:12:58.872271Z","iopub.execute_input":"2024-05-04T06:12:58.872644Z","iopub.status.idle":"2024-05-04T06:12:59.073243Z","shell.execute_reply.started":"2024-05-04T06:12:58.872614Z","shell.execute_reply":"2024-05-04T06:12:59.072441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Code to visualize the first molecule in molecule_smiles col in 2D.\n\n# Convert Dask Series to pandas Series and extract the first SMILES string\nfirst_smiles = df['molecule_smiles'].iloc[0]\n\n# Convert the SMILES string to a molecule object\nfirst_molecule = Chem.MolFromSmiles(first_smiles)\n\n# Draw and display the molecule\nDraw.MolToImage(first_molecule, size=(700, 700))","metadata":{"execution":{"iopub.status.busy":"2024-05-03T13:12:18.168655Z","iopub.execute_input":"2024-05-03T13:12:18.169005Z","iopub.status.idle":"2024-05-03T13:12:18.238358Z","shell.execute_reply.started":"2024-05-03T13:12:18.168977Z","shell.execute_reply":"2024-05-03T13:12:18.237489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Code to visualize the first molecule in molecule_smiles col in 2D.\n\n#Visualize the chemical formula of building block 1\nfirst_smiles = df['buildingblock1_smiles'].iloc[0]\n\n# Convert the SMILES string to a molecule object\nfirst_molecule = Chem.MolFromSmiles(first_smiles)\n\n# Draw and display the molecule\nDraw.MolToImage(first_molecule, size=(700, 700))","metadata":{"execution":{"iopub.status.busy":"2024-05-03T13:13:09.201117Z","iopub.execute_input":"2024-05-03T13:13:09.201585Z","iopub.status.idle":"2024-05-03T13:13:09.274480Z","shell.execute_reply.started":"2024-05-03T13:13:09.201549Z","shell.execute_reply":"2024-05-03T13:13:09.273514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize the chemical formula of building block 2\nfirst_smiles = df['buildingblock2_smiles'].iloc[0]\n\n# Convert the SMILES string to a molecule object\nfirst_molecule = Chem.MolFromSmiles(first_smiles)\n\n# Draw and display the molecule\nDraw.MolToImage(first_molecule, size=(700, 700))","metadata":{"execution":{"iopub.status.busy":"2024-05-03T13:13:33.030322Z","iopub.execute_input":"2024-05-03T13:13:33.031166Z","iopub.status.idle":"2024-05-03T13:13:33.099301Z","shell.execute_reply.started":"2024-05-03T13:13:33.031133Z","shell.execute_reply":"2024-05-03T13:13:33.098454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize the chemical formula of building block 3\nfirst_smiles = df['buildingblock3_smiles'].iloc[0]\n\n# Convert the SMILES string to a molecule object\nfirst_molecule = Chem.MolFromSmiles(first_smiles)\n\n# Draw and display the molecule\nDraw.MolToImage(first_molecule, size=(700, 700))","metadata":{"execution":{"iopub.status.busy":"2024-05-03T13:13:42.334220Z","iopub.execute_input":"2024-05-03T13:13:42.334917Z","iopub.status.idle":"2024-05-03T13:13:42.399083Z","shell.execute_reply.started":"2024-05-03T13:13:42.334886Z","shell.execute_reply":"2024-05-03T13:13:42.398323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install py3Dmol","metadata":{"execution":{"iopub.status.busy":"2024-05-04T06:19:04.126942Z","iopub.execute_input":"2024-05-04T06:19:04.127793Z","iopub.status.idle":"2024-05-04T06:19:16.827446Z","shell.execute_reply.started":"2024-05-04T06:19:04.127758Z","shell.execute_reply":"2024-05-04T06:19:16.826481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Code to visualize the first molecule in molecule_smiles col in 3D.\nimport py3Dmol\n\n# Convert the SMILES string to an RDKit molecule object\nfirst_molecule_smiles = df['molecule_smiles'].iloc[0]\nfirst_molecule = Chem.MolFromSmiles(first_molecule_smiles)\n\n# 2. Add hydrogen atoms to the molecule\nfirst_molecule = Chem.AddHs(first_molecule)\n\n# Embed the molecule in 3D space\nAllChem.EmbedMolecule(first_molecule)\n\n# Visualize the molecule in 3D using Py3Dmol\nview = py3Dmol.view(width=800, height=600)\npdb_block_molecule = Chem.MolToPDBBlock(first_molecule)\nview.addModel(pdb_block_molecule, 'pdb')\nview.setStyle({'stick': {}})\nview.zoomTo()\nview.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-03T13:27:22.887655Z","iopub.execute_input":"2024-05-03T13:27:22.888332Z","iopub.status.idle":"2024-05-03T13:27:23.080628Z","shell.execute_reply.started":"2024-05-03T13:27:22.888295Z","shell.execute_reply":"2024-05-03T13:27:23.079791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**** Examples with row 20000****","metadata":{}},{"cell_type":"code","source":"# Code to visualize the first molecule in molecule_smiles col in 2D.\n\n#Visualize the chemical formula of building block 1\nfirst_smiles = df['molecule_smiles'].iloc[20000]\n# first_block = df['buildingblock1_smiles'].iloc[20000]\n# second_block = df['buildingblock2_smiles'].iloc[20000]\n# third_block = df['buildingblock3_smiles'].iloc[20000]\n\n\n# Convert the SMILES string to a molecule object\nfirst_molecule = Chem.MolFromSmiles(first_smiles)\n# first_bl = Chem.MolFromSmiles(first_block)\n# second_bl = Chem.MolFromSmiles(second_block)\n# third_bl = Chem.MolFromSmiles(third_block)\n\n# Draw and display the molecule\nDraw.MolToImage(first_molecule, size=(700, 700))\n# Draw.MolToImage(first_bl, size=(700, 700))\n# Draw.MolToImage(second_bl, size=(700, 700))\n# Draw.MolToImage(third_bl, size=(700, 700))","metadata":{"execution":{"iopub.status.busy":"2024-05-04T07:15:28.926699Z","iopub.execute_input":"2024-05-04T07:15:28.927567Z","iopub.status.idle":"2024-05-04T07:15:29.013901Z","shell.execute_reply.started":"2024-05-04T07:15:28.927533Z","shell.execute_reply":"2024-05-04T07:15:29.012525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import py3Dmol\n\n# Convert the SMILES string to an RDKit molecule object\nfirst_molecule_smiles = df['molecule_smiles'].iloc[20000]\nfirst_molecule = Chem.MolFromSmiles(first_molecule_smiles)\n\n# 2. Add hydrogen atoms to the molecule\nfirst_molecule = Chem.AddHs(first_molecule)\n\n# Embed the molecule in 3D space\nAllChem.EmbedMolecule(first_molecule)\n\n# Visualize the molecule in 3D using Py3Dmol\nview = py3Dmol.view(width=800, height=600)\npdb_block_molecule = Chem.MolToPDBBlock(first_molecule)\nview.addModel(pdb_block_molecule, 'pdb')\nview.setStyle({'stick': {}})\nview.zoomTo()\nview.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-04T06:19:31.484196Z","iopub.execute_input":"2024-05-04T06:19:31.484561Z","iopub.status.idle":"2024-05-04T06:19:31.622560Z","shell.execute_reply.started":"2024-05-04T06:19:31.484530Z","shell.execute_reply":"2024-05-04T06:19:31.621669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Processing and training model\n","metadata":{}},{"cell_type":"markdown","source":"****The dataset when visualizing is not balanced, So the metrics when We use to evaluate dataset is mAP not Accuracy Score to evaluate accurately about the models and compare with them****","metadata":{}},{"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=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)","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:23:02.803126Z","iopub.execute_input":"2024-05-06T13:23:02.803567Z","iopub.status.idle":"2024-05-06T13:27:37.995285Z","shell.execute_reply.started":"2024-05-06T13:23:02.803518Z","shell.execute_reply":"2024-05-06T13:27:37.994280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 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())]\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 random forest model\nrf_model = RandomForestClassifier(n_estimators=100, random_state=42)\nrf_model.fit(X_train, y_train)\n\n# Make predictions on the test set\ny_pred_proba = rf_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}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:36:09.367499Z","iopub.execute_input":"2024-05-06T13:36:09.367888Z","iopub.status.idle":"2024-05-06T13:37:57.397102Z","shell.execute_reply.started":"2024-05-06T13:36:09.367861Z","shell.execute_reply":"2024-05-06T13:37:57.396143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.model_selection import GridSearchCV\n# from catboost import CatBoostClassifier\n# cat_model = CatBoostClassifier()\n\n# parameters = {'depth' : [4,5,6],\n#             'learning_rate' : [0.01,0.02],\n#             'iterations'    : [80,90,100],\n#             'loss_function': ['Logloss', 'CrossEntropy'],\n#             'eval_metric': ['map']}\n# Grid_CBC = GridSearchCV(estimator=cat_model, param_grid = parameters, cv = 5)\n# Grid_CBC.fit(X_train, y_train)\n# print(\" Results from Grid Search \" )\n# print(\"\\n The best estimator across ALL searched params:\\n\",Grid_CBC.best_estimator_)\n# print(\"\\n The best score across ALL searched params:\\n\",Grid_CBC.best_score_)\n# print(\"\\n The best parameters across ALL searched params:\\n\",Grid_CBC.best_params_)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.tree import DecisionTreeClassifier\ndt_model = DecisionTreeClassifier()\ndt_model.fit(X_train, y_train)\n\n# Predictions\ny_pred_prob_dt = dt_model.predict_proba(X_test)[:,1]\n\nmap_score = average_precision_score(y_test, y_pred_prob_dt)\nprint(f\"Mean Average Precision (mAP): {map_score:.2f}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:39:25.130349Z","iopub.execute_input":"2024-05-06T13:39:25.131035Z","iopub.status.idle":"2024-05-06T13:40:23.363820Z","shell.execute_reply.started":"2024-05-06T13:39:25.130986Z","shell.execute_reply":"2024-05-06T13:40:23.362770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from xgboost import XGBClassifier\nxgb_model = XGBClassifier()\nxgb_model.fit(X_train, y_train)\n\n# Predictions\ny_pred_proba_xgb = xgb_model.predict_proba(X_test)[:,1]\n\nmap_score = average_precision_score(y_test, y_pred_proba_xgb)\nprint(f\"Mean Average Precision (mAP): {map_score:.2f}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:40:54.344676Z","iopub.execute_input":"2024-05-06T13:40:54.345019Z","iopub.status.idle":"2024-05-06T13:42:43.614100Z","shell.execute_reply.started":"2024-05-06T13:40:54.344986Z","shell.execute_reply":"2024-05-06T13:42:43.613063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from catboost import CatBoostClassifier\n# cat_model = CatBoostClassifier(iterations=1000, learning_rate = 0.01, depth = 13)\ncat_model = CatBoostClassifier()\ncat_model.fit(X_train, y_train)\n\n# Predictions\ny_pred_proba_cat = cat_model.predict_proba(X_test)[:,1]\n\nmap_score = average_precision_score(y_test, y_pred_proba_cat)\nprint(f\"Mean Average Precision (mAP): {map_score:.2f}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:42:48.720990Z","iopub.execute_input":"2024-05-06T13:42:48.721427Z","iopub.status.idle":"2024-05-06T13:45:46.085286Z","shell.execute_reply.started":"2024-05-06T13:42:48.721394Z","shell.execute_reply":"2024-05-06T13:45:46.084273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.neighbors import KNeighborsClassifier\nKNN_model = KNeighborsClassifier()\nKNN_model.fit(X_train, y_train)\n\n# Predictions\ny_pred_proba_KNN = KNN_model.predict_proba(X_test)[:,1]\n\nmap_score = average_precision_score(y_test, y_pred_proba_KNN)\nprint(f\"Mean Average Precision (mAP): {map_score:.2f}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:48:38.935939Z","iopub.execute_input":"2024-05-06T13:48:38.936645Z","iopub.status.idle":"2024-05-06T13:51:04.362419Z","shell.execute_reply.started":"2024-05-06T13:48:38.936606Z","shell.execute_reply":"2024-05-06T13:51:04.361289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Calculate accuracy for each model\nimport matplotlib.pyplot as plt\nrf_score =  average_precision_score(y_test, y_pred_proba)\nknn_score = average_precision_score(y_test, y_pred_proba_KNN)\nxgb_score = average_precision_score(y_test, y_pred_proba_xgb)\ncat_score = average_precision_score(y_test,y_pred_proba_cat)\ndt_score = average_precision_score(y_test, y_pred_prob_dt)\n\n\n# Create a bar plot\nmodels = ['Random Forest', 'KNN', 'XGBoost','CatBoost','Decision Trees']\naccuracy_scores = [rf_score, knn_score, xgb_score,cat_score,dt_score]\n\nplt.figure(figsize=(10,6))\nplt.bar(models, accuracy_scores, color=['blue', 'orange', 'green','yellow','red'])\nplt.xlabel('Models')\nplt.ylabel('mAP')\nplt.title('Model mAP Comparison (Mean Average Precision)')\nplt.ylim(0, 1)\nplt.xticks(rotation=45)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:51:41.611431Z","iopub.execute_input":"2024-05-06T13:51:41.611810Z","iopub.status.idle":"2024-05-06T13:51:42.054470Z","shell.execute_reply.started":"2024-05-06T13:51:41.611781Z","shell.execute_reply":"2024-05-06T13:51:42.053599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"****We can see that the Catboost, XGBoost and Random Forest models have the highest mAP on the above dataset. This can be seen because part of the Random Forest model is usually more complex than Decision Tree and KNN and at the same time it also avoids overfitting compared to the above two models. Meanwhile, the two Boost models, Catboost and XGBoost, always show outstanding performance in large data sets thanks to their algorithm superiority compared to the two models KNN and Decision Tree.****","metadata":{}},{"cell_type":"markdown","source":"****Therefore, we will experiment with the model with the highest performance, Catboost, to see how it performs on the test set****","metadata":{}},{"cell_type":"markdown","source":"# Catboost in Test dataset","metadata":{}},{"cell_type":"code","source":"# import os\n\n# # Process the test.parquet file chunk by chunk\n# test_file = '/kaggle/input/leash-BELKA/test.csv'\n# output_file = 'submission.csv'  # Specify the path and filename for the output file\n\n# # Read the test.parquet file into a pandas DataFrame\n# for df_test in pd.read_csv(test_file, chunksize=100000):\n\n#     # Generate ECFPs for the molecule_smiles\n#     df_test['molecule'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles)\n#     df_test['ecfp'] = df_test['molecule'].apply(generate_ecfp)\n\n#     # One-hot encode the protein_name\n#     protein_onehot = onehot_encoder.transform(df_test['protein_name'].values.reshape(-1, 1))\n\n#     # Combine ECFPs and one-hot encoded protein_name\n#     X_test = [ecfp + protein for ecfp, protein in zip(df_test['ecfp'].tolist(), protein_onehot.tolist())]\n\n#     # Predict the probabilities\n#     probabilities = rf_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))","metadata":{"execution":{"iopub.status.busy":"2024-05-04T07:36:55.711579Z","iopub.execute_input":"2024-05-04T07:36:55.711971Z","iopub.status.idle":"2024-05-04T07:38:02.556760Z","shell.execute_reply.started":"2024-05-04T07:36:55.711940Z","shell.execute_reply":"2024-05-04T07:38:02.555537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n# from xgboost import XGBClassifier\n# from catboost import CatBoostClassifier\n# xg_model =  XGBClassifier()\n# cat_model = CatBoostClassifier()\n\n\n# Process the test.parquet file chunk by chunk\ntest_file = '/kaggle/input/leash-BELKA/test.csv'\noutput_file = 'submission.csv'  # Specify the path and filename for the output file\n\n# Read the test.parquet file into a pandas DataFrame\nfor df_test in pd.read_csv(test_file, chunksize=100000):\n\n    # Generate ECFPs for the molecule_smiles\n    df_test['molecule'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles)\n    df_test['ecfp'] = df_test['molecule'].apply(generate_ecfp)\n    df_test.drop([\"buildingblock1_smiles\",\"buildingblock2_smiles\",\"buildingblock3_smiles\"],axis = 1)\n    \n\n    # One-hot encode the protein_name\n    protein_onehot = onehot_encoder.transform(df_test['protein_name'].values.reshape(-1, 1))\n\n    # Combine ECFPs and one-hot encoded protein_name\n    X_test = [ecfp + protein for ecfp, protein in zip(df_test['ecfp'].tolist(), protein_onehot.tolist())]\n    \n    # Predict the probabilities\n    probabilities = cat_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))","metadata":{"execution":{"iopub.status.busy":"2024-05-06T13:58:06.805941Z","iopub.execute_input":"2024-05-06T13:58:06.806924Z","iopub.status.idle":"2024-05-06T15:00:44.051114Z","shell.execute_reply.started":"2024-05-06T13:58:06.806890Z","shell.execute_reply":"2024-05-06T15:00:44.049686Z"},"trusted":true},"execution_count":null,"outputs":[]}]}