{"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":30700,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install duckdb\n!pip install rdkit","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import duckdb\nimport pandas as pd\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\nfrom sklearn.preprocessing import OneHotEncoder\nfrom xgboost import XGBClassifier\nfrom sklearn.model_selection import cross_val_score\nimport os","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_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 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":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['molecule'] = df['molecule_smiles'].apply(Chem.MolFromSmiles)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 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_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))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 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()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create the XGBoost classifier\nxgb_model = XGBClassifier(n_estimators=100, random_state=42)\n\n# Perform cross-validation\ncv_scores = cross_val_score(xgb_model, X, y, cv=5, scoring='average_precision')\n\n# Calculate the mean average precision\nmap_score = cv_scores.mean()\nprint(f\"Mean Average Precision (mAP) with cross-validation: {map_score:.2f}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train the XGBoost model on the entire dataset\nxgb_model.fit(X, y)\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# Read the test.csv file into a pandas DataFrame\nfor df_test in pd.read_csv(test_file, chunksize=100000):\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 using the XGBoost model trained with cross-validation\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))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install duckdb\n# !pip install rdkit\n# !pip install xgboost\n# !pip install catboost\n# !pip install lightgbm\n\n\n# import os\n# import numpy as np\n# import pandas as pd \n# import tensorflow as tf\n# from tqdm.notebook import tqdm\n# from tensorflow.keras.models import Sequential\n# from tensorflow.keras.layers import Dense, ReLU, LeakyReLU,Dropout\n\n\n# import duckdb\n# from rdkit import Chem\n# from rdkit.Chem import AllChem\n\n# from sklearn.model_selection import train_test_split\n# from sklearn.preprocessing import OneHotEncoder\n# from sklearn.metrics import average_precision_score\n# from sklearn.svm import SVC\n# from sklearn.ensemble import StackingClassifier, VotingClassifier, BaggingClassifier, RandomForestClassifier\n# from sklearn.neural_network import MLPClassifier\n# from sklearn.linear_model import LogisticRegression\n# from sklearn.calibration import CalibratedClassifierCV\n\n# from xgboost import XGBClassifier\n# from catboost import CatBoostClassifier\n# from lightgbm import LGBMClassifier\n# from tensorflow import keras","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:07:13.934090Z","iopub.execute_input":"2024-06-15T12:07:13.934469Z","iopub.status.idle":"2024-06-15T12:08:33.704837Z","shell.execute_reply.started":"2024-06-15T12:07:13.934439Z","shell.execute_reply":"2024-06-15T12:08:33.703310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def generate_ecfp(molecule, radius=2, bits=2048):\n#     if molecule is None:\n#         return None\n#     return list(AllChem.GetMorganFingerprintAsBitVect(molecule, radius, nBits=bits))","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:08:33.712051Z","iopub.execute_input":"2024-06-15T12:08:33.712482Z","iopub.status.idle":"2024-06-15T12:08:33.719163Z","shell.execute_reply.started":"2024-06-15T12:08:33.712440Z","shell.execute_reply":"2024-06-15T12:08:33.717923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_path = '/kaggle/input/leash-BELKA/train.parquet'\n# test_path = '/kaggle/input/leash-BELKA/test.parquet'\n\n# targets = ['BRD4', 'sEH', 'HSA']\n# con = duckdb.connect()\n\n# def get_data(target):\n#     df = con.query(f\"\"\"(SELECT molecule_smiles, binds\n#                             FROM parquet_scan('{train_path}')\n#                             WHERE binds = 0\n#                             and protein_name = '{target}'\n#                             ORDER BY random()\n#                             LIMIT 55000)\n#                             UNION ALL\n#                             (SELECT molecule_smiles, binds\n#                             FROM parquet_scan('{train_path}')\n#                             WHERE binds = 1\n#                             and protein_name = '{target}'\n#                             ORDER BY random()\n#                             LIMIT 55000)\"\"\").df()\n    \n#     df['molecule_smiles'] = df['molecule_smiles'].apply(Chem.MolFromSmiles).apply(generate_ecfp)\n#     return df\n\n# res = list(map(get_data, targets))\n\n# con.close()","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:08:33.720732Z","iopub.execute_input":"2024-06-15T12:08:33.721086Z","iopub.status.idle":"2024-06-15T12:16:54.098568Z","shell.execute_reply.started":"2024-06-15T12:08:33.721057Z","shell.execute_reply":"2024-06-15T12:16:54.097247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df=pd.DataFrame()\n# cnt=0\n# for i in res:\n# #     i['protien_name'] = targets[cnt]\n# #     cnt+=1\n#     df=pd.concat([df,i]).reset_index(drop=True)\n# df.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:16:54.101803Z","iopub.execute_input":"2024-06-15T12:16:54.102178Z","iopub.status.idle":"2024-06-15T12:16:54.148888Z","shell.execute_reply.started":"2024-06-15T12:16:54.102147Z","shell.execute_reply":"2024-06-15T12:16:54.147673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df['molecule_smiles'] = df['molecule_smiles'].apply(lambda x: np.asarray(x).astype('float32'))","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:16:54.150248Z","iopub.execute_input":"2024-06-15T12:16:54.150632Z","iopub.status.idle":"2024-06-15T12:17:14.625262Z","shell.execute_reply.started":"2024-06-15T12:16:54.150598Z","shell.execute_reply":"2024-06-15T12:17:14.624109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# X_train, X_test, y_train, y_test = train_test_split(df['molecule_smiles'], df['binds'], test_size=0.2, random_state=0)\n# X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=0)","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:17:14.627202Z","iopub.execute_input":"2024-06-15T12:17:14.627574Z","iopub.status.idle":"2024-06-15T12:17:14.679867Z","shell.execute_reply.started":"2024-06-15T12:17:14.627524Z","shell.execute_reply":"2024-06-15T12:17:14.678692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# X_train = [[float(value) for value in sample] for sample in X_train]\n# X_train = np.array(X_train, dtype=np.float32)\n\n# X_test = [[float(value) for value in sample] for sample in X_test]\n# X_test = np.array(X_test, dtype=np.float32)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:17:14.681258Z","iopub.execute_input":"2024-06-15T12:17:14.681661Z","iopub.status.idle":"2024-06-15T12:18:19.380794Z","shell.execute_reply.started":"2024-06-15T12:17:14.681628Z","shell.execute_reply":"2024-06-15T12:18:19.379458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = keras.Sequential([\n#                            keras.layers.Dense(256,activation='relu'),\n#                            keras.layers.Dropout(0.5),\n#                            keras.layers.Dense(128,activation='relu'),\n#                            keras.layers.Dropout(0.5),\n#                            keras.layers.Dense(64,activation='relu'),\n#                            keras.layers.Dropout(0.5),\n#                            keras.layers.Dense(32,activation='relu'),\n#                            keras.layers.Dense(16,activation='relu'),\n#                            keras.layers.Dense(8,activation='relu'),\n#                            keras.layers.Dense(1,activation='sigmoid'),\n# ])\n\n# model.compile(optimizer='adam',\n#                loss='mean_squared_error',\n#                metrics=['binary_crossentropy']\n#              )\n\n# early_stopping = keras.callbacks.EarlyStopping(\n#     monitor=\"binary_crossentropy\",\n#     min_delta=0.0001,\n#     patience=20,\n#     verbose=1,\n#     mode=\"auto\",\n#     baseline=None,\n#     restore_best_weights=False,\n#     start_from_epoch=0,\n# )","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:23:15.168763Z","iopub.execute_input":"2024-06-15T12:23:15.169203Z","iopub.status.idle":"2024-06-15T12:23:15.187536Z","shell.execute_reply.started":"2024-06-15T12:23:15.169169Z","shell.execute_reply":"2024-06-15T12:23:15.186246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_history = model.fit(X_train,y_train,epochs=120) ","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:23:16.117922Z","iopub.execute_input":"2024-06-15T12:23:16.118396Z","iopub.status.idle":"2024-06-15T12:30:25.974330Z","shell.execute_reply.started":"2024-06-15T12:23:16.118361Z","shell.execute_reply":"2024-06-15T12:30:25.972833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_pred = model.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:30:32.365755Z","iopub.execute_input":"2024-06-15T12:30:32.366227Z","iopub.status.idle":"2024-06-15T12:30:35.657919Z","shell.execute_reply.started":"2024-06-15T12:30:32.366191Z","shell.execute_reply":"2024-06-15T12:30:35.656814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_pred = (y_pred>=0.5)\n# y_pred = y_pred.astype(int)\n# len(y_pred)","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:30:32.365755Z","iopub.execute_input":"2024-06-15T12:30:32.366227Z","iopub.status.idle":"2024-06-15T12:30:35.657919Z","shell.execute_reply.started":"2024-06-15T12:30:32.366191Z","shell.execute_reply":"2024-06-15T12:30:35.656814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.metrics import classification_report\n# print(classification_report(y_test, y_pred))","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:30:38.849251Z","iopub.execute_input":"2024-06-15T12:30:38.849684Z","iopub.status.idle":"2024-06-15T12:30:38.937610Z","shell.execute_reply.started":"2024-06-15T12:30:38.849648Z","shell.execute_reply":"2024-06-15T12:30:38.936348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Process the test.parquet file chunk by chunk sinc the file is huge\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.csv file into a pandas DataFrame\n# # Wrap the loop with tqdm to display progress\n# for df_test in tqdm(pd.read_csv(test_file, chunksize=10_000)):\n#     df_test = df_test.reset_index(drop=True)\n    \n#     df_test['molecule_smiles'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles).apply(generate_ecfp)    \n#     df_test['molecule_smiles']= np.array(df_test['molecule_smiles'])\n#     df_test1 = df_test['molecule_smiles'].to_list()\n\n#     df_test1 = [[float(value) for value in sample] for sample in df_test1]\n#     df_test1 = np.array(df_test1, dtype=np.float32)\n    \n#     pred = model.predict(df_test1)\n#     pred = pd.DataFrame(pred).rename(columns={0:\"proba\"})\n    \n#     output_df = df_test[['id']].merge(pred, left_index=True, right_index=True)\n    \n#     output_df.to_csv(output_file, index=False, mode='a', header=not os.path.exists(output_file))","metadata":{"execution":{"iopub.status.busy":"2024-06-15T09:14:44.685467Z","iopub.execute_input":"2024-06-15T09:14:44.685956Z","iopub.status.idle":"2024-06-15T09:16:10.855402Z","shell.execute_reply.started":"2024-06-15T09:14:44.685915Z","shell.execute_reply":"2024-06-15T09:16:10.853362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test  = pd.read_csv('/kaggle/input/leash-BELKA/test.csv')","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:32:28.140622Z","iopub.execute_input":"2024-06-15T12:32:28.141174Z","iopub.status.idle":"2024-06-15T12:32:32.194243Z","shell.execute_reply.started":"2024-06-15T12:32:28.141117Z","shell.execute_reply":"2024-06-15T12:32:32.192759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_test = test[1500000:]","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:32:32.196638Z","iopub.execute_input":"2024-06-15T12:32:32.197136Z","iopub.status.idle":"2024-06-15T12:32:32.205380Z","shell.execute_reply.started":"2024-06-15T12:32:32.197095Z","shell.execute_reply":"2024-06-15T12:32:32.204117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_test","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:32:32.206790Z","iopub.execute_input":"2024-06-15T12:32:32.207169Z","iopub.status.idle":"2024-06-15T12:32:32.228775Z","shell.execute_reply.started":"2024-06-15T12:32:32.207139Z","shell.execute_reply":"2024-06-15T12:32:32.227623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_test = df_test.reset_index(drop=True)\n\n# df_test['molecule_smiles'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles).apply(generate_ecfp)    \n# df_test['molecule_smiles']= np.array(df_test['molecule_smiles'])\n# df_test1 = df_test['molecule_smiles'].to_list()\n\n# df_test1 = [[float(value) for value in sample] for sample in df_test1]\n# df_test1 = np.array(df_test1, dtype=np.float32)\n ","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:32:34.395467Z","iopub.execute_input":"2024-06-15T12:32:34.395910Z","iopub.status.idle":"2024-06-15T12:40:20.041382Z","shell.execute_reply.started":"2024-06-15T12:32:34.395870Z","shell.execute_reply":"2024-06-15T12:40:20.039982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pred = model.predict(df_test1)\n# pred = pd.DataFrame(pred).rename(columns={0:\"proba\"})\n\n# output_df = df_test[['id']].merge(pred, left_index=True, right_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:40:43.781944Z","iopub.execute_input":"2024-06-15T12:40:43.782572Z","iopub.status.idle":"2024-06-15T12:40:57.017839Z","shell.execute_reply.started":"2024-06-15T12:40:43.782518Z","shell.execute_reply":"2024-06-15T12:40:57.016645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# output_df.to_csv(\"remaining.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-15T12:41:13.679336Z","iopub.execute_input":"2024-06-15T12:41:13.679824Z","iopub.status.idle":"2024-06-15T12:41:14.014149Z","shell.execute_reply.started":"2024-06-15T12:41:13.679785Z","shell.execute_reply":"2024-06-15T12:41:14.013052Z"},"trusted":true},"execution_count":null,"outputs":[]}]}